{
  "meta": {
    "title": "CMSLAB 프로젝트 체크리스트",
    "as_of": "2026-10-16",
    "commit": "06e1003e7bdf0e636c161a231fed9c6820e775e3",
    "repo": "https://lab.wishdev.net/aidp/cms-lab",
    "scope": "기존 80개 프로젝트 기록 + 아키텍처 Read 계약 + 120개 원천별 실제 Read 준비도",
    "architecture_policy": "기존 50_플랫폼아키텍처 산출물 재사용, 신규 생성 없음",
    "test_evidence": "기존 2026-09-27 통합 검증 기록 인용. 문서 작성 중 제품 시험 재실행 없음",
    "hierarchy": "영역 → 작업 묶음 → 원천/확인 항목 → 단계별 완료 기준",
    "local_only_paths": [
      "cmslab-data-platform/00_프로젝트작업실/51_프로젝트체크리스트/architecture-readiness.json",
      "cmslab-data-platform/00_프로젝트작업실/51_프로젝트체크리스트/checklist-base.json",
      "cmslab-data-platform/00_프로젝트작업실/51_프로젝트체크리스트/checklist-data.json",
      "cmslab-data-platform/00_프로젝트작업실/51_프로젝트체크리스트/read-complete-register.json",
      "cmslab-data-platform/00_프로젝트작업실/51_프로젝트체크리스트/source-readiness.json",
      "docs/work-log/2026-09-28_source-read-three-lanes/approvals/lane-b-source-8-remaining-criteria/closure-manifest-r2.json",
      "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
      "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-source7-signature.json",
      "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r2-source10-signature.json",
      "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
      "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-source8-e1-e9-closure-20260928T051355Z.json",
      "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-source8-e1-e9-closure-r2-20260928T051536Z.json",
      "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1-source7/source-7.json",
      "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-70.json",
      "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-74.json",
      "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-76.json",
      "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-77.json",
      "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-78.json",
      "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-79.json",
      "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-80.json",
      "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-81.json",
      "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-83.json",
      "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-84.json",
      "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-85.json",
      "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-86.json",
      "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-87.json",
      "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-89.json",
      "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-91.json",
      "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-92.json",
      "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-94.json",
      "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r2-source10/source-10.json",
      "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4-source62-67/source-62.json",
      "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4-source62-67/source-67.json",
      "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-52.json",
      "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-53.json",
      "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-66.json",
      "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-75.json",
      "docs/work-log/2026-09-30_checklist-wave2-update/context.md",
      "docs/work-log/2026-09-30_checklist-wave2-update/result.md",
      "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
      "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-11.json",
      "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-61.json",
      "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-69.json",
      "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-9.json",
      "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
      "docs/work-log/2026-10-11_read-occurrence/manifests/source-108.json",
      "docs/work-log/2026-10-11_read-occurrence/manifests/source-109.json",
      "docs/work-log/2026-10-11_read-occurrence/manifests/source-110.json",
      "docs/work-log/2026-10-11_read-occurrence/manifests/source-111.json",
      "docs/work-log/2026-10-11_read-occurrence/manifests/source-63.json",
      "docs/work-log/2026-10-11_read-occurrence/manifests/source-88.json",
      "docs/work-log/2026-10-14_erp-pages-refresh/evidence.md",
      "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
      "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-2.json",
      "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-44.json",
      "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-58.json",
      "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-60.json",
      "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-73.json",
      "docs/work-log/2026-10-15_erp-export-pages/evidence.md"
    ],
    "source_taxonomy": {
      "api_interface": 89,
      "automated_batch": 25,
      "conditional_realtime": 1,
      "document_watch": 4,
      "residual_manual": 1,
      "unclassified": 0
    },
    "progress_rule": "기존 80개와 확장 두 파일은 고치지 않고 이 파일로만 상태를 올리거나 작업 묶음을 더한다. 상태 상향은 from 이 현재 값과 같을 때만 적용된다. 코드·로컬 확인은 partial(구현·로컬 확인)이며 운영 적용·실제 Read 완료가 아니면 done 으로 올리지 않는다. READ_COMPLETE 는 루트 E9 서명만 바꾼다. 항목·묶음은 자기 `updated` 날짜를 가질 수 있다(없으면 meta.as_of).",
    "source_metrics": {
      "total": 120,
      "classified": 120,
      "unclassified": 0,
      "read_complete": 41,
      "active_scope_total": 117,
      "active_scope_read_complete": 41,
      "active_scope_live_read_done": 42,
      "active_scope_first_private_ingest": 31,
      "adjacent_backlog": 3,
      "google_rows": {
        "sheets": 42,
        "drive_shared_folder": 1,
        "drive_file": 6,
        "drive_upload": 9,
        "document_watch": 4
      }
    }
  },
  "sections": [
    {
      "id": "architecture",
      "title": "아키텍처 산출물·설계 검증",
      "description": "기존 구성도·Archify 상태머신·스키마 산출물의 설계 검증 범위다. 8/8은 운영 Read 완료를 뜻하지 않는다.",
      "groups": [
        {
          "id": "architecture-views",
          "title": "기존 아키텍처 산출물",
          "items": [
            {
              "id": "architecture-overview",
              "title": "플랫폼 아키텍처 문서·HTML 구축",
              "status": "done",
              "detail": "수집·저장·검증·발행·조회와 운영 경계를 기존 상세 설계와 탐색형 HTML에 정리했다. 이번 체크리스트에서는 재생성하지 않는다.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/index.html",
                "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/01_시스템아키텍처.md"
              ]
            },
            {
              "id": "architecture-archify",
              "title": "Archify 수령 배치 상태머신 구축",
              "status": "done",
              "detail": "이미 작성된 Archify HTML과 workflow JSON을 재사용한다. 수령 배치 상태와 전이 조건을 기존 산출물에서 확인한다.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/06_수령배치_상태머신.html",
                "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/assets/ingest-batch-status.workflow.json"
              ]
            },
            {
              "id": "architecture-uml",
              "title": "관계·시퀀스·생명주기 도식 문서화",
              "status": "done",
              "detail": "플랫폼의 관계와 실행 흐름을 UML/Mermaid 명세에 기록했다.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/05_UML_mermaid.md"
              ]
            }
          ]
        },
        {
          "id": "architecture-storage",
          "title": "저장·권한·공개 경계",
          "items": [
            {
              "id": "architecture-layers",
              "title": "Raw → staging → core → mart 계층 정의",
              "status": "done",
              "detail": "원본 증적과 재처리 가능한 적재, 표준 모델, 업무 조회 모델을 분리했다. 웹에는 발행된 데이터와 출처를 제공한다.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/01_시스템아키텍처.md",
                "cmslab-data-platform/10_플랫폼구현/worker/core/README.md"
              ]
            },
            {
              "id": "architecture-schema",
              "title": "6차 PostgreSQL 스키마·컬럼 명세 생성",
              "status": "done",
              "detail": "현재 DDL·테이블/컬럼 문서·뷰어 데이터를 동일 생성기에서 만든다. C6 staging 정리와 reference 원천 유형까지 반영했다.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/03_schema_postgresql.sql",
                "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/02_DB스키마·테이블·컬럼명세.md",
                "docs/work-log/2026-09-27_platform-phase2-continuation/result.md"
              ]
            },
            {
              "id": "architecture-roles",
              "title": "역할·함수 권한 및 제한된 보존 경계 설계",
              "status": "done",
              "detail": "읽기·적재·발행·보존 책임을 역할과 함수 권한으로 분리했다. 사본 증명과 권한 없이 개인정보 원본 삭제를 진행하지 않는 경계를 둔다.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/03_schema_postgresql.sql",
                "docs/work-log/2026-09-27_platform-phase2-continuation/architecture-review.md"
              ]
            }
          ]
        },
        {
          "id": "architecture-checks",
          "title": "생성기와 DB 검증",
          "items": [
            {
              "id": "architecture-determinism",
              "title": "DDL·문서·JS 생성 결정론 검증",
              "status": "done",
              "detail": "최종 통합에서 생성 산출물 4개의 재생성 전후 SHA-256이 일치했다. 기존 검증 기록을 인용하며 이번 문서 작성에서 재실행하지 않았다.",
              "evidence": [
                "docs/work-log/2026-09-27_platform-phase2-continuation/result.md"
              ]
            },
            {
              "id": "architecture-pg-tests",
              "title": "PG16 스모크·시간축 회귀 통과",
              "status": "done",
              "detail": "C6+X1 최종 통합에서 스모크 20개, 시간축 회귀 201개 PASS·FAIL 0을 기록했다.",
              "evidence": [
                "docs/work-log/2026-09-27_platform-phase2-continuation/result.md",
                "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/04_검증_결과_2026-09-27.txt"
              ]
            }
          ]
        }
      ]
    },
    {
      "id": "history",
      "title": "프로젝트 기준선과 역사",
      "description": "현재 정본과 과거 참고자료를 분리한다.",
      "groups": [
        {
          "id": "canonical",
          "title": "정본 규칙",
          "items": [
            {
              "id": "history-01",
              "title": "프로젝트 전체그림 정본 지정",
              "status": "done",
              "detail": "프로젝트 설명 정본은 프로젝트전체그림_CURRENT.md로 지정되어 있다.",
              "evidence": [
                "cmslab-data-platform/README.md",
                "cmslab-data-platform/02_프로젝트정본/프로젝트전체그림_CURRENT.md"
              ]
            },
            {
              "id": "history-02",
              "title": "문서 상태 체계 확인",
              "status": "done",
              "detail": "CURRENT, Proposed, Accepted, Superseded, Archived 의미가 문서 관리 원칙에 기록되어 있다.",
              "evidence": [
                "cmslab-data-platform/README.md"
              ]
            },
            {
              "id": "history-03",
              "title": "과거 인벤토리와 현재 원장 분리",
              "status": "done",
              "detail": "초기 데이터소스 시드는 아카이브이며 현재 상태로 재사용하지 않는다고 명시되어 있다.",
              "evidence": [
                "cmslab-data-platform/04_분석설계/데이터분석/데이터소스_인벤토리_시드.md"
              ]
            }
          ]
        },
        {
          "id": "execution-history",
          "title": "초기 실행 방향",
          "items": [
            {
              "id": "history-04",
              "title": "Discovery 단계와 공백 기록",
              "status": "partial",
              "detail": "2026-10-03 갱신 — Discovery 공백 18건(원장 「현재 못 채우는 항목」 10 · 인계 ASK 7 · 업무정책 H-04 · open-items 3, 중복 합침)을 10/7 패키지 기준으로 판정: 이미 닫힘 1 · 미팅 승인 시 닫힘 5 · 부분(오너·규칙은 닫히고 자료·실행이 남음) 8 · 남음(고객 접근권·자료) 4. 남는 12건은 고객 세팅 체크리스트 번호로 추적한다. 원장(discovery README · 04-handoff · 전체그림) 반영은 미팅 뒤.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/52_10-7미팅_패키지/10_Discovery공백_갱신_대내.md"
              ],
              "next": "10/7 승인 결과로 「미팅 승인 시 닫힘」 5건 확정 → discovery 원장 · 전체그림 v0.5 갱신 MR → 부분 8 · 남음 4 해소 시 done",
              "previous_status": "partial",
              "updated": "2026-10-03"
            },
            {
              "id": "history-05",
              "title": "초기 파일 우선 전략과 이후 전환 기록",
              "status": "done",
              "detail": "9월 초에는 파일 등록·검증·축적·조회부터 착수했다. 이후 자동화 목표는 36_ 의사결정의 정규 수동 업로드 0 기준으로 갱신했다.",
              "evidence": [
                "cmslab-data-platform/03_실행관리/00_프로젝트작전실/작전계획_CURRENT.md",
                "cmslab-data-platform/00_프로젝트작업실/17_CURRENT_데이터아키텍처.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
              ]
            }
          ]
        }
      ]
    },
    {
      "id": "requirements",
      "title": "업무 분석과 개념 설계",
      "description": "요구사항·인터뷰 근거·온톨로지와 고객 승인 공백.",
      "groups": [
        {
          "id": "functional",
          "title": "기능 클러스터",
          "items": [
            {
              "id": "req-01",
              "title": "5개 업무축 구조화",
              "status": "done",
              "detail": "매출·재고공급·마스터·마케팅·품질채권 축으로 요구사항을 분해했다.",
              "evidence": [
                "cmslab-data-platform/04_분석설계/요구사항/_README.md"
              ]
            },
            {
              "id": "req-02",
              "title": "13개 기능 선행조건 연결",
              "status": "done",
              "detail": "공통 파운데이션과 A~E 클러스터의 의존관계를 정의했다.",
              "evidence": [
                "cmslab-data-platform/04_분석설계/요구사항/_README.md",
                "cmslab-data-platform/04_분석설계/요구사항/00_공통파운데이션.md"
              ]
            },
            {
              "id": "req-03",
              "title": "업무 완료기준 인터뷰 확정",
              "status": "pending",
              "detail": "2026-10-03 갱신 — 13개 기능별 업무 완료기준 기본안(지금 → 플랫폼 오픈 뒤 → 판단 지점 → 완료 기준, 행마다 승인란)과 부서별 30분 세션 진행표 7개(10/8~10/14, 1.1 안건 8 고정 슬롯 사용)를 작성했다. 기한까지 미결인 행은 기본안 적용. 고객 승인 0건 — 상태 유지. 10/6 사용자 결정으로 기본안 송부를 미뤘다 — 완료 기준은 실제 숫자를 보며 원천별로 정한다(10/7 안건 E-1, 결정 미기록). 검증 참여 시간(C-8) · 주간 슬롯(D-11)은 추후 협의. 고객 승인 0건 — 상태 유지.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/52_10-7미팅_패키지/03_업무완료기준_기본안_고객용.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/9fc92f0/docs/work-log/2026-10-06_send-prep/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/9fc92f0/docs/work-log/2026-10-07_meeting-result/%EA%B2%B0%EC%A0%95%EA%B8%B0%EB%A1%9D.md"
              ],
              "next": "원천별 첫 실 Read 결과를 보여 주며 부서별 완료 기준 확정 → 서명 또는 기본안 적용 기록",
              "previous_status": "pending",
              "updated": "2026-10-07"
            },
            {
              "id": "req-04",
              "title": "고객 공식 업무규칙 승인",
              "status": "partial",
              "detail": "2026-10-03 갱신 — 숫자를 바꾸는 업무 규칙 45개 승인표(매출 인식 · 취소·반품·쿠폰·수수료 · 환율·부가세 · 품목·세트·매핑 · 재고·잠금 · 입고·계획 · 채권 · 확정·공개)와 품목 코드 매핑 승인 기준표(4단계 · 보류 규칙) 고객용을 작성했다. 확정서 1.1·별표와 겹치는 규칙은 포인터, 묶음 ⑤ 정합성 고객 결정 9건(B1~B9)은 규칙 행으로 흡수. 공식 승인 0건 — 상태 유지. 10/6 사용자 결정으로 승인표 송부를 미뤘다 — 실제 숫자를 보며 원천별로 정한다. 10/7 미팅에서 바뀐 규칙: 돈에 대한 최종 자료 = 경영지원실 마감 엑셀(C-9) · 원가 · 공헌이익은 재경 손익계산서를 받아 표시(C-5 · C-6) · 라쿠텐 총괄표 원화 칸 = 엔화 × 환율(F-1 안내). 공식 승인 0건 — 상태 유지. 2026-10-11: 금액 규칙(매출 인식 · 원가 · 손익 산식 · 공식 매출 기준)은 고객 승인 대신 경영지원실 자료를 정본으로 하고 위시켓이 역설계한다(10/11 사용자 원칙). 통합매출 ↔ 손익 1~8월 0원 대사로 1차 확인. 남은 승인은 금액이 아닌 규칙(매핑 · 업로드 · 열람 묶음 · 활동메모)뿐. 2026-10-11 사용자 결정 2건: ① 품목 코드 매핑 = 「기준에 따라서 매핑」 — 기준표대로, 1단계(코드 일치)는 위시켓 일괄(10/7 결정기록 D-7 메모, 도구 mapping-tier1 — !179). 2 · 3단계 승인자 지정은 10/12 미팅 그대로 남는다. ② 외화 원화 환산 = 원천 표(파일 · 시트 · API)에 환율이 있으면 그 환율, 없으면 수출입은행 매매기준율, 둘 다 없으면 원화 NULL(36_ 5절 정본 · 42_ G1 갱신, 마트 끝 열 fx_source — !178). 재경 확인은 ② 의 기본 환율 종류와 위안(CNY ↔ 수출입은행 CNH)으로 좁혀졌다.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/52_10-7미팅_패키지/04_업무규칙_승인표_고객용.md",
                "cmslab-data-platform/00_프로젝트작업실/52_10-7미팅_패키지/08_매핑승인기준표_고객용.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/9fc92f0/docs/work-log/2026-10-06_send-prep/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/9fc92f0/docs/work-log/2026-10-07_meeting-result/%EA%B2%B0%EC%A0%95%EA%B8%B0%EB%A1%9D.md",
                "cmslab-data-platform/00_프로젝트작업실/45_세부과업범위_확정서_v1.0.md",
                "docs/work-log/2026-10-11_live-read/reconcile-summary.json",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/2a87405/docs/work-log/2026-10-11_item-mapping-tier1/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/2a87405/docs/work-log/2026-10-11_fx-source-first/result.md"
              ],
              "next": "10/12 미팅에서 금액 외 규칙 승인자 지정(품목 코드 매핑 2 · 3단계 · 창고 매핑 · VOC 유형 · 업로드 담당) · 재경: 환율 ② 기본 종류 · CNH↔CNY",
              "previous_status": "pending",
              "updated": "2026-10-11"
            }
          ]
        },
        {
          "id": "analysis",
          "title": "분석 근거",
          "items": [
            {
              "id": "req-05",
              "title": "조직·시스템·원천 인덱스 구성",
              "status": "done",
              "detail": "R&R, 시스템 원장, 자료 인덱스가 분리되어 있다.",
              "evidence": [
                "cmslab-data-platform/04_분석설계/discovery/01-org-matrix.md",
                "cmslab-data-platform/04_분석설계/discovery/03-systems.md",
                "cmslab-data-platform/04_분석설계/discovery/_materials/INDEX.md"
              ]
            },
            {
              "id": "req-06",
              "title": "외부자료와 내부근거 결합 지침",
              "status": "done",
              "detail": "외부 조사와 내부 자료를 결합하는 지침이 별도 문서화되어 있다.",
              "evidence": [
                "cmslab-data-platform/04_분석설계/내부분석/02_외부조사와_내부자료_결합지침.md"
              ]
            },
            {
              "id": "req-07",
              "title": "원천 실제 접근 검증",
              "status": "partial",
              "detail": "2026-10-03 갱신 — 당시 115개 원천의 수령 · 접근 · 자동연동 · Read 완료 집계를 고객용으로 생성했다(13번 영역 source-readiness, as_of 2026-10-03): 수령 63 · 접근 30 · 자동연동 31(표본 파서만 14 별도) · Read 완료 30(전부 업무 시트) · 당시 ERP 접근 0. 막힌 원천 해소 주체 고객 66 · 제3자 18 · 위시켓 1. 10/3 실측 공유 끊김 시트 4원천(#82 · #83 · #85 · #89)을 주의로 표기. 2026-10-14 ERP DB E2는 직접 연결·읽기 확인으로 해소됐고, 사용자 테이블 3,359개·115,170,363행의 1회 전체 raw 확보와 파일 검증도 완료했다. 원천별 업무 매핑·대사·정기 운영은 남아 READ_COMPLETE는 아직 아님.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/52_10-7미팅_패키지/07_원천접근_현황_고객용.md",
                "docs/work-log/2026-10-03_meeting-1007/gen_setup_checklist.py"
              ],
              "next": "10/7 미팅 ⑥ 전달 → 접근권이 열릴 때마다 생성기 재실행으로 07 갱신 → 운영 경로 접근 · 실 Read 증적으로 갱신",
              "previous_status": "partial",
              "updated": "2026-10-03"
            }
          ]
        },
        {
          "id": "ontology",
          "title": "업무 개념 모델",
          "items": [
            {
              "id": "design-01",
              "title": "제품·판매·재고·정산 개념 연결",
              "status": "done",
              "detail": "업무 흐름과 개념 관계를 현재 온톨로지 README와 JSON에 기록했다.",
              "evidence": [
                "cmslab-data-platform/04_분석설계/아키텍처/ontology-workbench/README.md",
                "cmslab-data-platform/04_분석설계/아키텍처/ontology-workbench/domain-model.json"
              ]
            },
            {
              "id": "design-02",
              "title": "근거·제약·미결질문 연결",
              "status": "done",
              "detail": "현재 설계가 전사록 근거와 확인 질문을 연결하도록 구성되어 있다.",
              "evidence": [
                "cmslab-data-platform/04_분석설계/아키텍처/ontology-workbench/README.md",
                "cmslab-data-platform/04_분석설계/아키텍처/ontology-workbench/change-inputs/2026-09-16_interview-claims.json"
              ]
            },
            {
              "id": "design-03",
              "title": "온톨로지 검증과 승인 구분",
              "status": "done",
              "detail": "검증 결과가 고객 승인이나 업무 규칙 확정을 뜻하지 않는다고 명시한다.",
              "evidence": [
                "cmslab-data-platform/04_분석설계/아키텍처/ontology-workbench/README.md",
                "cmslab-data-platform/04_분석설계/아키텍처/ontology-workbench/07_테스트결과.md"
              ]
            }
          ]
        },
        {
          "id": "data-design",
          "title": "데이터 설계 준비",
          "items": [
            {
              "id": "design-04",
              "title": "제품·ITEM·포장·BOM·LOT 분리 원칙",
              "status": "done",
              "detail": "제품 계층과 포장·판매구성·LOT을 별도 축으로 설계했다.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/17_CURRENT_데이터아키텍처.md",
                "cmslab-data-platform/04_분석설계/아키텍처/ontology-workbench/README.md"
              ]
            },
            {
              "id": "design-05",
              "title": "판매 3축 분리 원칙",
              "status": "done",
              "detail": "판매계획·주문기준 판매추이·마감완료 정산을 섞지 않도록 정의했다.",
              "evidence": [
                "cmslab-data-platform/02_프로젝트정본/프로젝트전체그림_CURRENT.md",
                "cmslab-data-platform/03_실행관리/00_프로젝트작전실/작전계획_CURRENT.md"
              ]
            },
            {
              "id": "design-06",
              "title": "정본 마스터와 승인 경계 확정",
              "status": "partial",
              "detail": "2026-10-03 갱신 — 정본 마스터 13종(실물 품목 · 출시제품 · 판매상품 · 제품 분류 · 정상가 · 원료 · 처방·BOM · 거래처 · 거래처 영업그룹 · 채널 · 창고 · LOT · 환율)의 정본 원천 · 코드 체계 · 코드 오너 · 매핑 승인 · 변경 반영 기본안과 원천별 정본 우선순위 · 원천끼리 다를 때 규칙을 승인표로 작성했다. 플랫폼은 원장이 아니다(1.1 안건 3). 승인 전 — 상태 유지. 10/6 사용자 결정: 승인표(03 · 04 · 05 · 08)는 미리 보내지 않고 실제 숫자를 보며 원천별로 정한다. 10/7 미팅: 제품마스터 · 프로모션 등록·수정 안건 승인(C-3) · 품목 분류는 「품목 리스트 master」 시트 대신 ERP 에서(G-2) · LOT 은 기록하지 않음(요청목록 18). 서명 0 — 상태 유지. 2026-10-11: 금액의 채널 귀속 정본 = #103 통합매출 행마다의 영업그룹(관리)(10/11 「금액 = 경영지원실 자료」 — 고객 별도 승인 불요). 거래처 1,166 → 영업그룹 36, 그중 16 거래처는 행에 따라 영업그룹이 다르다(재경 덮어쓰기 규칙 — 9월 lane1 관찰과 같은 방향). 영업그룹 36 → 손익 영업그룹 38 과 이름 일치 0 누락. 2026-10-11 14차(로컬 확인 · 원격 미적용): 승인 경계를 DB 로 고정한 마스터 2개 — mdm.team_attribution(적재 역할은 제안만, 승인은 업무 앱) · mdm.channel_price(쓰기는 업무 앱만, #83 · #84 후보). 승인 행 겹침 금지.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/52_10-7미팅_패키지/05_정본마스터_승인표_고객용.md",
                "cmslab-data-platform/00_프로젝트작업실/52_10-7미팅_패키지/08_매핑승인기준표_고객용.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/9fc92f0/docs/work-log/2026-10-06_send-prep/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/9fc92f0/docs/work-log/2026-10-07_meeting-result/%EA%B2%B0%EC%A0%95%EA%B8%B0%EB%A1%9D.md",
                "docs/work-log/2026-10-11_live-read/attribution-summary.json",
                "docs/work-log/2026-10-11_live-read/reconcile-summary.json",
                "docs/work-log/2026-10-11_core-14th/result.md",
                "docs/work-log/2026-10-11_core-complete/result.md"
              ],
              "next": "mdm.channel_source_map 을 #103 거래처 × 영업그룹(관리)로 채우는 매퍼 → 복수 영업그룹 16 거래처는 행 단위 유지(덮어쓰기 규칙을 재현하지 않는다)",
              "previous_status": "partial",
              "updated": "2026-10-11"
            }
          ]
        }
      ]
    },
    {
      "id": "sources",
      "title": "원천 분류와 계약 시드",
      "description": "수집 정책을 원천 원장·계약·일정으로 구체화.",
      "groups": [
        {
          "id": "classification",
          "title": "분류 원장",
          "items": [
            {
              "id": "source-01",
              "title": "원천별 수집방식 분류표 작성",
              "status": "done",
              "detail": "원천별 현행 방식, 목표 분류, 폴백, 주기, 차단요인을 표로 관리한다.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.csv"
              ]
            },
            {
              "id": "source-02",
              "title": "파생 사본과 원천 구분",
              "status": "done",
              "detail": "대사용 시트는 원천이 아닌 파생 사본으로 분류한다.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.csv"
              ]
            },
            {
              "id": "source-03",
              "title": "수령 상태와 접근 성공 분리",
              "status": "done",
              "detail": "수령표의 TRUE/FALSE가 계정 접속·자동연동 완료를 뜻하지 않는다고 명시한다.",
              "evidence": [
                "cmslab-data-platform/04_분석설계/아키텍처/CMSLAB_원천별_갱신주기_근거표_CURRENT.md",
                "cmslab-data-platform/00_프로젝트작업실/17_CURRENT_데이터아키텍처.md"
              ]
            }
          ]
        },
        {
          "id": "automation",
          "title": "자동화 의사결정",
          "items": [
            {
              "id": "source-04",
              "title": "정규 수동 업로드 0 목표 결정",
              "status": "done",
              "detail": "목표와 잔여 수동 예외를 자동화 결정 문서에 기록했다.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
              ]
            },
            {
              "id": "source-05",
              "title": "수집주기 격자 결정",
              "status": "done",
              "detail": "10분·1시간·일 1회 기본 격자와 원천별 예외를 결정했다. 개별 감시·스냅샷·발행 주기는 각 계약과 레인 명세를 따른다.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
              ]
            },
            {
              "id": "source-06",
              "title": "고객 세팅과 운영 전환",
              "status": "pending",
              "detail": "2026-10-03 갱신 — 고객 세팅 체크리스트 64건(10/2 송부 53건 번호 유지 + 10/3 추가 11건: ERP 허용 IP 전환 · ERP 메타데이터·코드 대응표 · Drive 수집 범위 · 쿠팡 광고 · 코스트코 · 가명 키 · Hero 목록 · 행사 ID · 주 정의 · 끊긴 시트 재공유 · Amazon 정산 주기) · 임계 5건(AWS · ERP, 목표 10/13) · 원천별 보기 · 팀별 요약을 md · xlsx 로 만들었다(수집 경로 판정 · 48_ 1절과 맞춤). 고객 세팅 완료 0건 — 상태 유지.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/52_10-7미팅_패키지/06_고객세팅_체크리스트_고객용.md",
                "cmslab-data-platform/00_프로젝트작업실/52_10-7미팅_패키지/06_고객세팅_체크리스트.xlsx"
              ],
              "next": "10/6 기획팀 사전 송부 → 10/7 미팅 ⑥ 팀별 담당 지정 → 임계 5건 10/13 · 나머지 늦어도 10/30 → 건별 완료 확인",
              "previous_status": "pending",
              "updated": "2026-10-03"
            }
          ]
        },
        {
          "id": "seeds-generation",
          "title": "생성·PG",
          "items": [
            {
              "id": "seeds-contracts",
              "title": "원천·계정·계약·일정 시드 생성",
              "status": "done",
              "detail": "분류 원장 기준 source 109개·계정 108개·계약 153개·일정 190개를 생성했다. 분류 미확정 6행에는 계약을 임의 생성하지 않는다.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                "cmslab-data-platform/10_플랫폼구현/db/seeds/cmslab_seeds/spec_ledgers.py"
              ]
            },
            {
              "id": "seeds-projection",
              "title": "artifact·fortnight·reference·운영 시간 반영",
              "status": "done",
              "detail": "6차 스키마 필드를 생성기에 반영했다. HGLIS 09~19시 램프를 명시하고 실제 시작일이 없는 Amazon anchor는 NULL로 보존했다.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/db/seeds/cmslab_seeds/model.py",
                "cmslab-data-platform/10_플랫폼구현/db/seeds/cmslab_seeds/render.py"
              ]
            },
            {
              "id": "seeds-dbtests",
              "title": "시드 PG 회귀",
              "status": "done",
              "detail": "145 passed·결정론 확인.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                "docs/work-log/2026-09-27_platform-phase2-continuation/result.md"
              ]
            }
          ]
        }
      ]
    },
    {
      "id": "infrastructure",
      "title": "인프라와 보안 구성",
      "description": "구성 코드와 오프라인 검증 범위. 운영 가동은 별도.",
      "groups": [
        {
          "id": "infra-build",
          "title": "구성",
          "items": [
            {
              "id": "infra-network",
              "title": "VPC·RDS·S3·IAM·큐·스케줄러 코드 작성",
              "status": "done",
              "detail": "서울 리전, 2개 AZ, 사설 RDS, 원본 보관 S3, 역할 분리 IAM과 큐·스케줄러 구성을 작성했다. 운영 apply는 미실행이다.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/infra/README.md",
                "cmslab-data-platform/10_플랫폼구현/infra/modules/platform/network.tf"
              ]
            },
            {
              "id": "infra-runtime",
              "title": "수집·웹·이벤트 런타임 구성 작성",
              "status": "done",
              "detail": "API·브라우저 실행 역할, ECS 웹, 웹훅 Lambda와 SES 수신 경로를 코드로 구성했다. 실제 기동과 운영 연동은 별도다.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/infra/modules/platform/collectors.tf",
                "cmslab-data-platform/10_플랫폼구현/infra/modules/platform/webhook.tf"
              ]
            }
          ]
        },
        {
          "id": "infra-verify",
          "title": "검증",
          "items": [
            {
              "id": "infra-offline",
              "title": "오프라인 인프라 검증",
              "status": "done",
              "detail": "2026-10-02 전체 정적 검증 묶음 통과(infra/scripts/check.sh, EXIT 0) — terraform fmt · validate 4 루트(modules/platform·envs/prod·envs/dev·bootstrap) · TFLint 0.64.0+aws 0.49.0 4 루트 0건 · terraform test(mock) 8 run 통과 · 웹훅 zip = 원본 5항목 바이트 동일 · Checkov 3.3.19 통과 544·실패 0·예외 62(전부 자원 안 근거 skip 주석 — README 8절) · 구조 스캔 33파일 187자원 위반 0 · pytest 68/68. LocalStack 4.12 plan: 생성 216 · 변경·삭제 0 · 자원 유형 69 · NAT 0 · 가동 상태(HTTPS·ALB 로그인·BI·사건 소비자·업로드 트리거 켬, 저장소 밖 일회성): 생성 227 · 변경·삭제 0 · NAT 0 · 사전 조건(ECR digest·HTTPS·ALB 로그인) 통과. 9/27 미실행분(도구 부재)을 이번 변경(사건 소비자·BI·업로드 트리거·웹 자격) 포함 상태로 끝냈다. 고친 것: infra 시험 dev 의존성에 psycopg(core lake.py 가 605cc3d 부터 가져온다 — 기존 깨짐), Checkov 실패 1(BI 대상 그룹 HTTP)은 근거 skip. apply 는 하지 않았다(계정 없음).",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/infra/README.md",
                "cmslab-data-platform/10_플랫폼구현/infra/scripts/check.sh",
                "docs/work-log/2026-10-02_aws-cutover-prep/result.md"
              ],
              "next": "AWS 계정이 오면 dev apply 에서 IAM 조건 키·정책이 실제로 받아들여지는지 확인(README 10절 한계) — RUNBOOK 3단계",
              "previous_status": "partial",
              "updated": "2026-10-02"
            }
          ]
        },
        {
          "id": "aws-cutover-prep",
          "title": "AWS 계정 개설일 당일 적용 준비(묶음 ③)",
          "items": [
            {
              "id": "aws-web-ingress-trigger",
              "title": "웹 업로드 트리거 — _event.json → submit-event(FILE_INGRESS v1 4절)",
              "status": "partial",
              "detail": "구현(로컬 확인). 웹 업로드: 메일 버킷 ingress/web/<날짜>/<id>/_event.json 생성 → S3 EventBridge → ECS RunTask submit-event(ingress.tf). 2026-10-05 묶음 ⑪: 웹 태스크 s3:ListBucket(조건 s3:prefix = ingress/web/*) 추가 — 아직 없는 _result.json 이 403 대신 404 · 웹 태스크 메모리 1 → 2 GB(40 MiB 업로드 1건 ≈ 120 MiB) · ingress/ 수명 주기 90일을 별도 변수(mail_ingress_expire_days)로. SES 수신 트리거: API 노드 cmslab-file-reception.timer(15분 · flock 단일 실행 · 상태 = 지속 볼륨 inbound/ · drive/ — route 수를 세어 all-once/ses-once/drive-once/없음). 설치기가 타이머를 켠다. api-node 시험 14/14 · terraform test 8/8.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/infra/modules/platform/ingress.tf",
                "cmslab-data-platform/10_플랫폼구현/infra/modules/platform/web.tf",
                "cmslab-data-platform/10_플랫폼구현/worker/deploy/api-node/cmslab-file-reception.timer",
                "cmslab-data-platform/10_플랫폼구현/worker/deploy/api-node/cmslab-file-reception-tick.sh",
                "cmslab-data-platform/10_플랫폼구현/worker/core/FILE_INGRESS.md",
                "docs/work-log/2026-10-05_aws-start-prep/result.md"
              ],
              "next": "계정 개설일 enable_ingress_trigger=true → 합성 파일 1건 _result.json 확인 · SES DNS(MX · TXT) 뒤 api-node-routes.env 에 SES route → 타이머 한 바퀴(partner/ 1건)",
              "updated": "2026-10-05"
            },
            {
              "id": "aws-api-node-state-volume",
              "title": "API 노드 지속 상태 볼륨(시트·메일 수신 상태)",
              "status": "partial",
              "detail": "구현(정적 검증) — 2026-10-05 묶음 ⑪. 단일 AZ gp3 암호화 볼륨(collectors.tf api_state, 20 GB) + 부팅 스크립트가 태그로 찾아 붙임(탄력적 IP 와 같은 방식 — 남이 쥐면 10초 간격 10분 기다리고 빼앗지 않음, 끝내 못 붙이면 자기 종료) + 파일시스템은 blkid -p 가 「없음」일 때만 생성 + fstab(nofail) 로 /var/lib/cmslab-state + node.env CMSLAB_STATE_MOUNT + API ASG 를 그 AZ 서브넷으로 고정 + DLM 일일 스냅샷 14개. 노드 역할 ec2:AttachVolume 은 볼륨 · 인스턴스 모두 태그 조건. 설치기 preflight 가 --state-mount 와 부팅 값이 다르면 거부. 부팅 스크립트 시험(tests/boot) 8/8 — 부착 · 옛 노드가 쥔 볼륨 대기 · 끝내 안 풀리면 자기 종료 · 기존 파일시스템 포맷 안 함. terraform test 단언 · Checkov 0 실패 · LocalStack plan 통과. apply 는 계정 뒤.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/infra/modules/platform/collectors.tf",
                "cmslab-data-platform/10_플랫폼구현/infra/modules/platform/templates/node-boot.sh.tftpl",
                "cmslab-data-platform/10_플랫폼구현/infra/tests/boot/test_node_boot.py",
                "cmslab-data-platform/10_플랫폼구현/worker/deploy/api-node/preflight.py",
                "docs/work-log/2026-10-05_aws-start-prep/result.md"
              ],
              "next": "계정 개설일 dev apply → 첫 부착 · 교체 시 대기 확인(RUNBOOK 8단계 1) → prod 설치기 정상 경로로 API 워커 설치 → done",
              "previous_status": "pending",
              "updated": "2026-10-05"
            }
          ],
          "updated": "2026-10-02"
        }
      ]
    },
    {
      "id": "runtime",
      "title": "공통 실행과 보존",
      "description": "계약 판정·수집 증적·발행·보존의 공통 실행 레인.",
      "groups": [
        {
          "id": "core-runtime",
          "title": "실행",
          "items": [
            {
              "id": "core-contract",
              "title": "계약 효력·파일 기간·실행 시간대 판정",
              "status": "done",
              "detail": "계약 시작·종료, artifact 파일 기간, active hours, windowless 및 fortnight 발행 경계를 구현했다.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/worker/core/README.md"
              ]
            },
            {
              "id": "core-control",
              "title": "실행 기록·재시도·보류·행 수 기준 구현",
              "status": "done",
              "detail": "일정별 실행 기록, breaker/retry, 공개 보류, row count basis를 처리한다. 수집 성공과 공개 가능 상태를 구분한다.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/worker/core/README.md"
              ]
            },
            {
              "id": "core-c6",
              "title": "C6 stale staging purge",
              "status": "done",
              "detail": "검증된 URI·SHA 사본 목록, 잠금 뒤 상태·최근 재처리 재검사로 오래된 upsert/append staging만 정리한다. core/current를 보존하고 별도 단조 증가 marker를 쓴다.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/worker/core/README.md",
                "docs/work-log/2026-09-27_platform-phase2-continuation/architecture-review.md"
              ]
            }
          ]
        },
        {
          "id": "core-validation",
          "title": "공통 실행 검증",
          "items": [
            {
              "id": "core-tests",
              "title": "core·worker 통합 회귀 통과",
              "status": "done",
              "detail": "최종 core 593 passed·0 skipped, worker 통합 12 passed를 기록했다. 전체 플러그인 설치 후 레인별 skip도 해소했다.",
              "evidence": [
                "docs/work-log/2026-09-27_platform-phase2-continuation/result.md"
              ]
            }
          ]
        },
        {
          "id": "wave2-core",
          "title": "웨이브 2 stg → core 의미 매핑 실행",
          "items": [
            {
              "id": "w2-core-mapping-exec",
              "title": "core 매핑 실행기·재처리(remap)·창고 코드 예외",
              "status": "partial",
              "detail": "구현(로컬 확인). 2026-10-02 리허설: 라쿠텐 실제 파일 submit → load(core 1,596 · 식별자 81 · 예외 82) → ERP 품목 투영(합성 100) → 업무 앱 역할로 코드 일치 60건 승인 → 마트 미매핑 1,596 → 420, remap 대상 0(품목은 조회 시점 매핑 — 설계대로). 2026-10-05 12차(묶음 ⑩): 마트가 식별자 있는 사실을 조회 시점 매핑으로만 풀어 철회·효력 종료가 바로 반영되고, 매핑 제안이 효력 기간을 보며(끝난 매핑 뒤 사실 → 새 제안), remap 이 적재 버전과 무관하게 계정·기간·배치로 열 수 있다(창고 코드 승인한 날). 운영 DB 적재는 없다(운영 = AWS RDS — 2026-10-03 결정, 계정 전).",
              "evidence": [
                "docs/work-log/2026-10-02_erp-critical-path/evidence/rehearsal-2026-10-02.json",
                "docs/work-log/2026-10-02_erp-critical-path/mapping-criteria.md",
                "cmslab-data-platform/10_플랫폼구현/worker/core/cmslab_worker/mapping_exec.py",
                "docs/work-log/2026-10-03_aws-first-decision/result.md",
                "docs/work-log/2026-10-05_mart-12th/result.md"
              ],
              "next": "AWS RDS 부트스트랩(9~12차 포함) 뒤 운영 ERP 품목 투영(API 노드 — ERP 허용 IP 를 노드 탄력적 IP 로 전환) → 기준표 서명 + RQ-19 뒤 승인(day1-runbook 9절) · 창고 코드 승인 뒤 runbook 3.7 --any-version",
              "updated": "2026-10-05"
            },
            {
              "id": "w2-submit",
              "title": "부서 제출 파일 입구 `cmslab-worker submit`",
              "status": "partial",
              "detail": "구현(로컬 확인). 과도기 files 계약의 부서 제출 파일 1개를 Extractor 경로 그대로 레이크·manifest·개인정보 사본·배치까지 싣는다(10/2 회귀 수정 · 합성 관통). 10/5 묶음 ⑫: 실 파일 관통(01_고객원본 표본 3 — 개인정보 계약 무신사 정산은 열 비우기 사본으로 파싱, LOFT 는 확인 뒤 통과 사본) · MI 양식(web/public/templates/mi_signal_v1.csv 헤더 + 합성 4행) → submit-event → load(mi_signal 매퍼 → core.market_signal 4행) → 자동 공개기 첫 배치 human_queue(no_baseline) → 사람 공개(publish-batch) → 다음 주 파일 → 자동 공개(published) → mart.v_f13_market_signal 8행. 핵심 시험 core 768 passed(1 skip — test_publish 기대값을 8차 7ea1c06 DB 판정에 맞춤).",
              "evidence": [
                "docs/work-log/2026-10-05_file-ingress-close/ingress-pass.json",
                "cmslab-data-platform/10_플랫폼구현/worker/core/cmslab_worker/cli.py",
                "cmslab-data-platform/10_플랫폼구현/worker/core/FILE_INGRESS.md"
              ],
              "next": "운영 수집 노드(AWS 계정 뒤 ⑪)에서 부서 제출 경로를 확정하고 실제 제출로 실행",
              "updated": "2026-10-05"
            },
            {
              "id": "w2-schema-7-10",
              "title": "스키마 7~10차 DDL·관리형 마이그레이션",
              "status": "partial",
              "detail": "7~10차 DDL·관리형 마이그레이션 완료. 2026-10-02 운영과 같은 체인 상태(…120000)의 로컬 PostgreSQL 17 에 Supabase CLI db push 로 7~10차·에이블리·seed-reconcile 을 함께 적용 — mapping_proposal 표·stg_data_row_count 열·v_fx_krw_daily·item_guard_trg 존재, mdm.channel 11행, mdm.item 0행(ERP Read 전 정상). 2026-10-03 결정 — 운영 적용은 Supabase migrate-prod 가 아니라 AWS RDS 부트스트랩이다(03_ 에 7~10차 포함). 운영 미적용(AWS 계정 전).",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/managed/supabase/migrations/20260929200000_erp_item_projection.sql",
                "docs/work-log/2026-10-02_ops-db-apply/result.md",
                "cmslab-data-platform/10_플랫폼구현/infra/RUNBOOK.md",
                "docs/work-log/2026-10-03_aws-first-decision/result.md"
              ],
              "next": "AWS 계정 수령일 RUNBOOK 5단계 — 빈 RDS 에 03_ 적용 → mapping_proposal 표 · item_guard_trg · mdm.channel 11행 확인 → done",
              "updated": "2026-10-03"
            }
          ],
          "updated": "2026-09-30"
        }
      ]
    },
    {
      "id": "connectors",
      "title": "ERP·API·환율 수집",
      "description": "조회 전용 ERP, API 사건, 기준 환율의 세 구현 레인.",
      "groups": [
        {
          "id": "lane-erp",
          "title": "ERP 조회 전용 연결",
          "items": [
            {
              "id": "erp-views",
              "title": "ERP 조회 전용 계정·4개 뷰 SQL 준비",
              "status": "done",
              "detail": "메타데이터 수집·조회 계정·확인된 테이블 기반 4개 뷰·권한 점검·회수 SQL을 작성했다. 고객 DB 적용 완료를 뜻하지 않는다.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                "cmslab-data-platform/10_플랫폼구현/erp/03_조회전용_뷰.sql"
              ]
            },
            {
              "id": "erp-collector",
              "title": "ERP 일 단위 추출기·파서 구현",
              "status": "done",
              "detail": "조회 전용 연결, 하루 창 추출과 core 계약에 맞춘 ERP 파서 구현을 마쳤다. 10/5 결함 수정(묶음 ㉓ — 로컬 확인): 형식만 맞는 틀린 회사코드 · 필터 코드면 수집 직전 존재 확인으로 막고(not_configured) 28일 이상 창이 전부 0행이면 원본을 내지 않음(0행 원본이 window_replace 로 두 달치를 비우던 경로 차단) · REPLY_ 자리표시자 거부 · 1205·1222 그 날짜만 재시도 · 날짜 선두 인덱스 없으면 사유 필수 · diag/reconcile 실 Read 게이트 · 민감 약어(NM_CEO·NO_RES·EMP·ADS·ID_) · host,port 표기 · 설정 오류 재시도 없음. ERP 시험 205 passed · 20 skipped. 2026-10-14 사용자 테이블 3,359개·115,170,363행의 1회 전체 raw 확보·검증은 별도 export 경로로 완료했다. 이 하루 창 collector의 원천별 업무 계약 실행·운영 적재는 아직 0회다. 2026-10-15 Gate 3(로컬 확인): 운영 worker · run-job 공통 ERP 세션 상한 2 · 원본 SELECT 뒤 같은 조건 COUNT_BIG · SUM 통제(불일치면 배치 없음) · MAXDOP 1 · 추출/통제 관측 구간 기록 · 공개 checkpoint(마이그레이션 200019, RDS 판 200021).",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/cmslab_erp/collector.py",
                "docs/work-log/2026-10-05_fix-connectors/result.md",
                "docs/work-log/2026-10-15_erp-ingestion-execution/result.md",
                "docs/work-log/2026-10-15_erp-ingestion-execution/evidence.json"
              ],
              "next": "AWS 개설 뒤 migration(200019 · 200021) → worker 이미지 → shadow 측정 · 오너 승인 뒤 일정 켜기. 첫 운영 Read 에서 CP949 varchar 변환 · 회사 존재 확인 비용 확인(README 한계)",
              "previous_status": "done",
              "updated": "2026-10-15"
            },
            {
              "id": "erp-tests",
              "title": "ERP 검증",
              "status": "done",
              "detail": "128 passed, 11 skipped.",
              "evidence": [
                "docs/work-log/2026-09-27_platform-phase2-continuation/result.md"
              ]
            }
          ]
        },
        {
          "id": "lane-apis",
          "title": "API·웹훅·SP-API",
          "items": [
            {
              "id": "apis-connectors",
              "title": "22행·30계약 API collector/parser 구현",
              "status": "done",
              "detail": "분류 원장의 API 계열에 대해 api_record·webhook·refetch 경로를 구현했다. 비공개 원천의 응답·자격 확인은 후속이다.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md"
              ]
            },
            {
              "id": "apis-idempotency",
              "title": "사건 멱등·자격 회전·로그 보호 구현",
              "status": "done",
              "detail": "계정별 event key, 인증 재조회와 회전 토큰 분리, SP-API 외부 식별자 로그 차단을 적용했다. 재조회도 계약 효력 범위 안에서만 실행한다.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/worker/core/cmslab_worker/push_events.py",
                "cmslab-data-platform/10_플랫폼구현/worker/core/cmslab_worker/event_exec.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/sp_notifications.py"
              ]
            },
            {
              "id": "apis-tests",
              "title": "API 검증",
              "status": "done",
              "detail": "425 passed·3 skipped; notification 23 passed.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "docs/work-log/2026-09-27_platform-phase2-continuation/code-review.md"
              ]
            }
          ]
        },
        {
          "id": "lane-fx",
          "title": "환율·reference 원천",
          "items": [
            {
              "id": "fx-parser",
              "title": "한국수출입은행 환율 수집·파서 구현",
              "status": "done",
              "detail": "환율 계약 등록, 단위 환산과 Decimal 기반 파싱을 구현했다. 실원천 호출 시험 1건은 게이트로 건너뛰었다. 10/5 결함 수정(묶음 ㉓ — 로컬 확인): 「오늘」 일정을 12시간 간격(11:30 · 23:30)으로 — 주말 · 공휴일 빈 응답이 실패(not_arrived) 대신 polled. FX 시험 136 passed · 1 skipped(PG 포함). 2026-10-11(구현 — 로컬 확인): 10/11 결정으로 환율 계약 · 일정 · 목적지 선언을 시드에 넣었다(32_ 밖 참조 원천 — 계약 189 중 1, 12/23 auto · 공개 보류 없음). 수동 SQL 단계가 없어졌다 — connectors/fx/sql/seed_contract.sql 은 참고용 사본(생성물). 일정 2개는 인증키 전이라 꺼져 있다. 운영 체인은 15차 마이그레이션 20260929200016 이 같은 행을 넣는다(임시 PG16 — 체인 시드 정합 remaining 0).",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/fx/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/fx/sql/seed_contract.sql",
                "docs/work-log/2026-10-05_fix-connectors/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/2a87405/docs/work-log/2026-10-11_fx-source-first/result.md"
              ],
              "next": "수출입은행 인증키 발급 · 비밀 등록(cmslab/api/kexim_fx/ap01) → fx 일정 2개 켜기 → 실호출 1회로 result=1 행 필드 확인(README 한계)",
              "previous_status": "done",
              "updated": "2026-10-11"
            },
            {
              "id": "fx-reference",
              "title": "reference system_type",
              "status": "done",
              "detail": "생성기·DDL·FX 시험에서 reference 수용.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/99_생성도구/platform_arch_spec_tables.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/fx/README.md"
              ]
            },
            {
              "id": "fx-tests",
              "title": "FX 검증",
              "status": "done",
              "detail": "134 passed·1 skipped.",
              "evidence": [
                "docs/work-log/2026-09-27_platform-phase2-continuation/result.md"
              ]
            }
          ]
        }
      ]
    },
    {
      "id": "adapters",
      "title": "파일·시트·포털 수집",
      "description": "파일 파서, Google 변경 감시, 브라우저 수집 공통 틀.",
      "groups": [
        {
          "id": "lane-files",
          "title": "파일 파서",
          "items": [
            {
              "id": "files-artifact",
              "title": "8채널 파일 파서·기간·통제합계 구현",
              "status": "done",
              "detail": "채널별 파일 파서에 artifact 구분, 기간·통제합계·parser version·skipped rows를 반영했다. 올리브영 재고 기준일 오류도 수정했다.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md"
              ]
            },
            {
              "id": "files-tests",
              "title": "파일 검증",
              "status": "done",
              "detail": "통합 84 passed.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                "docs/work-log/2026-09-27_platform-phase2-continuation/result.md"
              ]
            }
          ]
        },
        {
          "id": "lane-sheets",
          "title": "Google Sheets·Drive",
          "items": [
            {
              "id": "sheets-drive",
              "title": "Sheets·Drive 카탈로그와 변경 감시 구현",
              "status": "done",
              "detail": "38행 카탈로그, Drive changes, 시트 스냅샷·헤더 변경 감시·문서 감시를 구현했다. 카탈로그 등록은 고객 연결 완료와 구분한다. 10/5 공유 문서함 전수조사(공유 문서함 135개 판정 → 도메인 검색 · 링크 크롤링 · 큰 시트 20개 전 탭 읽기) 결과로 10/6 카탈로그를 실데이터에 다시 묶었다(로컬 확인): #11 판매계획은 맞는 탭이 0개였던 옛 두 객체를 새 5객체로 · #9 TODAY 탭 3개 추가 · #53 「매출」 탭 30개를 한 객체로 · #59 핀 탭 교정 · #7 공급계획은 헤더 계약에서 월 · 주차 열을 빼 월이 바뀌어도 수집이 멈추지 않게 했다. 카탈로그 검사 오류 0 · 시드 생성물 최신.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/9fc92f0/docs/work-log/2026-10-06_catalog-rebind/plan.md",
                "docs/work-log/2026-10-06_seed-reconcile/result.md"
              ],
              "next": "정리할 운영 설정이 아직 없다 — 2026-10-11 확인: 맥미니 · 맥북 · 리포 · AWS 노드 어디에도 원천별 설정(api-config · CMSLAB_API_CONFIG)이 없고 상시 수집도 돌지 않는다(맥미니 로컬 러너는 계획만 있었다). AWS API 노드 개설 전에 설정 전달 경로를 정하고, 개설 때 카탈로그 기준으로 새로 만든다 → 원천별 첫 수집에서 새 탭 확인",
              "previous_status": "done",
              "updated": "2026-10-11"
            },
            {
              "id": "sheets-pii",
              "title": "PII redactor·commit",
              "status": "done",
              "detail": "sheets-pii/v2 개인정보 제거와 core 적재 뒤 커서 확정 경계를 구현했다. 헤더가 불명확한 민감 필드는 임의 통과시키지 않는다.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/cmslab_sheets/redactor.py",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md"
              ]
            },
            {
              "id": "sheets-tests",
              "title": "Sheets 검증",
              "status": "done",
              "detail": "161 passed.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "docs/work-log/2026-09-27_platform-phase2-continuation/result.md"
              ]
            }
          ]
        },
        {
          "id": "lane-portal",
          "title": "브라우저 포털",
          "items": [
            {
              "id": "portal-skeleton",
              "title": "14개 포털용 공통 runner·OTP·queue 골격",
              "status": "done",
              "detail": "Stagehand runner, OTP 대기, 큐 및 manifest 경계를 준비했다. 포털별 실제 로그인·수집 성공을 뜻하지 않는다.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
              ]
            },
            {
              "id": "portal-safety",
              "title": "약관·봇계정·action gate",
              "status": "partial",
              "detail": "fake portal 시험 완료. 실제 14곳 로그인·약관 확인 안 함. 2026-10-03 공개 약관 14곳 재확인 — 허용 0 · 불명 8 · 금지 신호 6. 직접 금지 조항 원문 2곳(쿠팡 서플라이어 허브 이용약관 제8조 7호, Qoo10 会員規約 第18条 9号), 참고 근거 4곳(B마트·컬리·무신사·쿠팡 광고센터). 판정은 registry 게이트 약관 값(allowed/unknown/prohibition_signal)과 일치시켰고, 금지 신호 강 3곳(쿠팡 2곳 · Qoo10)은 착수 보류(hold). 실제 로그인·로그인 뒤 약관 확인 0, 차단으로 못 본 URL 7개는 사람 확인 필요. 10/5 결함 수정(묶음 ㉔ — 구현(로컬 확인)): 봇 확인(캡차)·차단 안내·OTP 재요구 화면을 로그인 전·제출 뒤·단계마다 감지해 lock_risk + 서킷 즉시 개방(우회 0 — 36_ 11번) · 동작 사이 최소 1.5초 + 지터 · 날짜 사이 3초 · 하루 단위 실행당 최대 16일(백필은 나눔) · 약관판단표 4절 동의 문구를 실제 호출량(하루 1회 로그인 · 접속당 최대 16일치 약 70동작)으로 고침 · 차단 낱말에 요소 이름(id·name·class)·약어(del·upd 등) 추가, 주문 조회 주소(order)는 통과, 메뉴 화면 글자 없는 요소 거부 · 도메인 정책을 최상위(allowed_domains)·하위 요청(subresource_domains)으로 나누고 막힌 호스트를 blocked_hosts 알림으로 · 기록 실행에서 입력한 아이디·OTP 가 접근성 트리로 모델에 가던 것을 입력 전 일괄 관찰로 막음(합성 기록 실행 덤프로 확인). 실 포털 로그인 0.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/worker/portal/docs/약관판단표.md",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/src/portals/registry.ts",
                "docs/work-log/2026-10-03_collection-lanes-rest/portal-terms.md",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/src/actions/policy.ts",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/src/login.ts",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/src/steps.ts",
                "docs/work-log/2026-10-05_fix-portal/result.md"
              ],
              "next": "금지 신호 6곳은 L7 보류 — 파일 정기 제공·공식 수단(API·예약 보고서)·서면 동의 먼저(38-drafts C-1~C-4). 차단 URL 7개 사람 확인(약관판단표 5절). 봇 계정 요청 문안의 「하루 1회」를 실제 호출량으로 보정(fix-portal 38-drafts E-1 — 루트 판단). 나머지는 고객 봇계정·로그인 뒤 약관·허용 action 확인 후 포털별 실제 수집 검증 — 첫 기록 실행에서 blocked_hosts 로 subresource_domains 실측.",
              "previous_status": "partial",
              "updated": "2026-10-05"
            },
            {
              "id": "portal-tests",
              "title": "포털 로컬 검증",
              "status": "done",
              "detail": "unit·브라우저 E2E 합계 198 passed (2026-10-05 묶음 ㉔ 뒤 — 합성 원천 흐름 12곳 · 가짜 포털 변형(보안문자 · 다른 호스트 스크립트 · 읽기 전용 날짜칸 · 공지 레이어 · iframe) 포함).",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                "docs/work-log/2026-09-27_platform-phase2-continuation/result.md",
                "docs/work-log/2026-10-05_fix-portal/result.md"
              ],
              "next": null,
              "previous_status": "done",
              "updated": "2026-10-05"
            }
          ]
        },
        {
          "id": "wave2-adapters",
          "title": "수집 어댑터 V2·웨이브 2 매퍼",
          "items": [
            {
              "id": "adapter-v2",
              "title": "수집 어댑터 V2 P0~P4 반영·원장 34 해결",
              "status": "partial",
              "detail": "구현(로컬 확인). 07_ §9 기준 P0~P3 통합 구현과 P4 체크리스트를 마쳤다. 원장 34 는 portal 0a633fc 로 해결(MR !10). P4 게이트 시험 2건은 속도 우선 규칙으로 작성하지 않았다(원장 62). 남은 것은 운영 배포뿐 — 배포 이미지(worker/Dockerfile, uv sync --all-packages)에 core·전 플러그인이 들어 있음을 RUNBOOK 11절에서 대조했다. 배포 순서 DDL → 시드 002·003 → 워커(사건 소비자) → 웹훅 Lambda(README 4절).",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/07_수집어댑터_V2.md",
                "cmslab-data-platform/10_플랫폼구현/infra/RUNBOOK.md"
              ],
              "next": "RUNBOOK 5단계(시드 002·003) · 7단계(워커 이미지) 뒤 NULL 계정 키 0건 · 웹훅 DLQ 0 · `cmslab-worker plugins` 목록 확인(RUNBOOK 11절)",
              "updated": "2026-10-02"
            },
            {
              "id": "w2-mappers",
              "title": "stg → core 매퍼 21개",
              "status": "partial",
              "detail": "구현(로컬 확인). 매퍼 없음이던 18계약을 통합했다. 최종 명세는 Implemented 10·Proposed 8이며, Proposed는 GEC Make 2·ERP 5·TikTok 주문 1이다. CONTRACT_TARGETS mapper 플래그는 15 True·3 False다. False는 GEC 엔진 후보 2와 사실을 내지 않는 TikTok 진단 매퍼 1이다. 시트 7계약은 실/가림 staging과 후보 staging, ERP 5계약은 합성, Amazon 3·TikTok/Shopify 3계약은 공식 모양/픽스처·합성 입력으로 확인했다. 통합 채널 시드·target gate·카탈로그 생성물과 단일 마이그레이션을 반영했다. 2026-10-15 ERP 갱신: 7월 실데이터로 ERP 매퍼를 actual 실행해 사실 = core · 제약 위반 0. ERP 명세 8개 중 Implemented 5(MA_PITEM · FI_BAND · MA_PARTNER · medical · oliveyoung 셀인), Proposed 3(MM_QTIO — 단위 123행, FI_DOCU — 10805 외화 47행, reverse_dm — 관리분류 효력). 18계약 기준 Proposed 는 8 → 6. 구매 · 외주 4명세는 active catalog 밖 초안이다. 운영 AWS · 실 API Read 는 0이다.",
              "evidence": [
                "docs/work-log/2026-10-12_mapper18-integration/result.md",
                "docs/work-log/2026-10-12_mapper-sheets/result.md",
                "docs/work-log/2026-10-12_mapper-erp/result.md",
                "docs/work-log/2026-10-12_mapper-amazon/result.md",
                "docs/work-log/2026-10-12_mapper-tiktok-shopify/result.md",
                "docs/work-log/2026-10-14_erp-remaining-rules/result.md",
                "docs/work-log/2026-10-15_erp-domain-execution/decision-register.md",
                "docs/work-log/2026-10-15_medical-ar-inference/platform.md"
              ],
              "next": "Proposed 6계약(GEC Make 2 · TikTok 주문 1 · ERP 3)의 실원천 조건을 해소해 승격하고 첫 운영 배치의 사실 수 · 예외 · 권위 중복을 대조한다. #43/#69와 Make/API 효력기간 중복은 동시 공개 전에 닫는다.",
              "updated": "2026-10-15"
            },
            {
              "id": "w2-file-redactor",
              "title": "파일 개인정보 사본 제거기 — 지그재그·에이블리 주문·라쿠텐",
              "status": "partial",
              "detail": "구현(로컬 확인). raw_has_pii 파일 계약 3개(지그재그·에이블리 주문·라쿠텐)에 제거기를 등록했고 core 는 사본 없는 개인정보 계약의 처리 회차를 열지 않는다. 남은 것은 운영 배포뿐 — 같은 워커 이미지(adapters/files 포함)에 들어 있음을 RUNBOOK 11절에서 대조했다. 실패·나중 등록분은 사본 뒤채움 1시간 일정(infra events.tf redact-backfill)이 채운다. 웹훅 원문 제거기(operations-redaction)와는 별개다.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/cmslab_files/redact.py",
                "cmslab-data-platform/10_플랫폼구현/infra/RUNBOOK.md"
              ],
              "next": "RUNBOOK 7단계 뒤 첫 실제 제출 파일(웹 업로드 트리거 또는 submit) 1건의 redacted_sha256 · 사본 manifest kind=redacted_copy 확인",
              "updated": "2026-10-02"
            }
          ],
          "updated": "2026-09-30"
        }
      ]
    },
    {
      "id": "web",
      "title": "업무 화면과 출처 표시",
      "description": "사전구현 화면과 합성 데이터 검증. 고객 인수 완료와 구분.",
      "groups": [
        {
          "id": "web-ui",
          "title": "화면",
          "items": [
            {
              "id": "web-features",
              "title": "F01–F13·운영 화면·healthz 구현",
              "status": "done",
              "detail": "합성 seed·mart view 기반 조회 화면과 데이터 부족·차단 상태를 구현했다. 모든 업무 기능의 실데이터 완성 또는 고객 인수를 의미하지 않는다.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/web/README.md"
              ]
            },
            {
              "id": "web-provenance",
              "title": "원천·효력·대기·Aging 표시 보강",
              "status": "done",
              "detail": "6차 원천 정보, 효력 종료, raw/첫 공개 대기와 Aging을 표시한다. 가격 기준 혼합을 경고하며 F02 합성 회계 본문과 폴더 감시 계약을 분리했다.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/web/src/lib/queries/provenance.ts",
                "cmslab-data-platform/10_플랫폼구현/web/src/app/(app)/f02/page.tsx"
              ]
            },
            {
              "id": "web-tests",
              "title": "웹 검증",
              "status": "done",
              "detail": "unit114·DB111·E2E41·type/lint/build 통과.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/web/README.md",
                "docs/work-log/2026-09-27_platform-phase2-continuation/result.md"
              ]
            },
            {
              "id": "web-tls",
              "title": "RDS IAM·CA 기동 검증과 TLS 우회 차단",
              "status": "done",
              "detail": "CA 번들·역할별 DSN 검사를 추가하고 DSN의 TLS 설정 우회를 차단했다. 실제 IAM 연결은 후속 검증이다.",
              "evidence": [
                "docs/work-log/2026-09-27_platform-phase2-continuation/result.md",
                "docs/work-log/2026-09-27_platform-phase2-continuation/code-review.md"
              ]
            }
          ]
        },
        {
          "id": "wave2-web",
          "title": "웨이브 2 매핑 승인·원화 표시",
          "items": [
            {
              "id": "w2-web-mapping",
              "title": "매핑 승인 작업함 `/ops/mapping`·원화 합산 화면",
              "status": "partial",
              "detail": "구현(로컬 확인). 제안 품목이 없는 식별자 제안은 외부 식별자 원문으로 품목을 자동 검색해 「코드 일치」·「부분 일치」를 표시하고, 코드 일치가 1건이면 미리 고른다. 승인 기준표 T1~T4 와 승인 주체를 정했다. 10/5 묶음 ⑲: 앱 로그인 AWS 전환(ALB 서명 헤더 x-amzn-oidc-data 검증 · CMSLAB_AUTH=alb)을 코드로 해소하고 화면 클릭(렌더된 승인 폼 POST)을 처음 확인했다 — 그 과정에서 기존 결함(9/29부터 품목 식별자 제안 승인이 늘 err=invalid — 폼에 없는 창고 칸을 zod 가 거부)을 고쳤다. alb 모드 확인 7/7: 헤더 없음·reader·finance·위조 서명·다른 signer·개발 쿠키 6건 거부 → ops 승인 → ctl.mapping_proposal decided_by · mdm.identifier_mapping approved_by = 로그인 이메일, evidence_ref = 제안. 운영 RDS 승인은 아직 없다. 2026-10-11: 1단계(코드 일치)는 화면 대신 일괄 도구(cmslab-worker mapping-tier1 — !179)로 승인하고, 승인 행은 같은 화면(승인 목록 · 되돌리기)에 근거 「tier1 … 표본 해시」로 보인다. 2 · 3단계는 이 작업함이 받는다.",
              "evidence": [
                "docs/work-log/2026-10-05_web-auth-aws/result.md",
                "docs/work-log/2026-10-05_web-auth-aws/mapping-check.json",
                "docs/work-log/2026-10-05_web-auth-aws/alb-check.json",
                "cmslab-data-platform/10_플랫폼구현/web/src/app/(app)/ops/mapping/actions.ts",
                "cmslab-data-platform/10_플랫폼구현/web/src/lib/alb-oidc.ts",
                "docs/work-log/2026-10-02_erp-critical-path/mapping-criteria.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/2a87405/docs/work-log/2026-10-11_item-mapping-tier1/result.md"
              ],
              "next": "AWS 계정 → RDS(9·10차) → ERP 품목 투영 → 기준표 고객 서명(10/8) · RQ-19 → ⑪ 인프라 배선(CMSLAB_AUTH=alb 환경변수 · GOOGLE_WIF_CONFIG · /signed-out 무인증 규칙 — 묶음 ⑲ fyi-bundle11.md) · 그룹 platform-ops(⑥ 38-drafts A) · Groups Reader 할당(⑲ 38-drafts A) 뒤 운영 승인 1건",
              "updated": "2026-10-11"
            }
          ],
          "updated": "2026-09-30"
        }
      ]
    },
    {
      "id": "verification",
      "title": "숫자 검증과 통합 인계",
      "description": "과거 실행 결과를 근거로 인용한다. 이번 작업은 문서 검증만 수행.",
      "groups": [
        {
          "id": "verify-rules",
          "title": "채널 규칙",
          "items": [
            {
              "id": "verify-channels",
              "title": "10개 채널·공통 묶음의 규칙과 질문 작성",
              "status": "done",
              "detail": "면세 5곳·올리브영·자사몰·라쿠텐·지그재그·에이블리, 공통 묶음을 포함해 11개 질문 그룹·108개 고객 확인 질문을 정리했다.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/41_숫자맞추기_검증묶음/README.md",
                "cmslab-data-platform/00_프로젝트작업실/41_숫자맞추기_검증묶음/00_README.md"
              ]
            },
            {
              "id": "verify-tests",
              "title": "채널별 검증기·합성 회귀·누출 검사 도구 작성",
              "status": "done",
              "detail": "원천과 가공본의 수량·금액을 대조하는 검증기와 합성 시험을 작성했다. 개별 채널의 원천 부족·기간 차이는 별도 판정한다.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/41_숫자맞추기_검증묶음/verify/common.py",
                "cmslab-data-platform/00_프로젝트작업실/41_숫자맞추기_검증묶음/tests/test_leak_scan.py"
              ]
            },
            {
              "id": "verify-source-results",
              "title": "실제 표본의 일치·불일치·미확인 구분",
              "status": "partial",
              "detail": "2026-10-03 갱신 — 누출 검사 읽기 실패 0: 재실행 결과 적중 0 · 읽기 실패 0(종료 코드 0). 9/27 실패 4건의 원인 3종(CJ온스타일 xlsx 스타일 표 `<xf count>` 스키마 위반 · 무신사 XML 스프레드시트 2003 · 무신사 HTML 위장 xls)을 `verify/readers.py`(첫 바이트로 형식 판별)로 읽었다. 「전체 정합성 확정 불가」를 22건으로 다시 나눴다 — 원천 누락 9 · 기간 차이 4 · 규칙 미확정 9. 원천 누락·기간 차이 13건은 10/30 접근·제공 뒤 같은 명령 재실행으로 우리가 닫고, 규칙 미확정 9건만 고객 결정이다(플랫폼은 42_ G 기본값으로 이미 진행, 기본값이 없던 2건은 분류표 3.1 에서 정함). 표본 안 재현 수치는 바뀌지 않았다. 2026-10-14~15 ERP 실데이터: 7월 공식 엑셀 내부 대사(57,884행 · 549 집계키 불일치 0) · FI GL 9계정 9/9 exact · EC 출고 수량 23,487키 exact 를 일치로, EC 가격 4,122키(5 · 6월에도 반복, 10/15 역회계 규칙 v1 로 7월 99.88% 재현 — 검증 대기) · GL 범위 2분류 · 채권 321 거래처 · 계정을 「불일치 — 원인 미확인」으로 나눴다.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/41_숫자맞추기_검증묶음/00_정합성_미확정_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/41_숫자맞추기_검증묶음/README.md",
                "cmslab-data-platform/00_프로젝트작업실/41_숫자맞추기_검증묶음/verify/readers.py",
                "cmslab-data-platform/00_프로젝트작업실/41_숫자맞추기_검증묶음/00_README.md",
                "docs/work-log/2026-10-14_erp-july-reconciliation/result.md",
                "docs/work-log/2026-10-15_erp-domain-execution/result.md",
                "docs/work-log/2026-10-15_erp-residual-resolution/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/362dec2d/docs/work-log/2026-10-15_price-reverse-accounting/result.md"
              ],
              "next": "고객 10/30 전량 제공 뒤 첫 적재 주간(11/3~11/13)에 분류표 2절 13건 재실행 · 3절 9건은 10/7 미팅 승인표(묶음 ⑧)로 결정 → 채널 규칙가설 상태 갱신 · ERP 불일치 3종은 받은 원천 안에서 역회계(7월 적합 → 다른 달 반증)",
              "previous_status": "partial",
              "updated": "2026-10-15"
            }
          ]
        },
        {
          "id": "review-records",
          "title": "리뷰·인계·병합",
          "items": [
            {
              "id": "reviews-code",
              "title": "코드 리뷰 APPROVE",
              "status": "done",
              "detail": "미해결 0.",
              "evidence": [
                "docs/work-log/2026-09-27_platform-phase2-continuation/code-review.md"
              ]
            },
            {
              "id": "reviews-architecture",
              "title": "독립 아키텍처 검토 기록 확보",
              "status": "done",
              "detail": "판정 WATCH. 사전구현 병합 차단은 없으며 실운영 활성화 조건은 남겼다. WATCH 해소 완료를 의미하지 않는다.",
              "evidence": [
                "docs/work-log/2026-09-27_platform-phase2-continuation/architecture-review.md"
              ]
            },
            {
              "id": "reviews-handoff",
              "title": "MacBook → Mac mini 인계 및 PR #30 병합",
              "status": "done",
              "detail": "원본 Claude 중단, 미완료 4개 레인과 대화 기록 보존·이전, 현재 Codex에서 통합·검증을 마쳤다. PR #30은 main에 병합됐다.",
              "evidence": [
                "docs/work-log/2026-09-27_platform-phase2-continuation/result.md",
                "https://github.com/wishket-aidp/cms-lab/pull/30"
              ]
            }
          ]
        },
        {
          "id": "wave2-harness",
          "title": "웨이브 2 회귀 하네스와 로컬 관통",
          "items": [
            {
              "id": "w2-harness-f11",
              "title": "F11 회귀 하네스 — 41_ 기대값 ↔ 매퍼 같은 키 대조",
              "status": "partial",
              "detail": "구현(로컬 확인). 41_ `--emit-expected` 기대값과 매퍼 결과를 같은 키로 대조한다. 2026-10-03 — 한 채널에 표본 여러 벌을 두는 구조를 더했다(CLI 키는 따로 · 규칙 ID 접두어는 같게 · 벌마다 따로 대조해 한 벌의 하락이 가려지지 않음 · sample_result 는 「[표본] 요약」으로 이음 · 결과 끝 「표본 수(벌)」). `01_고객원본` 전수 확인 결과 둘째 벌은 지그재그 정산뿐이다 — `zz`(2026-09 정산 + 주문) · `zz-2608`(2026-08 정산, 9/7 영업팀 샘플, 정산 키 겹침 0) 모두 100%. 자사몰 9/7 사본은 4시트 셀 값이 같아 둘째 벌이 아니다. 올리브영 · 면세 · 자사몰 · 라쿠텐 · 에이블리는 표본 1벌 — 추가 기간은 10/30 접근 후. 7개 실행 모두 기준선 하락 0(종료 코드 0), 검사 키 합 기준 올리브영 99.87% · 면세 100% · 자사몰 99.99% · 라쿠텐 99.85% · 지그재그 100%(2벌) · 에이블리 100%. 하락이 없어 매퍼 수정은 없었다.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/worker/mappers/cmslab_mappers/harness/cli.py",
                "cmslab-data-platform/10_플랫폼구현/worker/mappers/cmslab_mappers/harness/vertical.py",
                "cmslab-data-platform/00_프로젝트작업실/42_웨이브2_의미매핑_인계/README.md",
                "docs/work-log/2026-10-03_numbers-close/result.md"
              ],
              "next": "10/30 접근 뒤 채널마다 둘째 벌(같은 달 면세 원본·가공 쌍 · RMS 주문 · 부서 가공본)을 키로 더해 재실행 → w2-schema-7-10(운영 DB 반영) 뒤 sample_result 를 운영 rule_version 에 기록",
              "updated": "2026-10-03"
            },
            {
              "id": "w2-rakuten-judgement",
              "title": "라쿠텐 3·6월 원화 키 휴먼에러 판정",
              "status": "partial",
              "detail": "RQ-04·RQ-05(3/4·3/5 원화 칸의 엔화 입력, 3/6·6/5 공란)를 부서 입력 결함으로 판정했다(2026-09-29, 위시켓 PM). 매퍼는 일 JPY × 환율 규칙값을 쓰고, 하네스는 두 달의 원화 파생 키 8개(RK-11 6 · RK-13 2)를 대조에서 빼고 따로 센다. 2026-10-03 고객용 통보 1쪽(날짜 · 칸 · 결함 · 영향 3월 72.1% · 6월 87.8% · 처리 방식 · 부서 입력 규칙 · 이견 기한 10/14)을 썼고 묶음 ⑧ 미팅 자료로 넘겼다. 아직 보내지 않았다.",
              "evidence": [
                "docs/work-log/2026-10-03_numbers-close/38-drafts.md",
                "cmslab-data-platform/00_프로젝트작업실/41_숫자맞추기_검증묶음/08_라쿠텐/고객확인질문.md"
              ],
              "next": "사용자가 10/7 미팅에서 전달하거나 메일로 발송 → 보낸 날 done",
              "updated": "2026-10-03"
            },
            {
              "id": "w2-local-e2e",
              "title": "라쿠텐 실제 파일 로컬 관통 — submit → load → core → 매핑 제안",
              "status": "partial",
              "detail": "2026-10-02 로컬 재현: submit → load → core 1,596 → 제안 81 → 공개(9/30 수치 그대로). 합성 ERP 품목으로 승인 → 마트 품목 연결까지 사슬을 확인했다(품목 수량 1,176행 · 미매핑 420 남음 · remap dry-run 0). ERP 품목이 합성이라 done 이 아니다 — 실 MA_PITEM Read 로 같은 순서를 다시 돈다.",
              "evidence": [
                "docs/work-log/2026-10-02_erp-critical-path/evidence/rehearsal-2026-10-02.json",
                "docs/work-log/2026-10-02_erp-critical-path/day1-runbook.md"
              ],
              "next": "허용 → day1-runbook 단계 4~8(실 품목) → 승인 수·미매핑 전후·remap 0 을 증거로",
              "updated": "2026-10-02"
            }
          ],
          "updated": "2026-09-30"
        }
      ]
    },
    {
      "id": "operations",
      "title": "운영 전환과 남은 작업",
      "description": "외부 사실·배포·실행 경로·Wave 2가 남아 있다.",
      "groups": [
        {
          "id": "activation-external",
          "title": "고객 사실과 운영 환경",
          "items": [
            {
              "id": "operations-amazon",
              "title": "Amazon anchor",
              "status": "blocked",
              "detail": "2026-10-03 갱신 — 고객 확인서(마켓별 최근 정산 기간 2개 · 지급 방식, 로그인 정보 불필요)와 반영 절차를 만들었다: 결정 규칙(14일 자동이면 anchor = 최근 기간 종료일 · 기한 3일, 수시 이체·일 지급이면 NULL 유지, 마켓별 경계가 다르면 최대 매출 마켓 기준) · csx mig 마이그레이션 틀(schedule_id 기준 — account_code 자리표시자에 걸지 않음, 다시 적용 0행). 회신 전 — NULL 유지. 10/7 미팅 안건 E-2(확인서 회신 10/14) — 결정 미기록.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/52_10-7미팅_패키지/09_Amazon정산주기_확인서_고객용.md",
                "cmslab-data-platform/00_프로젝트작업실/52_10-7미팅_패키지/09_Amazon정산주기_반영_대내.md",
                "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/9fc92f0/docs/work-log/2026-10-07_meeting-result/%EA%B2%B0%EC%A0%95%EA%B8%B0%EB%A1%9D.md"
              ],
              "next": "10/14 GEC팀 · 일본사업팀 회신(없으면 SP-API 연결 뒤 첫 정산 보고서 2개) → AWS 부트스트랩 전이면 시드(db/seeds Amazon settlement 일정 publish_*)에 넣어 부트스트랩에 포함, 뒤면 csx mig amazon-settlement-anchor → RDS 변경 경로(⑪). Supabase migrate-prod 는 쓰지 않는다(10/3 결정 · 10/5 정정)",
              "previous_status": "blocked",
              "updated": "2026-10-07"
            },
            {
              "id": "operations-live",
              "title": "실제 고객 연결·AWS 운영 배포",
              "status": "pending",
              "detail": "2026-10-03 사용자 결정 — 운영은 AWS 로 시작한다(Supabase 운영 반영 · Vercel 운영 배포 없음). 고객 AWS 계정 대기(업체 견적 비교 중, 10/1 · 확정서 제안 10/13 · 10/7 미팅 1순위). 계정이 오는 날 하루 안에 적용할 runbook(infra/RUNBOOK.md). 2026-10-05 묶음 ⑪ 이 우리 쪽 선행을 모두 코드로 닫았다: RDS 변경 경로(R4 — 부트스트랩 1회 뒤 CI rds-migrate 하나) · 웹 묶음 로그인 IAM 배선 · API 노드 지속 상태 볼륨 · SES 수신 타이머 · 웹 업로드 권한 · ⑲ 앱 로그인 배선 · 운영 이미지 4개 맥미니 빌드(worker Dockerfile 결함 수정). RUNBOOK 0-1 에 계정 개설 주체(고객 직접 / 업체 대행)별 권한표. 남은 차단은 모두 고객: AWS 계정 · OAuth 내부 클라이언트 · Groups Reader(앱 로그인) · DNS 6건. 앱 로그인 코드는 ⑲(ALB 서명 헤더 · CMSLAB_AUTH=alb). 10/5 ⑳ 이 합친 main 전체를 다시 돌렸다(결과 integration-close result 6절). 10/5 묶음 ㉑(코드 전수 검토 결함 21건 — 웹 · infra · CI): 공개 조회 노출을 이중으로 막았다(ALB 로그인 꺼짐 + 공개 조회면 443 고정 403 · 웹은 AWS 에서 서명 헤더 검증된 요청만 reader) · RDS 변경 경로 역할은 보호된 main 만(sub 에 ref_protected:true — GitLab 프로젝트 설정 필요) · apply 는 계획 해시 필수 · TikTok 토큰 회전 권한 · 태스크 실패 알림 · 레이크 덮어쓰기 금지 대상 · 원본 삭제 = pii AND purge 태그 · 부트스트랩 환경 분리 · 상태 버킷 관리자만 · 상태 볼륨 교체 방지. 로컬 확인: infra check.sh EXIT 0(terraform test 10/10 · checkov 634/0) · 웹 단위 144 · DB 200 · build. 10/7 미팅: AWS 운영·개발 계정 개설과 위시켓 접근 승인(A-1 · A-2), 개설일 10/12(월). 10/5 결정: 위시켓 명의 계정에서 먼저 올렸다가 옮기는 안은 쓰지 않고, 고객 소유 계정이 열린 뒤 그 위에 처음부터 올린다(옮기는 날 탄력적 IP 가 바뀌어 ERP 허용 IP 를 다시 요청해야 하고, 그동안 고객 운영 데이터가 위시켓 계정에 남는다). 2026-10-10 갱신 — 10/8 회신: AWS 는 「계약 후 진행」(#1), OAuth 클라이언트는 「서비스 계정(#3) 다음 작업」으로 이해(#4), DNS 는 「값을 주면 반영」(#5). 10/7 정한 개설일 10/12 은 계약 · 담당자 부재로 미확정. DNS 관리처는 가비아이고 data · bi · in 하위 도메인에 기존 레코드 없음(10/10 조회). 파일 수신 MX 1건은 값이 고정이라 지금 입력 가능 — 답변 초안에 넣었다.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/infra/RUNBOOK.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/a5cdea7/docs/work-log/2026-10-10_reply-1008/%EA%B7%BC%EA%B1%B0_A_IT%C2%B7Google%C2%B7AWS.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/a5cdea7/docs/work-log/2026-10-10_reply-1008/%EB%8B%B5%EB%B3%80%EB%A9%94%EC%9D%BC_%EC%B4%88%EC%95%88.md"
              ],
              "next": "10/12 미팅에서 계약일 · 개설 예정일 확보 → OAuth 클라이언트 ID(개설 전날) · MX 선입력 → 개설일 RUNBOOK 2~9단계",
              "previous_status": "pending",
              "updated": "2026-10-10"
            },
            {
              "id": "erp-customer-metadata",
              "title": "ERP 추가 테이블·조회 권한 확인",
              "status": "partial",
              "detail": "2026-10-15 갱신 — 10/14 ERP 운영 DB 읽기 전용 접속(TCP · TLS · 로그인 · SELECT 1)과 사용자 테이블 3,359개 · 115,170,363행의 1회 전체 raw 확보 뒤, 고객 메타데이터 회신 없이 우리가 객체 · 필드를 정했다. full export 의 catalog · schema · manifest 로 원천 계약 레지스트리를 만들었다 — MM_QTIO · FI_DOCU · FI_BAND · MA_PITEM · MA_PARTNER · 셀인 3, 표준 구매 PU_* · 외주 SU_* 계보. 수불유형 30/30 · 단위 공통코드는 ERP 코드 마스터로 닫혀 다시 묻지 않는다. 채권 계정은 10801 · 11800 · 12000(10805 보류)이고 ERP 에 만기일 열은 없다(due_date NULL 허용). SQL module 833개의 정의 본문은 이 계정에서 보이지 않는다. 남은 것은 업무 의미(가격 산식 · 계정대체 목적 · 현재고 산식 · 구매/외주 구분)다.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/erp/07_첫날_점검.sql",
                "cmslab-data-platform/10_플랫폼구현/erp/01_메타데이터_수집.sql",
                "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                "docs/work-log/2026-10-02_erp-critical-path/evidence/rehearsal-2026-10-02.json",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/9fc92f0/docs/work-log/2026-10-07_meeting-result/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/main/docs/memory/cmslab-erp-access-sean.md",
                "docs/work-log/2026-10-14_erp-pages-refresh/evidence.md",
                "docs/work-log/2026-10-15_erp-contract-execution/README.md",
                "docs/work-log/2026-10-15_erp-contract-execution/contract-registry.json",
                "docs/work-log/2026-10-15_erp-contract-execution/movement-code-evidence.json",
                "docs/work-log/2026-10-15_erp-export-complete/result.md"
              ],
              "next": "남은 업무 의미를 받은 원천 안에서 추론 → 계약별 Proposed → Implemented → AWS 운영 경로로 전환",
              "previous_status": "blocked",
              "updated": "2026-10-15"
            },
            {
              "id": "web-operating-credentials",
              "title": "운영 웹의 RDS CA·역할별 DSN 제공",
              "status": "partial",
              "detail": "구현(로컬 확인) — 2026-10-05 묶음 ⑪: 웹 묶음 로그인 web_finance · web_ar · web_voc(각 cmslab_finance · cmslab_ar · cmslab_voc, rds_iam · 읽기 전용 · 15초)를 rds_bootstrap_logins.sql 에 더하고, Terraform 웹 DSN 을 web/src/lib/db.ts 그대로 6개(READER · FINANCE · AR · VOC · FORMULA · APP — 비밀번호 없는 IAM)로, 웹 태스크 rds-db:connect 를 다섯 묶음 + web_app 으로 맞췄다. web_restricted 는 AWS 에서 만들지 않는다(웹이 11차부터 안 쓴다). ⑲ 앱 로그인 배선(CMSLAB_ALB_* · web_auth_mode · /signed-out 무인증 규칙 · GOOGLE_WIF_CONFIG)도 반영. 로컬 PG16 로그인 SQL 두 번 같은 결과 · 묶음 격리(voc→채권 뷰 거부) 확인 · terraform test 8/8. 웹 운영 이미지가 맥미니에서 처음 끝까지 빌드됐다(pnpm install 포함 — 결과 result.md 8). 실제 RDS 접속은 없다. ⑲(같은 날): 앱 로그인은 ALB 서명 헤더라 웹이 쥐는 로그인 비밀이 없다 — 웹이 쥐는 것은 Google 그룹 조회 신원 하나(키 파일 없는 WIF · Secrets Manager cmslab/<env>/web/auth 키 GOOGLE_WIF_CONFIG · 서비스 계정 cmslab-web-groups 에 Groups Reader 만). 서비스 계정 키는 시작 단계에서 거부. ⑳(10/5 통합 마감): alb-oidc 운영 iss 필수(infra 가 CMSLAB_ALB_ISSUER 를 이미 주입) · email_verified 거부 규칙 근거 · 공개 키 캐시 LRU + 모르는 kid 조회 10초 5회 제한 — 로컬 alb-check 85/85. ㉑(10/5 결함 수정): 로그인별 DB 풀이 1 연결 · 대기 무한이라 한 쿼리 10초면 전원이 멈추던 것을 대기 10초 · DATABASE_POOL_MAX(ECS 5, Vercel 기본 1)로 · 그룹 조회는 진행 중 공유 · 병렬 · 1회 재시도 · 장애 때 직전 결과(6시간) · 웹 이미지에 public/(MI 양식 404) · AWS 공개 조회는 서명 헤더 검증된 요청만(로컬 실측 — 헤더 없음 · 위조 · 개발 쿠키 403, 정상 reader 200).",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/infra/sql/rds_bootstrap_logins.sql",
                "cmslab-data-platform/10_플랫폼구현/infra/modules/platform/main.tf",
                "cmslab-data-platform/10_플랫폼구현/infra/modules/platform/web.tf",
                "cmslab-data-platform/10_플랫폼구현/web/src/lib/db.ts",
                "docs/work-log/2026-10-05_aws-start-prep/result.md",
                "docs/work-log/2026-10-05_aws-start-prep/ans-bundle19.md",
                "cmslab-data-platform/10_플랫폼구현/web/Dockerfile",
                "cmslab-data-platform/10_플랫폼구현/web/src/lib/group-resolver.ts",
                "cmslab-data-platform/10_플랫폼구현/web/src/lib/auth-mode.ts",
                "docs/work-log/2026-10-05_web-auth-aws/fyi-bundle11.md",
                "docs/work-log/2026-10-05_web-auth-aws/result.md",
                "cmslab-data-platform/10_플랫폼구현/web/src/lib/alb-oidc.ts",
                "docs/work-log/2026-10-05_integration-close/alb-check.json",
                "docs/work-log/2026-10-05_integration-close/result.md",
                "cmslab-data-platform/10_플랫폼구현/web/src/lib/access.ts",
                "docs/work-log/2026-10-05_fix-web-infra/result.md"
              ],
              "next": "계정 개설일 RUNBOOK 5단계 로그인 SQL → 7단계 웹 대상 그룹 healthy(㉑ L9 — 443 전이라 curl 대신) → 9단계 ALB 로그인 뒤 브라우저로 /healthz?db=1 200 → 그룹 조회 준비(고객 Groups Reader · WIF 값) 뒤 web_auth_mode=alb 재배포 → 묶음 화면 · 매핑 승인 쓰기 1건 · 고객 Groups Reader 할당(⑲ 38-drafts A) · WIF 설정 JSON 을 비밀에(사용자 — RUNBOOK 9단계 2)",
              "previous_status": "pending",
              "updated": "2026-10-05"
            }
          ]
        },
        {
          "id": "activation-runtime",
          "title": "운영 경로 연결과 회귀",
          "items": [
            {
              "id": "seeds-existing",
              "title": "기존 일정값 UPDATE",
              "status": "partial",
              "detail": "구현(로컬 확인). 1차 정합 20260929200001 + 10/5 묶음 ㉒ 2차 정합 20260929200005(체인 …200004 기준 remaining 4 → 0 — ⑫ 무신사 주문 폴백 계약·일정 · 무신사 정산·자사몰 #20 raw_has_pii 조임 · 설명 2). baseline_audit 예상 차이 축소(rds_chain.json — schedule boot-only 1→0 · contract 7/6→5/5, 「같다」). 10/6 3차 정합(로컬 확인): 20260929200007(32_ 밖 시트 2원천 · 계약 4 추가, 맞는 탭이 없던 옛 #11 두 계약 retire) + 20260929200008(reconcile emit — #13 GEC 3 · #11 새 5 · #9 3 · #61 1 계약과 일정 추가, 일정은 꺼진 채) → remaining 33 → 0. 두 번 더 적용해도 이력 그대로, RDS 부트 상태 사본 변화 0, baseline_audit 「같다(예상한 차이만)」. 2026-10-15 측정(core 17차 레인): 체인 ↔ 시드 remaining 31행(목적지 문구 — 17차가 바꾼 13행 · FI_BAND → ar_allocation 선언 누락 포함). 이어 200023(MA_PARTNER 계약 · 일정 · 목적지) · 200024(FI_BAND 계약 · 일정 3(꺼진 채) · 목적지)로 정합했다 — 200024 생성 기준 남은 차이는 설명 · 근거 CAS 갱신 26행이다.",
              "evidence": [
                "docs/work-log/2026-10-05_fix-worker-db/result.md",
                "cmslab-data-platform/10_플랫폼구현/managed/supabase/migrations/20260929200005_seed_reconcile_pii_musinsa_orders.sql",
                "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                "docs/work-log/2026-10-06_seed-reconcile/result.md",
                "cmslab-data-platform/10_플랫폼구현/managed/supabase/migrations/20260929200007_catalog_rebind_outside_sheets_retire_11.sql",
                "cmslab-data-platform/10_플랫폼구현/managed/supabase/migrations/20260929200008_seed_reconcile_catalog_rebind.sql",
                "docs/work-log/2026-10-15_core-17th/result.md",
                "cmslab-data-platform/10_플랫폼구현/managed/supabase/migrations/20260929200023_seed_reconcile_ma_partner.sql",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/362dec2d/cmslab-data-platform/10_%ED%94%8C%EB%9E%AB%ED%8F%BC%EA%B5%AC%ED%98%84/managed/supabase/migrations/20260929200024_seed_reconcile_fi_band.sql"
              ],
              "next": "설명 · 근거 CAS 26행 시드 정합 → AWS RDS 부트스트랩(RUNBOOK 5단계) 뒤 reconcile.py compare remaining 0 → done",
              "previous_status": "pending",
              "updated": "2026-10-15"
            },
            {
              "id": "core-concurrency",
              "title": "실제 두 트랜잭션 C6 경쟁",
              "status": "done",
              "detail": "임시 PostgreSQL 16 에서 별도 연결 두 트랜잭션으로 「새 load_run 시작(재처리 열기 → 회차 → T2)」과 「C6 stg 정리」를 겹쳤다. C6 먼저(재처리가 C6 잠금을 기다림 — pg_blocking_pids 확인 → 정리 뒤 새 회차 정상) · 재처리 먼저(C6 이 기다린 뒤 skipped_ineligible 거절) · 회차 진행 중(미커밋 stg 무손상, C6 거절) · 장벽 동시 진입 8회 모두 core·현재 회차·rows_purged_at 보존, 새 회차 stg 무손상, stg_rows_purged_at 은 새 회차보다 앞. 12회 실행 모두 11 passed. 잠금 수정·DDL 변경 불필요. 항목 목표가 실제 경쟁 시험이라 로컬 통과가 완료 근거다(운영 적용 대상 아님).",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/worker/core/tests/test_c6_concurrency.py",
                "docs/work-log/2026-10-02_core-hardening/result.md"
              ],
              "next": "",
              "previous_status": "pending",
              "updated": "2026-10-02"
            },
            {
              "id": "files-ingress-fanout",
              "title": "실제 파일 수신 → 여러 계약 배분 연결",
              "status": "partial",
              "detail": "구현(로컬 확인). 수신 인터페이스 v1 · submit-event 파일 1개 → 계약 N개(기존) + 10/5 묶음 ㉒: route 별 예외 격리(route_errors) · 「/」 파일명 · 사라진 pending 메일은 그 건만 종결 · target 일시 오류(internal_error)는 결과 파일에 확정하지 않고 종료 2(트리거 재시도) · 부서 제출이 포털 계정 서킷을 건드리지 않음.",
              "evidence": [
                "docs/work-log/2026-10-05_fix-worker-db/result.md",
                "cmslab-data-platform/10_플랫폼구현/worker/core/FILE_INGRESS.md"
              ],
              "next": "S3 트리거·영속 상태 볼륨(AWS 계정 뒤) → 첫 배포 뒤 실제 S3 1건 → 10/30 발송 합의 뒤 첫 실수신으로 계약별 배분·재수신 멱등 확인",
              "previous_status": "pending",
              "updated": "2026-10-05"
            },
            {
              "id": "api-push-operations",
              "title": "운영 사건 소비자 실행 단위 연결",
              "status": "partial",
              "detail": "구현(로컬 확인). 사건 소비자를 운영 실행 단위로 묶었다 — ECS Fargate 서비스 `event-consumer`(infra events.tf): 큐마다 컨테이너 하나, 진입점은 core `cmslab-worker events --queue webhook|spapi` 하나(긴 폴링 루프 · SIGTERM 정상 종료 stopTimeout 120초 · 처리 중 가시성 연장 · 75 = 시간 제한 재시작). 재시작 복구: 사건 메시지 가시성 120초(event_queue_visibility_seconds) — 태스크가 죽으면 2분 안에 다시 보인다. 독 메시지: 큐 재전송 정책 3회 → DLQ + DLQ 경보(기존). 오류 알림: 소비자 SNS(마지막 수신·시간 초과) + 0·75 밖 종료·시작 실패 EventBridge 규칙 → SNS + 15분 미가동 경보. 시크릿 경계: 태스크 역할은 재조회 원천(cafe24·channeltalk·amazon_sp_api) `cmslab/api/<원천>/*` 만, 그 밖 전부 NotResource Deny — 웹 태스크 역할·브라우저 노드 Deny 는 그대로(README 5절). DB 로그인 cmslab_event_consumer(ingest+loader, IAM). API 노드가 아니라 서비스로 둔 이유·되돌림은 README 10절 13. AWS 는 SQS 다 — pgmq 는 Supabase 일회성 tick 전용이라 이 단위에 쓰지 않는다. 검증 = infra check.sh 전체 통과 · LocalStack plan(가동 상태). 실제 큐·태스크 실행은 없다.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/infra/modules/platform/events.tf",
                "cmslab-data-platform/10_플랫폼구현/infra/README.md",
                "cmslab-data-platform/10_플랫폼구현/infra/RUNBOOK.md",
                "cmslab-data-platform/10_플랫폼구현/worker/core/cmslab_worker/event_consumer.py"
              ],
              "next": "계정 개설일 RUNBOOK 7단계 — 워커 이미지 digest 로 event_consumer_desired_count=1 → 웹훅 비밀·채널 URL 등록 → 실제 웹훅 1건으로 등록·사본·DLQ 0 확인",
              "previous_status": "pending",
              "updated": "2026-10-02"
            }
          ]
        },
        {
          "id": "wave-two",
          "title": "개인정보·업무 의미 후속",
          "items": [
            {
              "id": "operations-mapping",
              "title": "semantic mapping·backfill",
              "status": "partial",
              "detail": "구현(로컬 확인). 12/23 core 목적지 판정 18계약에 실행 매퍼 또는 진단/후보 매퍼를 추가했다(10/12). 2026-10-14~15 ERP: 7월 실데이터로 MM · FI · 셀인 5계약과 공식 반제 FI_BAND 를 임시 PostgreSQL 전체 체인에 적재해 6계약 사실 107,628 = core, 제약 위반 0을 확인했다. 수불유형 미등록 0(계정대체 = 재고 사건), 단위 공란 5,476행 품목 마스터 보강 · 123행 사실 억제, medical · oliveyoung gross 셀인 Implemented. 5 · 6 · 7월 MM 대사에서 수량은 공식 마감과 전부 맞고 EC 가격 잔차가 매달 반복돼 공식 순매출은 오스틴 정본을 유지한다. 맥미니 개발 DB 에 2026-01-01 ~ 10-14 를 적재하고 품목 매핑 1단계를 로컬에서만 적용했다(승인 1,349). 남은 것은 가격 산식 · 단위 123행 · 외화 47행 · reverse_dm 효력 · 구매/외주 4계약 등록, GEC 결과 시트, API 인가와 운영 backfill 이다.",
              "evidence": [
                "docs/work-log/2026-10-12_mapper18-integration/result.md",
                "docs/work-log/2026-10-14_erp-remaining-rules/result.md",
                "docs/work-log/2026-10-15_erp-domain-execution/result.md",
                "docs/work-log/2026-10-15_erp-operationalization/result.md",
                "docs/work-log/2026-10-15_mini-persistent-core/result.md"
              ],
              "next": "남은 ERP 규칙 6건을 받은 원천 안에서 추론 · 반증 → Proposed 계약 승격 → GEC 결과 시트 지정 → Amazon/TikTok/Shopify 인가 첫 Read → AWS 운영 배치 대사 · backfill",
              "previous_status": "pending",
              "updated": "2026-10-15"
            },
            {
              "id": "operations-redaction",
              "title": "웹훅 원문 개인정보 제거기",
              "status": "partial",
              "detail": "구현(로컬 확인). 웹훅 원문 제거기 4개(기존) + 10/5 묶음 ㉒: 파일 계약 개인정보 플래그 정합 — 자사몰 #20 raw_has_pii=true · MALL20 열 비우기 사본(진짜 xls), 무신사 정산 체인 조임(20260929200005), 파서 양식 PII 선언 ↔ 계약 false 가드(core 막힘 · 통합 대조), 파일 PII 값 규칙 유선·국제(pii.files.v4), 시트 사본이 계정 선택 탭(숨김 포함)의 개인정보 열도 비움.",
              "evidence": [
                "docs/work-log/2026-10-05_fix-worker-db/result.md",
                "cmslab-data-platform/10_플랫폼구현/managed/supabase/migrations/20260929200005_seed_reconcile_pii_musinsa_orders.sql"
              ],
              "next": "운영 배포 뒤 원천별 실제 웹훅 1건의 redacted_sha256 확인 — RUNBOOK 11절 · 자사몰 #20 첫 제출 사본에서 「ERP양식외」 열 비움 개수 확인",
              "previous_status": "pending",
              "updated": "2026-10-05"
            },
            {
              "id": "reviews-watch",
              "title": "WATCH 조건 해소",
              "status": "pending",
              "detail": "2026-10-02 재판정 — 5조건 중 C6 동시성 해소(core-concurrency), 파일 수신 orchestration 부분 해소(files-ingress-fanout: 경로 완성·로컬 관통, 트리거·화면·실수신 남음). 남음: 가격 기준(operations-mapping) · 고객 사실(operations-amazon · operations-redaction · api-push-operations) · 기존 DB 일정값(seeds-existing).",
              "evidence": [
                "docs/work-log/2026-10-02_core-hardening/result.md",
                "docs/work-log/2026-09-27_platform-phase2-continuation/architecture-review.md"
              ],
              "next": "연결 항목(operations-mapping · operations-amazon · operations-redaction · api-push-operations · seeds-existing · files-ingress-fanout)이 닫히면 조건별로 다시 판정",
              "previous_status": "pending",
              "updated": "2026-10-02"
            }
          ]
        },
        {
          "id": "wave2-activation",
          "title": "웨이브 2 운영 적용과 차단",
          "items": [
            {
              "id": "ops-ci-migrate",
              "title": "운영 마이그레이션 CI 경로(verify·migrate-prod)",
              "status": "partial",
              "detail": "구현(로컬 확인) — RDS 변경 경로(묶음 ⑪, 2026-10-05). 실행체 = ECS Fargate 마이그레이터 태스크(infra migrator.tf · 이미지 infra/images/migrator — 진입점 고정, RDS 마스터 비밀은 그 태스크 실행 역할만 주입, verify-full 은 RDS 끝점 + 내장 CA 만). 트리거 = GitLab main rds-plan(자동 dry-run · 적용 예정 목록 + plan_sha256) → 사람 ▶ rds-migrate(같은 계획만 적용 → 남은 차수 0 확인) — OIDC 로 이 태스크만 부르는 역할(main 브랜치 sub). 트리거와 실행체를 나눠 사람 SSO 로 같은 스크립트(ecs_migrate.py)를 불러도 된다. 원장 cmslab_migrations.applied(버전 · SHA-256 · 결과 · 적용 시각 · 원천 커밋). 체인은 Supabase 검증 런타임과 같은 managed/supabase/migrations 하나 — Supabase 전용 오버레이 4개만 rds_chain.json 으로 뺀다(CI verify 의 check-bundle 이 분류 누락을 막는다). 기준선 = 부트스트랩 때 체인 20차를 원장에 기록(baseline 13 · excluded 4) + 03_·시드에 없는 데이터 마이그레이션 재적용(일정 끔 추출 · 시트 바인딩 3 — baseline_audit.py 가 찾았다: 없었다면 켜진 일정 136 · 보류 · 문서 ID 빠진 시트 계약 22). migrate-prod 는 migrate-supabase-validation(「검증 런타임 전용 — 운영 아님」)으로 이름만 바꿔 남겼다. 로컬 PG16 비-superuser 마스터로 부트스트랩 → plan 0 → 가짜 차수 적용 → 재실행 변화 0 · 표류 · 구판 묶음 · 해시 위조 · 실패 차수 되돌림 확인, glab ci lint 통과. 운영 첫 실행은 계정 뒤.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/infra/migrator/rds_migrate.py",
                "cmslab-data-platform/10_플랫폼구현/infra/migrator/rds_chain.json",
                "cmslab-data-platform/10_플랫폼구현/infra/migrator/baseline_audit.py",
                "cmslab-data-platform/10_플랫폼구현/infra/modules/platform/migrator.tf",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/9668e1561f6126b58218f0a804a12b69d482bbc9/.gitlab-ci.yml",
                "cmslab-data-platform/10_플랫폼구현/infra/RUNBOOK.md",
                "docs/work-log/2026-10-05_aws-start-prep/result.md"
              ],
              "next": "AWS 계정 → apply → RUNBOOK 5단계 bootstrap(사람 · SSM, R4 예외 1회) → 사용자가 CI 변수 CMSLAB_RDS_MIGRATOR(terraform output rds_migrator, Protected) 등록 → rds-plan 0건 확인 → 첫 실제 체인 차수를 rds-migrate 로 적용 → 잡 ID · 원장 행으로 done",
              "updated": "2026-10-05"
            },
            {
              "id": "ops-ci-variables",
              "title": "CI 변수 미등록 — 운영 DB 에 7~10차 미적용",
              "status": "blocked",
              "detail": "2026-10-03 사용자 결정 — 운영은 AWS 로 시작한다. Supabase 운영 반영 경로(GitLab CI 변수 → migrate-prod)와 Vercel 운영 배포는 쓰지 않으므로 CI 변수는 등록하지 않는다. 운영 DB 는 AWS RDS 빈 DB 에 저장소 DDL(03_ — 7~11차 포함) + 시드로 만든다(infra RUNBOOK R1 · 5단계). 「운영 DB 에 7~10차 없음」은 그 부트스트랩으로 닫는다. Supabase 는 검증 런타임으로 체인 …120000 에 그대로 둔다.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/infra/RUNBOOK.md",
                "docs/work-log/2026-10-03_aws-first-decision/result.md"
              ],
              "next": "고객 AWS 계정 수령(10/7 미팅 1순위 안건 — 확정서 제안 10/13) → RUNBOOK 5단계 DB 부트스트랩 → 03_ 적용 확인으로 done",
              "updated": "2026-10-03"
            },
            {
              "id": "ops-mdm-item-empty",
              "title": "`mdm.item` 0행 — 매핑 승인 불가",
              "status": "blocked",
              "detail": "2026-10-02 — NEOE.MA_PITEM → mdm.item 투영을 core run-job 경로 그대로 합성 ERP 로 로컬 리허설했다: 100품목 투영(status new · 원천 계정·source_ref 채움 · 예외 0). 실 ERP Read 가 없어 운영·실품목은 여전히 0행이다. 2026-10-11: 로컬에서 ERP 품목 일정(run-job) → 품목 투영이 실제 경로로 돈다(ERP 「공장품목조회」 내보내기 6,633행 → 품목 6,611 — 이름 · 단위 빈 22 제외, 연결 함수만 가짜). 이어서 품목 매핑 1단계 도구가 이 품목으로 #103 식별자를 승인한다(!179). 발견: ErpItemMapper 가 계정 legal_entity 자리표시자를 회사코드로 그대로 쓴다 — 운영 세팅에서 legal_entity 를 채우면 생기지 않는다. 막힘은 운영 ERP 접근뿐.",
              "evidence": [
                "docs/work-log/2026-10-02_erp-critical-path/evidence/rehearsal-2026-10-02.json",
                "cmslab-data-platform/10_플랫폼구현/worker/mappers/cmslab_mappers/channels/erp_item.py",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/2a87405/docs/work-log/2026-10-11_item-mapping-tier1/result.md"
              ],
              "next": "운영 ERP 접근(김수현 과장 10/12 이후 IP 허용) → ERP 계정 legal_entity 채움 → run-job(ERP 품목 일정) → mdm.item 행 수 = MA_PITEM 품목 − 이름 · 단위 빈 품목 → mapping-tier1(d1011-item-mapping)",
              "updated": "2026-10-11"
            },
            {
              "id": "ops-erp-firewall",
              "title": "ERP DB 접속 경로",
              "status": "partial",
              "detail": "2026-10-14 갱신 — ERP 운영 DB 연결·암호화·읽기 전용 로그인·SELECT 1에 성공해 접근 장애는 해소됐다. ERP 앱 접속과 ERP DB 접속은 별도 경로다. 사용자 결정에 따라 ERP 업무 테이블 원본 읽기(SELECT)를 운영 경로로 유지한다. AWS 운영 러너 전환, 고객 측 허용 범위와 변경 기록 확인은 남음. 2026-10-15: 1회 전체 raw 로 업무 테이블 · 필드를 대사했다(원천 계약 레지스트리). AWS 계정이 없어 운영 러너는 개설 전이고(10/15 사용자 확인), ERP 정기 수집 러너는 맥미니에도 없다.",
              "evidence": [
                "docs/work-log/2026-10-02_erp-critical-path/day1-runbook.md",
                "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/main/docs/memory/cmslab-erp-access-sean.md",
                "docs/work-log/2026-10-14_erp-pages-refresh/evidence.md",
                "docs/work-log/2026-10-15_erp-ingestion-execution/result.md",
                "docs/work-log/2026-10-15_erp-contract-execution/README.md"
              ],
              "next": "고객 AWS 개설 → API 노드 원점 허용(고객 방화벽) → 운영 러너 전환 · 허용 범위와 변경 기록 확인",
              "updated": "2026-10-15"
            }
          ],
          "updated": "2026-09-30"
        },
        {
          "id": "scope-1223",
          "title": "12/23 세부 범위 확정 — 전 원천 웨이브 1(10/2)",
          "items": [
            {
              "id": "scope-confirm-draft",
              "title": "세부 과업범위 확정서 v1.0 제출본 · 10/7 협의 안건 9건",
              "status": "partial",
              "detail": "2026-10-05 갱신 — 37_ 개정 4(정식 재산정, 남은 56영업일 · AWS 기준 의존경로): 「12/23 가동」 = B(확정서 문언) 단계 공개 권고 — 전 원천 수집 가동 + 검증 통과분 공개 + 13개 기능, 원천별 공개 순서표 공개 77 · 수집만 25(1월 4차 공개) · 1월 13(외부 회신·심사·원천 확인 뒤). B 55.7일(8명 3/3/2, 여유 0.3) · 53.5일(9명 3/4/2, 여유 2.5) · P 97~123일. B 전부 공개 84.5일(11명 + 고객 주 90h 여야 들어감) · A 수동 0 100.5일(13명 + 주 130h) — 불가. 고객 검증 손익분기 주 61h. 원천 115행 진척(실측): E9 끝 30 · E3 끝 55 · E3 부분 22 · 시작 전 8, 첫 실 Read 31. 10/3 미팅 패키지(안건 문서 · IA 영향 분석 701행 · 확정서 v1.0 변경표 17건)는 그대로 — 52_ 대내 0·3절 숫자와 01_대내 4절 기준선만 개정 4 로 바꿨다. 고객용 기존 문서는 고치지 않았다(쿠팡 센터 재고·발주 원시 선행 2줄은 사용자 판단 → ⑰). 45_ 원문은 고치지 않았다. 10/7 협의 결과를 확정서 v1.0 제출본에 반영했다(결정 32건 중 기록 27 — 승인 18 · 기본안 1 · 수정 3 · 보류 6 · 안내 1 · 완료 1, 본문 81곳 수정). 범위가 바뀐 결정: 재고 배정·잠금은 ERP 에서만 하고 플랫폼은 조회만(C-4) · 원가·공헌이익은 계산하지 않고 재경이 만든 손익계산서를 받아 보여 준다(C-5 · C-6) · 돈에 대한 최종 자료는 경영지원실 마감 엑셀(C-9) · 열람은 사람이 지금 속한 팀 기준 행 단위(C-9 — 9/29 회신에서 범위 밖으로 뺐던 기능이라 공수 재산정 필요) · 품목 분류는 ERP 에서(G-2). 보류: 2단계 구분과 12/4 일정안(B-4) · 열람 묶음(C-7) · IA 반영 범위 기재(C-10). 제출 PDF 22쪽 생성, 회신 메일은 초안만 — 발송 전. 2026-10-11 갱신 — 미발송 v1.0 제출본을 10/8 회신 · 10/11 사용자 지시 · 역설계로 고쳤다: 재고 배정 = 귀사 배정 시트(재고분배, 공식 기록) · 금액(공식 매출 · 원가 · 손익) = 경영지원실 자료, 거래처 원가 = 통합매출 매출원가(손익과 0원 일치 확인) · **채권 = ERP 채권 · 거래처 원장, 위시켓이 「거래처별 채권조회」 기준으로 직접 확인** · 활동메모 = ERP 에 없음(10/12 협의) · 제출일 10/12 · 중간보고 기한 10/26. PDF 22쪽 재생성 · 대내 흔적 0건(사용자 다운로드 폴더). 발송 전.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md",
                "cmslab-data-platform/00_프로젝트작업실/52_10-7미팅_패키지/11_원천별_공개순서표_고객용.md",
                "cmslab-data-platform/00_프로젝트작업실/52_10-7미팅_패키지/00_미팅안건_고객용.md",
                "cmslab-data-platform/00_프로젝트작업실/52_10-7미팅_패키지/01_IA반영범위_고객용.md",
                "cmslab-data-platform/00_프로젝트작업실/52_10-7미팅_패키지/01_IA영향분석_대내.md",
                "cmslab-data-platform/00_프로젝트작업실/52_10-7미팅_패키지/02_확정서_v1.0_수정안_대내.md",
                "docs/work-log/2026-10-05_baseline-reestimate/result.md",
                "cmslab-data-platform/00_프로젝트작업실/45_세부과업범위_확정서_v1.0.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/9fc92f0/docs/work-log/2026-10-07_meeting-result/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/9fc92f0/docs/work-log/2026-10-07_meeting-result/%EA%B2%B0%EC%A0%95%EA%B8%B0%EB%A1%9D.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/9fc92f0/docs/work-log/2026-10-07_meeting-result/%ED%99%95%EC%A0%95%EC%84%9C_v1.0_%EB%B3%80%EA%B2%BD%ED%91%9C.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/main/docs/work-log/2026-10-11_austin-reverse/result.md"
              ],
              "next": "10/12 미팅 전 발송(사용자) → 10/14 정정 회신 기한",
              "updated": "2026-10-11"
            },
            {
              "id": "scope-aws-quote",
              "title": "고객 AWS 인프라 견적서 2종(표준 · 고가용성)",
              "status": "done",
              "detail": "위시켓 클라우드팀 양식으로 표준·고가용성 구성 견적서 PDF 2종을 작성했다(10/1). 고객 AWS 계정 개설은 아직이다(요청 10/7 · 확정서 제안 기한 10/13).",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/47_AWS_인프라_견적서/README.md",
                "cmslab-data-platform/00_프로젝트작업실/43_AWS_아키텍처_확정안.md"
              ],
              "next": "고객 AWS 계정 개설 당일 Terraform dev/prod apply"
            },
            {
              "id": "scope-priority",
              "title": "전 원천 웨이브 1 — 68개 원천 12/23 완료",
              "status": "done",
              "detail": "사용자 결정(10/1): 고객이 10/7 직후 접근권을 전량 제공(늦어도 10/30), 68개 원천 전부 웨이브 1 에서 12/23 완료. 웨이브 2A·2B·2C 분할 폐기. 수집 방식만 A(공식 API·계정 초대) · C(포털 자동 수집) · D(파일 정기 수신)로 다르다.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/48_12-23_잔여작업_우선순위.md"
              ],
              "next": "37_ 공수 재산정 — 두 달 안 전 원천 수집기 인원 적합성"
            },
            {
              "id": "scope-code-gap",
              "title": "확정서 신규 약속의 코드 공백(재고 배정·잠금 · MI 업로드 · 업로드 화면 · 권한 묶음 · Metabase · 경영진 요약)",
              "status": "partial",
              "detail": "구현(로컬 확인). 11차 DDL(마이그레이션 20260929200002 · MI 계약 20260929200003 — 운영 적용 전)과 웹·워커로 확정서 v1.0 공백 G1~G7 을 열었다(⑥ result.md). 10/5 묶음 ⑲: 쓰기 화면(매핑 승인·업로드·배정·MI 검수)이 AWS 첫날 열리도록 앱 로그인을 ALB 서명 헤더로 옮겼다 — 이메일 → Google 그룹 → 묶음·업무 권한(11차 G5 그대로). ⑥ 47건을 서명 헤더로 다시 돌려 47/47, 위조 22건(서명 불일치·다른 signer·만료·alg·kid·client·iss·도메인·그룹 없음·서명 없는 헤더·개발 쿠키) 전부 403. 웹 기존 시험 첫 실행: 단위 142/142 · DB 189/195 · E2E 39/56 — 실패는 1건(⑥ 기대값, 고침)을 빼고 전부 기존 결함 mart-f04-fx-perf(v_f04 15초 초과). 10/7 결정으로 공백 목록이 바뀐다: 재고 배정·잠금 쓰기 화면은 빠지고 ERP 배정 결과 조회가 들어온다(C-4 — ERP 기록 방식은 9절 8번 회신 10/14 뒤) · 원가 · 공헌이익 계산 대신 손익계산서 파일 수신 · 표시(C-5 · C-6) · 사람의 현재 팀 기준 행 단위 열람이 새로 생긴다(C-9). 코드는 아직 바꾸지 않았다 — 후속은 「10/7 협의 결정 후속」 묶음.",
              "evidence": [
                "docs/work-log/2026-10-03_scope-code-gap/result.md",
                "docs/work-log/2026-10-05_web-auth-aws/result.md",
                "docs/work-log/2026-10-05_web-auth-aws/alb-check.json",
                "docs/work-log/2026-10-03_scope-code-gap/http-check.json",
                "docs/work-log/2026-10-03_scope-code-gap/action-check.json",
                "cmslab-data-platform/10_플랫폼구현/web/src/lib/access.ts",
                "cmslab-data-platform/10_플랫폼구현/web/src/lib/auth-mode.ts",
                "cmslab-data-platform/00_프로젝트작업실/45_세부과업범위_확정서_v1.0.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/9fc92f0/docs/work-log/2026-10-07_meeting-result/result.md"
              ],
              "next": "10/7 결정 반영 설계(재고 배정·잠금 화면 제거 · 손익계산서 수신 계약 · 팀 귀속 행 단위 권한 — 팀 단위 열람은 재산정 뒤) → AWS 계정 수령일 RDS 부트스트랩 → mart-f04-fx-perf 해소(E2E 초록 조건) → 고객 대시보드 기획(10/30) 오면 경영진 요약 교체(11/20) · G6 은 RUNBOOK 9단계",
              "previous_status": "pending",
              "updated": "2026-10-07"
            },
            {
              "id": "scope-erp-access",
              "title": "ERP 조회 접속(임계경로)",
              "status": "partial",
              "detail": "2026-10-15 갱신 — 2026-10-14 22:27:25 KST, ERP DB 의 SELECT 가능한 사용자 테이블 3,359개 · 115,170,363행을 1회 전체 raw 로 확보하고 파일 검증을 마쳤다(예상 · 고유 객체 · 완료 파일 3,359 일치, 누락 · 예상 외 객체 · 중복 · 파일 오류 · 임시 파일 · 수집 오류 0). 그 raw 로 원천 계약 레지스트리(객체 · 기간 · 필드)를 만들고 7월 공식 엑셀 · GL 9계정 대사와 MM · FI 3개월 오프라인 대사(v4)를 했다. 남은 것은 업무 규칙 6건과 운영 적재 · 반복 Read(AWS 미구축으로 0회)다.",
              "evidence": [
                "docs/work-log/2026-10-02_erp-critical-path/day1-runbook.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/a5cdea7/docs/work-log/2026-10-10_reply-1008/%EA%B7%BC%EA%B1%B0_A_IT%C2%B7Google%C2%B7AWS.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/a5cdea7/docs/work-log/2026-10-10_reply-1008/%EB%8B%B5%EB%B3%80%EB%A9%94%EC%9D%BC_%EC%B4%88%EC%95%88.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/main/docs/memory/cmslab-erp-access-sean.md",
                "docs/work-log/2026-10-14_erp-pages-refresh/evidence.md",
                "docs/work-log/2026-10-15_erp-export-pages/evidence.md",
                "docs/work-log/2026-10-15_erp-contract-execution/README.md",
                "docs/work-log/2026-10-15_erp-operationalization/result.md"
              ],
              "next": "남은 업무 규칙 6건 추론 · 검증 → AWS 개설 → 원천별 운영 적재 · 반복 Read",
              "updated": "2026-10-15"
            }
          ],
          "updated": "2026-10-02"
        },
        {
          "id": "collect-lanes-1002",
          "title": "수집 착수 레인 A·D·C (10/2)",
          "items": [
            {
              "id": "lane-a-api",
              "title": "레인 A — 공식 API·계정 초대 수집기 E3",
              "status": "partial",
              "detail": "구현(로컬 확인). API 29개 시스템 · 능력 46 등록, ERP·Sheets 배선, 계정 설정 CMSLAB_API_CONFIG(자격증명 형태 필드 거부), 개인정보 주문·결제 redact. 라쿠텐 RMS 공식 명세 대조(10/3): 29항목 — 공식 일치 1 · 공식 확인 불가 28(wire 명세는 RMS 로그인 뒤), API 계약 값 변경 0, 불확실 값 설정화 · 페이징 칸 누락 bad_envelope · 카드 필드 제거(규칙 v2). 10/5 E4 준비(묶음 ⑬): ① 한도 초과를 HTTP 403 으로 주는 원천을 인증 실패로 막지 않게 공용 ApiClient 를 원천별 「403 본문 사유 판별기」 등록 구조로 일반화(Google 판별기 기본 + 라쿠텐 ES01-03·04·05 판별기는 라쿠텐 클라이언트에만 — 2차 근거, 첫 실 Read 에서 확인) · 200 봉투 안 한도 코드도 RateLimited · 오류 코드가 Results.errorCode 봉투도 읽음 ② licenseKey 만료 D-14 경보 배선 — 수집 때(호출 전) 남은 일수 · 발급일 없음 · 값 오류를 하루 한 번(서울 09시 뒤 첫 수집) core 알림 경로(NoticingCollector → core 추출기 → Notifier)로 냄, 수명은 설정 license_valid_days. 공개기 직접 배선은 하지 않음(공개기 역할은 cmslab/api/* 비밀을 못 읽는다). 변경 뒤 API 시험 649 passed · 3 skipped, core+통합 시험 통과(result.md), ruff · ty(변경 파일 신규 진단 0). 실 원천 호출 0. 라쿠텐 licenseKey 미발급(10/5 기준 고객 새 메일 0) — 시드 collection_class 는 manual 그대로. 10/5 결함 수정(묶음 ㉓ — 코드 전수 검토 배정분): 카카오페이 파일 오늘 건너뜀 · 최근 -2000 그날만 미도착(C1 — 4객체 영구 0건이던 결함) · 회전 토큰 저장 실패 = 경보(token_persist_failed) + 메모리 토큰 계속, 미저장 중 소비된 refresh 재사용 금지(C2 코드 면 — IAM 은 ㉑) · 쿠팡 Wing 시드 창 수용(증분 · last_n_days 하루씩 · 주문 전 상태 · 매출 오늘 건너뜀, H12) · 사방넷 updateOrderStsYn=N 본문(공식 스키마 확인)+쿼리 · 응답의 직후 주문확인 전이 감지 시 즉시 중단(H13) · 채널톡 closed 시간 경계(H14) · 사건 재조회 fetch_* 도 E4 게이트(M17) · 점검 스크립트 회전 원천 거부(M18) · 카카오쇼핑 상세 (orderId, modifiedAt) 캐시(M19) · 카카오모먼트 토큰 수명 결함 아님(비즈니스 토큰 만료 없음 — M20) · 라쿠텐 QPM 61초 대기(L10) · 페이코 자기합 통제합계 제거(L11) · GA4 dataset 검증(L12). ERP: 회사(+필터) 존재 확인 · 28일+ 창 전부 0행 거부(H15) · REPLY_ 자리표시자 거부(H17) · pymssql 오류 번호(M21) · 경합 날짜만 재시도(M22) · 인덱스 없으면 사유 필수(M23) · diag/reconcile 게이트(M24) · 민감 약어(M25) · 설정 오류 재시도 없음 · host,port(L13) · 대소문자 무시 가드(L14). 환율 오늘 일정 12시간 간격 — 주말 빈 응답 polled(H16). 변경 뒤 API 665 · ERP 205 · FX 136 passed, 통합 12 · core 계약 10 passed, ruff · ty(신규 0). 실 원천 호출 0. 10/6 #13 GEC BigQuery 수집기를 실측 표 구조에 맞췄다(로컬 확인): 객체 4개(주문×SKU · GMV Max 광고 · 어필리에이트 영상 · SKU 대응표) · 한글 · 공백 열 이름 허용 · 고른 열만 SELECT · 구매자 열 개인정보 키 추가. 능력 46 → 49, 계약 162 → 165(새 3개는 일정 꺼짐). 실 BigQuery 호출 0, 남은 차단은 GEC 데이터셋 조회 권한. 10/7 #34 TikTok Shop: 셀러센터를 수집 계정에 공유받아 화면만 확인했다(쓰기 0) — US 크로스보더 샵 1개이고, GEC 가 이미 Partner Center 셀러 자체 개발자 계정과 Custom 앱을 갖고 있어 새 개발자 등록은 필요 없다. 기본안은 그 계정에 데이터 플랫폼 전용 Custom 앱 1개(주문 · Finance 조회 scope)를 더하고 GEC 관리자가 인가하는 것. 셀러센터 관리자 역할은 쓰기 권한까지 따라와 요청하지 않는다.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/rakuten-rms-spec-check.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/common/http.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/sources/rakuten_rms.py",
                "cmslab-data-platform/10_플랫폼구현/worker/core/cmslab_worker/alerts.py",
                "docs/work-log/2026-10-03_collection-lanes-rest/lane-a.md",
                "docs/work-log/2026-10-05_e4-readiness/result.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/common/secrets.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/sources/sabangnet.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/sources/kakaopay.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/sources/coupang_wing.py",
                "docs/work-log/2026-10-05_fix-connectors/result.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/sources/gec_bigquery.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-ads-analytics.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/9fc92f0/docs/work-log/2026-10-06_gec-bigquery-connector/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/9fc92f0/docs/work-log/2026-10-07_meeting-result/result.md"
              ],
              "next": "GEC: ① BigQuery 데이터셋 조회 권한 → location · 표별 행 수 · max_rows 확인 → 일정 켜기 ② TikTok 전용 Custom 앱 인가 → Get Authorized Shops 응답으로 API 호스트 · shop_cipher 확정 → E4. 사방넷: 접근권 도착 뒤 README 「사방넷 첫 실 Read 단건 실측」(38-drafts D-1)으로만 일정을 켠다. 채널톡 정렬 열 · 카카오쇼핑 modifiedAt · 카카오모먼트 토큰 종류 · 카카오페이 파일 생성 시각을 첫 실 Read 에서 확인(result.md). C2 IAM(틱톡 토큰 비밀 PutSecretValue)은 ㉑. 라쿠텐: 접근 도착(늦어도 10/30) 뒤 E4 전에 고객과 RMS 「WEB APIサービス」 문서 확인(38-drafts A-2 · 대조표 C-1~C-16 — 특히 끝 시각 포함 · 한도 응답의 HTTP 상태와 봉투(C-12 · C-13 — 판별기 확인) · 키 발급 앱 범주) → licenseKey 발급 시 비밀에 license_issued_at 함께 저장 → 시드 collection_class manual → api 전환(db/seeds — 발급 뒤) → CMSLAB_API_LIVE_READ_ENABLED=1 로 E4 첫 실 Read. 그 밖의 원천은 10/7 이후 접근권 도착 순서대로 E4.",
              "updated": "2026-10-07"
            },
            {
              "id": "lane-d-files",
              "title": "레인 D — 파일 정기 수신 파이프라인 E3",
              "status": "partial",
              "detail": "구현(로컬 확인). submit fanout · 접수 검증 사유 코드·재업로드 안내 · 17개 원천 파서/수집기 E3 · 첫 도착 체크리스트 · 확장자≠형식 입구 3종(10/3). 10/5 묶음 ⑫: ① 별표 3-3 접수 키를 data 행 판정 키와 분리(Layout.required_columns · unique_columns)하고 6계약을 표본 행 입도로 재결정 — FIN12 중복 판정 안 함(원장 같은 행 9,408 정상) · JPOFF101 유일 키에 도매·판매점 추가(중복 1,505·107·1,207 → 0) · EMP99 품목 식별 = 주문상품명(옵션포함)(모델명 160/160 빈칸) · WMS3 유일 12열(중복 1,929 → 0) · WMS4 필수 SKU명·바코드 · BOM41 행 단위 거부 안 함(손 관리 기준 목록). 라운드트립 30건: 통과 21 · 구조 거부 9(표본≠표준안 — 정상) · 키 거부 6 → 0 · 결정론 빌드 21/21 · 파싱 21/21 · 사본 6/6 · 통제 합계 6/6, 값 출력 0. ② Drive 허용 MIME 과 SES files 파서 route 에 .xls 계열(application/vnd.ms-excel · text/html · application/xml · text/xml — 위장 파일) 추가. ③ CJ온스타일 정산(portal_cj_onstyle/settlement · Σ 행 통제 합계) · 주문(cj_onstyle_api/orders 파일 경로 — API JSON 과 형식 분기) · 무신사 정산(portal_musinsa/settlement · HTML 위장) · 주문(시드 폴백 계약 portal_musinsa/orders 추가 · SpreadsheetML 위장) 파서 4종. 열 비우기 제거기가 마크업을 표만 읽은 xlsx 사본으로 쓴다. PII 규칙 v3(인수자·수령자·tel·hp·현관 비번·배송참고·배송정보 — v2 가 못 잡던 열). 무신사 정산 raw_has_pii true 로 정정. 시험 files 125 · inbound 25 · connectors/api 649 · worker 통합 12 · seeds 148(2 실패 = 남의 레인 04_ SQL 기존 결함) passed · ruff · ty 신규 0 · uv build 4종 성공. 실제 수신 0. ⑳(10/5): ⑫ 는 허용 MIME 집합만 넓혔고 route 템플릿 3개는 xlsx·csv 그대로라 실제 .xls 가 route 단계에서 떨어졌다 → Drive 표 route 3(FIN12 · WMS3 · WMS4) 파일명 .xls + MIME 넷 · 면세 SES route 3 attachment_format workbook(xlsx·xls 둘 다) · 정기 inbound_* 는 자체 파서(openpyxl)라 xlsx·CSV 그대로(같은 기준). ARRIVAL_CHECKLIST 미결 문구 → 10/5 결정. 2026-10-11: 경영지원실 파서 5종(실파일 1회 · 거부 0) · 원본 미보관 수신 경로(계약 raw_retention keep/none · 선별기 PayrollRowSanitizer · 원본을 레이크에 두지 않고 산출물만 착지 · fail-closed 6가지 실파일 확인) · Drive route 템플릿 mgmt-* 5종 · 적재 회차 skipped_row_count 가 files 계약에서 늘 NULL 이던 결함 수정. 웹 업로드 · SES 로는 원본 미보관 계약을 받지 않는다(수신 버킷 90일). 운영 러너 route 미등록.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/evidence/SAMPLE_ROUNDTRIP_2026-10-05.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/evidence/ARRIVAL_CHECKLIST.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/cmslab_files/channels/periodic.py",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/cmslab_files/channels/cjonstyle.py",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/cmslab_files/channels/musinsa.py",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                "docs/work-log/2026-10-05_file-ingress-close/result.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/inbound/contracts/dutyfree_routes.template.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/inbound/cmslab_inbound/config.py",
                "docs/work-log/2026-10-05_integration-close/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/2596833/docs/work-log/2026-10-11_finance-parsers/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/2596833/docs/work-log/2026-10-11_restricted-no-raw/result.md",
                "docs/work-log/2026-10-11_core-complete/result.md"
              ],
              "next": "고객·제3자: 발송 합의(38_ 5·6·7·7-1·7-2) → 수집 전용 주소로 첫 수신(E4, ARRIVAL_CHECKLIST 0절 — 그래도 키 거부면 재업로드 요구 전에 행 입도 재확인). 우리: 정기 inbound_* 원천이 .xls 로만 내면 route 를 files 파서 route 로 전환 · CJ온스타일·무신사 매퍼(정산·주문 → core) · 시윤 7-2 양식 v2 Layout.",
              "updated": "2026-10-11"
            },
            {
              "id": "lane-c-portal",
              "title": "레인 C — 포털 자동 수집(봇 전용 계정)",
              "status": "partial",
              "detail": "구현(로컬 확인). 포털 골격 14개 중 12개를 원천별 합성 페이지로 완성(selector_basis synthetic — 봇 계정 도착 후 첫 기록 실행에서 교체, 합성 selector 는 loopback 에서만), 합성 흐름 12건 기록→승인→재생(재생 모델 0회 · 로그인 1회 · 결정론), 쿠팡 2곳 · Qoo10 착수 보류, 게이트 전부 닫힘. 10/5 E4 준비(묶음 ⑬ — core 몫): ① 한 작업 다중 산출물 규칙 — 산출물은 「창 전체 1개」 또는 「하루마다 1개」만(core portal.check_job_periods, 어긋나면 막힘 config_invalid). 시드 하루 단위(last_n_days_sliced) 계약 정의 11개는 러너가 한 로그인 안에서 하루씩 조회(query_unit day) — 전에는 창 전체 1개를 내 core 가 sliced 계약에서 전부 거부할 상태였다(발견). 창 전체 정의에서 화면 상한(컬리 16일)보다 긴 창은 로그인 전 config_invalid ② 화면이 밝힌 기간(PeriodClaimed content)이 요청 기간과 다르면 막힘(조용히 줄인 창) ③ xlsx 정규화 다이제스트를 core 가 Python 으로 같게 계산(같은 파일 TS·Python 값 일치 확인) — 브라우저 xlsx 는 최신 배치 원본과 다이제스트가 같으면 unchanged ④ 다이소 daily_sellout = API 노드 core 수집기(cmslab_worker.daiso_daily)가 레이크 누적 스냅샷 전체로 창(7일)을 매번 다시 차분(시드 결정과 같음) — 노드 파일 carry 삭제(정본 = 레이크 S3 원본 + ctl.ingest_batch), 노드 교체 이중 집계 경로 0 ⑤ 기록 모드 CLI(run --record)는 설계 메모만(모델 · 처리위탁 결정 뒤). 변경 뒤 러너 typecheck · build · 시험, core+통합 시험(result.md). 실 포털 로그인 0. 가정: 개발 Mac mini(acp-mini) · 납품 AWS 브라우저 노드(EC2 t4g.medium ARM64 · Chromium). 10/5 결함 수정(묶음 ㉔ — 코드 전수 검토 배정 11건, 구현(로컬 확인)): 하루 단위 조회에서 전날 화면을 읽는 경로 차단(C3 — 조회 단계 전후 결과 지문 대기 · 화면 적용 기간 대조 · 날짜 형식 템플릿 · fill 뒤 값 다시 읽기(Stagehand fill 은 읽기 전용 칸에서도 성공을 돌려줌을 확인) · 연속 날짜 같은 내용이면 멈춤 · 받는 중 파일 대기) · 데이터 없는 날(H18 — 빈 결과 표식·경고창이면 머리글만 CSV 또는 0바이트 + 합계 0, 그 밖의 경고창은 문구 담아 즉시 실패) · 호출 간격·실행당 16일(H20) · 도메인 정책 범위(H19) · 봇 확인 감지 → 서킷(M26) · 차단 낱말 이름·약어(M27) · 태그만 표식 제거 · frameset/iframe(`>>`) · 공지 레이어 닫기(onlyIf) · 정의별 대상 예외(M28) · CLI --total-timeout-seconds 와 최소 소요 사전 검사(M29) · 입력 전 관찰(M30) · 제출 시점(L15) · 가리기 순서(L16) · preflight --slack-secret(L17). 변경 뒤 러너 typecheck · build · vitest 전체(14 파일 198 passed) · preflight pytest 17 passed. 실 포털 로그인 0.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/docs/실행환경.md",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/src/portals/definition.ts",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/src/portals/registry.ts",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/src/portals/skeletons/shared.ts",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/src/runner.ts",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/src/daiso/definition.ts",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/src/daiso/snapshotCsv.ts",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/src/xlsx.ts",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/src/browser/table.ts",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/test/e2e/sourceFlows.e2e.test.ts",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/test/support/syntheticPortal.ts",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/test/support/syntheticSources.ts",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/test/unit/sourceSkeletons.test.ts",
                "cmslab-data-platform/10_플랫폼구현/worker/core/cmslab_worker/portal.py",
                "cmslab-data-platform/10_플랫폼구현/worker/core/cmslab_worker/daiso_daily.py",
                "cmslab-data-platform/10_플랫폼구현/worker/core/cmslab_worker/extract.py",
                "docs/work-log/2026-10-03_collection-lanes-rest/lane-c.md",
                "docs/work-log/2026-10-05_e4-readiness/record-mode-cli.md",
                "docs/work-log/2026-10-05_e4-readiness/result.md",
                "docs/work-log/2026-10-05_fix-portal/result.md",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/src/window.ts"
              ],
              "next": "봇 전용 계정 · 자동 접근 서면 동의 도착(10/30) → 기록 모델 · 처리위탁 결정(record-mode-cli.md 3절 — 권고 A: 고객 AWS 계정 안 Bedrock) → record 명령 붙이기(반나절) → 원천별 실 화면 확인 후 selector · URL · OTP 메일 모양 교체(selector_basis portal) · 게이트 열기 → 기록→승인→재생으로 원천별 E4(하루 단위 계약은 하루씩 조회). 첫 실 xlsx 다운로드 두 번으로 시트 안 가변 셀 유무 확인(있으면 원천별 비교 규칙). 다이소: daily_sellout 파서 · 매핑(mappers)과 누적 표 실제 열 이름 교체(러너 DAISO_CUMULATIVE_CSV · core CUMULATIVE_COLUMNS 함께). 실 메뉴 차단어(발주 · 확정) 정책 결정. 금지 신호 강 3곳(쿠팡 2 · Qoo10)은 38-drafts C-1 · C-2 · C-3 회신 · 서면 동의 뒤 hold 해제 판단. 첫 기록 실행에서 원천별 빈 날 표식(empty_result) · 적용 기간(applied_period) · 날짜 형식 · 하위 요청 호스트(subresource_domains) · 팝업(onlyIf) · 프레임 · 2단계 로그인(startsScreen)을 실 화면으로 확정(docs/실행환경.md 3절). core 가 --total-timeout-seconds 를 넘기고 0바이트 빈 날을 「그날 0행」으로 받는지는 ㉒(fix-portal fyi-fix-worker-db.md).",
              "previous_status": "pending",
              "updated": "2026-10-05"
            },
            {
              "id": "request-list",
              "title": "고객 요청 목록(최송이 부장 · 16개 팀 · 53건)",
              "status": "done",
              "detail": "원천 연결에 필요한 요청 53건을 경로 팀(16개)·팀장·확인 담당자·기한·우선순위로 정리(1순위 18건). 엑셀로 전달. 10/7 미팅 회신(53건): 진행 중 26 · 회신 받음 3 · 해당 없음 4 · 미확인 20. **10/8 18:36 최송이 부장 서면 회신(같은 엑셀에 「회신내용」 열 + 「계정목록」 탭 60행)** — 53건 중 50건 회신, 현업 대기 3건(#27 인스타그램 · #40 결제 PG · #45 GEC BigQuery). 회신 중 15건은 위시켓에 되묻는 질문이다(#3 서비스 계정의 뜻 · #5 DNS 값 · #7 그룹웨어 계정 · #14 사방넷 API 경로 · #19 품고 재고 API · #24 광고 초대 주소 · #33 API 키 발급 여부 · #35 기준정보 시트 · #39 카페24 앱 가이드 · #46 · #47 일본 채널 · #52 채널톡 키 등). 차주 미팅 10/12(월) 15:30 의제: 제품마스터 · 연구소 원료 마스터 · 메디컬 채권 및 B2B 거래처.",
              "evidence": [
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/a5cdea7/docs/work-log/2026-10-10_reply-1008/context.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/a5cdea7/docs/work-log/2026-10-10_reply-1008/answers.json"
              ],
              "next": "10/12 미팅 전 답변 메일 · 답변 열을 붙인 회신 사본 발송(사용자) → 대기 3건 · 되물은 15건 회신 추적",
              "updated": "2026-10-10"
            }
          ],
          "updated": "2026-10-02"
        },
        {
          "id": "share-status-1003",
          "title": "원천 시트 공유 상태 (10/3 수집 계정 실측)",
          "items": [
            {
              "id": "share-revoked",
              "title": "9/30 이후 공유가 끊긴 시트 3개 — #82 본문서·#83·#85·#89",
              "status": "partial",
              "detail": "9/30 에 열리던 #82 · #39 · #83 · #85 · #89 가 10/3 404. 10/8 RBD1팀이 새 파일로 다시 공유(문서 ID 변경, 탭 gid 그대로). 2026-10-11 카탈로그 · 시드 바인딩을 새 ID 로 옮겼다(구현 — 로컬 확인). 운영 반영(마이그레이션 적용 · 러너 설정) 전이라 반복 수집은 아직 옛 설정. #83 · #85 · #89 READ_COMPLETE 는 서명 시점 증거라 유지.",
              "evidence": [
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/6f444b2/docs/work-log/2026-10-11_sources-1011/result.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/cmslab_sheets/catalog.py"
              ],
              "next": "운영 반영 뒤 #82 · #83 · #85 · #89 새 ID 로 1회 재조회 · 헤더 기준 확인",
              "updated": "2026-10-11",
              "previous_status": "blocked"
            },
            {
              "id": "share-never",
              "title": "공유된 적 없는 시트 6개 — 요청 시트 통합본·#63·#82 두 번째 문서·#88 외",
              "status": "partial",
              "detail": "#88 쿠팡 셀아웃은 10/8 새 파일(「쿠팡 셀아웃_빈스」)로 2026-10-11 카탈로그 재바인딩 · 막힘 해제(구현 — 로컬 확인). 같은 파일의 「기말재고」 탭은 32_ #111 로 등록. 남은 3개: #82 두 번째 문서(17Telw…, 404 — 「일간 매출 통합 시트로 공유」 대체 여부 확인 필요) · 영업 데이터 요청 공유문서 · 품목마스터 협의본(위시켓 소유).",
              "evidence": [
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/6f444b2/docs/work-log/2026-10-11_sources-1011/result.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/cmslab_sheets/catalog.py"
              ],
              "next": "#82 두 번째 문서 대체 여부 RBD1팀 확인 · 위시켓 소유 2개 수집 계정 공유 여부 결정",
              "previous_status": "blocked",
              "updated": "2026-10-11"
            },
            {
              "id": "share-no-link",
              "title": "공유 경로 확인 중 — 시트·폴더별 남은 범위",
              "status": "partial",
              "detail": "10/8 회신으로 #43 VOC, #42 출하적부, #12 경영지원실 경로를 확인했다. 10/14에는 연구소 원료마스터 파일을 읽기 전용으로 확인하고 별도 비공개 정리 작업을 가동했다. 다만 이는 원료마스터 한 파일 범위이며 #41 원료·전성분·BOM 문서감시 폴더 전체를 받은 것은 아니다. #71 기준정보, #23 라플라스 매핑, #40 신제품 코드 원본, #68 품질서류와 #41 전체 폴더 범위는 별도 상태를 유지한다.",
              "evidence": [
                "docs/work-log/2026-10-14_material-automation-status-refresh/public-material-automation-status.md",
                "docs/work-log/2026-10-10_reply-1008/share-probe-1010-sanitized.json"
              ],
              "next": "#71·#23·#40·#68의 남은 공유 경로를 확정하고, #41은 BOM·전성분 문서감시 전체 폴더와 권한 범위를 별도로 정한다.",
              "previous_status": "blocked",
              "updated": "2026-10-14"
            }
          ],
          "updated": "2026-10-03"
        },
        {
          "id": "scope-code-gap-followups",
          "title": "묶음 ⑥ 에서 찾은 기존 결함(이 묶음 밖)",
          "items": [
            {
              "id": "mart-f04-fx-perf",
              "title": "mart.v_f04_plan_vs_actual 원화 환산 조인 성능 — F-01·F-04 시간 초과",
              "status": "partial",
              "detail": "구현(로컬 확인) — 운영 적용 대기. 12차(20260929200004): 원인은 환산 조인 앞의 재조인 추정이었다 — 실적 CTE 를 입도 고르기와 3열로 다시 조인해 플래너가 1행으로 추정했고, 환율 뷰를 실적 행마다 다시 계산했다(색인 탐색 2,372만 번). 입도·수준 고르기를 윈도로, 환율은 비원화 (통화, 날짜) 쌍만 한 번(MATERIALIZED), 품목 비교·실적 집계는 한 번만(MATERIALIZED — 「계획 있는 행만」 조건이 FULL JOIN 을 LEFT JOIN 으로 바꿔 계획 행마다 다시 집계하던 두 번째 병목도). 합성(실적 25,075행) EXPLAIN ANALYZE 27.4초 → 0.06초 · F-01 계획 대비 26초 → 0.05초 · F-04 품목 25초 → 0.05초. 기존 26열 결과 집합 차이 0(1,124행 · 가격 기준·입도·수준·통화·환율 공백·채널 계획을 흔든 교란 트랜잭션에서도 0). 화면: next dev F-01 4가지 · F-04 3가지 200(0.22~0.42초, 「조회 시간 초과」 없음). 다른 환산 마트 뷰 3개(v_f01_sales_trend_daily · v_f01_settlement_daily · v_f09_ad_daily)는 같은 합성에서 화면 쿼리 5~27 ms 라 그대로 뒀다. ⑲ 기록: 10/5 웹 기존 시험 첫 실행의 E2E 15건 · DB 시험 6건 실패가 모두 이 뷰(LIMIT 1 조회도 15초 초과)였다. ⑳(10/5) 합친 main 재실행: 웹 test:db 200/200(⑲ 때 189/195) — 결과 표 integration-close result 6절. 2026-10-11 15차(구현 — 로컬 확인): v_f04 실적 환산이 행마다 COALESCE(원천 환율, 수출입은행), 환율 CTE 는 원천 환율 없는 행만 — 원천 환율이 없으면 12차와 같은 값. 끝 열 fx_source. v_f01 판매 · 정산 · v_f09 도 같은 규칙 · 끝 열 fx_source, v_f03 손익은 원천 환율 열을 그대로. 성능 재측정은 안 했다.",
              "evidence": [
                "docs/work-log/2026-10-05_mart-12th/result.md",
                "docs/work-log/2026-10-05_mart-12th/explain-v_f04-before.txt",
                "docs/work-log/2026-10-05_mart-12th/explain-v_f04-after.txt",
                "docs/work-log/2026-10-05_mart-12th/bench-before.txt",
                "docs/work-log/2026-10-05_mart-12th/bench-after.txt",
                "docs/work-log/2026-10-05_mart-12th/http-check.json",
                "cmslab-data-platform/10_플랫폼구현/managed/supabase/migrations/20260929200004_mart_12th.sql",
                "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/01_시스템아키텍처.md",
                "docs/work-log/2026-10-05_web-auth-aws/result.md",
                "docs/work-log/2026-10-05_integration-close/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/2a87405/docs/work-log/2026-10-11_fx-source-first/result.md"
              ],
              "next": "운영 적용: AWS RDS 부트스트랩(⑱ — 그날의 03_ 에 12차 포함) 또는 그 뒤면 ⑪ RDS 변경 경로로 20260929200004. 적용 뒤 운영 F-01·F-04 200 · 1초 안 확인",
              "updated": "2026-10-11",
              "previous_status": "pending"
            },
            {
              "id": "mapping-revoke-mart-remap",
              "title": "매핑 되돌림 — 철회 뒤 마트가 적재 item_id 로 되돌아감 · remap 은 매핑만 바뀐 배치를 안 연다",
              "status": "partial",
              "detail": "구현(로컬 확인) — 운영 적용 대기. ① 마트 4뷰(v_f01_sales_trend_daily · v_f01_item_units_daily · v_f04 계획·실적 · v_f05_inventory_latest) 품목 풀이: 식별자가 있는 사실은 조회 시점 승인 매핑만(12차). 먼저 적재 경로 확인 — core 사실을 쓰는 곳은 mapping_exec 하나, 매퍼는 item_id 를 직접 못 주고(CORE_FILLED), 10차 ERP 투영은 mdm.item(참조 표)만 쓴다. 합성: 식별자 있는 판매 관측 28,645 · 재고 240행 중 적재 품목 ≠ 현재 매핑 0행 → 마트 4뷰 전·후 차이 0. 승인 매핑 1건 철회(ROLLBACK): 옛 뷰는 459행 그대로, 새 뷰는 미매핑 28 → 487. ② 창고: 결정 = remap 에 「적재 버전 무관 · 계정·기간·배치로 좁혀 열기」(document_line 에 원천 창고 코드 열이 없어 조회 시점 풀이가 불가능) — 합성: 같은 적재 버전이면 기본 모드 대상 0, any_version + 계정이면 1 → 열림(published → validating), 좁히지 않으면 거부. runbook 3.7 의 다른 두 날(ERP 수불 매퍼 신설 · 가격 기준 반영)은 매퍼 버전이 바뀌어 기본 모드로 열린다. ③ mapping_exec._already_approved 가 효력 기간을 본다 — 효력을 끝낸 매핑 뒤 사실이면 새 제안(9가지 경우 기대대로). ④ day1-runbook 3.7 · mapping-criteria 되돌림 표 정정, 고객용 08_ 은 옛 한계 문구가 없어 그대로. 명령줄 플래그(--any-version · --account · --since · --until · --batch) 배선 상태는 result.md.",
              "evidence": [
                "docs/work-log/2026-10-05_mart-12th/result.md",
                "docs/work-log/2026-10-05_mart-12th/worker-check.json",
                "cmslab-data-platform/10_플랫폼구현/worker/core/cmslab_worker/remap.py",
                "cmslab-data-platform/10_플랫폼구현/worker/core/cmslab_worker/mapping_exec.py",
                "docs/work-log/2026-10-02_erp-critical-path/day1-runbook.md",
                "docs/work-log/2026-10-02_erp-critical-path/mapping-criteria.md",
                "cmslab-data-platform/10_플랫폼구현/managed/supabase/migrations/20260929200004_mart_12th.sql"
              ],
              "next": "운영 적용(⑱ 부트스트랩 또는 ⑪ 변경 경로) · ERP 접속일(⑮) 창고 코드 승인 뒤 runbook 3.7 의 --any-version 실행",
              "updated": "2026-10-05",
              "previous_status": "pending"
            }
          ],
          "updated": "2026-10-03"
        },
        {
          "id": "code-review-1005-fixes",
          "title": "10/5 코드 전수 검토 결함 수정(㉑~㉔)",
          "items": [
            {
              "id": "fix-web-infra",
              "title": "㉑ 결함 수정 — 웹 · infra · CI(21건)",
              "status": "partial",
              "detail": "구현(로컬 확인) — 21건 모두 코드에서 재현 · 고침(M7 은 일부 — 사건 소비자 역할 원천 좁히기는 업로드 제출 · 사본 뒤채움이 같은 역할이라 보류, DB 면은 ㉒ fyi). H2 공개 노출 이중 방어(infra 443 고정 403 + 앱 서명 헤더 검증) · H3 OIDC sub 에 ref_protected:true(AWS 범용 OIDC 는 aud · sub · amr · email · oaud 만 조건 키 — 공식 문서 확인) · apply 계획 해시 필수 · C2 회전 토큰 쓰기 = 카페24 · TikTok Shop · Creator 의 /token 비밀만(원 비밀 쓰기 닫음) · M5 실패 알림 규칙 목록 · M6 사건 소비자 레이크 덮어쓰기 금지 · M7 브라우저 노드 = 시드 browser 원천 14개 접두어 · M8 원본 삭제 = pii AND purge + 기존 태그 조건 · M9 부트스트랩 워크스페이스 · 계정 가드 · H1 F-04 가격 기준 하나 · M1 public/ · M2 12차 규칙 안내 · 영향 산식 · M3 풀 대기 · 크기 · M4 · L1 미환산 · 빈 값 표시 · L2 날짜 500 · L3 그룹 조회 · L4 상태 볼륨 prevent_destroy · L5 상태 버킷 관리자만 · L7 업로드 트리거 DLQ · 실패 알림 · L8 예약 동시성 tfvars · L9 7단계 확인. 확인: infra check.sh EXIT 0(terraform test 10/10 · checkov 634/0 · pytest 70) · web typecheck · lint · build · 단위 144/144 · test:db 200/200 · migrator check-bundle problems 0 · 화면 11경로 200 · H2 앱 방어 실측 8/8. 운영 apply 0.",
              "evidence": [
                "docs/work-log/2026-10-05_fix-web-infra/result.md",
                "docs/work-log/2026-10-05_fix-web-infra/fyi-bundle22.md",
                "docs/work-log/2026-10-05_fix-web-infra/fyi-bundle23.md",
                "docs/work-log/2026-10-05_customer-comms-polish/code-review-findings.md",
                "cmslab-data-platform/10_플랫폼구현/infra/RUNBOOK.md",
                "cmslab-data-platform/10_플랫폼구현/infra/modules/platform/tests/platform.tftest.hcl",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/b20c07e/.gitlab-ci.yml",
                "docs/work-log/2026-10-05_fix-connectors/fyi-fix-web-infra.md"
              ],
              "next": "사용자: GitLab 프로젝트 ci_id_token_sub_claim_components 에 ref_protected(첫 rds-plan 전) · (권고) ci_allow_fork_pipelines_to_run_in_parent_project=false → AWS 계정 D 에 RUNBOOK 2~9단계로 운영 적용 → 사건 소비자 · 업로드 제출 · 뒤채움 역할 분리(첫 웹훅 source= 확인 뒤)",
              "updated": "2026-10-05"
            },
            {
              "id": "fix1005-pii-contracts",
              "title": "개인정보 계약 플래그 — 자사몰 #20 · 무신사 정산 · 파서 PII 선언 가드(H7 · H8)",
              "status": "partial",
              "detail": "구현(로컬 확인). 자사몰 #20 dept_daily_metrics 를 raw_has_pii=true(시드) + files MALL20 열 비우기 사본(진짜 xls → xlsx, 「ERP양식외」 PII 열 · 되풀이 헤더 라벨 보존). 무신사 정산 · 자사몰 #20 조이기와 ⑫ 무신사 주문 폴백 계약·일정을 체인 20260929200005(reconcile.py emit-migration 생성물 — 체인 …200004 기준 remaining 4 → 0)로. 파서가 양식에 PII 열을 선언했는데 계약이 false 면 core 가 수집·제출을 pii_contract_mismatch 로 막고, 통합 시험이 파서 선언·제거기 등록 ⇒ 시드 true 를 대조한다. 실표본(자사몰-일매출 xls, 읽기 전용) 사본: 기간·거부·stg 1,609행 같음(부동소수 1 ulp 1칸).",
              "evidence": [
                "docs/work-log/2026-10-05_fix-worker-db/result.md",
                "cmslab-data-platform/10_플랫폼구현/managed/supabase/migrations/20260929200005_seed_reconcile_pii_musinsa_orders.sql",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/cmslab_files/redact.py",
                "cmslab-data-platform/10_플랫폼구현/worker/core/cmslab_worker/extract.py",
                "cmslab-data-platform/10_플랫폼구현/worker/tests/test_seed_contracts.py"
              ],
              "next": "운영 적용: AWS RDS 부트스트랩(RUNBOOK 5단계 — 그날의 03_ · 현행 시드에 포함) 또는 그 뒤면 ⑪ RDS 변경 경로(rds-plan → rds-migrate)로 20260929200005·200006. 첫 실 적재(10/30 전후)에서 확인할 사실은 result 6절",
              "updated": "2026-10-05"
            },
            {
              "id": "fix1005-publish-gate",
              "title": "자동 공개 게이트 — 승인 회차 결속 · 첫 core 배치 하한(H5 · M16)",
              "status": "partial",
              "detail": "구현(로컬 확인). 사람 승인(accepted)은 그 처리 회차에만 — remap·재적재 새 회차는 같은 사유면 예외를 새로 연다(core publish.py). ctl.auto_publish_check: 이전 기준(stg 데이터 행 수)으로 비교한 첫 core 배치도 core 행이 stg 의 50% 미만(0 포함)이면 row_count_out_of_range(생성기 → 03_ → 20260929200006). core 시험 2건 추가.",
              "evidence": [
                "docs/work-log/2026-10-05_fix-worker-db/result.md",
                "cmslab-data-platform/10_플랫폼구현/managed/supabase/migrations/20260929200006_publish_check_core_floor_settlement_finance.sql",
                "cmslab-data-platform/10_플랫폼구현/worker/core/cmslab_worker/publish.py",
                "cmslab-data-platform/10_플랫폼구현/worker/core/tests/test_publish.py"
              ],
              "next": "운영 적용: AWS RDS 부트스트랩(RUNBOOK 5단계 — 그날의 03_ · 현행 시드에 포함) 또는 그 뒤면 ⑪ RDS 변경 경로(rds-plan → rds-migrate)로 20260929200005·200006. 첫 실 적재(10/30 전후)에서 확인할 사실은 result 6절",
              "updated": "2026-10-05"
            },
            {
              "id": "fix1005-numbers",
              "title": "숫자 정확성 — 지그재그 수수료 · 면세 연속성 · 자사몰/라쿠텐 셀 해석 · 합계 라벨(H10 · H9 · M15 · M12)",
              "status": "partial",
              "detail": "구현(로컬 확인). 지그재그 정산 fee = 수수료 공급가(부가세 포함액 − 부가세, w2.zz.settlement/2) · 면세 G6 직전 배치 = 기간 끝이 이 배치 시작 −1일인 공개 배치 · 자사몰·라쿠텐 날짜(2026.10.05 · 20261005)·글자 숫자(1,234) 해석 + 해석 실패 type warn · 같은 날 합산 duplicate warn · 합계 라벨(「합계:」·「월 합계」·「합계(VAT포함)」) files · sheets · inbound 같은 규칙 · inbound 끝 빈 칸 무시. 매퍼 버전이 올라 remap 대상이 된다.",
              "evidence": [
                "docs/work-log/2026-10-05_fix-worker-db/result.md",
                "cmslab-data-platform/10_플랫폼구현/worker/mappers/cmslab_mappers/channels/zigzag.py",
                "cmslab-data-platform/10_플랫폼구현/worker/core/cmslab_worker/mapping_exec.py",
                "cmslab-data-platform/10_플랫폼구현/worker/mappers/cmslab_mappers/channels/_values.py",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/cmslab_files/engine.py"
              ],
              "next": "운영 첫 적재 뒤 remap(지그재그 정산 · 자사몰 · 라쿠텐 — 적재 버전이 바뀌었다)",
              "updated": "2026-10-05"
            },
            {
              "id": "fix1005-ingest-robustness",
              "title": "수집·수신 견고성 — 포털 서킷 · 시트 선택자 · 수신 route 격리(H4 · H6 · H11)",
              "status": "partial",
              "detail": "구현(로컬 확인). 부서 제출은 진짜 artifact(비브라우저) 일정일 때만 추출 기록 schedule_id — 포털 계정 서킷을 닫거나 열지 않는다. 시트 파서·사본 선택자 = 카탈로그 기본 ∪ 계정 설정, 스냅샷에 선택자 밖 탭이 있으면 거부. 수신 route 하나의 예외가 수신 전체를 멈추지 않는다(route_errors) · 「/」 파일명 · 사라진 pending 메일은 그 건만 종결.",
              "evidence": [
                "docs/work-log/2026-10-05_fix-worker-db/result.md",
                "cmslab-data-platform/10_플랫폼구현/worker/core/cmslab_worker/submit.py",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/cmslab_sheets/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/cmslab_files/reception/cli.py"
              ],
              "next": "첫 실수신(10/30 합의 뒤) · #82 두 계정 시트 첫 수집에서 선택 탭 확인",
              "updated": "2026-10-05"
            },
            {
              "id": "fix1005-reprocess",
              "title": "재처리 경로 — 옛 파서 block · validated 거부 · remap 수집 방식 · 다이소 창 · 예외 문구(M10 · M11 · M13 · M14)",
              "status": "partial",
              "detail": "구현(로컬 확인). 고친 파서의 새 회차가 성공한 rejected 배치의 옛 parser: block 을 자동 공개기(업무 앱)가 해소 · →validated 거부 failed 배치 재시도 경로(3회·15분 · --batch 는 바로) · remap 이 배치 ingest_method 별 적재 버전 · 다이소 일자별은 창 앞에서 시작하는 기간 행을 내지 않고 알림 · 파서·매퍼 예외 문구는 유형 이름만(LoadError · 사유 코드 거부만 문구).",
              "evidence": [
                "docs/work-log/2026-10-05_fix-worker-db/result.md",
                "cmslab-data-platform/10_플랫폼구현/worker/core/cmslab_worker/load.py",
                "cmslab-data-platform/10_플랫폼구현/worker/core/cmslab_worker/remap.py",
                "cmslab-data-platform/10_플랫폼구현/worker/core/cmslab_worker/daiso_daily.py"
              ],
              "next": "",
              "updated": "2026-10-05"
            },
            {
              "id": "fix1005-settlement-fee-finance",
              "title": "정산 수수료 = 재무 제한(확정서 6절) — 일반 정산 뷰에서 수수료 열 분리(L6)",
              "status": "partial",
              "detail": "구현(로컬 확인). mart.v_f01_settlement_daily(일반)에서 fee · fee_vat_amount 를 빼고 재무 뷰 mart.v_f01_settlement_fee_daily 로(생성기 → 03_ → 20260929200006 — 03_ DB 와 체인 DB 정의·권한 같음). 웹 F-01 정산 카드 수수료 열 제거 · F-03 재무 뷰로 · screens MART_GRANTS · e2e 갱신(단위 142 · DB 205 · e2e F-01/F-03/reader 통과). 정산 순액을 일반에게 보일지는 고객 확인 대상(result 4절).",
              "evidence": [
                "docs/work-log/2026-10-05_fix-worker-db/result.md",
                "cmslab-data-platform/10_플랫폼구현/managed/supabase/migrations/20260929200006_publish_check_core_floor_settlement_finance.sql",
                "cmslab-data-platform/10_플랫폼구현/web/src/app/(app)/f01/page.tsx",
                "cmslab-data-platform/00_프로젝트작업실/45_세부과업범위_확정서_v1.0.md"
              ],
              "next": "고객 확인(정산 순액 공개 범위) · 운영 적용(RDS 부트스트랩 03_ 또는 rds-migrate)",
              "updated": "2026-10-05"
            },
            {
              "id": "fix1005-worker-misc",
              "title": "워커 순위 밖 5건 · ㉓ fyi(대조 0키 · PII 유선/국제 · BCC 알림 · submit-event 일시 오류 · 철회 배치 · read_only_violation)",
              "status": "partial",
              "detail": "구현(로컬 확인). 대조 0건이면 info(올리브영·면세·라쿠텐) · 파일 PII 값 규칙에 유선(구분자)·국제 번호(pii.files.v4) · To/Cc 에 수신자 없는 같은 발신 메일은 알림(inbound_not_addressed) · submit-event 는 일시 오류면 결과 파일을 쓰지 않고 재시도 · 철회된 최신 배치와 같은 바이트는 unchanged 대신 duplicate_rejected · 오류 분류 read_only_violation 추가(사방넷 전환). 「빈 결과 정상」 표시는 보류(result 3절).",
              "evidence": [
                "docs/work-log/2026-10-05_fix-worker-db/result.md",
                "cmslab-data-platform/10_플랫폼구현/worker/contracts/error_classes.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/inbound/cmslab_inbound/collector.py"
              ],
              "next": "「빈 결과 정상(영업일 원천)」 계약 표시 — 다음 묶음",
              "updated": "2026-10-05"
            }
          ],
          "updated": "2026-10-05"
        },
        {
          "id": "decisions-1007-followups",
          "title": "10/7 협의 결정 후속 — 범위가 바뀐 것",
          "items": [
            {
              "id": "d1007-team-view",
              "title": "팀 단위 열람 — 사람의 현재 팀 기준 행 단위 권한(C-9)",
              "status": "partial",
              "detail": "10/7 결정 · 사용자 확인: 사람은 지금 속한 팀의 데이터만 과거 연도까지 본다(2024년 A팀이던 사람이 2026년 B팀이면 2024년 데이터도 B팀 것만). 데이터 행마다 그 시점 팀 귀속이 있고 사용자는 현재 팀으로 걸러지는 행 단위 권한이다. 9/29 회신에서 「범위 밖 · 별도 설계」로 뺐던 기능이라 확정서 v1.0 제출본에 넣었지만 공수 · 일정 · 직접 분석 도구 비용 영향은 아직 산정하지 않았다. 필요한 것: 행별 시점 팀 귀속(귀속 이력 · 전 기간 소급) · 사람 → 현재 팀 동기화 · 포털 DB 행 단위 정책 · 직접 분석 도구 쪽 행 단위 권한 · 귀속 예외 처리 화면 · 검수 시 팀별 열람 확인. 2026-10-11 입력 연결(값은 레이크에만): ① 거래처 → 영업그룹(관리) 1,166 거래처 · 36 영업그룹(#103, 복수 영업그룹 거래처 16) ② 영업그룹 → 담당부서 9팀(#104 손익 요약) — 「계열사」(RBD1 · RBD2) · 「자사몰-국내」(동북아MC · 디바이스 · 일본사업)는 브랜드별로 담당이 갈려 행마다 브랜드가 필요(10/7 통합매출엔 브랜드 열 없음 → 품목코드 → 브랜드 마스터로 붙임) ③ 사람 → 부서 146명(#109 GWS). 담당부서 9 중 6은 GWS 부서와 바로 연결, **GEC팀 · Global 사업팀 · 동북아MC팀 3은 연결 안 됨** — 8월 조직도의 팀이 지금 GWS 에 없거나(GEC · 동북아MC) 둘로 나뉨(Global 사업1 · 2팀). 금액의 팀 귀속은 고객에게 따로 받지 않고 경영지원실 자료에서 역설계(10/11 원칙). 2026-10-11 구현(로컬 임시 DB 확인): 팀 귀속 마스터 mdm.team_attribution 신설(14차 — 영업그룹 · 영업그룹 × 브랜드 · 거래처 · 브랜드 · 사람 → 팀 × 효력 기간, 승인 행 겹침 금지, 적재 역할은 제안만 · 승인은 업무 앱). #104 요약에서 영업그룹 × 브랜드 → 담당부서 제안 118건을 실제로 적재했다. 3팀은 제안으로만 남는다(추측 귀속 없음). 팀별 손익(연결기준) 표도 core.pnl_line(단위 = 팀)으로 들어온다. 남은 것: 3팀 GWS 연결(10/12) · 승인 화면 · 행 단위 권한 정책 · 공수 산정.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/45_세부과업범위_확정서_v1.0.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/9fc92f0/docs/work-log/2026-10-07_meeting-result/result.md",
                "docs/work-log/2026-10-11_live-read/attribution-summary.json",
                "docs/work-log/2026-10-11_live-read/read-evidence-sanitized.json",
                "docs/work-log/2026-10-11_core-14th/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/2596833/docs/work-log/2026-10-11_finance-core-map/result.md",
                "docs/work-log/2026-10-11_core-complete/result.md"
              ],
              "next": "3팀(GEC · Global 사업 · 동북아MC → 현재 조직) 10/12 확인 → 팀 코드 체계 · 업무 앱 승인 화면 → 사람(#109) 귀속 · 행 단위 권한 정책 → 공수 재산정(10/30 전)",
              "updated": "2026-10-11",
              "previous_status": "pending"
            },
            {
              "id": "d1007-pnl-statement",
              "title": "재경 손익계산서 수신 · 표시(C-5 · C-6)",
              "status": "partial",
              "detail": "10/7 결정(손익은 계산하지 않고 받아 보인다)의 원천을 2026-10-11 등록했다: 「경영지원실 데이터」 폴더 = gdrive_mgmt_finance, 32_ #104 영업그룹별 손익 · #105 손익계산서 · #106 판매비와관리비(제한) · #107 실행계획 취합(목표, 비권위). 역설계: 마감월 손익 불변(9월 판 ↔ 10/7 판 1~7월 같음) · 손익 원가 = 통합매출 행 원가 합. 2026-10-11 구현(로컬 임시 DB 확인): 손익 행 사실 core.pnl_line 신설(14차 — 기간 · 마감 버전 · 시나리오 · 법인 · 단위 종류 · 계정 트리 · 측정값 · 배율, 소계도 받은 값 그대로, 재계산 없음) · 재무 묶음 전용 마트 mart.v_f03_pnl_line(조회 역할은 못 읽음). #104 는 월별 · 요약 · 브랜드 · 총합계 · 팀 · 채널 보기를 단위 종류로 갈라 겹쳐 세지 않고, #105 는 법인별 PL 5시트(한국 · 중국 원화 · 중국 위안 · 연결 · 연결조정)만 싣는다(PL_누계 · 기간별 · 원가 원장은 같은 숫자라 뺐다). 사슬 대사: PL 매출액 − 회계차이 = #104 순매출 1~8월 1원 미만 8/8, (매출원가 + 제품) − 회계차이 = #104 원가 3블록 8/8. #107 은 목적지 후보라 명세만, #106 은 목적지 없음. 2026-10-11 사용자 결정 「손익 · 공식 매출 = 12/23 공개」 — #104 · #105 를 자동(정본, 공개)으로 바꾸고 공개 보류를 풀었다(37_ 「부록 A 추가」 · 마이그레이션 20260929200015 — !177). #106 판관비(목적지 없음) · #107 실행계획(목표 정본 미정)은 원시 수집(공개 보류) 그대로다. 15차(!178): #105 PL_China_CNY 위안 행에 원천 적용환율(같은 달 칸)을 source_fx_rate 로 싣는다 — v_f03 은 원화로 환산하지 않고 그대로 보인다. 남은 것: 원격 적용(200012 · 200014 · 200015 · 200016) · 운영 첫 공개(사람 관문 — 0원 대사 확인 뒤) · 주간 손익 양식 · #104 요약 한국법인과 PL_Korea 차이의 뜻(재경) · F-03 화면.",
              "evidence": [
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/6f444b2/docs/work-log/2026-10-11_sources-1011/result.md",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/99_생성도구/core_fact_contracts.py",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/main/docs/work-log/2026-10-11_austin-reverse/result.md",
                "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/08_core사실_확정안.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/main/docs/memory/cmslab-money-austin-excel.md",
                "docs/work-log/2026-10-11_core-14th/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/2596833/docs/work-log/2026-10-11_finance-parsers/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/2596833/docs/work-log/2026-10-11_finance-core-map/result.md",
                "docs/work-log/2026-10-11_core-complete/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/2a87405/docs/work-log/2026-10-11_finance-publish-1223/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/2a87405/docs/work-log/2026-10-11_fx-source-first/result.md"
              ],
              "next": "첫 RDS 부트스트랩(그날 03_ + 시드 — 200012~200016 은 기준선 기록만, RUNBOOK R4) → 워커 배포 → API 노드 route 등록 · 첫 운영 수신 → 0원 대사 확인 · 첫 공개 승인(사람) → F-03 손익 화면(mart.v_f03_pnl_line). 재경: 요약 한국법인 ↔ PL 차이 · 주간 손익 양식 · #107 목표 정본(10/12 미팅 4-4)",
              "updated": "2026-10-11",
              "previous_status": "pending"
            },
            {
              "id": "d1007-close-excel",
              "title": "전사 공식 매출 = 경영지원실 통합매출(손익의 행 원천 — 10/11 역설계 확인)(C-9)",
              "status": "partial",
              "detail": "「통합매출_2026 누계」를 32_ #103 · 계약 gdrive_mgmt_finance/main/sales_close_ytd(accounting · 권위)로 등록했다. 역설계(값 미기록): 재경 통합매출의 열 축소판이고 1~8월 매출 합 = 영업그룹별 손익 순매출, 원가 합 = 원가 3블록 합(0원 차이) → 공식 매출 = 이 파일. 지난달 행 정정이 있어 매 업로드 전체 교체. 2026-10-11 구현(로컬 임시 DB 확인): core.accounting_sales 를 원천 행 입도로 바꿨다(14차 — 회계월 × 버전 × 상태 × 원천 행, source_kind mgmt_close). #103 목적지 판정, #12 도서관파일은 같은 원천이라 목적지 없음(중복 공급 방지). 매핑 명세(엔진 실행)로 원천 행 418,588 = 사실 418,588(매출 · 원가 전용 행 구분). 다시 올리면 현재 행 = 새 배치뿐이고 옛 배치는 버전으로 남는다. core 0원 대사(acceptance SQL): 1~8월 순매출 정확 일치 8/8 · 원가 1원 미만 8/8. 원가의 원 미만 소수 때문에 금액 열을 4자리로 넓혔고, 두 번째 업로드부터 현재 행 뷰가 멈추던 partition 검사를 고쳤다(마이그레이션 200014). 2026-10-11 사용자 결정 「손익 · 공식 매출 = 12/23 공개」 — #103 의 12/23 상태를 원시 수집 → 자동(정본, 공개)으로 바꾸고(37_ 「부록 A 추가」) 시드 · 운영 DB 의 공개 보류를 풀었다(마이그레이션 20260929200015, 임시 PG16 체인 2회 적용 · compare remaining 0 — !177). 같은 날 「품목 매핑 — 기준에 따라서」 결정으로 1단계(코드 일치) 일괄 승인 도구를 만들었다(!179): 로컬 ERP 품목 내보내기 기준 #103 식별자 790 → 승인 763 · 3단계 24 · 4단계 3, 재처리 뒤 item_id 채움 417,659/418,588(임시 DB). 남은 것: 원격 적용 · 운영 첫 공개(사람 관문 — 0원 대사 확인 뒤 publish-batch) · 품목 매핑 1단계 운영 실행(ERP 접근 뒤 — 통합매출은 1단계 허용 원천) · 적재 메모리(약 2GB — API 노드 2GB 에서 위험) · 마감 확정 버전 여부(재경).",
              "evidence": [
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/6f444b2/docs/work-log/2026-10-11_sources-1011/result.md",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/99_생성도구/core_fact_contracts.py",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/main/docs/work-log/2026-10-11_austin-reverse/result.md",
                "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/08_core사실_확정안.md",
                "docs/work-log/2026-10-11_core-14th/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/2596833/docs/work-log/2026-10-11_finance-parsers/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/2596833/docs/work-log/2026-10-11_finance-core-map/result.md",
                "docs/work-log/2026-10-11_core-complete/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/2a87405/docs/work-log/2026-10-11_finance-publish-1223/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/2a87405/docs/work-log/2026-10-11_item-mapping-tier1/result.md"
              ],
              "next": "첫 RDS 부트스트랩(그날 03_ + 시드 — 200012~200016 은 기준선 기록만, RUNBOOK R4) → 워커 배포 → API 노드 route(#103 80MiB 상한) · 첫 운영 수신 → 품목 매핑 1단계(mapping-tier1 — ERP 품목 마스터 선행) · remap → 0원 대사 확인 · 첫 공개 승인(사람) → F-02 월 확정 화면. 적재를 묶음 단위로 흘리거나 적재 노드 크기 상향",
              "updated": "2026-10-11",
              "previous_status": "pending"
            },
            {
              "id": "d1007-inventory-lock-erp",
              "title": "재고 배정 = 귀사 배정 시트(RBD 재고분배 — 공식 기록), 플랫폼은 조회 · 잠금 없음(C-4 · 10/11)",
              "status": "partial",
              "detail": "10/7 결정 C-4(ERP 배정 결과 조회)와 10/8 회신 #18(「ERP 에 배정 기록 없음」)이 부딪힌다. 국내 B2C 배정 기록은 RBD1 프로모션 캘린더 「재고분배」 탭(입고분 × 자사몰 · 네이버 · 쿠팡 · 버티컬 · 군납 · 잔여)에 있다 — 2026-10-11 32_ #110 · 계약 sheet_rbd1_stock_allocation(원시 수집, 목적지 후보 wf.stock_allocation)으로 등록(구현 — 로컬 확인). 정본 결정은 10/12 미팅. 2026-10-11 사용자 확인: **RBD 프로모션 캘린더 「재고분배」 탭이 국내 B2C 공식 배정 기록**이다(ERP 에는 배정 · LOT 기록 없음 — 10/8 회신 #18). 원천 #110 으로 등록(로컬 확인 — 10/11 sources-1011). 미발송 확정서 v1.0 의 1.1 안건 4 · 1.2 · 2.2 · 3.5 · 9절 8 · 별표 1-5 · 별표 2 를 「배정은 귀사 배정 시트, 플랫폼은 조회만」으로 고쳤다. ",
              "evidence": [
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/6f444b2/docs/work-log/2026-10-11_sources-1011/result.md",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/45_세부과업범위_확정서_v1.0.md"
              ],
              "next": "확정서 v1.0 발송 → 다른 팀 배정 시트 유무 확인 → 러너 설정 · 재고분배(#110) 파서 → 가용 = 실재고 − 배정 화면",
              "updated": "2026-10-11",
              "previous_status": "pending"
            }
          ],
          "updated": "2026-10-07"
        },
        {
          "id": "reply-1008-followups",
          "title": "10/8 요청목록 회신 후속 — 답변 · 위시켓 할 일",
          "items": [
            {
              "id": "r1008-reply-draft",
              "title": "회신 답변 메일 · 답변 열 붙인 사본 · 경영지원실 안내 메일 · 함께 보낼 7통",
              "status": "partial",
              "detail": "10/8 회신 53행 전부에 위시켓 판정 · 답변 · 다음 할 일을 달았다(귀사 진행 요청 30 · 완료 11 · 10/12 협의 5 · 위시켓 진행 3 · 회신 대기 2 · 범위 조정 2). 고객 xlsx 사본은 「계정목록」 탭과 회신 칸 계정 정보를 빼고 만들며 대내 흔적 검사 0건. 답장 본문 · 재경 질의 메일 본문 누출 0건. 10/2 이후 미발송인 안내 메일 6통(10/7 결정 회신 · 확정서 v1.0, ERP 스크립트, AWS 계정 생성, 개설일 할 일, Google 그룹 · Groups Reader, 재경 질의)을 함께 보낼 목록으로 묶었다. 발송 전. 2026-10-11 최종 — 신규 원천 6종 수용 · 금액 = 경영지원실 자료 · 재고분배 = 공식 배정 · 채권 = 위시켓 ERP 직접 확인을 답변 · 메일에 반영. 재경 질의 메일은 규칙 질문을 빼고 「경영지원실 안내」(통합매출 열 2개 선택 · 급여 행 제외)로 줄였다. 함께 보낼 메일 7통(10/8 답장 · 10/7 결정 회신 + 확정서 v1.0(10/12 판 PDF) · ERP 스크립트 · AWS 계정 생성 · 개설일 할 일 · Google 그룹 · 경영지원실 안내) — 10/2 이후 고객 발송 0통. 10/11 재확인: 10/8 이후 고객 새 메일 0 · 경영지원실 폴더 새 파일 0.",
              "evidence": [
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/a5cdea7/docs/work-log/2026-10-10_reply-1008/answers.json",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/a5cdea7/docs/work-log/2026-10-10_reply-1008/%EB%8B%B5%EB%B3%80%EB%A9%94%EC%9D%BC_%EC%B4%88%EC%95%88.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/main/docs/work-log/2026-10-10_reply-1008/%EB%8B%B5%EB%B3%80%EB%A9%94%EC%9D%BC_%EC%B4%88%EC%95%88.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/main/docs/work-log/2026-10-10_reply-1008/answers.json"
              ],
              "next": "10/12 미팅 전 사용자 발송 → 대기 3건(#27 · #40 · #45) · 되물은 항목 회신 추적",
              "updated": "2026-10-11"
            },
            {
              "id": "r1008-meeting-1012",
              "title": "10/12 미팅 — 제품마스터 · 연구소 원료 · 메디컬 채권 · 재고 배정",
              "status": "partial",
              "detail": "결정 질문과 기본안을 준비했다. 원료마스터 대상은 연구소 일반원료, 사급원료는 ERP 품목으로 확인했다. 기존 결정은 금액=경영지원실 자료, 채권=ERP 직접 확인, 재고분배 탭=공식 배정 기록, 품목 코드 1단계 매핑=위시켓 일괄, 환율=원천 표 우선이다. 남은 공통 의제는 AWS 계약·개설일, ERP 접근 범위, 품목 코드 2·3단계 승인자, 열람 인원, 활동메모 수집 방식이다. 10/14 원료 논의 결과 고객은 현재 원장을 유지하고 사용유무 Y/N과 업무 판단만 관리한다. 이전 조성은 해당 조성으로 만든 제품이 판매 중일 수 있어 삭제하지 않는다. 병합 해석·반복값 채움·사양 ID 생성·회색 음영 상태 변환·형식 점검은 읽기 전용 비공개 자동화 또는 내부 작업으로 넘겼다. 원료 사양 478개·성분 1,054개를 정리했고 고객 판단 13건만 남겼다. 원료·전성분·BOM 전체 범위는 계속 진행 중이다.",
              "evidence": [
                "docs/work-log/2026-10-14_material-automation-status-refresh/public-material-automation-status.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/a5cdea7/docs/work-log/2026-10-10_reply-1008/%EB%AF%B8%ED%8C%85%EC%A4%80%EB%B9%84_1012.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/main/docs/work-log/2026-10-10_reply-1008/%EB%AF%B8%ED%8C%85%ED%99%95%EC%9D%B8%EB%AA%A9%EB%A1%9D_1012.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/main/docs/memory/cmslab-erp-access-sean.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/2a87405/docs/work-log/2026-10-11_finance-publish-1223/result.md"
              ],
              "next": "고객은 10/23까지 원장을 Google Sheets로 전환하고 사용유무 Y/N과 13건의 업무 판단을 관리한다. 기존 공통 의제의 결정 기록을 갱신하고, 고객 AWS·플랫폼 적재와 #41 전체 문서감시는 별도 범위로 연결한다.",
              "updated": "2026-10-14"
            },
            {
              "id": "r1008-sheet-rebind",
              "title": "RBD 시트 새 파일 재바인딩 — #82 · #83 · #85 · #89 · #88",
              "status": "partial",
              "detail": "구현(로컬 확인). 10/8 재공유 새 파일 ID 로 시트 카탈로그 · 바인딩 마이그레이션(20260929200010)을 옮겼다 — #82 main 15X5p1zJ2- · #83 1FivnCABlI · #85 · #89 1z-5kVqVP8 · #88 1SqnXo2BH7(막힘 해제). 묶은 탭 gid 는 새 파일에 모두 있다(수집 계정 탭 속성 실측). 로컬 임시 PG16 에서 체인 적용 · 시드 정합 remaining 0 · RDS 기준선 대조 「같다(예상한 차이만)」. #82 두 번째 문서(17Telw…)는 여전히 404 라 그대로. 운영 DB · 러너 설정 반영 전. 2026-10-11 재측정: 시트 카탈로그 · 시드가 가리키는 문서 중 404 = 0(옛 ID 는 과거 기록 · 스냅샷에만). 원천 등록 묶음(sources-1011)에서 #82 · #83 · #85 · #89 · #88 을 새 ID 로 다시 묶었다(로컬 · 마이그레이션 원격 미적용).",
              "evidence": [
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/6f444b2/docs/work-log/2026-10-11_sources-1011/result.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/cmslab_sheets/catalog.py",
                "cmslab-data-platform/10_플랫폼구현/managed/supabase/migrations/20260929200010_sources_1011_new_sources_rebind.sql"
              ],
              "next": "새 ID 로 원천별 재조회는 2026-10-11 플랫폼 수집기 경로 발생 A · R · B 로 했다(#82 · #88 · #108~#111, 카탈로그 바인딩 그대로). 「맥미니 러너 설정 반영」은 할 일이 아니다 — 맥미니에 러너 설정 · 상시 수집이 없다(10/11 확인). 남은 일: AWS API 노드 개설 전에 원천별 설정 전달 경로(CMSLAB_API_CONFIG)를 정하고 개설 당일 이 카탈로그로 첫 수집 · 바인딩 마이그레이션 원격 적용",
              "updated": "2026-10-11",
              "previous_status": "pending"
            },
            {
              "id": "r1008-cafe24-app",
              "title": "카페24 개발자 앱 등록(본몰 · 엑스퍼트몰 설치 링크 전)",
              "status": "pending",
              "detail": "#13 · #39 고객이 설치 가이드를 요청했다. 위시켓 카페24 앱 등록 기록이 없다(client_id · Redirect URI 없음). 인가 코드는 1분 만료라 콜백이 즉시 교환해야 한다. 미심사 개발 앱은 설치 몰 5개 상한 · 운영 몰 설치 비권장 — 출시 심사 여부 결정 필요. 본몰 mall_id 는 고객 회신 대기.",
              "evidence": [
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/a5cdea7/docs/work-log/2026-10-10_reply-1008/%EA%B7%BC%EA%B1%B0_B_%EA%B5%AD%EB%82%B4%EC%B1%84%EB%84%90.md"
              ],
              "next": "앱 등록(scope 읽기 전용) · 콜백 → 설치 링크 송부 → 대표 운영자 승인",
              "updated": "2026-10-10"
            },
            {
              "id": "r1008-ads-identities",
              "title": "광고 계정 초대용 위시켓 신원 — Meta 비즈니스 포트폴리오 · 네이버 광고 ID",
              "status": "pending",
              "detail": "#24 고객은 관리자 초대용 메일을 물었다. Meta 는 Facebook 계정 메일만 초대되므로 파트너 공유(성과 보기)로, 네이버는 네이버 ID 로 「운영 조회」 초대로 답했다. 위시켓 Meta 포트폴리오 ID · 네이버 광고주센터 ID 보유 근거가 없다. Google Ads(읽기 전용) · GA4(편집자 → 연결 뒤 뷰어)는 수집 계정으로. 카카오모먼트는 조회 전용 역할이 없어 보류. 10/10 기준 수집 계정에 초대 메일 0건.",
              "evidence": [
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/a5cdea7/docs/work-log/2026-10-10_reply-1008/%EA%B7%BC%EA%B1%B0_C_%EA%B8%80%EB%A1%9C%EB%B2%8C%C2%B7%EA%B4%91%EA%B3%A0%C2%B7PG.md"
              ],
              "next": "위시켓 ID 준비 → 고객에게 전달 → GA4 BigQuery 연결 최우선",
              "updated": "2026-10-10"
            },
            {
              "id": "r1008-tiktok-main-account",
              "title": "TikTok Shop — 메인 셀러 계정 승인(앱 스코프 축소 후)",
              "status": "blocked",
              "detail": "10/8 확인: 공유받은 수집 계정은 서브 계정이라 앱 인가 불가(TikTok 정책 — 메인 계정만 승인). 승인 링크 송부 전 앱 스코프를 주문 · 정산 · 샵 조회만 남기고 콜백 주소를 살린다(10/7 신청 스코프에 쓰기 권한 포함 가능).",
              "evidence": [
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/a5cdea7/docs/work-log/2026-10-10_reply-1008/%EA%B7%BC%EA%B1%B0_C_%EA%B8%80%EB%A1%9C%EB%B2%8C%C2%B7%EA%B4%91%EA%B3%A0%C2%B7PG.md",
                "docs/work-log/2026-10-07_meeting-result/result.md"
              ],
              "next": "스코프 축소 · 콜백 → GEC 메인 계정 소유자 5분 화면 공유 승인 → shop_cipher 확정 → E4",
              "updated": "2026-10-10"
            },
            {
              "id": "r1008-file-intake-folders",
              "title": "「원본 파일 제공 가능」 채널 — Drive 업로드 폴더 · 객체코드",
              "status": "partial",
              "detail": "#31 쿠팡 · #32 컬리 · B마트 · #36 올리브영 · #37 면세 5곳 · #38 다이소 · #48 LOFT 가 원본 파일 제공 가능으로 회신했다. 수집 전용 메일(in 하위 도메인)은 AWS · DNS 뒤라, 그 전에는 채널별 Drive 폴더(수집 계정 소유, 업로더에게 편집 공유)로 받는다(가정). 쿠팡 서플라이어 허브 · 컬리 · B마트 · 다이소 · 품고 재고는 파일 객체코드 · 파서가 아직 없다. 2026-10-16: 메일 수신에서 옮긴 8원천(#46 Kantar · #47 #48 #51 면세 · #96 코스트코 · #100 LOFT · #101 일본 셀인 · #102 시윤)의 업로드 폴더를 수집 계정 소유 「CMSLAB 데이터 업로드」 아래에 만들고 담당자(쥬비 · 서나 · 에스더 · 젤다 · 니키 · 켈시 · 제이미)에게 편집 권한을 줬다(알림 없음, 코스트코는 두 분만). Drive route 9개(upload-* 8 + 시윤 사진)를 폴더에 바인딩했다. 면세 「일판매」는 파서가 없어 route 미등록. 업로드 요청 메일은 초안(미발송).",
              "evidence": [
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/a5cdea7/docs/work-log/2026-10-10_reply-1008/%EA%B7%BC%EA%B1%B0_B_%EA%B5%AD%EB%82%B4%EC%B1%84%EB%84%90.md",
                "docs/work-log/2026-10-16_drive-upload-folders/result.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
              ],
              "next": "업로드 요청 메일 발송 → 첫 실파일로 파서 확인(면세 원본 · 코스트코 · Kantar) → 쿠팡 · 컬리 · B마트 · 올리브영 · 다이소 폴더",
              "updated": "2026-10-16"
            },
            {
              "id": "r1008-api-asks",
              "title": "공식 API 경로 문의 — 사방넷 3.0 · 품고 재고 · 카카오쇼핑 대행사 · Qoo10 키 병행",
              "status": "pending",
              "detail": "사방넷 API 3.0 은 관리자 화면이 아니라 연동 개발자센터에서 앱 등록 · 허용 IP(#14). 품고 공개 문서에는 송장 API 만 있다(#19). 카카오쇼핑은 위시켓이 연동대행사로 등록돼야 한다(#34). 네이버 커머스API 는 대행사 칸(라플라스 · 품고)과 별개로 내스토어 앱을 새로 만든다(#15 — 10/7 「해당 없음」 정정). Qoo10 키는 물류 연동과 병행 가능 여부 확인 전 재발급 금지(#46).",
              "evidence": [
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/a5cdea7/docs/work-log/2026-10-10_reply-1008/%EA%B7%BC%EA%B1%B0_B_%EA%B5%AD%EB%82%B4%EC%B1%84%EB%84%90.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/a5cdea7/docs/work-log/2026-10-10_reply-1008/%EA%B7%BC%EA%B1%B0_C_%EA%B8%80%EB%A1%9C%EB%B2%8C%C2%B7%EA%B4%91%EA%B3%A0%C2%B7PG.md"
              ],
              "next": "고객 문의 회신(사방넷 · 품고 · Qoo10) · 위시켓 카카오 신청 → AWS 고정 IP 나오면 허용 IP 등록",
              "updated": "2026-10-10"
            },
            {
              "id": "material-master-automation-1014",
              "title": "기존 원료리스트 읽기·정리 30분 가동",
              "status": "done",
              "detail": "2026-10-14 기존 원료리스트 단일 파일의 읽기 전용 정리 작업 가동 완료. Drive 원본을 수정하지 않고 30분마다 확인한다. 원료 사양 478개·성분 1,054개를 정리했으며, 동일 ERP 코드의 다른 조성은 각각 보존하고 기존 사양 ID 478개를 유지했다. 명시 Y/N을 우선하고 기존 회색 58건은 현재 미사용 N, 미표시 420건은 미확인으로 두었다. N은 판매 종료나 이력 삭제가 아니다. 변경 없음 수동 재확인은 건너뛰기와 마지막 정상 결과 보존을 확인했다.",
              "next": "이 완료 범위 밖인 10/23 Google Sheets 전환·고객 판단 13건·고객 AWS/플랫폼 적재·원료·전성분·BOM 전체 문서감시는 상위 진행 항목에서 추적한다.",
              "evidence": [
                "docs/work-log/2026-10-14_material-automation-status-refresh/public-material-automation-status.md"
              ],
              "updated": "2026-10-14"
            }
          ],
          "updated": "2026-10-14"
        },
        {
          "id": "merged-1008",
          "title": "10/8 병합분 — 데이터 카탈로그 · core 13차 · 담당자 배정",
          "items": [
            {
              "id": "m1008-data-catalog",
              "title": "데이터 카탈로그 — 지표 · 용어 · 오너 · 계보 + CI 게이트",
              "status": "partial",
              "detail": "구현(로컬 확인). 2026-10-11 원천 범위 편입 반영: 원천 123(32_ 120 + 밖 3) · 계약 188 · 계보 엣지 834. 새 원천 11개 도메인 · 오너(전부 「확인 예정」). CI data-catalog 게이트 통과. 오너 확인됨 0. 문서 · 뷰 불일치 4건 후속은 그대로. 2026-10-11 14차 · 엔진 · 재무 반영: 표 155 · 계약 188 · 매핑 명세 55(Implemented/Accepted 32 · 엔진 실행 7) · 컬럼 엣지 854. 게이트 M12 엔진 갈래 · M15 실행 필드 어휘 · M16 막힘 사유 추가, 06_ 9.2 에 엔진 실행 · 막힘 사유별 수. 로컬 --check 통과(CI 러너는 d1011-ci-runner).",
              "evidence": [
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/6f444b2/docs/work-log/2026-10-11_sources-1011/result.md",
                "cmslab-data-platform/00_프로젝트작업실/53_데이터카탈로그/README.md",
                "docs/work-log/2026-10-11_core-14th/result.md",
                "docs/work-log/2026-10-11_spec-engine/result.md",
                "docs/work-log/2026-10-11_core-complete/result.md"
              ],
              "next": "오너 확인 · 문서 · 뷰 불일치 4건 수정",
              "updated": "2026-10-11"
            },
            {
              "id": "m1008-core-13th",
              "title": "core 사실 확정안 · 13차 스키마(계약 목적지) · 매핑 명세 51",
              "status": "partial",
              "detail": "구현(로컬 확인) — 원격 DB 미적용. 13차(계약 목적지)의 남은 일을 14차(마이그레이션 20260929200012)에서 닫았다: 목적지 선언 변경 이력 ctl.contract_target_history(트리거만 쓴다 · SECURITY DEFINER 아님 · DELETE 권한 없음) · 감시 뷰 ctl.v_contract_target_gap · 매퍼 목적지 게이트(P2 — 선언 밖 표의 사실이 있으면 아무것도 쓰지 않고 거부). 2026-10-11 계약 188 목적지 판정 104 · 후보 56 · 없음 28(ctl.contract_target 238행). 시드 정합 비교기가 contract_target · data_kind 까지 대조한다(체인 …200012 remaining 0 · blocked 0). 매핑 명세 55 — 명세 실행 엔진(SpecMapper)이 7계약을 돌린다(시트 4 · 재무 3), 코드 매퍼 23과 같은 stg 행 25계약 대조 차이 0, 못 돌리는 명세 23은 막힘 사유를 단다. 목적지 게이트 정적 대조: 코드 매퍼 23 · 명세 엔진 계약 7 · 문제 0. 마이그레이션 200012 · 200013 · 200014 를 임시 PG16 의 03_ DB · 체인 DB 양쪽에 적용 · 재적용(멱등), 스키마 덤프 새 차이 0. 같은 날 뒤 차수: 200015(12/23 공개 — #103~#105 publish_hold 해제만 · 가드 · 멱등, 임시 PG16 체인 2회 적용 · compare remaining 0 — !177) · 200016(15차 — core 사실 5개에 원천 환율 열 source_fx_rate · source_fx_basis + CHECK, 마트 KRW 환산 4개 COALESCE(원천, 수출입은행) · 끝 열 fx_source, fx 계약 시드 편입으로 계약 189 · 목적지 239행. 03_ DB · 체인 DB 적용 · 재적용 멱등 · 스키마 덤프 새 차이 0 · 체인 compare remaining 0 — !178). 모두 원격 미적용. 테스트 스위트(pytest · 04_ 회귀)는 돌리지 않았다.",
              "evidence": [
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/6f444b2/docs/work-log/2026-10-11_sources-1011/result.md",
                "cmslab-data-platform/00_프로젝트작업실/99_생성도구/core_fact_contracts.py",
                "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                "docs/work-log/2026-10-11_core-14th/result.md",
                "docs/work-log/2026-10-11_spec-engine/result.md",
                "docs/work-log/2026-10-11_seed-reconcile-target/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/2596833/docs/work-log/2026-10-11_finance-core-map/result.md",
                "docs/work-log/2026-10-11_core-complete/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/2a87405/docs/work-log/2026-10-11_finance-publish-1223/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/2a87405/docs/work-log/2026-10-11_fx-source-first/result.md"
              ],
              "next": "첫 RDS 부트스트랩(그날 03_ + 시드 — 200012~200016 은 기준선 기록만, RUNBOOK R4) → 그 뒤 차수만 main rds-plan → rds-migrate(사람 ▶) → 워커 배포 → 테스트 스위트 1회 · 현재 행 뷰 권위 coalesce(08_ 남은 권고). Supabase 검증 런타임에는 적용하지 않는다(10/3 결정)",
              "updated": "2026-10-11"
            },
            {
              "id": "m1008-team-assign",
              "title": "팀별 담당자 배정 사이트 · 슬랙 봇(씨엠에스랩 워크스페이스)",
              "status": "partial",
              "detail": "고르면 팀 슬랙 채널로 초대하는 사이트와 @멘션 · DM 받은 편지함 봇. 앱은 (주)씨엠에스랩 워크스페이스에 설치됨, 10/10 기준 봇이 들어간 채널 0개. CS 채널(#8) 읽기에도 쓸 수 있으나 권한이 넓어 운영 수집은 읽기 전용 앱 별도 권장.",
              "evidence": [
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/910d763/tools/team-assign/README.md"
              ],
              "next": "팀 채널 생성 · 봇 초대 · 최송이 부장 배정",
              "updated": "2026-10-08"
            }
          ],
          "updated": "2026-10-08"
        },
        {
          "id": "sources-1011",
          "title": "10/11 원천 범위 편입 — 32_ #103~#113 · 모집단 124",
          "items": [
            {
              "id": "s1011-register",
              "title": "원천 11개 등록 — 32_ · 시드 · 목적지 · 데이터 카탈로그 · 시트 카탈로그 · 파일 수신 · 체크리스트",
              "status": "partial",
              "detail": "구현(로컬 확인). 32_ 109 → 120행(#103~#113: 경영지원실 파일 5 · 글로벌 거래처별 매출 · GWS 계정 정보 · 재고분배 탭 · 쿠팡 기말재고 탭 · SPATE · 엠브레인). 모집단 115 → 124(U4 글로벌 B2B → #108 식별 · U6 일본 자사몰 범위 제외). 시드 계약 176 → 188(공개 보류 77) · 원천 119 · 계정 118. 정합 마이그레이션 20260929200010 · 200011(로컬 PG16 remaining 0 · 재적용 변화 0 · RDS 기준선 대조 「같다」). CI 게이트 통과. 새 계약은 모두 원시 수집(공개 보류) — 파서 · 매퍼 전.",
              "evidence": [
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/6f444b2/docs/work-log/2026-10-11_sources-1011/result.md",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/10_플랫폼구현/managed/supabase/migrations/20260929200010_sources_1011_new_sources_rebind.sql"
              ],
              "next": "main 머지 → rds-plan · rds-migrate ▶ → 러너 설정 · Drive route 반영 → 파일 · 시트 원천 1회 Read",
              "updated": "2026-10-11"
            },
            {
              "id": "s1011-payroll-default",
              "title": "판관비(#106) 급여 계정 행 · 작성사원명 제외 — 고객 확인",
              "status": "pending",
              "detail": "기본값(2026-10-11 실파일로 확정): 계정명 급여 · 상여 · 퇴직 233행과 원가중심 「임원(급여용)」 51행, 합계 284행을 파서 · 선별기가 버린다. 작성사원명 · 관리항목2 · 적요 값은 싣지 않는다. 처음 적은 432행은 다른 기준 · 판으로 보고 233을 정본으로 했다. #105 손익계산서의 급여 계정 줄 55도 뺀다. 원본은 레이크에 두지 않는다 — 원본 미보관 계약(raw_retention = none, 마이그레이션 …200013)이라 선별 산출물만 착지한다(로컬 관통: 원본 해시와 같은 레이크 객체 0 · 남은 급여 행 0 · 사람 열 0). Drive route 템플릿(mgmt-sga-ledger)은 생겼고 시드 수신 점검은 켰다(운영 DB 는 운영이 켠다). 열람은 재무 묶음. 고객 확인은 아직 없다.",
              "evidence": [
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/2596833/docs/work-log/2026-10-11_restricted-no-raw/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/2596833/docs/work-log/2026-10-11_finance-parsers/result.md",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "docs/work-log/2026-10-11_core-complete/result.md"
              ],
              "next": "재경 · 경영지원실에 제외 기준(계정 목록 · 원가중심 라벨 · #105 급여 줄) 확인 — 기준이 바뀌면 파서 규칙만 고친다(선별기가 따라간다)",
              "updated": "2026-10-11"
            },
            {
              "id": "s1011-finance-parsers",
              "title": "경영지원실 파일 files 파서 5종 · core.pnl_line 신설",
              "status": "partial",
              "detail": "구현(로컬 확인) — 운영 수집 전. 파서 5종(FIN103 · PNL104 · PNL105 · SGA106 · PLAN107)을 files 어댑터에 등록했다(file_upload 전용). 실파일 5개를 한 번씩 돌려 거부 0, #103 41.9만 행은 스트리밍(최대 RSS 67MB). core.pnl_line · mdm.team_attribution 은 14차(…200012)에서 만들었다. 파서 출력이 매핑 명세 엔진을 거쳐 core 까지 간다(임시 PG16 e2e: files 제출 → 레이크 → stg → SpecMapper → 목적지 게이트 → core): #103 → core.accounting_sales 418,588행 · #104 → core.pnl_line(단위 종류 6) + 팀 귀속 제안 118 · #105 → core.pnl_line(법인별 PL 5시트). #107 은 목적지 후보라 명세만 두고 stg 까지, #106 은 목적지 없음이라 stg 까지(원본 미보관 경로). 남은 것: 원격 마이그레이션 적용 · AWS API 노드 route 파일 등록 · 첫 운영 공개 승인(사람 — #103 · #104 · #105 는 2026-10-11 공개 보류를 풀었다, 마이그레이션 20260929200015 · #106 · #107 은 보류 그대로) · 테스트 스위트.",
              "evidence": [
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/2596833/docs/work-log/2026-10-11_finance-parsers/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/2596833/docs/work-log/2026-10-11_finance-core-map/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/2596833/docs/work-log/2026-10-11_restricted-no-raw/result.md",
                "docs/work-log/2026-10-11_core-14th/result.md",
                "docs/work-log/2026-10-11_core-complete/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/2a87405/docs/work-log/2026-10-11_finance-publish-1223/result.md"
              ],
              "next": "첫 RDS 부트스트랩(그날 03_ + 시드 — 200012~200016 은 기준선 기록만, RUNBOOK R4) → 워커 배포 → AWS API 노드 개설 시 /etc/cmslab/api-node-routes.env 의 CMSLAB_FILE_DRIVE_ROUTES 에 경영지원실 route mgmt-* 5종(템플릿 그대로) 등록 → cmslab-file-reception drive-once 1회(E4) → 0원 대사 확인 · 첫 공개 승인(사람) → 합성 픽스처 회귀 시험. 「맥미니 러너」 아님(e48a743 · infra/RUNBOOK.md 8절 1)",
              "updated": "2026-10-11",
              "previous_status": "pending"
            },
            {
              "id": "s1011-mi-access",
              "title": "SPATE · 엠브레인 접근(기능 13)",
              "status": "blocked",
              "detail": "SPATE(#112): 로그인 정보만 있고 API · export 경로 미확인 — 수동이면 기획팀 MI 업로드(mi_signal)로 받는다. 엠브레인(#113): 수집 계정 404 — 기획팀 재공유 필요. 둘 다 계약은 있고 일정은 꺼져 있다. 2026-10-11 재확인: 엠브레인은 수집 계정에서 여전히 보이지 않는다(재공유 요청은 답변 #28 에 넣음).",
              "evidence": [
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/6f444b2/docs/work-log/2026-10-11_sources-1011/result.md"
              ],
              "next": "답변 발송 → 엠브레인 재공유 · SPATE 내보내기 방식 회신",
              "updated": "2026-10-11"
            }
          ],
          "updated": "2026-10-11"
        },
        {
          "id": "decisions-1011",
          "title": "10/11 결정 · 실측 — 금액 기준 · 채권 · CI · 12/23 공개 · 품목 매핑 · 환율",
          "items": [
            {
              "id": "d1011-money-austin",
              "title": "금액 기준 = 경영지원실(장진우 실장) 엑셀, 규칙은 위시켓이 역설계",
              "status": "partial",
              "detail": "10/11 사용자 지시: 매출 · 원가 · 손익 · 목표 등 돈과 관련된 기준은 경영지원실 엑셀로 갈음하고, 고객 현업에 규칙 · 표를 요청하지 않는다. 역설계 1차 완료(값 미기록): 통합매출 = 영업그룹별 손익의 행 원천(1~8월 0원 일치) · 마감월 손익 불변 · 지난달 통합매출 행 정정 있음 → 전체 교체 적재. 확정서 v1.0 · 메일 초안 · 미팅 목록을 이 기준으로 고쳤다. 2026-10-11 첫 실 Read: #103 · #104 · #105 · #107 원본을 레이크에 착지(SHA-256 기록), #106 은 급여 행 때문에 원본 착지 제외. 대사 요약(값 없음)을 공개 근거로 분리. 2026-10-11 수용 시험을 코드로 옮겼다(로컬 임시 DB 확인): worker/core/acceptance/finance_core_reconcile.sql 이 현재 행 뷰 기준으로 통합매출 ↔ 영업그룹별 손익 (순매출 8/8 정확 · 원가 8/8 1원 미만) · 손익계산서 − 회계차이 ↔ 영업그룹별 손익(8/8 1원 미만)을 낸다. 운영 DB 에서는 아직 돌지 않았다. 2026-10-14~15: 7월 통합매출 ↔ 영업그룹별 손익 549 집계키 불일치 0을 다시 확인했고, 가격 4,122키의 공식 금액 출처를 「매출 마감리스트_2026」 최종매출까지 재현했고, 10/15 밤 역회계로 거래처 × 월 합계를 ERP 출고 행에 배부하는 규칙 v1 을 찾았다(7월 4,117/4,122키 — 고객 검증 대기). 10/16 정합: 월 합계는 ERP 판매 · 재고 데이터로는 안 만들어지지만 월 마감 수기 대체전표(FI_DOCU 40200 · 40210)에 기장돼 있다 — 원천(발생)은 ERP 밖(채널 정산 → 경영지원실 수기 조정), 기장은 ERP 안. v1 풀 34개 중 할인 합계 33 · 공급가 합계 25 가 원 단위로 같다(결정 1). 인과 방향(오스틴 작업 시트 → 전표인지 그 반대인지)은 미판별 — 수기 전표 252행은 모두 오스틴 판본 저장 전에 입력됐다. 10/15 사용자 결정 — 오스틴 자료 추가 요청 · 설명 자리 없이 ERP 와 받은 파일로 역회계한다.",
              "evidence": [
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/main/docs/work-log/2026-10-11_austin-reverse/result.md",
                "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/08_core사실_확정안.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/main/docs/memory/cmslab-money-austin-excel.md",
                "docs/work-log/2026-10-11_live-read/reconcile-summary.json",
                "docs/work-log/2026-10-11_live-read/read-evidence-sanitized.json",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/2596833/docs/work-log/2026-10-11_finance-core-map/result.md",
                "docs/work-log/2026-10-11_core-complete/result.md",
                "docs/work-log/2026-10-14_erp-july-reconciliation/result.md",
                "docs/work-log/2026-10-15_erp-residual-resolution/pricing/result.md",
                "docs/work-log/2026-10-15_austin-history/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/362dec2d/docs/work-log/2026-10-15_price-reverse-accounting/result.md",
                "docs/work-log/2026-10-15_erp-decision-inference/decision-1-price.md",
                "docs/work-log/2026-10-16_price-reconcile/README.md"
              ],
              "next": "원격 적용 · 운영 공개 뒤 같은 대사 SQL 을 운영 배치에 1회 → F-02 · F-03 화면 · 가격 규칙 v1.2 고객 검증(나중에 한 번에 — 월 합계 = ERP 월 마감 수기 전표 기장분 한 문장)",
              "updated": "2026-10-16"
            },
            {
              "id": "d1011-ar-erp",
              "title": "채권 = 위시켓이 ERP 「거래처별 채권조회」 기준으로 직접 확인",
              "status": "partial",
              "detail": "2026-10-15 갱신 — 차단 사유였던 ERP 접근이 풀렸다(10/14 읽기 전용 접속 · 1회 전체 raw). 채권조회 표본은 내부 재구성 차이 0, 화면 잔액은 조회 시작일 의존으로 미대사다. 채권 계정은 10801 · 11800 · 12000(원천 계정 코드 보존), 10805 는 외화 원액 결손 47행으로 계정 전체 보류. 승인 전표만 사실로 내고, 공식 반제 FI_BAND → core.ar_allocation(마이그레이션 200018)으로 F-12 의 FIFO 추정을 없앴다. 7월 표본 거래처(10801 · 2026-07-28) 원장을 직접 참조로 재구성해 차이 0, 화면 잔액은 조회 시작일에 따라 바뀌어 적재하지 않는다. full raw v4 사실 7월 1,971 · 8월 1,799 · 9월 1,608(9월 미결 204행 억제), 형식 오류 0. 2026-07-31 까지 거래처 · 계정 3,745개 중 3,424개가 공식 반제 미결과 일치하고 321개는 집합 분해만 됐다(경제적 원인 미확인). 메디컬 채권은 회전일을 거래처 마스터 수금예정일로 추론해 9/30 잔액 · 회전일 초과 · 10월 수금선을 만들고 F-12 규칙(200022) · MA_PARTNER 수집(200023)에 넣었다 — 고객 검증 대기. 체인에 빠져 있던 FI_BAND 적재 계약 · 일정(꺼진 채) · 목적지는 200024 로 정합했다. 모두 로컬 · offline 확인이고 운영 RDS 적재는 0이다.",
              "evidence": [
                "docs/work-log/2026-10-15_erp-finance-execution/result.md",
                "docs/work-log/2026-10-15_erp-ar-integration/result.md",
                "docs/work-log/2026-10-14_erp-remaining-rules/load-result.md",
                "docs/work-log/2026-10-14_erp-july-reconciliation/result.md",
                "docs/work-log/2026-10-15_erp-residual-resolution/ar/result.md",
                "docs/work-log/2026-10-15_medical-ar-inference/platform.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/362dec2d/docs/work-log/2026-10-15_medical-ar-inference/result.md",
                "cmslab-data-platform/10_플랫폼구현/managed/supabase/migrations/20260929200018_erp_ar_allocation.sql",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/362dec2d/cmslab-data-platform/10_%ED%94%8C%EB%9E%AB%ED%8F%BC%EA%B5%AC%ED%98%84/managed/supabase/migrations/20260929200024_seed_reconcile_fi_band.sql"
              ],
              "next": "10805 외화 원액 · 반제망 밖 승인 전표 포함 규칙 · 화면 「매출기준」 금액 정의를 받은 원천 안에서 추론 → 메디컬 회전일 규칙 고객 검증 → AWS 개설 뒤 FI_DOCU · FI_BAND · MA_PARTNER 운영 수집과 FI_BAND 연속 coverage",
              "updated": "2026-10-16",
              "previous_status": "blocked"
            },
            {
              "id": "d1011-ci-runner",
              "title": "MR 파이프라인만 대기 — 공유 러너는 보호 브랜치(main) 전용(ref_protected)",
              "status": "partial",
              "detail": "정정(2026-10-11 확인): 「러너가 잡을 가져가지 않는다」는 사실과 다르다. 공유 러너 lightsail-dynamo-runner(instance_type · run_untagged true)의 access_level 이 ref_protected 라서 보호 브랜치(main) 파이프라인만 실행한다. main 의 verify · data-catalog · rds-plan 은 정상 실행 · 통과한다(예: 파이프라인 4998 · 커밋 2596833 — verify success · data-catalog success · rds-plan success, 안에서 「CMSLAB_RDS_MIGRATOR 미등록 — 건너뜀」). stuck 은 MR(비보호 브랜치) 파이프라인뿐이다(10/8 !145 · 10/11 !150 파이프라인 4736). 운영 rds-migrate(main 수동)는 이 러너로 돈다 — AWS 개설 전에 풀어야 할 막힘이 아니다. MR 검사를 켜려면 러너 접근 수준 변경이 필요한데, 인스턴스 관리자 몫이고(bbakcar 등과 공유) 보호되지 않은 브랜치 코드가 공유 러너에서 돌게 되는 보안 영향이 있어 바꾸지 않았다. 그동안 MR 은 같은 검사를 로컬에서 돌리고 머지 뒤 main 파이프라인이 다시 확인한다.",
              "evidence": [
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/6f444b2/docs/work-log/2026-10-11_sources-1011/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/pipelines/4998",
                "docs/work-log/2026-10-11_decisions-checklist/result.md"
              ],
              "next": "MR 단계 검사가 필요해지면 인스턴스 관리자에게 러너 접근 수준 변경 또는 cms-lab 전용 프로젝트 러너 등록을 요청(보안 검토 포함). 그 전까지 로컬 검사 + main 파이프라인",
              "updated": "2026-10-11",
              "previous_status": "blocked"
            },
            {
              "id": "d1011-publish-1223",
              "title": "손익 · 공식 매출 = 12/23 공개 — #103 · #104 · #105 공개 보류 해제",
              "status": "partial",
              "detail": "10/11 사용자 결정 원문: 「\"손익·공식 매출 = 12/23 공개\" -> 이걸로 결정해.」(MR !177). 구현(로컬 확인) — 원격 미적용: 37_ 「부록 A 추가」에 #103 공식 매출 · #104 영업그룹별 손익 · #105 손익계산서 = 자동(정본, 공개)으로 적고 시드 공개 보류를 풀었다(시드 계약 188 중 보류 77 → 74). 운영 체인용 마이그레이션 20260929200015 는 세 계약의 publish_hold 해제만 한다(가드 · 멱등 — 임시 PG16 체인에 1 · 2회 적용, 바뀐 행 = 세 계약뿐, compare remaining 0). #106 판관비(목적지 없음) · #107 실행계획(목표 정본 미정)은 공개 보류 그대로다. 10/12 미팅 목록 4-10 을 결정됨으로 고쳤다. 첫 운영 공개는 0원 대사(finance_core_reconcile.sql)를 사람이 확인한 뒤 승인한다.",
              "evidence": [
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/2a87405/docs/work-log/2026-10-11_finance-publish-1223/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/merge_requests/177",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/main/docs/work-log/2026-10-10_reply-1008/%EB%AF%B8%ED%8C%85%ED%99%95%EC%9D%B8%EB%AA%A9%EB%A1%9D_1012.md"
              ],
              "next": "첫 RDS 부트스트랩(그날 03_ + 시드 — 200012~200016 은 기준선 기록만, RUNBOOK R4) → 워커 배포 → API 노드 route mgmt-* · drive-once 첫 수신 → 0원 대사 확인 · 첫 공개 승인(사람) → F-02 · F-03 화면. #106 · #107 · #108~#113 공개 시점은 10/12 미팅(4-10 · 4-4)",
              "updated": "2026-10-11"
            },
            {
              "id": "d1011-item-mapping",
              "title": "품목 매핑 = 기준표대로 — 1단계(코드 일치) 위시켓 일괄 · ERP 품목 마스터 선행",
              "status": "partial",
              "detail": "10/11 사용자 결정 원문: 「품목 매핑 — 기준에 따라서 매핑해.」(MR !179). 1단계(코드 일치)는 위시켓이 일괄 처리하고 2 · 3단계는 고객 승인자가 정한다. 일괄 도구 cmslab-worker mapping-tier1(구현 — 로컬 임시 DB 확인): 기준표 1단계 네 조건 판정 · 무작위 10건 이름 · 단위 대조표와 표본 해시 서명(표본을 본 사람이 확인해야 승인) · 1건이라도 다르면 그 원천 전체를 3단계로 내리고 이유를 남김 · 적격 전체 이름 대조로 다른 것만 3단계로 뺌 · 승인 뒤 재처리로 이미 적재된 사실에 품목을 붙임 · 2~4단계는 대상 목록만. 허용 원천은 경영지원실 통합매출(역설계 근거)과 ERP 자체뿐, 채널은 담당 회신 전. 실데이터 e2e(로컬 ERP 품목 내보내기 기준): #103 식별자 790 → 승인 763 · 3단계 24(같은 코드 · 다른 판 품목 의심 이름 차이) · 4단계 3, item_id 채움 417,659/418,588(채워진 행 코드 대조 100%). 되돌리기(철회 → 재처리)도 확인. 운영 실행 선행 = ERP 접근(10/12 이후) · 운영 DB.",
              "evidence": [
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/2a87405/docs/work-log/2026-10-11_item-mapping-tier1/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/merge_requests/179",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/2a87405/docs/work-log/2026-10-07_meeting-result/%EA%B2%B0%EC%A0%95%EA%B8%B0%EB%A1%9D.md",
                "cmslab-data-platform/00_프로젝트작업실/52_10-7미팅_패키지/08_매핑승인기준표_고객용.md"
              ],
              "next": "운영 ERP 접근(10/12 이후) → ERP 품목 마스터(mdm.item, ops-mdm-item-empty) → 운영 DB · 워커 배포 → #103 운영 수신 → mapping-tier1 dry-run → 사람 표본 확인 → apply. 채널 담당 회신 → 허용 목록 확장. 2 · 3단계 승인자 지정(10/12 미팅) — 첫 대상 3단계 24 · 4단계 3",
              "updated": "2026-10-11"
            },
            {
              "id": "d1011-fx-source-first",
              "title": "환율 = 원천 표 환율 우선, 없으면 수출입은행",
              "status": "partial",
              "detail": "10/11 사용자 결정 원문: 「환율은 표에 환율이 있으면 그걸 쓰는게 맞아. 없으면 수출입은행 API를 쓰자.」(MR !178). 구현(로컬 확인) — 원격 미적용: 15차 마이그레이션 20260929200016 — core 사실 5개(판매 관측 · 정산 · 문서 라인 · 손익 · 광고비)에 원천 환율 열 source_fx_rate · source_fx_basis(외화 행에만 — CHECK), 마트 KRW 환산 4개 COALESCE(원천, 수출입은행) + 끝 열 fx_source(source · kexim · mixed · none), fx 계약 시드 편입(수동 SQL 단계 폐지). 원천 환율 매핑: 라쿠텐 총괄표 · #105 PL_China · #52 면세 취합. 임시 PG16 의 03_ DB · 체인 DB 적용 · 재적용, 스키마 덤프 새 차이 0, 합성 행 판정 PASS. 36_ 5절 정본 · 42_ G1 갱신. 남은 것: 수출입은행 인증키 · 비밀 등록 → fx 일정 켜기 · CNH↔CNY 재경 확인(원천 환율 없는 위안 행은 지금 none) · 라쿠텐 9.5 출처 확인(재경이 대조값으로 판정하면 원천 환율을 끈다) · 매퍼 없는 환율 원천 · ERP RT_EXCH 추출 · 화면 fx_source 표시.",
              "evidence": [
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/2a87405/docs/work-log/2026-10-11_fx-source-first/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/merge_requests/178",
                "cmslab-data-platform/00_프로젝트작업실/42_웨이브2_의미매핑_인계/README.md"
              ],
              "next": "수출입은행 인증키 발급 · 비밀 등록(cmslab/api/kexim_fx/ap01) → fx 일정 2개 켜기 · 재경: ② 기본 환율 종류 · CNH↔CNY · 라쿠텐 9.5 출처 → 첫 RDS 부트스트랩(그날 03_ + 시드 — 200012~200016 은 기준선 기록만, RUNBOOK R4) → 웹 F-01 · F-04 · F-09 에 fx_source 표시",
              "updated": "2026-10-11"
            }
          ],
          "updated": "2026-10-11"
        },
        {
          "id": "sheet-automation-consolidation-1014",
          "title": "시트 자동화 통합 실행계획 — 120개 현황과 11개 원천 정기수집",
          "items": [
            {
              "id": "sheet-auto-classification-1014",
              "title": "120개 현황 정리·종전 입력 유지 70개 재평가",
              "status": "done",
              "detail": "분석 완료. 전체 120개는 자동화 후 대체 가능 63 · 자동화 + 결정·예외 입력 46 · 근거 확인 필요 11이다. 현재 운영 상태는 가동 중 1 · 일부 가동 12 · 준비 중 86 · 대상 아님 16 · 확인 필요 5다. 신규 11개는 원본 정기수집·정규화와 일부 대사 범위이며 남은 상류 연결을 완료로 올리지 않았다.",
              "evidence": [
                "docs/project/sheet-automation-plan.md"
              ],
              "next": "아래 7개 실행 묶음의 완료 조건으로 운영 연결을 진행한다. 이미 받은 자료와 기존 결정은 다시 요청하지 않는다.",
              "updated": "2026-10-14"
            },
            {
              "id": "ready-sheet-automation-1014",
              "title": "11개 확보 원천 30분 정기수집·정규화 운영 연결",
              "status": "done",
              "detail": "읽기 전용 실행기를 30분 주기로 배포했다. 최근 실행은 11/11 성공, 56초, 이슈 26건, 오류 0건이며 변경 없음 재실행은 안전하게 건너뛰고 마지막 정상 결과와 출력 포인터를 유지했다. Google 원본과 운영 DB 쓰기는 없었다. 이 완료는 수집·정규화 운영 연결 범위이며 ERP·Directory·BOM·광고·승인 원천 결합과 업무 전체 자동화 완료를 뜻하지 않는다.",
              "evidence": [
                "docs/work-log/2026-10-14_ready-sheet-automation/public-result.md"
              ],
              "next": "남은 상류 연결 17건을 실행묶음별로 연결하고 통제합·승인 기준을 확인한다. 고객에게는 내부 조사 뒤 필요한 신규 결정과 실제 예외만 요청한다.",
              "updated": "2026-10-14"
            },
            {
              "id": "sheet-upstream-connectors-1015",
              "title": "ERP 실적·BOM 후보·광고 상류 연결",
              "status": "done",
              "detail": "읽기 전용 30분 실행기에 ERP KST 전일 live, 공식 매출 index, ERP 현재 효력 BOM 후보, 광고 상류 정규화와 제품코드 exact 대사를 연결했다. 최종 실행은 원천 11개와 상류 4개를 279초에 처리했고 차단 0건이었다. ERP 전일 1,063행 중 대상 122행을 55개 index로 만들었고 이슈는 0건이다. 광고 제품코드 56,434/56,434 exact, BOM 후보 1,143쌍 일치다. 승인 BOM과 계획 제품 단위 매출 join은 근거·키·기간 불일치로 0건이다.",
              "evidence": [
                "docs/work-log/2026-10-14_sheet-upstream-connectors/public-result.md"
              ],
              "next": "승인 BOM 근거, ERP 관계 우선순위, 복수 사양 문서키, 승인 캠페인·행사키와 동일 비교 기간처럼 자동으로 닫히지 않은 조건만 이어서 연결한다.",
              "updated": "2026-10-15"
            },
            {
              "id": "sheet-auto-evidence-closure",
              "title": "P0 · 근거 공백 11개 자력 확인",
              "status": "partial",
              "detail": "11개 근거 확인 묶음 중 3개 원천은 30분 정기수집·정규화가 일부 가동됐다. 묶음 상태는 일부 가동 3 · 준비 중 3 · 확인 필요 5, 자료는 일부 확보 11이다. 최초 접수·ERP/WMS 사건·승인 BOM 같은 권위 상류는 아직 미확인이라 묶음 전체 완료가 아니다.",
              "evidence": [
                "docs/project/sheet-automation-plan.md",
                "docs/work-log/2026-10-14_ready-sheet-automation/public-result.md"
              ],
              "next": "확보된 원천 구현과 병행해 ERP·Drive·회의록·메일·기존 계정으로 먼저 확인 → 끝까지 남은 항목만 단일 질문으로 묶기. 내부 판정 완료와 고객 확인 대기를 분리하고, 답이 없으면 미확인 상태를 유지한다.",
              "updated": "2026-10-14"
            },
            {
              "id": "sheet-auto-finance-control",
              "title": "P0 · 매출·원가·손익·예산 통제",
              "status": "partial",
              "detail": "14개 묶음. ERP 원본 읽기·메타데이터와 경영지원실 파일 파서는 확보했지만 업무 필터·월 통제합·반복 운영은 미완이다. 분류는 대체 가능 9 · 결정/예외 5, 자동화 상태는 준비 중 8 · 대상 아님 6이다. 기존 ERP/BQ 진행 상태를 유지한다.",
              "evidence": [
                "docs/project/sheet-automation-plan.md"
              ],
              "next": "ERP 원본의 매출·원가·GL 업무 필터와 관리영업그룹·계정 매핑 확정 → 월 통제합 대사 → 손익·판관비·예산대비 파이프라인 통합. 기존 목표 재입력 금지; 조정·배부·마감 예외만 승인.",
              "updated": "2026-10-14"
            },
            {
              "id": "sheet-auto-commerce-performance",
              "title": "P0 · 국내·글로벌 판매·주문·정산",
              "status": "partial",
              "detail": "52개 묶음. MAKEAMZ 1개만 일부 가동이고 46개 준비 중 · 5개 대상 아님이다. 주문·판매·환불·정산 원천 연결과 채널별 통제합은 아직 운영 완료가 아니다. 대체 가능 44 · 결정/예외 8로 분석됐다.",
              "evidence": [
                "docs/project/sheet-automation-plan.md"
              ],
              "next": "채널·주문키·SKU·기준일 공통 계약 → ERP 품목·세트·환율 연결 → 채널별 합계 대사 → 중복 다운로드 제외. 신규 매핑·계약 예외만 확인 큐에 남긴다.",
              "updated": "2026-10-14"
            },
            {
              "id": "sheet-auto-planning-masterdata",
              "title": "P1 · 계획·가격·프로모션·공통 마스터",
              "status": "partial",
              "detail": "21개 묶음 중 판매계획 2개, 역할 1개, 프로모션 1개가 30분 정기수집·정규화로 일부 가동됐다. 상태는 일부 가동 4 · 준비 중 12 · 대상 아님 5, 자료는 일부 확보 21이다. ERP 실적·Directory ID·품목·승인키 연결과 신규 결정 입력 분리는 남았다.",
              "evidence": [
                "docs/project/sheet-automation-plan.md",
                "docs/work-log/2026-10-14_ready-sheet-automation/public-result.md"
              ],
              "next": "S013 판매계획·가격·프로모션·신규코드·역할의 중복 필드를 최초 결정 원장 1곳으로 통합 → ERP·채널 값 자동 제안 → 효력일·승인·변경 이력 보존.",
              "updated": "2026-10-14"
            },
            {
              "id": "sheet-auto-inventory-fulfillment",
              "title": "P1 · 재고·WMS·출고·풀필먼트",
              "status": "pending",
              "detail": "12개 묶음. 대체 가능 3 · 결정/예외 9로 분석했지만 전부 준비 중이다. 자료는 일부 확보 10 · 확보 필요 2이며 새 collector 운영은 이번 정리 범위에서 실행하지 않았다.",
              "evidence": [
                "docs/project/sheet-automation-plan.md"
              ],
              "next": "ERP·WMS·3PL·FBA의 SKU·창고·LOT·사건시각 공통 계약 → 가용재고·입고중·이동중·재고일수 계산 → ERP-WMS 차이와 승인 예외만 기록.",
              "updated": "2026-10-14"
            },
            {
              "id": "sheet-auto-product-quality",
              "title": "P0 · 원료·품질·제품문서",
              "status": "partial",
              "detail": "기존 원료리스트 1개는 가동 중이고 제조사 IL·문안용 전성분 2개는 일부 가동, 나머지 1개는 준비 중이다. 자료는 확보 완료 1 · 일부 확보 3이다. 제조사 IL 36행은 함량 합계 100%를 확인했고 문안용 42행의 함량 공란은 추정하지 않았다. 승인 처방·BOM·문안 승인은 남았다.",
              "evidence": [
                "docs/project/sheet-automation-plan.md",
                "docs/work-log/2026-10-14_material-automation-status-refresh/public-material-automation-status.md",
                "docs/work-log/2026-10-14_ready-sheet-automation/public-result.md"
              ],
              "next": "원료 가동 상태·예외 큐 유지 → 품질 입고·검사·승인 BOM·전성분을 원료사양ID와 제품코드로 연결. 신규 채택·사용유무·품질 판정·최종 공개만 승인.",
              "updated": "2026-10-14"
            },
            {
              "id": "sheet-auto-marketing-content",
              "title": "P1 · 광고·캠페인·크리에이터 성과",
              "status": "partial",
              "detail": "6개 중 일본 계획·마케팅 캘린더 2개가 30분 정기수집·정규화로 일부 가동됐고 4개는 준비 중이다. 자료는 일부 확보 6이다. 최근 출력은 일본 계획 412행, 캘린더 원천항목 49개이며 주문·광고 성과·승인 행사키 연결은 남았다.",
              "evidence": [
                "docs/project/sheet-automation-plan.md",
                "docs/work-log/2026-10-14_ready-sheet-automation/public-result.md"
              ],
              "next": "광고비·노출·클릭·전환·게시물을 공통 캠페인/콘텐츠 키로 수집 → 프로모션·상품·랜딩 귀속 → 일·주·월 성과 계산. 기획·예산·선정·계약·해석만 승인.",
              "updated": "2026-10-14"
            }
          ],
          "updated": "2026-10-15"
        },
        {
          "id": "erp-execution-1015",
          "title": "ERP 대사 · 업무 계약 · 적재 준비 (10/14~10/15)",
          "items": [
            {
              "id": "erp-july-recon-1014",
              "title": "7월 공식 엑셀 대사 · GL 9계정 · 채권 표본 재현",
              "status": "partial",
              "detail": "2026-10-14 ERP 1회 전체 raw 로 7월을 오프라인 대사했다. 공식 엑셀: 7월 월분 ↔ 누계 7월 57,884행 exact(누락 · 추가 0), 통합매출 ↔ 영업그룹별 손익 549개 집계키 불일치 0, GL workbook 계정 ↔ ERP 계정코드 9/9. FI_DOCU 7월 14,868행 중 GL 9계정 947행이 차변 · 대변 · 순액 9/9 exact(허용오차 없음)이고 포인트 차이 잔차는 0이다. 수량 계보: EC 출고 23,487키의 품목마감수량이 전부 exact. 할인식으로 안 닫힌 EC 출고 4,106 + 반품 16 = 4,122키는 가격 차이로 격리했다. 채권: 회사 7000 · 10801 · 2026-07-28 표본 거래처 원장을 직접 참조로 재구성해 차이 0, 화면 잔액은 조회 시작일에 따라 바뀌어 적재하지 않는다. 고객 확인 8건(거래처 2 · 관리분류 1 · GTIN 3 · category 1 · 채권 1)을 10/14 18:35 공식 메일로 보냈으나 최종 내부 확인 전 발송이라 같은 날 21:06 철회 안내를 보냈고, 10/15 07:52 고객 주 창구(최송이 부장)가 철회를 확인했다(사례별 답 0건). 8건은 질문이 아니라 받은 원천 안의 추론 대상이다. ERP · 운영 DB · 공식 원본 변경 0.",
              "evidence": [
                "docs/work-log/2026-10-14_erp-july-reconciliation/result.md",
                "docs/work-log/2026-10-14_erp-july-reconciliation/baseline/gl-bridge-result.md",
                "docs/work-log/2026-10-14_erp-july-reconciliation/sales/summary.md",
                "docs/work-log/2026-10-14_erp-july-reconciliation/customer-confirmation.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/362dec2d/docs/memory/cmslab-infer-then-verify.md"
              ],
              "next": "GL 범위 2분류 금액 bridge · 채권 화면 금액 정의를 내부에서 추론 → 「이렇게 정해 이 숫자가 나왔다, 맞나?」로 검증(가격 4,122키는 역회계 규칙 v1 항목)",
              "updated": "2026-10-14"
            },
            {
              "id": "erp-mm-sales-3m-1015",
              "title": "MM · 매출 · 재고 3개월(5 · 6 · 7월) 오프라인 대사와 v4 재실행",
              "status": "partial",
              "detail": "full export 의 MM_QTIO 8,013,398행을 전수 스캔해 세 달 159,629행을 공식 마감 179,490행과 비교했다(새 SQL · ERP 연결 · 운영 DB 쓰기 0). 7월 가격 잔차 4,106 + 16 을 그대로 재현했고 5월 5,164 + 7, 6월 8,273 + 18 에서도 같은 가격 축 차이가 반복됐다. 잔차 키의 수량은 공식 마감과 전부 같다 — 문서 · 수량 연결 실패가 아니라 가격 기준 차이다. 대체 금액 열 6개 후보는 6 · 7월 잔차를 하나도 설명하지 못했고 내부 문서 6경로 · 외부 참조 4경로도 세 정규화 방식에서 연결 0이다. v4: 수불유형 미등록 1,940 → 0(계정대체 출고 · 입고 = 재고 사건만), 단위 공란 5,599행 중 5,476행을 품목 마스터로 보강하고 123행은 사실을 억제한다. medical · oliveyoung 셀인은 gross 출고로 Implemented, reverse_dm 은 관리분류 override 1키의 효력 입력이 없어 Proposed. 공식 순매출은 오스틴 정본을 유지하고 ERP 금액 대체 · 임의 조정은 하지 않는다.",
              "evidence": [
                "docs/work-log/2026-10-15_erp-domain-execution/result.md",
                "docs/work-log/2026-10-15_erp-domain-execution/decision-register.md",
                "docs/work-log/2026-10-15_erp-domain-execution/evidence/reconciliation.json",
                "docs/work-log/2026-10-15_erp-domain-execution/evidence/sales-lineage.json"
              ],
              "next": "가격 축 규칙 v1 고객 검증 · 단위 123행 권위 단위 또는 제외 승인 · reverse_dm 효력 기간 → MM_QTIO · reverse_dm 명세 승격",
              "updated": "2026-10-15"
            },
            {
              "id": "erp-fi-ar-v4-1015",
              "title": "FI · 채권 v4 3개월 재실행과 공식 반제(FI_BAND)",
              "status": "partial",
              "detail": "채권 계정 10801 · 11800 · 12000 을 원천 계정 코드와 함께 적재하고 10805 는 외화 원액 결손 47행 때문에 계정 전체를 보류한다. 승인 전표(ST_DOCU=2)만 사실로 낸다. 공식 반제 FI_BAND → core.ar_allocation(마이그레이션 200018)을 붙이고 F-12 의 FIFO 추정을 없앴다 — 공식 반제가 원장 기간을 덮고 상태 · 통화가 확인될 때만 미결 금액 · Aging 을 낸다. full raw 3개월 v4: 7월 FI 14,868행 → 사실 1,971 · 8월 13,512 → 1,799 · 9월 13,378 → 1,608(미결 204행 억제), 형식 오류 0. 상태 열을 지운 probe 는 사실 0 · 이슈 1로 막혔다. 10/14 임시 PostgreSQL 전체 체인 actual Loader: 6계약 사실 107,628 = core, 제약 위반 0. due_date NULL 은 기술 적재 차단이 아니다. FI_BAND 명세 Implemented, FI_DOCU 는 10805 보류로 Proposed. 체인에 빠져 있던 FI_BAND 적재 계약(approved · 권위 · window_replace) · 일정 3(꺼진 채) · 목적지 1은 200024 로 정합했다.",
              "evidence": [
                "docs/work-log/2026-10-15_erp-finance-execution/result.md",
                "docs/work-log/2026-10-15_erp-finance-execution/v4-mapper-actual.json",
                "docs/work-log/2026-10-15_erp-ar-integration/result.md",
                "docs/work-log/2026-10-14_erp-remaining-rules/load-result.md",
                "cmslab-data-platform/10_플랫폼구현/managed/supabase/migrations/20260929200018_erp_ar_allocation.sql",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/362dec2d/cmslab-data-platform/10_%ED%94%8C%EB%9E%AB%ED%8F%BC%EA%B5%AC%ED%98%84/managed/supabase/migrations/20260929200024_seed_reconcile_fi_band.sql"
              ],
              "next": "10805 외화 원액 규칙 추론 → FI_DOCU 승격 → AWS 운영에서 FI_BAND 권위 연속 창 확보",
              "updated": "2026-10-15"
            },
            {
              "id": "erp-contract-registry-1015",
              "title": "ERP 원천 계약 레지스트리 · 구매 · 외주 후보 변환",
              "status": "partial",
              "detail": "full export 의 catalog · schema · manifest 와 선택 테이블 원본을 오프라인으로 읽어 업무 ↔ 원천 객체 · 열 · 키 · 입도 · 기간 · 목적지 레지스트리를 만들었다(DB 재접속 없음). 표준 구매(PU_POH/POL · PU_RCVH/RCVL · PU_IVH/IVL)와 외주(SU_POH/POL · SU_RCVH/RCVL) 계보, MA_PARTNER 16,416 · MA_SL 180 · MA_SALEGRP 396행의 필수키 중복 0을 확인했다. Proposed 매퍼 4개를 실제로 돌려 원천 39,418라인 = 후보 39,407 + 헤더 없는 11라인으로 보존 대사했다. 운영 매퍼 등록은 0이라 사실 공개는 시작되지 않는다. 수불유형 30/30 · 단위 공통코드는 ERP 코드 마스터로 닫혀 다시 묻지 않는다. 현재고 후보 5개는 기초 · 수불 · 누계 · 평가 계층이라 정본으로 올리지 않았다. 정기 수집은 업무 필수 본표만(로그 · 날짜 복사본 · 이력 · 임시 표 제외), 수정시각이 희소해 최근 창 재조회 + 월마감 재조회로 한다.",
              "evidence": [
                "docs/work-log/2026-10-15_erp-contract-execution/README.md",
                "docs/work-log/2026-10-15_erp-contract-execution/contract-registry.json",
                "docs/work-log/2026-10-15_erp-contract-execution/purchase-candidates-safe.json",
                "docs/work-log/2026-10-15_erp-contract-execution/movement-code-evidence.json"
              ],
              "next": "예외 11라인 판정 · 입고 반품/상태 · 표준 구매/외주 구분 → 4계약 운영 등록, 현재고 공식 산식 추론",
              "updated": "2026-10-15"
            },
            {
              "id": "erp-ingestion-gate3-1015",
              "title": "ERP 정기 적재 Gate 3 — 세션 상한 2 · 통제 합계 · 공개 checkpoint",
              "status": "partial",
              "detail": "구현(로컬 확인). 운영 worker · run-job 의 ERP 수집이 PostgreSQL advisory slot 2개를 쥔다 — 독립 PG16 에서 2개 동시 확보 · 세 번째 timeout 차단 · 해제 뒤 재확보를 관측했다. 원본 SELECT 뒤 같은 조건의 COUNT_BIG · SUM 통제를 따로 돌리고 어긋나면 reconcile_diff 로 실패해 배치를 만들지 않는다(MAXDOP 1). 추출 · 통제 관측 구간을 raw manifest 와 ctl.ingest_batch 에 남기고, ERP 에 수정 cursor 가 없어 watermark 는 만들지 않는다. 마이그레이션 200019 공개 checkpoint 는 published 에서만 전진한다(rejected 뒤에도 1건 유지). 17차가 03_ 누락과 RDS 의 Supabase 역할 REVOKE 오류를 200021(RDS 판)로 보정했다. 운영 일정은 꺼져 있다 — 10/15 사용자 확인 「아직 AWS 없어」, aws 자격 없음, GitLab CI 변수 0(CMSLAB_RDS_MIGRATOR 없음: rds-plan 은 성공으로 보이지만 건너뜀), OIDC sub 에 ref_protected 없음, worker 이미지 CI job 없음. 독립 ERP CLI · ad hoc 조회는 자동 상한 밖이라 수동으로 합계 2를 지킨다.",
              "evidence": [
                "docs/work-log/2026-10-15_erp-ingestion-execution/result.md",
                "docs/work-log/2026-10-15_erp-ingestion-execution/evidence.json",
                "docs/work-log/2026-10-15_erp-ingestion-execution/manual-runbook.md",
                "cmslab-data-platform/10_플랫폼구현/managed/supabase/migrations/20260929200019_erp_ingestion_checkpoint.sql",
                "cmslab-data-platform/10_플랫폼구현/managed/supabase/migrations/20260929200021_erp_ingestion_checkpoint_rds.sql",
                "docs/work-log/2026-10-15_core-17th/result.md"
              ],
              "next": "고객 AWS 개설 → rds_migrator 출력을 protected 변수로 등록 · OIDC ref_protected 추가 → migration → worker 이미지 → shadow 측정 · 오너 승인 뒤 cadence 켜기",
              "updated": "2026-10-15"
            },
            {
              "id": "erp-residual-1015",
              "title": "ERP 잔여 차이 4레인 — 가격 · 출고→FI · GL 범위 · 채권",
              "status": "partial",
              "detail": "저장된 raw 와 확보 원천으로 기술 계산을 끝냈다(외부 연락 0). 가격 4,122키: 공식 금액은 「매출 마감리스트_2026」 2026마감누적 최종매출에서 89개 거래처 × 품목 그룹 89/89 exact 로 출처를 재현했다(source_resolved). ERP 와 달라진 조정 사유 · 배부 · 승인 근거는 찾지 못했다(reason_unresolved). EC 계보 MM → 출하지시 → 수주 → 송장으로 4,122키 전부 연결, EC 송장 15/15 · 일반 송장 523/523 이 FI 매출 순액과 exact. 일반 출고 385행(매출마감 없음)과 FI 없는 zero-net 송장 9건은 남았다. GL 범위 2분류: 원본 5행 / 8행 범위와 관리손익 집단 · ERP 원가 계보를 재현했지만 금액 bridge 는 2026-07 계정대체 원천이 없어 미해결. 채권: 2026-07-31 까지 FI 166,270행 ↔ 공식 반제 원전표 72,603행 · 상세 84,465행 — 거래처 · 계정 3,745개 중 3,424 exact, 321개는 집합 분해만 됐다. 10/15 사용자 결정에 따라 남은 것은 오스틴 자료 추가 요청 없이 ERP 와 받은 파일로 역회계한다.",
              "evidence": [
                "docs/work-log/2026-10-15_erp-residual-resolution/result.md",
                "docs/work-log/2026-10-15_erp-residual-resolution/pricing/result.md",
                "docs/work-log/2026-10-15_erp-residual-resolution/lineage/summary.md",
                "docs/work-log/2026-10-15_erp-residual-resolution/gl/summary.md",
                "docs/work-log/2026-10-15_erp-residual-resolution/ar/result.md",
                "docs/work-log/2026-10-15_austin-history/result.md"
              ],
              "next": "가격은 역회계 규칙 v1 로 이어짐(별도 항목) → 2026 계정대체 재구성으로 GL bridge → 채권 포함 규칙 · 화면 금액 정의 추론 뒤 검증",
              "updated": "2026-10-15"
            },
            {
              "id": "erp-price-reverse-1015",
              "title": "EC 가격축 잔차 역회계 — 거래처 × 월 합계 배부 규칙 v1(고객 검증 대기)",
              "status": "partial",
              "detail": "10/15 사용자 결정(받은 원천 안에서 역회계)에 따라 7월 EC 가격 잔차 4,122키의 규칙을 세웠다. 공식 통합매출의 EC 행은 거래처 × 매출월 풀의 월 합계(공급가 · 할인)를 ERP 출고 행에 배부한 값이다 — 합계가 ERP 와 10% 이상 다르면 비율 배부, 아니면 행당 가감, 할인은 공급가 비례, 반올림 끝전은 풀마다 한 행. 풀마다 숫자 두 개로 7월 4,117/4,122키(99.88%)를 원 단위까지 맞췄고, 같은 규칙으로 홀드아웃 5월 4,238/5,171(81.96%) · 6월 7,691/8,291(92.76%) · 1~4월 100 · 100 · 94.99 · 93.45%다. 환율 · 고정 차감률 · 송장 배부 · ERP 단일 단가 · 인식시점 이동 가설은 기각했다. 10/16 정합: 월 합계는 ERP 판매 · 재고 데이터로는 안 만들어지지만 월 마감 수기 대체전표(FI_DOCU 40200 · 40210)에 기장돼 있다 — 원천(발생)은 ERP 밖(채널 정산 → 경영지원실 수기 조정), 기장은 ERP 안. v1 풀 34개 중 할인 합계 33 · 공급가 합계 25 가 원 단위로 같다(결정 1). 받은 원천 텍스트 검색(H6)이 오스틴 워크북 밖에서 못 찾은 것은 ERP DB 를 색인하지 않은 한계였다. 그 풀들에서는 월 합계도 독립 원천으로 맞는다(7월 3,995키는 ERP 전표만으로) — P5 는 판매출고/EC 나눔 때문에 공식 합계가 필요하다. 5~7월 남은 1,538키는 모양별로 분류만 했다. 규칙 파일 v1.2(산식 동일, 풀 합계 원천 후보 = FI 수기 전표) · 고객 검증 초안(결정 1 과 한 문장으로 합침)을 만들었고 발송하지 않았다 — 고객확인은 나중에 한 번에.",
              "evidence": [
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/362dec2d/docs/work-log/2026-10-15_price-reverse-accounting/result.md",
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/362dec2d/docs/work-log/2026-10-15_price-reverse-accounting/price-axis-rule-v1.json",
                "docs/work-log/2026-10-15_erp-residual-resolution/pricing/result.md",
                "docs/work-log/2026-10-15_erp-decision-inference/decision-1-price.md",
                "docs/work-log/2026-10-16_price-reconcile/README.md"
              ],
              "next": "고객 검증(나중에 한 번에) — 월 합계 = ERP 월 마감 수기 전표 기장분이라는 한 문장 → 맞으면 v2 · MM · 셀인 가격 축 규칙으로 반영. 남은 키는 10/16 원칙대로 「수기 조정」 칸에 보인다",
              "updated": "2026-10-16"
            },
            {
              "id": "erp-mini-core-1015",
              "title": "맥미니 상시 개발 DB — ERP 2026 core 적재 · 품목 매핑 1단계(로컬)",
              "status": "partial",
              "detail": "구현(로컬 확인). 맥미니 PostgreSQL 16 상시 개발 DB 에 ERP 전체 추출본의 2026-01-01 ~ 10-14 회사 7000 자료를 하루 창 원본으로 오프라인 재현해 7계약 1,723배치를 운영 Loader 로 적재 · 공개했다. 실패 · 거부 배치 0, 7계약 모두 사실 = core. 7월분 core 행 수는 10/14 7월 적재와 계약마다 같다. 품목 매핑 1단계를 이 DB 에서만 적용해(표본 10건 불일치 0 · 승인 1,349 · 예외 59,845 해소) F-01 미매핑 원천 행이 12,804 → 22 가 됐다. F-12 는 1,212행(ready 1,055 · 반제 상태 미확정 157). 17차 · 200021 을 적용했고 데이터는 보존됐다. 로컬 승인은 운영 승인이 아니고 고객 ERP · 운영 DB 접속은 없다.",
              "evidence": [
                "docs/work-log/2026-10-15_mini-persistent-core/result.md",
                "docs/work-log/2026-10-15_mini-persistent-core/evidence/july-parity.json",
                "docs/work-log/2026-10-15_mini-persistent-core/evidence/counts-after-tier1.json"
              ],
              "next": "운영 DB 에서 1단계 사람 서명 재실행 · FI_BAND 상태 의미 584행 · MM 단위 없음 1,173행 · 창고 코드 제안 66개 판정",
              "updated": "2026-10-15"
            },
            {
              "id": "erp-medical-ar-1015",
              "title": "메디컬 채권 회전일 추론 · 9/30 Aging · F-12 규칙(고객 검증 대기)",
              "status": "partial",
              "detail": "고객에게 규칙을 묻지 않고 ERP 전체 추출본(FI_DOCU 10801 · FI_BANH · FI_BAND · MA_PARTNER)과 받은 자료로 정했다. 회전일 = 거래처 마스터 수금예정일수 · 구분(구분 1은 발생월 + round(일수/30)개월 말일). 실제 수금 시점 시험과 2025-01 매출현황 표 재현 시험에서 M+2 월말 · 달력 90일은 기각했다. 공식 반제의 91.8%(금액 96.4%)가 가장 오래된 매출부터 지워 반제망 밖 차이도 오래된 매출부터 상계한다. 이 기준으로 9/30 잔액 · 경과일 Aging · 회전일 초과 · 10월 수금선을 냈다(금액은 비공개 엑셀과 검증 문서). 플랫폼: MA_PARTNER 수집 · ErpPartnerTermMapper → core.party_ar_term, 마이그레이션 200022(F-12 회전일 규칙 · mart.v_f12_ar_open_item) · 200023(MA_PARTNER 계약 시드 정합)을 로컬 PG16 체인에 적용했다. 계약 proposed · 일정 꺼짐 · 운영 RDS 미적용이고 고객 검증 문서는 아직 보내지 않았다.",
              "evidence": [
                "https://lab.wishdev.net/aidp/cms-lab/-/blob/362dec2d/docs/work-log/2026-10-15_medical-ar-inference/result.md",
                "docs/work-log/2026-10-15_medical-ar-inference/platform.md",
                "docs/work-log/2026-10-15_medical-ar-inference/ar-due-rule-v0.json",
                "cmslab-data-platform/10_플랫폼구현/managed/supabase/migrations/20260929200022_f12_ar_due_rule.sql",
                "cmslab-data-platform/10_플랫폼구현/managed/supabase/migrations/20260929200023_seed_reconcile_ma_partner.sql"
              ],
              "next": "고객 검증(「맞나? 아니면 어떻게 고치나?」) → rds-plan · rds-migrate → MA_PARTNER · FI_BAND 운영 수집 · 계약 approved → F-12 구간을 확정서 3.12(30 · 60 · 90 · 120+)에 맞춤",
              "updated": "2026-10-15"
            },
            {
              "id": "erp-open-rules-1015",
              "title": "ERP 남은 업무 규칙 6건 — 받은 원천 안에서 추론",
              "status": "partial",
              "detail": "2026-10-16 갱신 — 6건 모두 2026-10-14 ERP 전체 추출본 offline 계산으로 추론안과 결과 숫자를 만들었다(ERP 실시간 접속 · 고객 발송 0). ① 가격: v1 배부 규칙 유지, 풀 합계는 ERP 월 마감 수기 대체전표(40200 · 40210) 기장분 — 7월 4,117/4,122키(그중 3,995 는 ERP 전표만). 10/16 정합: 월 합계는 ERP 판매 · 재고 데이터로는 안 만들어지지만 월 마감 수기 대체전표(FI_DOCU 40200 · 40210)에 기장돼 있다 — 원천(발생)은 ERP 밖(채널 정산 → 경영지원실 수기 조정), 기장은 ERP 안. v1 풀 34개 중 할인 합계 33 · 공급가 합계 25 가 원 단위로 같다(보조: 1~7월 거래처×월 3,003/3,135, 자동 분개 몫 포함). ② 단위 123행: 품목계정 「비용」 품목 = 재고 없는 품목 → 123 → 0(매출할인 115 · 배송비 8). ③ 외화 47행: 10805 원화 원장 + 같은 전표 10801 · 정확 일치 인보이스로 원액 → 7월 121행 적재, 외화 91행 중 원액 62. ④ 역직구: ERP 역직구몰 그룹 + 매핑은 역직구몰인데 ERP 그룹이 다른 거래처 1곳의 판매 출고, 효력 2026-04-01~ · 마감월 재작성 없음 → 1~7월 526키 누락 0 · 오분류 0. ⑤ 구매 · 외주 11행: 허용 예외, 수불유형으로 방향 → 39,418 → 사실 39,017 · 제외 401. ⑥ 현재고: 그해 기초(MM_PINVN) + 일별 입고 − 출고(MM_OHSLINVD), 양품 · 전 창고 → 7월 말 수불부 기말 4,638/4,638 품목 일치. 고객 확인 문장 6개는 초안(발송 안 함). 계약 승격 · 매퍼 반영은 검증 뒤.",
              "evidence": [
                "docs/work-log/2026-10-15_erp-decision-inference/README.md",
                "docs/work-log/2026-10-15_erp-decision-inference/고객확인_초안.md",
                "docs/work-log/2026-10-15_erp-decision-inference/decision-1-price.md",
                "docs/work-log/2026-10-15_erp-decision-inference/decision-2-units.md",
                "docs/work-log/2026-10-15_erp-decision-inference/decision-3-fx.md",
                "docs/work-log/2026-10-15_erp-decision-inference/decision-4-reverse-dm.md",
                "docs/work-log/2026-10-15_erp-decision-inference/decision-5-purchase.md",
                "docs/work-log/2026-10-15_erp-decision-inference/decision-6-inventory.md",
                "docs/work-log/2026-10-16_price-reconcile/README.md"
              ],
              "next": "고객 확인 6건(발송 · 미팅 여부는 사용자 결정) → 맞으면 Proposed 계약(MM_QTIO · FI_DOCU · reverse_dm · 구매 4계약) 승격 · 매퍼 반영",
              "updated": "2026-10-16",
              "previous_status": "pending"
            }
          ],
          "updated": "2026-10-15"
        }
      ]
    },
    {
      "id": "read-platform",
      "title": "실제 Read 플랫폼 완료 조건",
      "description": "기존 아키텍처 7개 탭을 실제 접속·전체 범위 읽기·완전성 대조·반복 실행 증거로 분해한 4단계 체크리스트다.",
      "groups": [
        {
          "id": "read-arch",
          "title": "① 시스템 아키텍처 — Read 범위·계약·raw 증적",
          "items": [
            {
              "id": "read-boundary",
              "title": "Read 완료 경계를 Write·발행·반출과 분리",
              "status": "done",
              "detail": "이 체크리스트의 완료는 원천에서 읽은 범위를 raw·manifest·stg까지 검증하는 것이다. 핵심 데이터 적재, 마트 공개, 반출 파일, ERP 업로드는 별도 상태로 관리한다.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/01_시스템아키텍처.md"
              ],
              "next": "원천별 카드에 같은 Read 경계를 적용해 완료 판정을 유지",
              "checks": [
                {
                  "id": "read-boundary-scope",
                  "title": "Read 시작·종료 지점 명시",
                  "status": "done",
                  "detail": "원천 접속부터 stg 완전성 대조까지를 Read로 정의했다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/01_시스템아키텍처.md"
                  ],
                  "next": "정의 유지",
                  "criterion": "완료 정의에 접속, 전체 읽기, raw 증적, stg 대조, 재실행이 명시된다.",
                  "stage": "scope"
                },
                {
                  "id": "read-boundary-write",
                  "title": "Write·승인·반출 후속 분리",
                  "status": "done",
                  "detail": "반출 묶음과 ERP 업로드는 Read 완료 필수 조건에서 제외했다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/01_시스템아키텍처.md"
                  ],
                  "next": "후속 체크리스트에서 관리",
                  "criterion": "Read 완료여부가 반출·업로드 미완료와 독립적으로 계산된다.",
                  "stage": "scope"
                },
                {
                  "id": "read-boundary-live",
                  "title": "실제 Read 증거 우선 규칙",
                  "status": "done",
                  "detail": "코드·설계·합성 테스트는 구현 준비도 근거로만 취급한다.",
                  "evidence": [
                    "docs/work-log/2026-09-27_platform-phase2-continuation/result.md"
                  ],
                  "next": "운영 실행 수령증 추가",
                  "criterion": "실제 Read 완료는 실제 원천·실제 권한·실제 범위 증거를 가진다.",
                  "stage": "proof"
                },
                {
                  "id": "read-boundary-architecture",
                  "title": "기존 7탭·Archify 재사용",
                  "status": "done",
                  "detail": "기존 HTML·UML·상태머신을 Read 체크리스트의 근거로 연결했다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/index.html",
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/06_수령배치_상태머신.html"
                  ],
                  "next": "기존 산출물 변경 시 연결 검증",
                  "criterion": "새 도식 없이 기존 7개 탭과 상태머신으로 모든 Read 체크를 추적한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "read-contract-coverage",
              "title": "전체 원천의 Read 계약·범위·주기 완전성",
              "status": "partial",
              "detail": "분류표 원천과 미분류 원천을 함께 다룬다. 코드와 시드는 존재하지만 실제 계정·객체·시간창·페이징 범위는 전수 실측하지 못했다.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
              ],
              "next": "원천별 실제 계정·범위·주기·페이징·시작점을 수령증으로 고정",
              "checks": [
                {
                  "id": "read-contract-population",
                  "title": "원천 모집단 고정",
                  "status": "done",
                  "detail": "분류표 원천 행과 미분류 원천을 분리해 한 모집단으로 관리한다. 개수는 생성기가 단언한다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "식별자 변경 시 전수 대조",
                  "criterion": "모집단의 원천 ID가 중복 없이 모두 존재한다.",
                  "stage": "scope"
                },
                {
                  "id": "read-contract-owner",
                  "title": "계정·권한 소유자 확정",
                  "status": "pending",
                  "detail": "실제 API·DB·시트·포털 계정의 소유자와 최소 읽기 권한을 전수 확정해야 한다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천별 소유자·권한 승인 증거 연결",
                  "criterion": "모든 원천에 운영 소유자와 Read 권한 범위가 기록된다.",
                  "stage": "access"
                },
                {
                  "id": "read-contract-object",
                  "title": "객체·탭·보고서·뷰 범위 확정",
                  "status": "partial",
                  "detail": "시드에 계약은 있지만 모든 원천의 실제 객체가 실측된 것은 아니다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "실제 목록 API·UI·DB 메타데이터로 계약 대조",
                  "criterion": "각 원천의 필수 객체 목록과 제외 객체가 고정된다.",
                  "stage": "contract"
                },
                {
                  "id": "read-contract-window",
                  "title": "초기 읽기·증분·재수집 시간창 확정",
                  "status": "partial",
                  "detail": "시간창 패턴은 실행 계약에 있으나 원천별 초기 백필 시작점은 실제 검증이 남았다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/01_시스템아키텍처.md"
                  ],
                  "next": "원천별 최초·일일·재수집 창 승인",
                  "criterion": "각 계약에 초기 시작점, 증분 기준, 재수집 가능 범위가 있다.",
                  "stage": "contract"
                },
                {
                  "id": "read-contract-pagination",
                  "title": "페이징·유소백필·탭 종료 조건 확정",
                  "status": "pending",
                  "detail": "전체 읽기를 증명할 마지막 페이지·탭·파일 종료 조건이 원천별로 필요하다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md"
                  ],
                  "next": "페이징·탭·파일 전수 종료 수치 저장",
                  "criterion": "각 실행에 종료 조건과 총 단위 수가 기록된다.",
                  "stage": "live_read"
                },
                {
                  "id": "read-contract-unclassified",
                  "title": "미분류 원천 식별·계약 생성",
                  "status": "blocked",
                  "detail": "화해·제휴몰·계열사·글로벌 B2B·중국법인·일본자사몰은 스키마와 접속 방식이 확정되지 않았다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "실제 원천·소유자·접속법·스키마 확정",
                  "criterion": "6개 모두 식별자와 실행 가능한 Read 계약을 가진다.",
                  "stage": "contract"
                }
              ]
            },
            {
              "id": "read-raw-proof",
              "title": "raw 원본·manifest·해시 증적 체인",
              "status": "partial",
              "detail": "raw 경로, manifest, SHA-256, 배치 불변 열과 코드 검증은 있다. 실제 원천 전수에 대한 운영 raw 착지와 해시 수령증은 없다. 2026-10-14 ERP: SELECT 가능한 사용자 테이블 3,359개 · 115,170,363행의 1회 전체 raw 를 받아 테이블 파일 크기 · SHA-256 을 전수 확인했다(누락 · 중복 · 파일 오류 0, 동일 시점 snapshot 아님). 맥미니 개발 DB 재현 배치는 extract_query_ref 에 원본 표 SHA-256 과 오프라인 재현임을 남겼다. 운영 실행 raw 수령증은 AWS 전이라 없다.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/worker/core/README.md",
                "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/03_schema_postgresql.sql",
                "docs/work-log/2026-10-15_erp-export-complete/result.md",
                "docs/work-log/2026-10-15_erp-export-complete/evidence.json",
                "docs/work-log/2026-10-15_mini-persistent-core/result.md"
              ],
              "next": "운영 실행별 raw 객체·manifest·DB 불변 필드를 자동 대조",
              "checks": [
                {
                  "id": "read-raw-path",
                  "title": "원천·계정·객체·배치 raw 경로",
                  "status": "done",
                  "detail": "표준 raw 경로와 동일 폴더 manifest 구조가 구현되었다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/core/README.md"
                  ],
                  "next": "운영 S3 표본 경로 검증",
                  "criterion": "모든 실행이 원천·계정·객체·수령일·배치로 유일하게 착지한다.",
                  "stage": "raw"
                },
                {
                  "id": "read-raw-manifest",
                  "title": "manifest 필수 필드 기록",
                  "status": "done",
                  "detail": "추출 시각·방법·기간·파일·해시·경로 계약이 코드에 있다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/core/README.md"
                  ],
                  "next": "실제 manifest 전수 스키마 검증",
                  "criterion": "각 raw 객체에 필수 필드가 누락 없는 manifest가 존재한다.",
                  "stage": "raw"
                },
                {
                  "id": "read-raw-hash",
                  "title": "raw·manifest·DB SHA-256 일치",
                  "status": "partial",
                  "detail": "로컬 검증은 있지만 운영 raw 전수 해시 대조는 없다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/core/README.md",
                    "docs/work-log/2026-09-27_platform-phase2-continuation/result.md"
                  ],
                  "next": "운영 배치별 3자 해시 대조 결과 저장",
                  "criterion": "raw 바이트, manifest 해시, DB 배치 해시가 모두 일치한다.",
                  "stage": "proof"
                },
                {
                  "id": "read-raw-immutable",
                  "title": "배치 식별·기간·해시·경로 불변",
                  "status": "done",
                  "detail": "등록 후 불변 제약과 회귀 검증 기록이 있다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/03_schema_postgresql.sql",
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/04_검증_결과_2026-09-27.txt"
                  ],
                  "next": "운영 DB에서 변조 거부 표본 확인",
                  "criterion": "등록된 배치 증적 필드는 일반 역할로 수정되지 않는다.",
                  "stage": "control"
                },
                {
                  "id": "read-raw-count",
                  "title": "raw 객체·바이트·레코드 수 수령증",
                  "status": "pending",
                  "detail": "실제 전체 범위의 객체·바이트·레코드 수가 원천 수치와 일치한다는 증거가 필요하다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/01_시스템아키텍처.md"
                  ],
                  "next": "원천 수치와 raw 수치 대조",
                  "criterion": "실행별 예상·수신·중복·누락 수가 수령증에 있다.",
                  "stage": "completeness"
                },
                {
                  "id": "read-raw-retention",
                  "title": "PII raw·비식별 raw 보존 경계",
                  "status": "partial",
                  "detail": "삭제 태그·사본 해시 확인 로직은 있지만 운영 라이프사이클은 검증되지 않았다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/core/README.md"
                  ],
                  "next": "운영 S3 태그·사본·보존 후 삭제 증거 확보",
                  "criterion": "보존·삭제 정책이 raw 증적 완전성을 깨지 않고 작동한다.",
                  "stage": "control"
                }
              ],
              "previous_status": "partial",
              "updated": "2026-10-15"
            }
          ]
        },
        {
          "id": "read-sequence",
          "title": "② UML 시퀀스 — T0~T5 실행·반복 Read",
          "items": [
            {
              "id": "read-e2e-path",
              "title": "실제 원천 T0 → 추출 T1 → raw T2 → stg T3 경로",
              "status": "pending",
              "detail": "시퀀스와 로컬 E2E는 있지만 실제 원천 전수가 동일 경로를 통과한 운영 증거는 없다.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/index.html",
                "cmslab-data-platform/10_플랫폼구현/worker/core/README.md"
              ],
              "next": "원천별 correlation ID로 T0~T3 운영 이력을 한 묶음으로 저장",
              "checks": [
                {
                  "id": "read-e2e-trigger",
                  "title": "T0 원천 사건·스냅샷 기준 기록",
                  "status": "pending",
                  "detail": "원천 기준 시각과 수집 시작 시각을 실제 수령증에 남겨야 한다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/01_시스템아키텍처.md"
                  ],
                  "next": "실행 로그에 source event time·started_at 저장",
                  "criterion": "각 Read 실행의 T0와 T1 시각을 추적할 수 있다.",
                  "stage": "live_read"
                },
                {
                  "id": "read-e2e-extract",
                  "title": "T1 추출 범위·요청·응답 증거",
                  "status": "pending",
                  "detail": "페이지별 요청과 응답 범위가 실제 원천에서 기록돼야 한다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md"
                  ],
                  "next": "비밀·PII 제거한 요청 요약과 응답 수치 저장",
                  "criterion": "요청 횟수, 페이지 수, 응답 레코드 수를 실행별로 검증한다.",
                  "stage": "live_read"
                },
                {
                  "id": "read-e2e-land",
                  "title": "T2 raw 착지 성공",
                  "status": "pending",
                  "detail": "실제 원천 추출물의 raw 객체와 manifest가 필요하다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/core/README.md"
                  ],
                  "next": "실행 ID별 raw 객체·manifest 존재 검증",
                  "criterion": "모든 성공 추출에 검증 가능한 raw와 manifest가 있다.",
                  "stage": "raw"
                },
                {
                  "id": "read-e2e-stage",
                  "title": "T3 stg 적재·파싱 결과",
                  "status": "pending",
                  "detail": "파서가 실제 raw 전체를 읽고 stg 수치를 남긴 증거가 필요하다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/core/README.md"
                  ],
                  "next": "raw→stg 실제 적재 수령증 저장",
                  "criterion": "raw 레코드, stg 데이터 행, skip·reject 행 합계가 설명 가능하다.",
                  "stage": "completeness"
                },
                {
                  "id": "read-e2e-correlation",
                  "title": "T0~T3 단일 추적 키",
                  "status": "partial",
                  "detail": "배치·회차 키 설계는 있지만 운영 흐름 전체 추적 증거는 없다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/02_DB스키마·테이블·컬럼명세.md"
                  ],
                  "next": "실행별 타임라인 자동 생성",
                  "criterion": "하나의 실행 ID로 원천 요청부터 stg 행까지 추적한다.",
                  "stage": "proof"
                },
                {
                  "id": "read-e2e-failure",
                  "title": "경로 단계별 실패·차단 분리",
                  "status": "partial",
                  "detail": "blocked·failed·rejected 분리는 구현됐으나 실제 원천 전수 분류 증거가 필요하다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/core/README.md"
                  ],
                  "next": "실제 실패 시 단계·원인·재시도 결과 저장",
                  "criterion": "모든 비성공 실행이 접속 차단, 실행 실패, 품질 거부로 분류된다.",
                  "stage": "recovery"
                }
              ]
            },
            {
              "id": "read-repeat-proof",
              "title": "반복 Read·변경 감지·재수집 증명",
              "status": "pending",
              "detail": "새 데이터, unchanged, A→B→A, 재처리 코드 테스트는 있다. 실제 원천에서 서로 다른 두 회 이상 Read와 누락 없음을 입증하지 못했다.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/worker/core/README.md",
                "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/01_시스템아키텍처.md"
              ],
              "next": "원천별 최소 2회 운영 Read, 변경·무변경·늦은 수정 대조",
              "checks": [
                {
                  "id": "read-repeat-twice",
                  "title": "실제 원천 2회 이상 반복 Read",
                  "status": "pending",
                  "detail": "단발 탐색이 아닌 반복 실행 증거가 필요하다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/core/README.md"
                  ],
                  "next": "정규 실행 2회 수령증 저장",
                  "criterion": "각 원천에 서로 다른 시각의 성공 Read 수령증이 2개 이상 있다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "read-repeat-unchanged",
                  "title": "무변경 실행 멱등 확인",
                  "status": "partial",
                  "detail": "합성 시험은 있지만 실제 원천 무변경 수령증은 없다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/core/README.md"
                  ],
                  "next": "동일 범위 재실행 해시·배치 결과 대조",
                  "criterion": "변경 없는 재실행은 중복 사실행 없이 unchanged로 기록된다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "read-repeat-change",
                  "title": "변경·늦은 수정 감지",
                  "status": "pending",
                  "detail": "수정일 없는 원천과 시트 수식 변경을 포함한 실제 검증이 필요하다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md"
                  ],
                  "next": "검증용 변경 후 정규·정합 재수집 대조",
                  "criterion": "변경과 늦은 수정이 정해진 최대 시간 안에 raw와 stg에 반영된다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "read-repeat-backfill",
                  "title": "종료된 기간 재수집",
                  "status": "pending",
                  "detail": "과거 하루·월·정산 기간을 지정한 재수집 증거가 없다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/01_시스템아키텍처.md"
                  ],
                  "next": "원천별 완료 기간 1건 재수집",
                  "criterion": "지정 기간의 재수집이 현재 읽기와 충돌하지 않고 별도 배치로 남는다.",
                  "stage": "recovery"
                },
                {
                  "id": "read-repeat-reconcile",
                  "title": "1차·2차 합계·키 대조",
                  "status": "pending",
                  "detail": "반복 Read 사이 추가·수정·삭제를 설명할 대조표가 필요하다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/01_시스템아키텍처.md"
                  ],
                  "next": "실행 간 natural key·합계 차이 리포트 생성",
                  "criterion": "두 Read의 차이가 원천 변경분과 일치한다.",
                  "stage": "completeness"
                },
                {
                  "id": "read-repeat-cadence",
                  "title": "주기·재시도·정합 실행 준수",
                  "status": "pending",
                  "detail": "설계된 주기가 운영에서 실제 발화한 증거가 없다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/infra/README.md"
                  ],
                  "next": "운영 Scheduler 발화·지연·누락 지표 확보",
                  "criterion": "계획 주기별 발화, 재시도, 정합 실행이 허용 오차 안에 돈다.",
                  "stage": "repeat_read"
                }
              ]
            }
          ]
        },
        {
          "id": "read-state",
          "title": "③ UML 상태 머신 — 재시도·멱등·복구",
          "items": [
            {
              "id": "read-lifecycle",
              "title": "수령 배치·처리 회차 상태 전이",
              "status": "partial",
              "detail": "상태 정의, DB 제약, 트리거, 상태머신 산출물과 PG16 회귀 결과는 있다. 운영 배치의 전이 이력은 없다.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/06_수령배치_상태머신.html",
                "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/04_검증_결과_2026-09-27.txt"
              ],
              "next": "실제 Read 배치의 received→parsed→validated 전이 이력 확보",
              "checks": [
                {
                  "id": "read-state-definition",
                  "title": "상태·전이·수행 역할 단일 정의",
                  "status": "done",
                  "detail": "그림·DDL·시드가 동일 정의에서 생성된다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/README.md"
                  ],
                  "next": "정의 변경 시 재생성 검증",
                  "criterion": "그림·DDL·시드의 상태와 수행 역할이 일치한다.",
                  "stage": "control"
                },
                {
                  "id": "read-state-live",
                  "title": "실제 배치 전이 이력",
                  "status": "pending",
                  "detail": "운영 배치의 상태별 시각·역할·사유가 필요하다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/01_시스템아키텍처.md"
                  ],
                  "next": "state_history 운영 수령증 생성",
                  "criterion": "성공 Read의 received→parsing→parsed→validating→validated 이력을 추적한다.",
                  "stage": "proof"
                },
                {
                  "id": "read-state-invalid",
                  "title": "허용되지 않은 전이 거부",
                  "status": "done",
                  "detail": "상태표에 없는 전이와 잘못된 역할을 DB가 거부한다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/04_검증_결과_2026-09-27.txt"
                  ],
                  "next": "운영 권한 표본 거부 검증",
                  "criterion": "비허용 상태 전이와 역할 오용이 항상 실패한다.",
                  "stage": "control"
                },
                {
                  "id": "read-state-rejected",
                  "title": "실패·거부·차단 상태 원인 보존",
                  "status": "partial",
                  "detail": "에러 분류 코드는 있지만 실제 운영 사례 전수 검증이 남았다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/core/README.md"
                  ],
                  "next": "비성공 실행의 원인·복구조치 저장",
                  "criterion": "모든 비성공 상태에 원인, 재시도 가능여부, 작업자 조치가 있다.",
                  "stage": "recovery"
                },
                {
                  "id": "read-state-read-only",
                  "title": "validated 전이와 published 전이 분리",
                  "status": "done",
                  "detail": "Read 검증 완료와 발행을 다른 상태로 관리한다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/01_시스템아키텍처.md"
                  ],
                  "next": "Read 지표에 published 요구 유입 방지",
                  "criterion": "validated 배치는 발행 없이도 Read 완전성을 입증할 수 있다.",
                  "stage": "scope"
                }
              ]
            },
            {
              "id": "read-retry-idempotency",
              "title": "재시도·DLQ·lease·멱등 복구",
              "status": "partial",
              "detail": "FIFO, 가시성 연장, 재시도 상한, DLQ, unchanged, lease 테스트가 있다. 실제 AWS와 원천 오류에서 복구한 증거는 없다. 2026-10-15 ERP(독립 PG16): 운영 worker · run-job 세션 상한 2(세 번째 차단 · 해제 뒤 재확보)와 공개 checkpoint 가 published 에서만 전진하고 rejected 에서는 멈추는 것을 관측했다.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/worker/core/README.md",
                "cmslab-data-platform/10_플랫폼구현/infra/README.md",
                "docs/work-log/2026-10-15_erp-ingestion-execution/result.md",
                "docs/work-log/2026-10-15_erp-ingestion-execution/evidence.json"
              ],
              "next": "dev AWS와 실제 원천 표본에서 재시도·DLQ·재실행 후 수치 대조",
              "checks": [
                {
                  "id": "read-retry-transient",
                  "title": "일시 오류 재시도 상한",
                  "status": "done",
                  "detail": "재배달·백오프·3회 상한이 구현됐다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/core/README.md"
                  ],
                  "next": "실제 429·5xx·네트워크 오류 복구 검증",
                  "criterion": "일시 오류는 정해진 상한 내에 재시도하고 중복 적재를 만들지 않는다.",
                  "stage": "recovery"
                },
                {
                  "id": "read-retry-blocked",
                  "title": "권한·설정 차단 즉시 분리",
                  "status": "done",
                  "detail": "retryable=false와 blocked 분류 계약이 있다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/core/README.md"
                  ],
                  "next": "실제 403·404·인증 실패 수령증 검증",
                  "criterion": "재시도해도 풀리지 않는 오류는 DLQ 소모 없이 blocked로 종료한다.",
                  "stage": "recovery"
                },
                {
                  "id": "read-retry-dlq",
                  "title": "3회 실패 후 DLQ·경보",
                  "status": "partial",
                  "detail": "구성·테스트는 있지만 운영 전달·경보 증거가 없다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/infra/README.md"
                  ],
                  "next": "dev AWS에서 의도적 실패·DLQ·경보 확인",
                  "criterion": "재시도 상한 초과 메시지가 DLQ와 운영 경보에 존재한다.",
                  "stage": "recovery"
                },
                {
                  "id": "read-retry-lease",
                  "title": "장시간 Read 가시성·lease 연장",
                  "status": "partial",
                  "detail": "테스트는 있지만 실제 장시간 수집 실측이 없다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/core/README.md"
                  ],
                  "next": "실제 장시간 페이징 작업에서 heartbeat 확인",
                  "criterion": "Read 시간 동안 lease가 끊기지 않고 동일 그룹의 중복 소비가 없다.",
                  "stage": "live_read"
                },
                {
                  "id": "read-retry-idempotent",
                  "title": "동일 입력 재실행 멱등",
                  "status": "partial",
                  "detail": "합성 A→B→A·unchanged 검증은 있으나 실제 원천 증거가 필요하다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/core/README.md"
                  ],
                  "next": "동일 원천 범위 2회 재실행 후 해시·행수 대조",
                  "criterion": "동일 입력은 중복 raw·stg 사실을 만들지 않는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "read-retry-resume",
                  "title": "중간 실패 후 안전 재개",
                  "status": "partial",
                  "detail": "코드 검증은 있지만 raw 저장 전·후 실제 프로세스 중단 복구 증거가 없다.",
                  "evidence": [
                    "docs/work-log/2026-09-27_platform-phase2-continuation/result.md"
                  ],
                  "next": "저장 전·manifest 전·DB 등록 전 중단 후 재개 테스트",
                  "criterion": "중간 중단 후 재실행이 부분 증적을 잘못된 성공으로 등록하지 않는다.",
                  "stage": "recovery"
                }
              ],
              "previous_status": "partial",
              "updated": "2026-10-15"
            }
          ]
        },
        {
          "id": "read-db",
          "title": "④ UML 클래스·DB — stg 완전성·PII 경계",
          "items": [
            {
              "id": "read-stg-completeness",
              "title": "raw → stg 행수·skip·reject·중복 대조",
              "status": "partial",
              "detail": "행 수 기준, skipped_row_count, 헤더 드리프트, 기간 불일치, 현재 회차 설계가 있다. 실제 원천 전수 대조는 없다. 2026-10-15 ERP(로컬 확인): 수집기가 원본 SELECT 뒤 같은 조건의 COUNT_BIG · SUM 통제를 따로 돌려 어긋나면 배치를 만들지 않는다. 맥미니 개발 DB 재현에서 날짜별 물리 COUNT · SUM 과 원본 합계 불일치 0일, 7계약 사실 = core.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/02_DB스키마·테이블·컬럼명세.md",
                "cmslab-data-platform/10_플랫폼구현/worker/core/README.md",
                "docs/work-log/2026-10-15_erp-ingestion-execution/result.md",
                "docs/work-log/2026-10-15_mini-persistent-core/result.md"
              ],
              "next": "원천별 실제 raw·stg·skip·reject 합계 자동 대조",
              "checks": [
                {
                  "id": "read-stg-basis",
                  "title": "행 수 기준 고정",
                  "status": "done",
                  "detail": "stg_data_rows와 skipped_row_count 기록 계약이 있다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/core/README.md"
                  ],
                  "next": "파서별 기준 표시 유지",
                  "criterion": "모든 회차에 row_count_basis와 skipped_row_count가 기록된다.",
                  "stage": "completeness"
                },
                {
                  "id": "read-stg-equation",
                  "title": "raw = stg + skip + reject 설명",
                  "status": "pending",
                  "detail": "실제 raw 단위와 파싱 단위 차이를 전수 설명해야 한다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/core/README.md"
                  ],
                  "next": "계약별 완전성 방정식과 수치 저장",
                  "criterion": "실행별 raw 입력 수가 stg, skip, reject, 기술 행으로 전부 설명된다.",
                  "stage": "completeness"
                },
                {
                  "id": "read-stg-key",
                  "title": "자연키 중복·누락 검증",
                  "status": "partial",
                  "detail": "자연키·현재 행 뷰 설계는 있지만 실데이터 전수 검증이 남았다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/01_시스템아키텍처.md"
                  ],
                  "next": "실제 자연키 uniqueness·null 수치 저장",
                  "criterion": "원천 키의 중복·누락이 계약 허용치 이내다.",
                  "stage": "completeness"
                },
                {
                  "id": "read-stg-header",
                  "title": "헤더·스키마 드리프트 거부",
                  "status": "partial",
                  "detail": "코드와 테스트는 있지만 실제 원천 전수의 최신 헤더 고정이 완료되지 않았다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md"
                  ],
                  "next": "실제 헤더·탭·컬럼 기준선 확정",
                  "criterion": "예상하지 못한 헤더·형·탭 변경은 묵시되지 않고 rejected로 남는다.",
                  "stage": "quality"
                },
                {
                  "id": "read-stg-period",
                  "title": "요청 기간·산출물 기간 대조",
                  "status": "partial",
                  "detail": "PeriodClaimedArtifact와 기간 거부 계약이 있지만 운영 증거가 없다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/core/README.md"
                  ],
                  "next": "실제 정산·파일 기간 표본 대조",
                  "criterion": "요청 기간과 산출물 선언 기간이 일치하며 불일치는 적재되지 않는다.",
                  "stage": "quality"
                },
                {
                  "id": "read-stg-total",
                  "title": "원천 합계·잔액·건수 대조",
                  "status": "pending",
                  "detail": "실제 원천 보고서 합계와 stg 합계를 전수 대조한 증거가 필요하다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/01_시스템아키텍처.md"
                  ],
                  "next": "원천 통제 합계와 stg 합계 대조표 생성",
                  "criterion": "계약별 통제 합계가 허용 오차 안에서 원천과 일치한다.",
                  "stage": "completeness"
                }
              ],
              "previous_status": "partial",
              "updated": "2026-10-15"
            },
            {
              "id": "read-pii-boundary",
              "title": "PII·민감 열 raw 격리·stg 제거·사본 검증",
              "status": "partial",
              "detail": "raw_has_pii, 제거 규칙, redacted 사본, 보존 경계가 설계·구현됐다. #43·#59·#69 헤더 고정과 실제 사본 품질 검증은 남았다.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/01_시스템아키텍처.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md"
              ],
              "next": "PII 원천 헤더 고정·실제 redacted 사본 점검·stg 제거 증거 확보",
              "checks": [
                {
                  "id": "read-pii-classify",
                  "title": "PII 원천·열 분류",
                  "status": "partial",
                  "detail": "일부 원천 규칙은 있지만 실제 헤더 전수 확정이 남았다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md"
                  ],
                  "next": "전 원천 실제 헤더·값 모양 검토",
                  "criterion": "PII를 포함할 수 있는 원천과 열이 버전 관리된다.",
                  "stage": "pii"
                },
                {
                  "id": "read-pii-raw",
                  "title": "PII raw 원본 격리",
                  "status": "partial",
                  "detail": "레이크 raw 전용 경계와 역할이 설계되었지만 운영 AWS 검증은 없다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/01_시스템아키텍처.md"
                  ],
                  "next": "운영 버킷 정책·역할 거부 검증",
                  "criterion": "PII raw는 허용된 수집 역할만 쓰고 읽으며 일반 조회 역할은 접근하지 못한다.",
                  "stage": "pii"
                },
                {
                  "id": "read-pii-redacted",
                  "title": "redacted 사본 해시·버전 검증",
                  "status": "partial",
                  "detail": "코드·테스트는 있지만 실제 PII 사본 표본 검토가 필요하다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/core/README.md"
                  ],
                  "next": "실제 사본의 redactor 버전·입출력 해시 점검",
                  "criterion": "모든 PII raw에 원본과 분리된 검증 가능한 redacted 사본이 있다.",
                  "stage": "pii"
                },
                {
                  "id": "read-pii-stage",
                  "title": "stg·extra에 PII 미적재",
                  "status": "pending",
                  "detail": "실제 적재 후 제외 열과 extra 필드를 전수 검색해야 한다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/01_시스템아키텍처.md"
                  ],
                  "next": "PII 식별 정규식·열 검색 결과 저장",
                  "criterion": "stg 전용 열과 extra에 제외 대상 PII가 0건이다.",
                  "stage": "pii"
                },
                {
                  "id": "read-pii-pins",
                  "title": "#43·#59·#69 헤더 고정 해제",
                  "status": "blocked",
                  "detail": "PII 시트는 실제 헤더 핀닝 전 stg 진입을 막는다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md"
                  ],
                  "next": "실제 탭·헤더·PII 열 승인 후 기준선 고정",
                  "criterion": "3개 시트의 헤더 기준선과 PII 제거 규칙이 승인된다.",
                  "stage": "access"
                },
                {
                  "id": "read-pii-retention",
                  "title": "사본 확인 후 raw 보존 주기",
                  "status": "partial",
                  "detail": "삭제 태그 가드가 구현됐으나 운영 주기는 미검증이다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/core/README.md"
                  ],
                  "next": "실제 사본 해시 확인·태깅·수명주기 검증",
                  "criterion": "사본 없는 PII raw는 삭제되지 않고 확인된 사본만 정책에 따라 처리된다.",
                  "stage": "control"
                }
              ]
            }
          ]
        },
        {
          "id": "read-deploy",
          "title": "⑤ UML 배포 — 실행 인프라·스케줄러·설치형 폴백",
          "items": [
            {
              "id": "read-runtime",
              "title": "AWS Read 운영 경로 배포·발화·관측",
              "status": "blocked",
              "detail": "Terraform, 역할별 EC2, EventBridge Scheduler, SQS FIFO/DLQ, S3 raw, RDS, 경보 설계와 구조 검증은 있다. AWS 계정·리소스는 아직 적용되지 않았다. 2026-10-15 재확인: 사용자 「아직 AWS 없어」, aws 자격 없음, GitLab CI 변수 0(CMSLAB_RDS_MIGRATOR 없음 — rds-plan 은 성공으로 표시되지만 건너뜀), OIDC sub 에 ref_protected 없음, worker 이미지 CI job 없음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/index.html",
                "cmslab-data-platform/10_플랫폼구현/infra/README.md",
                "docs/work-log/2026-10-15_erp-ingestion-execution/result.md",
                "docs/work-log/2026-10-15_erp-ingestion-execution/evidence.json"
              ],
              "next": "dev AWS 적용 후 스케줄 발화→큐→노드→S3→RDS 실증",
              "checks": [
                {
                  "id": "read-runtime-account",
                  "title": "AWS 계정·리전·상태 백엔드 확정",
                  "status": "blocked",
                  "detail": "실제 적용 대상과 Terraform 상태 저장소 준비가 필요하다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/infra/README.md"
                  ],
                  "next": "적용 계정·상태 백엔드·암호화 설정",
                  "criterion": "검증된 AWS 계정과 서울 리전에 실행 환경이 존재한다.",
                  "stage": "deployment"
                },
                {
                  "id": "read-runtime-network",
                  "title": "고정 IP·화이트리스트·최소 네트워크",
                  "status": "blocked",
                  "detail": "ERP·API·포털 접속을 위한 실제 허용목록 검증이 없다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "탄력 IP 허용 후 원천별 TCP·TLS·응용 접속 검증",
                  "criterion": "실행 노드에서 필요 원천만 접속되고 인바운드는 차단된다.",
                  "stage": "access"
                },
                {
                  "id": "read-runtime-scheduler",
                  "title": "EventBridge 실제 발화·시간대",
                  "status": "blocked",
                  "detail": "구조 테스트는 있지만 실제 Scheduler의 서울 시간대 표현식·발화를 검증하지 못했다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/core/README.md"
                  ],
                  "next": "dev Scheduler에서 일정 생성·발화·비활성 검증",
                  "criterion": "시드 일정이 Asia/Seoul 기준 허용 오차 안에 큐 메시지를 발행한다.",
                  "stage": "deployment"
                },
                {
                  "id": "read-runtime-queue",
                  "title": "FIFO·DLQ·중복제거 실증",
                  "status": "blocked",
                  "detail": "moto 테스트가 현실 SQS 5분 중복 제거와 가시성 상한을 완전히 모사하지 못한다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/core/README.md"
                  ],
                  "next": "실제 SQS에서 순서·중복·재배달·DLQ 검증",
                  "criterion": "동일 계약·주기 메시지가 순차 처리되고 상한 초과는 DLQ로 이동한다.",
                  "stage": "deployment"
                },
                {
                  "id": "read-runtime-lake-db",
                  "title": "S3 raw·RDS ctl/stg 실제 연결",
                  "status": "blocked",
                  "detail": "운영 자원이 없어 실제 저장 경로를 검증하지 못했다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/infra/README.md"
                  ],
                  "next": "실제 원천 표본 1건으로 S3·RDS 동시 대조",
                  "criterion": "성공 Read의 raw·manifest·ingest_batch·load_run·stg 기록이 모두 존재한다.",
                  "stage": "deployment"
                },
                {
                  "id": "read-runtime-observe",
                  "title": "실패·신선도·미도착·DLQ 관측",
                  "status": "blocked",
                  "detail": "경보 자원은 정의됐지만 운영 지표·수신 실증이 없다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/infra/README.md"
                  ],
                  "next": "dev 경보 강제 발화·해제·수신 검증",
                  "criterion": "Read 누락·지연·실패가 정해진 시간 안에 운영 경보로 드러난다.",
                  "stage": "proof"
                }
              ],
              "previous_status": "blocked",
              "updated": "2026-10-15"
            },
            {
              "id": "read-installed-client",
              "title": "L8 설치형·computer-use 발견 PoC·반복 자동화 폴백",
              "status": "blocked",
              "detail": "computer-use는 Windows VM 발견용이고 반복 실행은 pywinauto·Power Automate Desktop 후보다. 설치형 경로를 채택한 원천에만 보안 모듈, XPLATFORM UIA, 승인된 HTTP 캡처 3개 게이트가 필수다. API·EDI·파일 경로로 확정한 원천에는 L8 통과를 요구하지 않는다.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
              ],
              "next": "Windows VM에서 3개 게이트 PoC 후 결과에 따라 API·파일·EDI·사무실 러너 폴백 확정",
              "checks": [
                {
                  "id": "read-l8-condition",
                  "title": "L8 적용 조건 확정",
                  "status": "done",
                  "detail": "L8 3개 PoC는 설치형 경로를 선택한 원천에만 필수다. API·EDI·파일 경로는 해당 전송수단의 실제 Read 증거로 완료한다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천별 채택 경로와 폴백 조건 승인",
                  "criterion": "설치형 채택 원천만 L8 3개 PoC를 필수로 가지며 다른 전송수단을 채택한 원천에 L8 성공을 요구하지 않는다.",
                  "stage": "scope"
                },
                {
                  "id": "read-l8-vm",
                  "title": "Windows VM·자동 로그온·세션 유지",
                  "status": "blocked",
                  "detail": "설치형 경로 선택 시 실제 클라이언트와 보안 모듈을 실행할 VM이 필요하다. 다른 전송수단 선택 시 경로 근거로 N/A를 기록한다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md"
                  ],
                  "next": "설치형이면 VM·라이선스·네트워크·세션 유지 준비, 아니면 채택 전송수단 근거로 N/A 기록",
                  "criterion": "설치형이면 RDP 종료 후에도 세션이 유지되며, 다른 전송수단이면 승인된 경로 근거와 N/A 판정이 있다.",
                  "stage": "access"
                },
                {
                  "id": "read-l8-security",
                  "title": "게이트 1: VM 보안 모듈 동작",
                  "status": "blocked",
                  "detail": "설치형 경로 선택 시 키보드·보안 모듈이 VM·자동화 입력을 허용하는지 검증한다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md"
                  ],
                  "next": "설치형이면 로그인·메뉴·다운로드 실행, 아니면 경로 근거로 N/A 기록",
                  "criterion": "설치형이면 우회 없이 보안 모듈이 작동하고, 다른 전송수단이면 승인된 경로 근거와 N/A 판정이 있다.",
                  "stage": "live_read"
                },
                {
                  "id": "read-l8-uia",
                  "title": "게이트 2: XPLATFORM 컨트롤 UIA 노출",
                  "status": "blocked",
                  "detail": "설치형 경로 선택 시 테이블·필터·다운로드 컨트롤이 UIA에 노출되는지 검증한다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md"
                  ],
                  "next": "설치형이면 accessibility tree·컨트롤 ID 측정, 아니면 경로 근거로 N/A 기록",
                  "criterion": "설치형이면 필터·검색·전체 이동·다운로드를 안정적 UIA 식별자로 수행하고, 아니면 승인된 경로 근거와 N/A 판정이 있다.",
                  "stage": "live_read"
                },
                {
                  "id": "read-l8-http",
                  "title": "게이트 3: 승인된 HTTP 트랜잭션 캡처",
                  "status": "blocked",
                  "detail": "설치형 경로 선택 시 약관·보안 허용 범위 안에서 클라이언트 통신을 측정할 수 있는지 검증한다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md"
                  ],
                  "next": "설치형이면 약관·보안 승인 후 요청·응답 범위 측정, 아니면 경로 근거로 N/A 기록",
                  "criterion": "설치형이면 인증·비밀 노출 없이 승인된 범위의 트랜잭션을 검증하고, 아니면 승인된 경로 근거와 N/A 판정이 있다.",
                  "stage": "proof"
                },
                {
                  "id": "read-l8-repeat",
                  "title": "computer-use 발견 후 결정적 반복 실행",
                  "status": "blocked",
                  "detail": "설치형 경로에서 computer-use 자체를 정규 운영 러너로 보지 않는다. 다른 전송수단은 해당 수집기의 반복 Read로 검증한다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md"
                  ],
                  "next": "설치형이면 PoC 후 pywinauto·PAD 복구 절차 작성, 아니면 채택 수집기 2회 반복 증거 연결",
                  "criterion": "설치형은 결정적 도구 2회 실행으로 범위·합계·복구를 입증하고, 다른 전송수단은 해당 수집기의 2회 수령증으로 L8 N/A를 입증한다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "read-l8-fallback",
                  "title": "PoC 실패 폴백: API·파일·EDI·사무실 러너",
                  "status": "pending",
                  "detail": "실패 시 원천별 대체 경로의 실제 제공 가능성은 미확정이다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "제공사 API·EDI·파일 협상과 폴백 우선순위 승인",
                  "criterion": "L8 불가능이면 우회 없이 승인된 대체 Read 경로로 전환한다.",
                  "stage": "recovery"
                },
                {
                  "id": "read-l8-guard",
                  "title": "캡차·보안모듈·약관 우회 금지",
                  "status": "done",
                  "detail": "비정상 우회를 실행 조건으로 사용하지 않는다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md"
                  ],
                  "next": "포털별 약관·봇 계정·OTP 조건 확정",
                  "criterion": "Read 자동화가 캡차·보안 모듈·접근 제어를 우회하지 않는다.",
                  "stage": "control"
                }
              ]
            }
          ]
        },
        {
          "id": "read-spec",
          "title": "⑥ 테이블·컬럼 명세 — 스키마·품질 수용 기준",
          "items": [
            {
              "id": "read-schema-contract",
              "title": "원천 스키마 → 수집 계약 → stg 열 매핑",
              "status": "partial",
              "detail": "79개 테이블과 6차 DDL은 있지만 검증 결과·README는 1013개, DB 명세·뷰어 데이터는 1014개 컬럼으로 서로 다르다. 이 1개 불일치와 실제 원천 전수의 헤더·형·값 범위 매핑을 해소해야 한다.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/02_DB스키마·테이블·컬럼명세.md",
                "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/03_schema_postgresql.sql"
              ],
              "next": "실제 메타데이터·헤더 측정 후 열 매핑·형·nullable·자연키 확정",
              "checks": [
                {
                  "id": "read-schema-ddl",
                  "title": "DDL·문서·뷰어 결정론·수치 일치",
                  "status": "partial",
                  "detail": "생성 전후 SHA-256 일치와 PG16 회귀는 기록됐지만 컬럼 수가 검증 결과·README 1013개, DB 명세·뷰어 1014개로 다르다.",
                  "evidence": [
                    "docs/work-log/2026-09-27_platform-phase2-continuation/result.md",
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/02_DB스키마·테이블·컬럼명세.md"
                  ],
                  "next": "동일 생성 입력으로 DDL·명세·뷰어·검증 결과를 재생성하고 테이블·컬럼 인벤토리를 전수 비교",
                  "criterion": "DDL, 컬럼 명세, 뷰어 데이터, 검증 결과의 테이블·컬럼 수와 구조 해시가 재생성 후 모두 일치한다.",
                  "stage": "spec"
                },
                {
                  "id": "read-schema-source",
                  "title": "실제 원천 헤더·형 메타데이터",
                  "status": "partial",
                  "detail": "Sheets 구조 탐색과 ERP 일부 SELECT 실측은 있지만 전수가 아니다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/erp/README.md"
                  ],
                  "next": "원천 전수의 실제 메타데이터 수령증 저장",
                  "criterion": "각 원천의 최신 객체·헤더·형·nullable 목록이 있다.",
                  "stage": "live_read"
                },
                {
                  "id": "read-schema-map",
                  "title": "원천 필드 → stg 필드 전수 매핑",
                  "status": "partial",
                  "detail": "커넥터별 파서는 있지만 미식별 6개와 실제 헤더 변형을 포함한 전수 매핑은 없다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md"
                  ],
                  "next": "필드별 원천·변환·대상·제외 표 확정",
                  "criterion": "모든 원천 필드가 stg 필드, extra, 의도적 제외 중 하나로 분류된다.",
                  "stage": "spec"
                },
                {
                  "id": "read-schema-type",
                  "title": "형·시간대·통화·코드 변환 정의",
                  "status": "partial",
                  "detail": "표준 스키마는 있지만 실제 예외값 범위 검증이 필요하다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/02_DB스키마·테이블·컬럼명세.md"
                  ],
                  "next": "실제 min/max·예외값·시간대 표본 검증",
                  "criterion": "값 손실 없이 표준 형으로 변환되며 변환 실패는 분리 계수된다.",
                  "stage": "quality"
                },
                {
                  "id": "read-schema-version",
                  "title": "파서·규칙·스키마 버전 추적",
                  "status": "done",
                  "detail": "버전과 이력 연결 구조가 구현됐다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/core/README.md"
                  ],
                  "next": "운영 manifest·DB 버전 일치 검증",
                  "criterion": "각 회차에 적용된 파서·품질·사본 규칙 버전을 재현할 수 있다.",
                  "stage": "proof"
                },
                {
                  "id": "read-schema-unknown",
                  "title": "미식별·미매핑 필드 0 건",
                  "status": "pending",
                  "detail": "실제 필드 전수를 대조하지 않아 완료로 볼 수 없다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/02_DB스키마·테이블·컬럼명세.md"
                  ],
                  "next": "원천 필드·stg 필드 양방향 차집합 검사",
                  "criterion": "승인되지 않은 미식별·미매핑 필드가 0건이다.",
                  "stage": "completeness"
                }
              ]
            },
            {
              "id": "read-quality-acceptance",
              "title": "Read 품질 수용 기준·예외·검수",
              "status": "partial",
              "detail": "헤더 드리프트, 기간 불일치, 행 수, 통제 합계, quality_issue 구조가 있다. 원천별 실제 허용치와 오너 승인은 남았다.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/01_시스템아키텍처.md",
                "cmslab-data-platform/10_플랫폼구현/worker/core/README.md"
              ],
              "next": "원천 오너가 행 수·누락·합계·신선도 허용치를 승인",
              "checks": [
                {
                  "id": "read-quality-rules",
                  "title": "원천별 필수 품질 규칙 존재",
                  "status": "partial",
                  "detail": "공통 규칙은 있지만 전 원천의 실제 통제치가 확정되지 않았다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/core/README.md"
                  ],
                  "next": "원천별 필수·경고·차단 규칙 표 승인",
                  "criterion": "모든 원천에 최소 완전성·신선도·중복 규칙이 있다.",
                  "stage": "quality"
                },
                {
                  "id": "read-quality-threshold",
                  "title": "허용치·비교 기준 오너 승인",
                  "status": "pending",
                  "detail": "첫 배치, 이전 기간, 원천 통제 합계 중 비교 기준을 확정해야 한다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/01_시스템아키텍처.md"
                  ],
                  "next": "원천 오너 승인 및 버전 기록",
                  "criterion": "품질 허용치와 비교 기준이 원천 오너에 의해 승인된다.",
                  "stage": "quality"
                },
                {
                  "id": "read-quality-block",
                  "title": "block 예외 있으면 Read 완료 금지",
                  "status": "done",
                  "detail": "미해결 block 예외을 가진 배치는 validated 전이를 통과하지 못한다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/01_시스템아키텍처.md"
                  ],
                  "next": "실제 block 표본의 거부 검증",
                  "criterion": "미해결 block 예외이 1건이라도 있으면 Read 완료로 집계되지 않는다.",
                  "stage": "control"
                },
                {
                  "id": "read-quality-evidence",
                  "title": "규칙별 실행값·기준값·판정 저장",
                  "status": "pending",
                  "detail": "실제 운영 품질 판정 수령증이 필요하다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/02_DB스키마·테이블·컬럼명세.md"
                  ],
                  "next": "실행별 품질 판정 JSON·DB 뷰 보존",
                  "criterion": "각 규칙의 실행값, 기준값, 결과, 버전을 재현할 수 있다.",
                  "stage": "proof"
                },
                {
                  "id": "read-quality-owner",
                  "title": "예외 해소·수용 오너 기록",
                  "status": "pending",
                  "detail": "실제 원천 오너의 수용·거부 증거가 없다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/01_시스템아키텍처.md"
                  ],
                  "next": "예외별 해소자·시각·사유·근거 필수화",
                  "criterion": "모든 품질 예외에 오너와 해소·수용 근거가 있다.",
                  "stage": "proof"
                },
                {
                  "id": "read-quality-no-publish",
                  "title": "Read 수용과 마트 발행 승인 분리",
                  "status": "done",
                  "detail": "품질과 stg 완전성 통과는 Read 완료 근거지 마트 공개 의무가 아니다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/01_시스템아키텍처.md"
                  ],
                  "next": "Read 지표에 publish 상태 제외 유지",
                  "criterion": "Read 완료는 published 여부와 독립적으로 판정된다.",
                  "stage": "scope"
                }
              ]
            }
          ]
        },
        {
          "id": "read-evidence",
          "title": "⑦ 실측 근거·미결 — 실제 Read 수령증·종료 판정",
          "items": [
            {
              "id": "read-historical-evidence",
              "title": "기존 실측을 전면 미실행으로 잘못 분류하지 않기",
              "status": "partial",
              "detail": "개발 계정 Google Sheets 구조 탐색과 ERP 일부 SELECT 성공 기록은 실측으로 유지한다. 다만 이 근거만으로 전체 원천 Read 완료로 확장하지 않는다.",
              "evidence": [
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/01_시스템아키텍처.md"
              ],
              "next": "기존 탐색의 범위·시각·계정·한계를 수령증으로 정규화",
              "checks": [
                {
                  "id": "read-history-sheets",
                  "title": "Sheets 개발 계정 구조 탐색 보존",
                  "status": "partial",
                  "detail": "읽기 전용 개발 계정의 구조 탐색 기록은 있다. 37개 Sheets 행·1개 Drive 폴더 전체 운영 Read는 아니다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md"
                  ],
                  "next": "객체별 탐색 성공·차단 범위 표로 정리",
                  "criterion": "실측한 시트·탭·헤더와 미실측 범위가 명확히 분리된다.",
                  "stage": "proof"
                },
                {
                  "id": "read-history-erp",
                  "title": "ERP 일부 SELECT 성공 보존",
                  "status": "partial",
                  "detail": "사내망 현장 PC에서 일부 조회 성공 실측이 있다. 새 수집기·4개 뷰·11개 대상·반복 Read 완료 근거는 아니다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/01_시스템아키텍처.md",
                    "cmslab-data-platform/10_플랫폼구현/erp/README.md"
                  ],
                  "next": "실측 SELECT 범위와 신규 수집기 범위를 분리 기록",
                  "criterion": "기존 성공 근거와 아직 남은 뷰·열·기간·반복 검증을 구분한다.",
                  "stage": "proof"
                },
                {
                  "id": "read-history-portal",
                  "title": "포털 합성·가짜 테스트와 실제 로그인 분리",
                  "status": "done",
                  "detail": "14개 사이트 공통 러너와 가짜 포털 테스트를 실제 포털 Read 성공으로 세지 않는다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "실제 봇 계정·OTP·약관 확정 후 사이트별 실행",
                  "criterion": "실제 포털 접속·전체 범위 다운로드 수령증만 live Read로 계산된다.",
                  "stage": "scope"
                },
                {
                  "id": "read-history-tests",
                  "title": "코드·합성·로컬 DB 검증 별도 표시",
                  "status": "done",
                  "detail": "통합 테스트와 PG16 결과는 준비도 근거이며 live Read 수령증이 아니다.",
                  "evidence": [
                    "docs/work-log/2026-09-27_platform-phase2-continuation/result.md"
                  ],
                  "next": "화면에 구현·실측 상태 분리 유지",
                  "criterion": "합성 통과가 실제 Read 완료 수치를 올리지 않는다.",
                  "stage": "scope"
                },
                {
                  "id": "read-history-time",
                  "title": "실측 시각·환경·범위·한계 표준화",
                  "status": "pending",
                  "detail": "기존 실측을 동일 형식의 수령증으로 정규화해야 한다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/01_시스템아키텍처.md"
                  ],
                  "next": "기존 실측별 범위·환경·한계 메타데이터 추가",
                  "criterion": "모든 기존 실측 근거에 날짜, 계정 종류, 실행 환경, 읽은 범위, 미확인 범위가 있다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "read-closure-pack",
              "title": "전체 원천 실제 Read 완료 수령증·독립 검수",
              "status": "pending",
              "detail": "전체 완료는 원천별 scope·access·connector·live_read·completeness·recovery·repeat_read·proof가 모두 통과해야 한다. 현재 그 조건을 만족한 원천은 입증되지 않았다.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/01_시스템아키텍처.md",
                "docs/work-log/2026-09-27_platform-phase2-continuation/result.md"
              ],
              "next": "원천별 실행 수령증 자동 생성, 표본 독립 재실행, 전수 종료 판정",
              "checks": [
                {
                  "id": "read-closure-receipt",
                  "title": "원천별 실행 수령증",
                  "status": "pending",
                  "detail": "접속부터 stg 대조까지 한 번에 볼 수 있는 수령증이 필요하다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/01_시스템아키텍처.md"
                  ],
                  "next": "표준 수령증 JSON·HTML·DB 뷰 생성",
                  "criterion": "원천마다 범위, 시각, 방법, 해시, 행 수, 품질, 재실행 근거가 있다.",
                  "stage": "proof"
                },
                {
                  "id": "read-closure-secrets",
                  "title": "수령증 비밀·PII·권한 링크 제거",
                  "status": "partial",
                  "detail": "비밀 검사 코드는 있지만 실제 수령증 결과물 전수는 아직 없다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/core/README.md"
                  ],
                  "next": "수령증 생성 시 비밀·PII 검사를 필수 게이트로 실행",
                  "criterion": "공유 수령증에 토큰, 비밀번호, 계정 ID, 사설 URL, PII 값이 없다.",
                  "stage": "control"
                },
                {
                  "id": "read-closure-independent",
                  "title": "독립 표본 재실행",
                  "status": "pending",
                  "detail": "작성자와 다른 검수자가 표본 원천을 재실행한 근거가 필요하다.",
                  "evidence": [
                    "docs/work-log/2026-09-27_platform-phase2-continuation/result.md"
                  ],
                  "next": "전송수단별 표본과 고위험 원천을 독립 재실행",
                  "criterion": "독립 검수자의 결과가 기존 수령증의 범위·해시·합계와 일치한다.",
                  "stage": "proof"
                },
                {
                  "id": "read-closure-all",
                  "title": "원천 전수 필수 체크 통과",
                  "status": "pending",
                  "detail": "현재 코드·설계 통과를 원천 Read 완료로 보지 않는다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 카드별 모든 필수 체크 통과 후만 완료 집계",
                  "criterion": "모든 원천이 필수 세부 체크를 하나도 빠짐없이 통과한다.",
                  "stage": "proof"
                },
                {
                  "id": "read-closure-no-false",
                  "title": "상위 상태 자동 올림 방지",
                  "status": "pending",
                  "detail": "일부 하위 체크 통과만으로 원천·그룹·전체를 완료로 표시하면 안 된다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/01_시스템아키텍처.md"
                  ],
                  "next": "완료 계산식을 필수 하위 체크 AND로 검증",
                  "criterion": "원천·그룹·전체 done은 필수 하위 체크가 모두 done일 때만 표시된다.",
                  "stage": "control"
                },
                {
                  "id": "read-closure-freeze",
                  "title": "완료 증거 해시·버전 고정",
                  "status": "pending",
                  "detail": "실제 수령증 묶음이 생성되지 않아 해시 고정을 할 수 없다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/50_플랫폼아키텍처/04_검증_결과_2026-09-27.txt"
                  ],
                  "next": "수령증·대조표·로그·검수 결과의 SHA-256 매니페스트 생성",
                  "criterion": "완료 판정에 사용한 모든 증거의 경로, 바이트 수, SHA-256, 생성 시각을 고정한다.",
                  "stage": "proof"
                },
                {
                  "id": "read-closure-signoff",
                  "title": "기술·데이터·업무 오너 종료 서명",
                  "status": "pending",
                  "detail": "Read 수령증과 완전성 결과를 승인한 사람과 범위가 없다.",
                  "evidence": [
                    "cmslab-data-platform/02_프로젝트정본/프로젝트전체그림_CURRENT.md"
                  ],
                  "next": "원천 오너·데이터 책임자·플랫폼 운영자 승인 기록",
                  "criterion": "완료 범위·예외·남은 제약을 명시한 종료 승인이 있다.",
                  "stage": "proof"
                }
              ]
            }
          ]
        }
      ]
    },
    {
      "id": "source-readiness",
      "title": "120개 원천 실제 Read",
      "description": "32_ 120행 번호를 보존하고(2026-10-11 #103~#113 범위 편입) 36_ 미분류 6채널은 모두 닫았다(10/11 U4 글로벌 B2B → #108 식별 · U6 일본 자사몰 범위 제외, 10/16 U1 화해 · U3 계열사 → #2 ERP · U2 제휴몰 → #2 + #98 식별 · U5 중국법인 범위 제외). 36_ 최신 결정 우선. 과거 구조 프로빙·ERP SELECT는 부분 증거이며 전체 Read 완료로 세지 않는다.",
      "links": [
        {
          "label": "데이터 요청 시트 · 행별 체크",
          "href": "data-request/index.html",
          "note": "고객 시트 원본 모양 + 요청 행별 상태(읽기 전용). ID·PW 비공개."
        }
      ],
      "evidence": [
        "cmslab-data-platform/00_프로젝트작업실/51_프로젝트체크리스트/data-request/index.html",
        "cmslab-data-platform/00_프로젝트작업실/51_프로젝트체크리스트/data-request/data-request-status.json",
        "cmslab-data-platform/00_프로젝트작업실/51_프로젝트체크리스트/data-request/sheet-snapshot.json"
      ],
      "groups": [
        {
          "id": "read-db",
          "title": "DB Read",
          "items": [
            {
              "id": "source-2",
              "title": "#2 더존 ERP-U (DB)",
              "status": "done",
              "detail": "ERP 전 영역 · 원천. 목표=api_interface: MSSQL 읽기 전용 SELECT. 핵심 테이블 일일 스냅샷 + 스냅샷 diff(취소·삭제 검출), 핵심 테이블 1시간 증분; E1–E9 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 609ed54ca230. Read 범위 = 회사 7000 · ERP 준비 계약 7객체 부분집합(MM_QTIO · MM_QTIOH · MA_PITEM · MA_SALEGRP · FI_DOCU · FI_BAND · MA_PARTNER), 2026-09 하루 30창 + 마스터 snapshot. 「ERP 전 영역」 전체가 아니다 — 재고 기초 · 일별 재고 · 구매 · 외주 · 코드 마스터 표는 계약이 없어 범위 밖(10/14 전체 1회 수집본 보존). r2(10/16 독립 리뷰 반영). READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-2.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "2",
                "name": "더존 ERP-U (DB)",
                "kind": "원천",
                "transport": "db",
                "cadence": "일 1회(야간) + 핵심 테이블 1시간",
                "target_method": "api_interface: MSSQL 읽기 전용 SELECT. 핵심 테이블 일일 스냅샷 + 스냅샷 diff(취소·삭제 검출), 핵심 테이블 1시간 증분",
                "current_state": "E1–E9 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 609ed54ca230. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "원점 IP 허용 또는 고객사 러너 · 필요한 테이블 뷰로 계정 축소 · 보안서약서",
                "fallback": "AWS 고정 IP → site-to-site VPN → 완화책 갖춘 ERP 전용 사무실 러너 → 화면 파일 반출",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-2-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 609ed54ca230.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-2.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-2-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 609ed54ca230.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-2.json",
                    "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-2-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 609ed54ca230.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-2.json",
                    "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-2-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 609ed54ca230.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-2.json",
                    "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-15_erp-export-pages/evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-2-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 609ed54ca230.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-2.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-2-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 ROOT_APPROVABLE · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 609ed54ca230.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-2.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-2-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 609ed54ca230.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-2.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-2-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 609ed54ca230.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-2.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-2-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 609ed54ca230. Read 범위 = 회사 7000 · ERP 준비 계약 7객체 부분집합(MM_QTIO · MM_QTIOH · MA_PITEM · MA_SALEGRP · FI_DOCU · FI_BAND · MA_PARTNER), 2026-09 하루 30창 + 마스터 snapshot. 「ERP 전 영역」 전체가 아니다 — 재고 기초 · 일별 재고 · 구매 · 외주 · 코드 마스터 표는 계약이 없어 범위 밖(10/14 전체 1회 수집본 보존). r2(10/16 독립 리뷰 반영). READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-2.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-44",
              "title": "#44 거래처별 매출채권·만기",
              "status": "done",
              "detail": "채권 · 원천. 목표=api_interface: ERP DB 채권·만기 테이블 조회(FI_DOCU 후보, 대조 전); E1–E9 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 4eb315871c00. Read 범위 = FI_DOCU 전 계정 · FI_BAND 반제 · MA_PARTNER 수금조건 8열(2026-09). 만기는 범위 밖(ERP 열 없음 → 회전일 규칙, 고객확인 묶음). 채권 계정 범위 · 외화 원액 47행은 매퍼 · 업무 단계. r2. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-44.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "44",
                "name": "거래처별 매출채권·만기",
                "kind": "원천",
                "transport": "db",
                "cadence": "일 1회",
                "target_method": "api_interface: ERP DB 채권·만기 테이블 조회(FI_DOCU 후보, 대조 전)",
                "current_state": "E1–E9 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 4eb315871c00. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "#2 와 동일",
                "fallback": "ERP 화면 조회(④)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-44-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 4eb315871c00.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-44.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-44-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 4eb315871c00.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-44.json",
                    "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-44-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 4eb315871c00.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-44.json",
                    "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-44-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 4eb315871c00.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-44.json",
                    "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-15_erp-export-pages/evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-44-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 4eb315871c00.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-44.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-44-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 ROOT_APPROVABLE · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 4eb315871c00.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-44.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-44-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 4eb315871c00.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-44.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-44-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 4eb315871c00.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-44.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-44-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 4eb315871c00. Read 범위 = FI_DOCU 전 계정 · FI_BAND 반제 · MA_PARTNER 수금조건 8열(2026-09). 만기는 범위 밖(ERP 열 없음 → 회전일 규칙, 고객확인 묶음). 채권 계정 범위 · 외화 원액 47행은 매퍼 · 업무 단계. r2. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-44.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-58",
              "title": "#58 메디컬팀 매출현황",
              "status": "done",
              "detail": "매출취합 · 원천. 목표=api_interface: ERP DB 에서 메디컬 매출 직접 산출. 기존 시트는 대사용; E1–E9 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 5f52d6238bc9. Read 범위 = MM_QTIO + 메디컬 영업그룹 6코드 기술 모집단(2026-09). 월 확정 매출은 #103, 계획 · 목표 열은 시트. 가격 산식은 업무 단계. r2. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-58.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "58",
                "name": "메디컬팀 매출현황",
                "kind": "원천",
                "transport": "db",
                "cadence": "일 1회",
                "target_method": "api_interface: ERP DB 에서 메디컬 매출 직접 산출. 기존 시트는 대사용",
                "current_state": "E1–E9 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 5f52d6238bc9. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "#2 와 동일",
                "fallback": "기존 시트 Sheets API(① 파생)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-58-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 5f52d6238bc9.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-58.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-58-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 5f52d6238bc9.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-58.json",
                    "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-58-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 5f52d6238bc9.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-58.json",
                    "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-58-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 5f52d6238bc9.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-58.json",
                    "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-29_source-read-t0t1t2-resume/read-evidence-sanitized.json",
                    "docs/work-log/2026-10-15_erp-export-pages/evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-58-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 5f52d6238bc9.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-58.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-58-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 ROOT_APPROVABLE · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 5f52d6238bc9.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-58.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-58-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 5f52d6238bc9.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-58.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-58-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 5f52d6238bc9.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-58.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-58-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 5f52d6238bc9. Read 범위 = MM_QTIO + 메디컬 영업그룹 6코드 기술 모집단(2026-09). 월 확정 매출은 #103, 계획 · 목표 열은 시트. 가격 산식은 업무 단계. r2. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-58.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-60",
              "title": "#60 역직구몰 매출",
              "status": "done",
              "detail": "채널 · 원천. 목표=api_interface: ERP DB 조회; E1–E9 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 b6f29404287c. Read 범위 = G613206 ∪ 매핑 시트 역직구몰 거래처 중 ERP 그룹이 다른 1곳의 전체 수불(2026-09, 사용자 10/16 「범위 넓혀 다시 읽기」). 판매 판정 · 효력일(2026-04-01)은 매퍼 — 결정 4 고객확인 묶음. 월 확정 매출은 #103. r2. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-60.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "60",
                "name": "역직구몰 매출",
                "kind": "원천",
                "transport": "db",
                "cadence": "일 1회",
                "target_method": "api_interface: ERP DB 조회",
                "current_state": "E1–E9 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 b6f29404287c. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "#2 와 동일 · 역직구몰 플랫폼 확인",
                "fallback": "몰 관리자 다운로드(④)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-60-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 b6f29404287c.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-60.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-60-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 b6f29404287c.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-60.json",
                    "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-60-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 b6f29404287c.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-60.json",
                    "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-60-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 b6f29404287c.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-60.json",
                    "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-15_erp-export-pages/evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-60-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 b6f29404287c.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-60.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-60-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 ROOT_APPROVABLE · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 b6f29404287c.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-60.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-60-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 b6f29404287c.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-60.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-60-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 b6f29404287c.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-60.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-60-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 b6f29404287c. Read 범위 = G613206 ∪ 매핑 시트 역직구몰 거래처 중 ERP 그룹이 다른 1곳의 전체 수불(2026-09, 사용자 10/16 「범위 넓혀 다시 읽기」). 판매 판정 · 효력일(2026-04-01)은 매퍼 — 결정 4 고객확인 묶음. 월 확정 매출은 #103. r2. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-60.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-73",
              "title": "#73 올리브영 셀인",
              "status": "done",
              "detail": "채널 · 원천. 목표=api_interface: CMSLAB 출고·매출 전표 = 셀인. ERP DB 조회; E1–E9 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 01f853bd217d. Read 범위 = 영업그룹 G612101 총출고 셀인(2026-09, 사용자 10/16 「총출고 셀인으로 수용」). 9/30 조건(거래처 코드 모집단 · 포털 매입/반품 대사)은 업무 단계. 월 확정 매출은 #103. r2. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-73.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "73",
                "name": "올리브영 셀인",
                "kind": "원천",
                "transport": "db",
                "cadence": "일 1회",
                "target_method": "api_interface: CMSLAB 출고·매출 전표 = 셀인. ERP DB 조회",
                "current_state": "E1–E9 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 01f853bd217d. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "#2 와 동일",
                "fallback": "올리브영 셀인 파일(④)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-73-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 01f853bd217d.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-73.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-73-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 01f853bd217d.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-73.json",
                    "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-73-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 01f853bd217d.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-73.json",
                    "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-73-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 01f853bd217d.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-73.json",
                    "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-29_source-read-t0t1t2-resume/read-evidence-sanitized.json",
                    "docs/work-log/2026-10-15_erp-export-pages/evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-73-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 01f853bd217d.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-73.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-73-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 ROOT_APPROVABLE · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 01f853bd217d.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-73.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-73-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 01f853bd217d.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-73.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/erp/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-73-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 01f853bd217d.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-73.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-73-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-10-15T17:52:07.527003Z READ_COMPLETE, manifest SHA-256 01f853bd217d. Read 범위 = 영업그룹 G612101 총출고 셀인(2026-09, 사용자 10/16 「총출고 셀인으로 수용」). 9/30 조건(거래처 코드 모집단 · 포털 매입/반품 대사)은 업무 단계. 월 확정 매출은 #103. r2. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-10-15_db-read-occurrence/approvals/root-db-read-occurrence-1015-r2-signature.json",
                    "docs/work-log/2026-10-15_db-read-occurrence/manifests-r2/source-73.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            }
          ]
        },
        {
          "id": "read-api",
          "title": "API·인터페이스 Read",
          "items": [
            {
              "id": "source-13",
              "title": "#13 GEC BigQuery",
              "status": "partial",
              "detail": "TikTok 등 · 원천. 목표=GEC BigQuery authorized view를 읽기 전용 IAM으로 조회; 실행 프로젝트와 VIEW 스키마를 설정에 고정; 현재 접근은 원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→#34 TikTok Shop 계약의 원천별 확인 주기를 공유; 가장 느린 확인도 일 1회 2회→증거 동결.",
              "source": {
                "row_id": "13",
                "name": "GEC BigQuery",
                "kind": "원천",
                "transport": "api",
                "cadence": "#34 TikTok Shop 계약의 원천별 확인 주기를 공유; 가장 느린 확인도 일 1회",
                "target_method": "GEC BigQuery authorized view를 읽기 전용 IAM으로 조회; 실행 프로젝트와 VIEW 스키마를 설정에 고정",
                "current_state": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                "conditions": "#34 TikTok Shop 앱·샵별 읽기 승인과 GEC 인계 범위 매핑; BigQuery 프로젝트 이전을 필수로 요구하지 않음",
                "fallback": "API 직결 범위가 검증될 때까지 승인된 인계 추출 파일로 비교; BigQuery 이전은 필수 운영 경로가 아님",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-13-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #13 분류 기준은 있음: 업무=TikTok 등, 유형=원천. 36_ 우선 결정은 GEC BigQuery authorized view를 읽기 전용 IAM으로 조회; 실행 프로젝트와 VIEW 스키마를 설정에 고정. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#13 업무 범위 → #34 TikTok Shop Partner API의 모든 대응 계약 목록과 포함/제외 기간·필드를 승인하고 누락된 업무 범위를 별도로 기록한다.",
                  "stage": "scope"
                },
                {
                  "id": "source-13-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "#34 원천의 읽기 전용 승인과 샵/몰별 권한을 확인한다.",
                  "criterion": "#34 TikTok Shop Partner API의 승인된 읽기 신원으로 #13 업무 범위에 필요한 객체를 조회하고 쓰기 권한·동작이 배제됨을 기록한다.",
                  "stage": "access"
                },
                {
                  "id": "source-13-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지. 이전 실측·합성 근거(L5)는 evidence로 보존.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/sources/gec_bigquery.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/tests/test_gec_bigquery.py",
                    "docs/work-log/2026-09-30_todo-l5-ads-global/synthetic-test-results.json",
                    "docs/work-log/2026-09-30_todo-l5-ads-global/registry-additions.json"
                  ],
                  "next": "#13 업무 범위 → #34 TikTok Shop Partner API의 모든 대응 계약를 공유 수집기·파서·스케줄에 연결하고 별도 중복 수집을 만들지 않는다.",
                  "criterion": "#13 업무 범위 → #34 TikTok Shop Partner API의 모든 대응 계약의 명시적 매핑과 합성 계약 시험이 있고 동일 데이터 이중 적재가 없다.",
                  "stage": "connector"
                },
                {
                  "id": "source-13-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "#34 TikTok Shop Partner API로 #13 업무 범위를 실제 읽은 완료 증거는 아직 없음. 대체 원천의 실행 증거를 공유한다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "#34 실제 API에서 #13 대응 범위의 완결 창을 읽어 raw와 manifest를 남긴다.",
                  "criterion": "#34 TikTok Shop Partner API의 실제 완결 창에 #13 업무 객체·기간이 모두 포함되고 실행 시각·행 수·raw URI·SHA-256이 남는다. 기존 화면/BigQuery의 별도 운영 수집은 요구하지 않는다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-13-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "#13 업무 범위 → #34 TikTok Shop Partner API의 모든 대응 계약의 전체 필드·기간·몰/샵 대응과 누락 검증이 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "#34 결과가 #13 업무 범위를 전부 커버하고 원천 화면 또는 승인된 인계 자료의 통제 합계와 일치한다. 누락·중복 0과 기존 경로 종료 조건을 기록한다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-13-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=하. 근거: 개인 소유·개발 중·적재 주체 불명. 담당자 퇴사·중단 시 끊김 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-13-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 실패 분기 필요. 승인된 폴백: VIEW 추출 파일(④)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-13-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "#34의 승인된 스케줄과 실행 증거를 공유하며 #13 범위의 반복 Read를 검증한다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "#34의 서로 다른 예정 실행 2회에서 #13 대응 범위의 완전성·행 수·URI·SHA-256이 확인된다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-13-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#13→#34 대체 매핑, 실제 Read 2회 증거, 통제 합계·완전성, 기존 경로 종료 승인을 함께 보관한다. 중복 원천 실행을 완료 조건으로 요구하지 않는다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-19",
              "title": "#19 카페24 자사몰 (API)",
              "status": "partial",
              "detail": "자사몰 · 원천. 목표=api_interface: 카페24 Admin API — 주문 웹훅(접수·입금·배송·취소·반품·교환·환불) + GET /orders 보정 폴링(문서에 \"일부 웹훅 누락 가능\" 명시). 일별·시간별 매출 통계 API 는 승인 필요 제한 API; 현재 접근은 원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→웹훅 즉시 + 1시간 보정 폴링 2회→증거 동결.",
              "source": {
                "row_id": "19",
                "name": "카페24 자사몰 (API)",
                "kind": "원천",
                "transport": "api",
                "cadence": "웹훅 즉시 + 1시간 보정 폴링",
                "target_method": "api_interface: 카페24 Admin API — 주문 웹훅(접수·입금·배송·취소·반품·교환·환불) + GET /orders 보정 폴링(문서에 \"일부 웹훅 누락 가능\" 명시). 일별·시간별 매출 통계 API 는 승인 필요 제한 API",
                "current_state": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                "conditions": "Pharos 카페24 앱(10/6 등록 · 10/12 심사 요청) + Pharos 서버 콜백 중계(등록된 redirect URI 그대로 · CMSLAB 서명 state → 토큰을 CMSLAB 공개키로 암호화해 전달 · 갱신도 중계, 2026-10-16 결정 20) · 대표 운영자 동의(몰별 앱 설치 · 웹훅) · 읽기 전용 scope(read/write 분리됨) · refresh token 2주 회전(Pharos 중계 — 놓치면 브라우저 재인가)",
                "fallback": "관리자 다운로드(④)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-19-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #19 분류 기준은 있음: 업무=자사몰, 유형=원천. 36_ 우선 결정은 api_interface: 카페24 Admin API — 주문 웹훅(접수·입금·배송·취소·반품·교환·환불) + GET /orders 보정 폴링(문서에 \"일부 웹훅 누락 가능\" 명시). 일별·시간별 매출 통계 API 는 승인 필요 제한 API. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#19의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-19-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "Pharos 카페24 앱(10/6 등록 · 10/12 심사 요청) + Pharos 서버 콜백 중계(등록된 redirect URI 그대로 · CMSLAB 서명 state → 토큰을 CMSLAB 공개키로 암호화해 전달 · 갱신도 중계, 2026-10-16 결정 20) · 대표 운영자 동의(몰별 앱 설치 · 웹훅) · 읽기 전용 scope(read/write 분리됨) · refresh token 2주 회전(Pharos 중계 — 놓치면 브라우저 재인가)",
                  "criterion": "카페24 자사몰 (API) 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-19-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "api_interface: 카페24 Admin API — 주문 웹훅(접수·입금·배송·취소·반품·교환·환불) + GET /orders 보정 폴링(문서에 \"일부 웹훅 누락 가능\" 명시). 일별·시간별 매출 통계 API 는 승인 필요 제한 API 경로의 account/object, parser, 개인정보 제거기, 웹훅 즉시 + 1시간 보정 폴링 schedule을 원천별로 고정한다.",
                  "criterion": "#19에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-19-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "카페24 자사몰 (API) 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "카페24 자사몰 (API)에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-19-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 카페24 주몰 주문·취소·반품·교환·환불 이벤트와 GET /orders 보정 창. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "카페24 주몰 주문·취소·반품·교환·환불 이벤트와 GET /orders 보정 창에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-19-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=상. 근거: 주문 원장 직접. 취소·환불 상태 변화를 받음 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-19-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 실패 분기 필요. 승인된 폴백: 관리자 다운로드(④)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-19-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=웹훅 즉시 + 1시간 보정 폴링. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "웹훅 즉시 + 1시간 보정 폴링 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-19-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#19 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-20",
              "title": "#20 카페24 자사몰 (관리자 화면)",
              "status": "partial",
              "detail": "자사몰 · 원천. 목표=api_interface: #19 API 로 대체(관리자 화면 복붙 폐지); 현재 접근은 원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→웹훅 즉시 + 1시간 보정 폴링 2회→증거 동결.",
              "source": {
                "row_id": "20",
                "name": "카페24 자사몰 (관리자 화면)",
                "kind": "원천",
                "transport": "api",
                "cadence": "웹훅 즉시 + 1시간 보정 폴링",
                "target_method": "api_interface: #19 API 로 대체(관리자 화면 복붙 폐지)",
                "current_state": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                "conditions": "Pharos 카페24 앱(10/6 등록 · 10/12 심사 요청) + Pharos 서버 콜백 중계(등록된 redirect URI 그대로 · CMSLAB 서명 state → 토큰을 CMSLAB 공개키로 암호화해 전달 · 갱신도 중계, 2026-10-16 결정 20) · 대표 운영자 동의(몰별 앱 설치 · 웹훅) · 읽기 전용 scope(read/write 분리됨) · refresh token 2주 회전(Pharos 중계 — 놓치면 브라우저 재인가)",
                "fallback": "공식 API·EDI 요청 → 허용된 파일 수신 또는 포털 → 잔여 수동 공개",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-20-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #20 분류 기준은 있음: 업무=자사몰, 유형=원천. 36_ 우선 결정은 api_interface: #19 API 로 대체(관리자 화면 복붙 폐지). 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#20 업무 범위 → #19 카페24 API의 모든 대응 계약 목록과 포함/제외 기간·필드를 승인하고 누락된 업무 범위를 별도로 기록한다.",
                  "stage": "scope"
                },
                {
                  "id": "source-20-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "#19 원천의 읽기 전용 승인과 샵/몰별 권한을 확인한다.",
                  "criterion": "#19 카페24 API의 승인된 읽기 신원으로 #20 업무 범위에 필요한 객체를 조회하고 쓰기 권한·동작이 배제됨을 기록한다.",
                  "stage": "access"
                },
                {
                  "id": "source-20-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "#20 업무 범위 → #19 카페24 API의 모든 대응 계약를 공유 수집기·파서·스케줄에 연결하고 별도 중복 수집을 만들지 않는다.",
                  "criterion": "#20 업무 범위 → #19 카페24 API의 모든 대응 계약의 명시적 매핑과 합성 계약 시험이 있고 동일 데이터 이중 적재가 없다.",
                  "stage": "connector"
                },
                {
                  "id": "source-20-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "#19 카페24 API로 #20 업무 범위를 실제 읽은 완료 증거는 아직 없음. 대체 원천의 실행 증거를 공유한다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "#19 실제 API에서 #20 대응 범위의 완결 창을 읽어 raw와 manifest를 남긴다.",
                  "criterion": "#19 카페24 API의 실제 완결 창에 #20 업무 객체·기간이 모두 포함되고 실행 시각·행 수·raw URI·SHA-256이 남는다. 기존 화면/BigQuery의 별도 운영 수집은 요구하지 않는다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-20-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "#20 업무 범위 → #19 카페24 API의 모든 대응 계약의 전체 필드·기간·몰/샵 대응과 누락 검증이 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "#19 결과가 #20 업무 범위를 전부 커버하고 원천 화면 또는 승인된 인계 자료의 통제 합계와 일치한다. 누락·중복 0과 기존 경로 종료 조건을 기록한다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-20-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=상. 근거: 화면 복붙(사람) → API 로 바뀌면 누락·오타 제거 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-20-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 실패 분기 필요. 승인된 폴백: 공식 API·EDI 요청 → 허용된 파일 수신 또는 포털 → 잔여 수동 공개",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-20-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "#19의 승인된 스케줄과 실행 증거를 공유하며 #20 범위의 반복 Read를 검증한다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "#19의 서로 다른 예정 실행 2회에서 #20 대응 범위의 완전성·행 수·URI·SHA-256이 확인된다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-20-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#20→#19 대체 매핑, 실제 Read 2회 증거, 통제 합계·완전성, 기존 경로 종료 승인을 함께 보관한다. 중복 원천 실행을 완료 조건으로 요구하지 않는다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-21",
              "title": "#21 메이크샵",
              "status": "partial",
              "detail": "자사몰 · 원천. 목표=api_interface: 과거분 1회 백필 — 메이크샵 Open API(30일 창·시간당 500회로 분할) 또는 라플라스 보유 과거 데이터 반출; 현재 접근은 원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→1회 2회→증거 동결.",
              "source": {
                "row_id": "21",
                "name": "메이크샵",
                "kind": "원천",
                "transport": "api",
                "cadence": "1회",
                "target_method": "api_interface: 과거분 1회 백필 — 메이크샵 Open API(30일 창·시간당 500회로 분할) 또는 라플라스 보유 과거 데이터 반출",
                "current_state": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                "conditions": "사용 여부 확인",
                "fallback": "라플라스 과거 데이터 반출(④)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-21-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #21 분류 기준은 있음: 업무=자사몰, 유형=원천. 36_ 우선 결정은 api_interface: 과거분 1회 백필 — 메이크샵 Open API(30일 창·시간당 500회로 분할) 또는 라플라스 보유 과거 데이터 반출. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#21의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-21-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "사용 여부 확인",
                  "criterion": "메이크샵 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-21-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "api_interface: 과거분 1회 백필 — 메이크샵 Open API(30일 창·시간당 500회로 분할) 또는 라플라스 보유 과거 데이터 반출 경로의 account/object, parser, 개인정보 제거기, 1회 schedule을 원천별로 고정한다.",
                  "criterion": "#21에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-21-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "메이크샵 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "메이크샵에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-21-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 메이크샵 자사몰 객체: 과거분 1회 백필 — 메이크샵 Open API(30일 창·시간당 500회로 분할) 또는 라플라스 보유 과거 데이터 반출. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "메이크샵 자사몰 객체: 과거분 1회 백필 — 메이크샵 Open API(30일 창·시간당 500회로 분할) 또는 라플라스 보유 과거 데이터 반출에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-21-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=상. 근거: 몰 원장 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-21-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 실패 분기 필요. 승인된 폴백: 라플라스 과거 데이터 반출(④)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-21-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=1회. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "1회 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-21-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#21 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-24",
              "title": "#24 채널톡",
              "status": "partial",
              "detail": "고객상담 · 원천. 목표=api_interface: 채널톡 Open API + 웹훅(새 메시지·새 상담·유저 변경). v5 주소는 2027-07-09 까지 신버전으로 이전; 현재 접근은 원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→웹훅 즉시 + 일 1회 대사 2회→증거 동결.",
              "source": {
                "row_id": "24",
                "name": "채널톡",
                "kind": "원천",
                "transport": "api",
                "cadence": "웹훅 즉시 + 일 1회 대사",
                "target_method": "api_interface: 채널톡 Open API + 웹훅(새 메시지·새 상담·유저 변경). v5 주소는 2027-07-09 까지 신버전으로 이전",
                "current_state": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                "conditions": "API 키",
                "fallback": "공식 API·EDI 요청 → 허용된 파일 수신 또는 포털 → 잔여 수동 공개",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-24-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #24 분류 기준은 있음: 업무=고객상담, 유형=원천. 36_ 우선 결정은 api_interface: 채널톡 Open API + 웹훅(새 메시지·새 상담·유저 변경). v5 주소는 2027-07-09 까지 신버전으로 이전. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#24의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-24-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "API 키",
                  "criterion": "채널톡 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-24-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "api_interface: 채널톡 Open API + 웹훅(새 메시지·새 상담·유저 변경). v5 주소는 2027-07-09 까지 신버전으로 이전 경로의 account/object, parser, 개인정보 제거기, 웹훅 즉시 + 일 1회 대사 schedule을 원천별로 고정한다.",
                  "criterion": "#24에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-24-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "채널톡 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "채널톡에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-24-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 채널톡 고객상담 객체: 채널톡 Open API + 웹훅(새 메시지·새 상담·유저 변경). v5 주소는 2027-07-09 까지 신버전으로 이전. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "채널톡 고객상담 객체: 채널톡 Open API + 웹훅(새 메시지·새 상담·유저 변경). v5 주소는 2027-07-09 까지 신버전으로 이전에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-24-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=상. 근거: 상담 원장 직접 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-24-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 실패 분기 필요. 승인된 폴백: 공식 API·EDI 요청 → 허용된 파일 수신 또는 포털 → 잔여 수동 공개",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-24-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=웹훅 즉시 + 일 1회 대사. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "웹훅 즉시 + 일 1회 대사 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-24-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#24 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-25",
              "title": "#25 Meta Ads",
              "status": "partial",
              "detail": "광고 · 원천. 목표=api_interface: Marketing API Insights 또는 AppFlow Facebook Ads 커넥터(공식 목록 등재); 현재 접근은 원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→일 1회 + 최근 28일 재수집 2회→증거 동결.",
              "source": {
                "row_id": "25",
                "name": "Meta Ads",
                "kind": "원천",
                "transport": "api",
                "cadence": "일 1회 + 최근 28일 재수집",
                "target_method": "api_interface: Marketing API Insights 또는 AppFlow Facebook Ads 커넥터(공식 목록 등재)",
                "current_state": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                "conditions": "비즈니스 관리자 권한",
                "fallback": "대행사 피드(③ 수신)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-25-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #25 분류 기준은 있음: 업무=광고, 유형=원천. 36_ 우선 결정은 api_interface: Marketing API Insights 또는 AppFlow Facebook Ads 커넥터(공식 목록 등재). 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#25의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-25-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "비즈니스 관리자 권한",
                  "criterion": "Meta Ads 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-25-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지. 이전 실측·합성 근거(묶음③·루트 수락)는 evidence로 보존.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "docs/work-log/2026-09-30_pending-sources-readiness/connector-audit.md",
                    "docs/work-log/2026-09-30_pending-sources-readiness/synthetic-test-results.json"
                  ],
                  "next": "api_interface: Marketing API Insights 또는 AppFlow Facebook Ads 커넥터(공식 목록 등재) 경로의 account/object, parser, 개인정보 제거기, 일 1회 + 최근 28일 재수집 schedule을 원천별로 고정한다.",
                  "criterion": "#25에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-25-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "Meta Ads 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "Meta Ads에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-25-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: Meta Ads 광고 객체: Marketing API Insights 또는 AppFlow Facebook Ads 커넥터(공식 목록 등재). 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "Meta Ads 광고 객체: Marketing API Insights 또는 AppFlow Facebook Ads 커넥터(공식 목록 등재)에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-25-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=상. 근거: 플랫폼 원장. 값이 15분마다 갱신되고 28일이 지나야 고정 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-25-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 실패 분기 필요. 승인된 폴백: 대행사 피드(③ 수신)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-25-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=일 1회 + 최근 28일 재수집. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "일 1회 + 최근 28일 재수집 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-25-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#25 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-26",
              "title": "#26 Google Ads",
              "status": "partial",
              "detail": "광고 · 원천. 목표=api_interface: Google Ads API(개발자 토큰 2026-09-09 폐지 → OAuth 발급 Cloud 프로젝트의 접근 수준) 또는 AppFlow Google Ads 커넥터; 현재 접근은 원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→일 1회 + 최근 7~30일 재수집(전환창) 2회→증거 동결.",
              "source": {
                "row_id": "26",
                "name": "Google Ads",
                "kind": "원천",
                "transport": "api",
                "cadence": "일 1회 + 최근 7~30일 재수집(전환창)",
                "target_method": "api_interface: Google Ads API(개발자 토큰 2026-09-09 폐지 → OAuth 발급 Cloud 프로젝트의 접근 수준) 또는 AppFlow Google Ads 커넥터",
                "current_state": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                "conditions": "읽기 권한 · 고객 ID · Cloud 프로젝트 API 접근 수준",
                "fallback": "BigQuery DTS",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-26-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #26 분류 기준은 있음: 업무=광고, 유형=원천. 36_ 우선 결정은 api_interface: Google Ads API(개발자 토큰 2026-09-09 폐지 → OAuth 발급 Cloud 프로젝트의 접근 수준) 또는 AppFlow Google Ads 커넥터. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#26의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-26-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "읽기 권한 · 고객 ID · Cloud 프로젝트 API 접근 수준",
                  "criterion": "Google Ads 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-26-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지. 이전 실측·합성 근거(묶음③·루트 수락)는 evidence로 보존.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "docs/work-log/2026-09-30_pending-sources-readiness/connector-audit.md",
                    "docs/work-log/2026-09-30_pending-sources-readiness/synthetic-test-results.json"
                  ],
                  "next": "api_interface: Google Ads API(개발자 토큰 2026-09-09 폐지 → OAuth 발급 Cloud 프로젝트의 접근 수준) 또는 AppFlow Google Ads 커넥터 경로의 account/object, parser, 개인정보 제거기, 일 1회 + 최근 7~30일 재수집(전환창) schedule을 원천별로 고정한다.",
                  "criterion": "#26에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-26-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "Google Ads 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "Google Ads에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-26-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: Google Ads 광고 객체: Google Ads API(개발자 토큰 2026-09-09 폐지 → OAuth 발급 Cloud 프로젝트의 접근 수준) 또는 AppFlow Google Ads 커넥터. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "Google Ads 광고 객체: Google Ads API(개발자 토큰 2026-09-09 폐지 → OAuth 발급 Cloud 프로젝트의 접근 수준) 또는 AppFlow Google Ads 커넥터에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-26-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=상. 근거: 플랫폼 원장. 무효 트래픽·지연 전환이 소급 반영됨 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-26-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 실패 분기 필요. 승인된 폴백: BigQuery DTS",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-26-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=일 1회 + 최근 7~30일 재수집(전환창). 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "일 1회 + 최근 7~30일 재수집(전환창) 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-26-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#26 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-27",
              "title": "#27 GA4",
              "status": "partial",
              "detail": "웹분석 · 원천. 목표=api_interface: GA4 Data API(집계) · 원시 이벤트는 BigQuery export(일 export 는 약 3일간 갱신, streaming 은 수 분·유료) · Realtime API 는 최근 30분 모니터링용; 현재 접근은 원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→일 1회 + 최근 3~7일 재수집 2회→증거 동결.",
              "source": {
                "row_id": "27",
                "name": "GA4",
                "kind": "원천",
                "transport": "api",
                "cadence": "일 1회 + 최근 3~7일 재수집",
                "target_method": "api_interface: GA4 Data API(집계) · 원시 이벤트는 BigQuery export(일 export 는 약 3일간 갱신, streaming 은 수 분·유료) · Realtime API 는 최근 30분 모니터링용",
                "current_state": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                "conditions": "GA4 편집자(export 링크) · 권한 받는 즉시 export 켜기(백필 불가)",
                "fallback": "공식 API·EDI 요청 → 허용된 파일 수신 또는 포털 → 잔여 수동 공개",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-27-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #27 분류 기준은 있음: 업무=웹분석, 유형=원천. 36_ 우선 결정은 api_interface: GA4 Data API(집계) · 원시 이벤트는 BigQuery export(일 export 는 약 3일간 갱신, streaming 은 수 분·유료) · Realtime API 는 최근 30분 모니터링용. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#27의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-27-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "GA4 편집자(export 링크) · 권한 받는 즉시 export 켜기(백필 불가)",
                  "criterion": "GA4 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-27-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지. 이전 실측·합성 근거(묶음③·루트 수락)는 evidence로 보존.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "docs/work-log/2026-09-30_pending-sources-readiness/connector-audit.md",
                    "docs/work-log/2026-09-30_pending-sources-readiness/synthetic-test-results.json"
                  ],
                  "next": "api_interface: GA4 Data API(집계) · 원시 이벤트는 BigQuery export(일 export 는 약 3일간 갱신, streaming 은 수 분·유료) · Realtime API 는 최근 30분 모니터링용 경로의 account/object, parser, 개인정보 제거기, 일 1회 + 최근 3~7일 재수집 schedule을 원천별로 고정한다.",
                  "criterion": "#27에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-27-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "GA4 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "GA4에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-27-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: GA4 웹분석 객체: GA4 Data API(집계) · 원시 이벤트는 BigQuery export(일 export 는 약 3일간 갱신, streaming 은 수 분·유료) · Realtime API 는 최근 30분 모니터링용. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "GA4 웹분석 객체: GA4 Data API(집계) · 원시 이벤트는 BigQuery export(일 export 는 약 3일간 갱신, streaming 은 수 분·유료) · Realtime API 는 최근 30분 모니터링용에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-27-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=상. 근거: 분석 원장. 표준 리포트는 처리 뒤 확정(24~48시간, 최대 7일, SLA 아님) 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-27-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 실패 분기 필요. 승인된 폴백: 공식 API·EDI 요청 → 허용된 파일 수신 또는 포털 → 잔여 수동 공개",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-27-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=일 1회 + 최근 3~7일 재수집. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "일 1회 + 최근 3~7일 재수집 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-27-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#27 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-28",
              "title": "#28 Amazon (미국·호주·영국·중동)",
              "status": "partial",
              "detail": "해외 EC · 원천. 목표=api_interface: Fivetran Amazon Selling Partner 커넥터(Amazon 승인 제3자 앱, 2026-10-16 결정 20) — 고객 셀러센트럴 Admin 권한자가 리전마다 Allow(미국 = 북미, 영국 · UAE = 유럽, 호주 = 극동 — 같은 리전 마켓플레이스는 연결 하나). 주문 · 리포트(판매·트래픽 · 재고 · 정산 등)를 Fivetran 이 목적지에 적재하고 우리는 적재본을 읽는다. SP-API 직접 앱(Private · Public) · 알림 SQS 는 쓰지 않는다; 현재 접근은 Fivetran Amazon Selling Partner 커넥터 경로(36_ 결정 20). 고객 동의(미국 제3자 경유) · 리전 계정별 Admin Allow · Fivetran 계정 · 목적지가 아직 없음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→Fivetran 동기화 1시간 · 리포트 일 1회 · 정산 생성 시 2회→증거 동결.",
              "source": {
                "row_id": "28",
                "name": "Amazon (미국·호주·영국·중동)",
                "kind": "원천",
                "transport": "api",
                "cadence": "Fivetran 동기화 1시간 · 리포트 일 1회 · 정산 생성 시",
                "target_method": "api_interface: Fivetran Amazon Selling Partner 커넥터(Amazon 승인 제3자 앱, 2026-10-16 결정 20) — 고객 셀러센트럴 Admin 권한자가 리전마다 Allow(미국 = 북미, 영국 · UAE = 유럽, 호주 = 극동 — 같은 리전 마켓플레이스는 연결 하나). 주문 · 리포트(판매·트래픽 · 재고 · 정산 등)를 Fivetran 이 목적지에 적재하고 우리는 적재본을 읽는다. SP-API 직접 앱(Private · Public) · 알림 SQS 는 쓰지 않는다",
                "current_state": "Fivetran Amazon Selling Partner 커넥터 경로(36_ 결정 20). 고객 동의(미국 제3자 경유) · 리전 계정별 Admin Allow · Fivetran 계정 · 목적지가 아직 없음.",
                "conditions": "고객 동의(미국 제3자 Fivetran 경유) · 리전 계정마다 Admin 권한자가 Fivetran 앱 Allow(북미 · 유럽 · 극동 — 계정 병합 여부에 따라 1~3회) · Fivetran 계정 · 목적지 · 기존 Make 시나리오 인계(중복 개발 방지)",
                "fallback": "GEC Make 결과 시트 MAKEAMZ(판매·트래픽 — 미국 2025-07~, 영국 · 호주 · UAE 2026-04~) + 셀러센트럴 화면 백필(판매·트래픽 리포트 2년 · 재고 원장 18개월 한도)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-28-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #28 분류 기준은 있음: 업무=해외 EC, 유형=원천. 36_ 우선 결정은 api_interface: Fivetran Amazon Selling Partner 커넥터(Amazon 승인 제3자 앱, 2026-10-16 결정 20) — 고객 셀러센트럴 Admin 권한자가 리전마다 Allow(미국 = 북미, 영국 · UAE = 유럽, 호주 = 극동 — 같은 리전 마켓플레이스는 연결 하나). 주문 · 리포트(판매·트래픽 · 재고 · 정산 등)를 Fivetran 이 목적지에 적재하고 우리는 적재본을 읽는다. SP-API 직접 앱(Private · Public) · 알림 SQS 는 쓰지 않는다. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#28의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-28-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "Fivetran Amazon Selling Partner 커넥터 경로(36_ 결정 20). 고객 동의(미국 제3자 경유) · 리전 계정별 Admin Allow · Fivetran 계정 · 목적지가 아직 없음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "고객 동의(미국 제3자 Fivetran 경유) · 리전 계정마다 Admin 권한자가 Fivetran 앱 Allow(북미 · 유럽 · 극동 — 계정 병합 여부에 따라 1~3회) · Fivetran 계정 · 목적지 · 기존 Make 시나리오 인계(중복 개발 방지)",
                  "criterion": "Amazon (미국·호주·영국·중동) 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-28-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "Fivetran Amazon Selling Partner 커넥터가 수집을 맡는다(36_ 결정 20). Fivetran 적재본을 읽는 계약 · 테이블 매핑 · 파서는 없음. SP-API 직접 수집기(E3 합성 시험 완료)는 운영 경로가 아니라 완료로 세지 않는다. 이전 실측·합성 근거(묶음③·루트 수락)는 evidence로 보존.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "docs/work-log/2026-09-30_pending-sources-readiness/connector-audit.md",
                    "docs/work-log/2026-09-30_pending-sources-readiness/synthetic-test-results.json"
                  ],
                  "next": "api_interface: Fivetran Amazon Selling Partner 커넥터(Amazon 승인 제3자 앱, 2026-10-16 결정 20) — 고객 셀러센트럴 Admin 권한자가 리전마다 Allow(미국 = 북미, 영국 · UAE = 유럽, 호주 = 극동 — 같은 리전 마켓플레이스는 연결 하나). 주문 · 리포트(판매·트래픽 · 재고 · 정산 등)를 Fivetran 이 목적지에 적재하고 우리는 적재본을 읽는다. SP-API 직접 앱(Private · Public) · 알림 SQS 는 쓰지 않는다 경로의 account/object, parser, 개인정보 제거기, Fivetran 동기화 1시간 · 리포트 일 1회 · 정산 생성 시 schedule을 원천별로 고정한다.",
                  "criterion": "#28에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-28-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "Amazon (미국·호주·영국·중동) 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "Amazon (미국·호주·영국·중동)에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-28-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: Fivetran 적재본의 Amazon 미국 · 영국 · 호주 · UAE 주문 · 판매·트래픽 · 재고 · 정산 리포트; 리전 연결별 동기화 창, MAKEAMZ 판매·트래픽 대조. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "Fivetran 적재본의 Amazon 미국 · 영국 · 호주 · UAE 주문 · 판매·트래픽 · 재고 · 정산 리포트; 리전 연결별 동기화 창, MAKEAMZ 판매·트래픽 대조에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-28-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=상. 근거: 주문·정산 원장(Fivetran 이 SP-API 로 받은 적재본) 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-28-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 실패 분기 필요. 승인된 폴백: GEC Make 결과 시트 MAKEAMZ(판매·트래픽 — 미국 2025-07~, 영국 · 호주 · UAE 2026-04~) + 셀러센트럴 화면 백필(판매·트래픽 리포트 2년 · 재고 원장 18개월 한도)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-28-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=Fivetran 동기화 1시간 · 리포트 일 1회 · 정산 생성 시. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "Fivetran 동기화 1시간 · 리포트 일 1회 · 정산 생성 시 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-28-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#28 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-29",
              "title": "#29 Helium 10",
              "status": "partial",
              "detail": "콘텐츠·시장 · 원천. 목표=api_interface: Helium 10 MCP(Diamond 이상, OAuth). REST API 는 Enterprise 전용; 현재 접근은 원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→원천 발행: 주 1회; 미발행 여부 매일 확인 2회→증거 동결.",
              "source": {
                "row_id": "29",
                "name": "Helium 10",
                "kind": "원천",
                "transport": "api",
                "cadence": "원천 발행: 주 1회; 미발행 여부 매일 확인",
                "target_method": "api_interface: Helium 10 MCP(Diamond 이상, OAuth). REST API 는 Enterprise 전용",
                "current_state": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                "conditions": "Diamond 이상 · 계정 소유자 MCP 권한",
                "fallback": "브라우저 export(③)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-29-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #29 분류 기준은 있음: 업무=콘텐츠·시장, 유형=원천. 36_ 우선 결정은 api_interface: Helium 10 MCP(Diamond 이상, OAuth). REST API 는 Enterprise 전용. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#29의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-29-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "Diamond 이상 · 계정 소유자 MCP 권한",
                  "criterion": "Helium 10 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-29-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지. 이전 실측·합성 근거(L5)는 evidence로 보존.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/sources/helium10.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/tests/test_helium10.py",
                    "docs/work-log/2026-09-30_todo-l5-ads-global/synthetic-test-results.json",
                    "docs/work-log/2026-09-30_todo-l5-ads-global/registry-additions.json"
                  ],
                  "next": "api_interface: Helium 10 MCP(Diamond 이상, OAuth). REST API 는 Enterprise 전용 경로의 account/object, parser, 개인정보 제거기, 원천 발행: 주 1회; 미발행 여부 매일 확인 schedule을 원천별로 고정한다.",
                  "criterion": "#29에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-29-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "Helium 10 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "Helium 10에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-29-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: Helium 10 콘텐츠·시장 객체: Helium 10 MCP(Diamond 이상, OAuth). REST API 는 Enterprise 전용. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "Helium 10 콘텐츠·시장 객체: Helium 10 MCP(Diamond 이상, OAuth). REST API 는 Enterprise 전용에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-29-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 제3자 추정치. 자사 원장 아님 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-29-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 실패 분기 필요. 승인된 폴백: 브라우저 export(③)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-29-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=원천 발행: 주 1회; 미발행 여부 매일 확인. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "원천 발행: 주 1회; 미발행 여부 매일 확인 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-29-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#29 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-30",
              "title": "#30 Helium 10 MCP",
              "status": "partial",
              "detail": "콘텐츠·시장 · 원천. 목표=api_interface: #29 와 같은 MCP; 현재 접근은 원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→원천 발행: 주 1회; 미발행 여부 매일 확인 2회→증거 동결.",
              "source": {
                "row_id": "30",
                "name": "Helium 10 MCP",
                "kind": "원천",
                "transport": "api",
                "cadence": "원천 발행: 주 1회; 미발행 여부 매일 확인",
                "target_method": "api_interface: #29 와 같은 MCP",
                "current_state": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                "conditions": "범위 확정",
                "fallback": "공식 API·EDI 요청 → 허용된 파일 수신 또는 포털 → 잔여 수동 공개",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-30-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #30 분류 기준은 있음: 업무=콘텐츠·시장, 유형=원천. 36_ 우선 결정은 api_interface: #29 와 같은 MCP. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#30의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-30-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "범위 확정",
                  "criterion": "Helium 10 MCP 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-30-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지. 이전 실측·합성 근거(L5)는 evidence로 보존.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/sources/helium10.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/tests/test_helium10.py",
                    "docs/work-log/2026-09-30_todo-l5-ads-global/synthetic-test-results.json",
                    "docs/work-log/2026-09-30_todo-l5-ads-global/registry-additions.json"
                  ],
                  "next": "api_interface: #29 와 같은 MCP 경로의 account/object, parser, 개인정보 제거기, 원천 발행: 주 1회; 미발행 여부 매일 확인 schedule을 원천별로 고정한다.",
                  "criterion": "#30에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-30-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "Helium 10 MCP 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "Helium 10 MCP에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-30-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: Helium 10 MCP 콘텐츠·시장 객체: #29 와 같은 MCP. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "Helium 10 MCP 콘텐츠·시장 객체: #29 와 같은 MCP에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-30-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: #29 와 동일 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-30-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 실패 분기 필요. 승인된 폴백: 공식 API·EDI 요청 → 허용된 파일 수신 또는 포털 → 잔여 수동 공개",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-30-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=원천 발행: 주 1회; 미발행 여부 매일 확인. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "원천 발행: 주 1회; 미발행 여부 매일 확인 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-30-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#30 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-31",
              "title": "#31 Amazon 일본",
              "status": "partial",
              "detail": "해외 EC · 원천. 목표=api_interface: Fivetran Amazon Selling Partner 커넥터(Amazon 승인 제3자 앱, 2026-10-16 결정 20) — 고객 셀러센트럴(JP) Admin 권한자가 극동 리전 Allow(호주와 같은 셀러 계정이면 연결 하나). 주문 · 리포트(판매·트래픽 · 재고 · 정산 등)를 Fivetran 이 목적지에 적재하고 우리는 적재본을 읽는다. SP-API 직접 앱 · 알림 SQS 는 쓰지 않는다; 현재 접근은 Fivetran Amazon Selling Partner 커넥터 경로(36_ 결정 20). 고객 동의(미국 제3자 경유) · 리전 계정별 Admin Allow · Fivetran 계정 · 목적지가 아직 없음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→Fivetran 동기화 1시간 · 리포트 일 1회 · 정산 생성 시 2회→증거 동결.",
              "source": {
                "row_id": "31",
                "name": "Amazon 일본",
                "kind": "원천",
                "transport": "api",
                "cadence": "Fivetran 동기화 1시간 · 리포트 일 1회 · 정산 생성 시",
                "target_method": "api_interface: Fivetran Amazon Selling Partner 커넥터(Amazon 승인 제3자 앱, 2026-10-16 결정 20) — 고객 셀러센트럴(JP) Admin 권한자가 극동 리전 Allow(호주와 같은 셀러 계정이면 연결 하나). 주문 · 리포트(판매·트래픽 · 재고 · 정산 등)를 Fivetran 이 목적지에 적재하고 우리는 적재본을 읽는다. SP-API 직접 앱 · 알림 SQS 는 쓰지 않는다",
                "current_state": "Fivetran Amazon Selling Partner 커넥터 경로(36_ 결정 20). 고객 동의(미국 제3자 경유) · 리전 계정별 Admin Allow · Fivetran 계정 · 목적지가 아직 없음.",
                "conditions": "고객 동의(미국 제3자 Fivetran 경유) · JP 계정 Admin 권한자가 Fivetran 앱 Allow(소유자 OTP) · JP 판매자 승인 · Fivetran 계정 · 목적지",
                "fallback": "셀러센트럴 화면 백필(BusinessReport · FBA 보고서 — 판매·트래픽 리포트 2년 · 재고 원장 18개월 한도). MAKEAMZ 에는 일본이 없다",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-31-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #31 분류 기준은 있음: 업무=해외 EC, 유형=원천. 36_ 우선 결정은 api_interface: Fivetran Amazon Selling Partner 커넥터(Amazon 승인 제3자 앱, 2026-10-16 결정 20) — 고객 셀러센트럴(JP) Admin 권한자가 극동 리전 Allow(호주와 같은 셀러 계정이면 연결 하나). 주문 · 리포트(판매·트래픽 · 재고 · 정산 등)를 Fivetran 이 목적지에 적재하고 우리는 적재본을 읽는다. SP-API 직접 앱 · 알림 SQS 는 쓰지 않는다. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#31의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-31-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "Fivetran Amazon Selling Partner 커넥터 경로(36_ 결정 20). 고객 동의(미국 제3자 경유) · 리전 계정별 Admin Allow · Fivetran 계정 · 목적지가 아직 없음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "고객 동의(미국 제3자 Fivetran 경유) · JP 계정 Admin 권한자가 Fivetran 앱 Allow(소유자 OTP) · JP 판매자 승인 · Fivetran 계정 · 목적지",
                  "criterion": "Amazon 일본 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-31-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "Fivetran Amazon Selling Partner 커넥터가 수집을 맡는다(36_ 결정 20). Fivetran 적재본을 읽는 계약 · 테이블 매핑 · 파서는 없음. SP-API 직접 수집기(E3 합성 시험 완료)는 운영 경로가 아니라 완료로 세지 않는다. 이전 실측·합성 근거(묶음③·루트 수락)는 evidence로 보존.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "docs/work-log/2026-09-30_pending-sources-readiness/connector-audit.md",
                    "docs/work-log/2026-09-30_pending-sources-readiness/synthetic-test-results.json"
                  ],
                  "next": "api_interface: Fivetran Amazon Selling Partner 커넥터(Amazon 승인 제3자 앱, 2026-10-16 결정 20) — 고객 셀러센트럴(JP) Admin 권한자가 극동 리전 Allow(호주와 같은 셀러 계정이면 연결 하나). 주문 · 리포트(판매·트래픽 · 재고 · 정산 등)를 Fivetran 이 목적지에 적재하고 우리는 적재본을 읽는다. SP-API 직접 앱 · 알림 SQS 는 쓰지 않는다 경로의 account/object, parser, 개인정보 제거기, Fivetran 동기화 1시간 · 리포트 일 1회 · 정산 생성 시 schedule을 원천별로 고정한다.",
                  "criterion": "#31에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-31-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "Amazon 일본 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "Amazon 일본에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-31-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: Fivetran 적재본의 Amazon JP 주문 · 판매·트래픽 · 재고 · 정산 리포트; 극동 리전 연결의 동기화 창. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "Fivetran 적재본의 Amazon JP 주문 · 판매·트래픽 · 재고 · 정산 리포트; 극동 리전 연결의 동기화 창에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-31-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=상. 근거: 주문·정산 원장(Fivetran 이 SP-API 로 받은 적재본) 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-31-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 실패 분기 필요. 승인된 폴백: 셀러센트럴 화면 백필(BusinessReport · FBA 보고서 — 판매·트래픽 리포트 2년 · 재고 원장 18개월 한도). MAKEAMZ 에는 일본이 없다",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-31-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=Fivetran 동기화 1시간 · 리포트 일 1회 · 정산 생성 시. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "Fivetran 동기화 1시간 · 리포트 일 1회 · 정산 생성 시 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-31-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#31 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-32",
              "title": "#32 Shopify",
              "status": "partial",
              "detail": "해외 자사몰 · 원천. 목표=api_interface: Admin API(GraphQL) + 주문 웹훅(생성·수정·취소). 수신 5초 제한·4시간 내 8회 재시도 → 일 1회 전체 대사 폴링 병행; 현재 접근은 원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→웹훅 즉시 + 일 1회 대사 2회→증거 동결.",
              "source": {
                "row_id": "32",
                "name": "Shopify",
                "kind": "원천",
                "transport": "api",
                "cadence": "웹훅 즉시 + 일 1회 대사",
                "target_method": "api_interface: Admin API(GraphQL) + 주문 웹훅(생성·수정·취소). 수신 5초 제한·4시간 내 8회 재시도 → 일 1회 전체 대사 폴링 병행",
                "current_state": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                "conditions": "레거시 custom app 이 있으면 그 토큰 유지(2026-01-01 이후 신규 생성 불가) · 없으면 Dev Dashboard 앱(client credentials 24시간, 같은 조직일 때만)",
                "fallback": "Make 결과 시트",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-32-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #32 분류 기준은 있음: 업무=해외 자사몰, 유형=원천. 36_ 우선 결정은 api_interface: Admin API(GraphQL) + 주문 웹훅(생성·수정·취소). 수신 5초 제한·4시간 내 8회 재시도 → 일 1회 전체 대사 폴링 병행. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#32의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-32-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "레거시 custom app 이 있으면 그 토큰 유지(2026-01-01 이후 신규 생성 불가) · 없으면 Dev Dashboard 앱(client credentials 24시간, 같은 조직일 때만)",
                  "criterion": "Shopify 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-32-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지. 이전 실측·합성 근거(묶음③·루트 수락)는 evidence로 보존.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "docs/work-log/2026-09-30_pending-sources-readiness/connector-audit.md",
                    "docs/work-log/2026-09-30_pending-sources-readiness/synthetic-test-results.json"
                  ],
                  "next": "api_interface: Admin API(GraphQL) + 주문 웹훅(생성·수정·취소). 수신 5초 제한·4시간 내 8회 재시도 → 일 1회 전체 대사 폴링 병행 경로의 account/object, parser, 개인정보 제거기, 웹훅 즉시 + 일 1회 대사 schedule을 원천별로 고정한다.",
                  "criterion": "#32에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-32-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "Shopify 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "Shopify에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-32-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: Shopify 주문 생성·수정·취소 웹훅과 일 1회 전체 대사 창. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "Shopify 주문 생성·수정·취소 웹훅과 일 1회 전체 대사 창에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-32-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=상. 근거: 주문 원장 직접 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-32-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 실패 분기 필요. 승인된 폴백: Make 결과 시트",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-32-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=웹훅 즉시 + 일 1회 대사. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "웹훅 즉시 + 일 1회 대사 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-32-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#32 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-34",
              "title": "#34 TikTok Shop",
              "status": "partial",
              "detail": "해외 EC · 원천. 목표=api_interface: TikTok Shop Partner API — 주문 웹훅(ORDER_STATUS_CHANGE·취소·반품) + Finance API(정산). 단일 셀러 custom app 가능; 현재 접근은 원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→웹훅 즉시 + 일 1회 대사 2회→증거 동결.",
              "source": {
                "row_id": "34",
                "name": "TikTok Shop",
                "kind": "원천",
                "transport": "api",
                "cadence": "웹훅 즉시 + 일 1회 대사",
                "target_method": "api_interface: TikTok Shop Partner API — 주문 웹훅(ORDER_STATUS_CHANGE·취소·반품) + Finance API(정산). 단일 셀러 custom app 가능",
                "current_state": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                "conditions": "Partner 앱 승인",
                "fallback": "GEC BigQuery VIEW(#13, 임시)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-34-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #34 분류 기준은 있음: 업무=해외 EC, 유형=원천. 36_ 우선 결정은 api_interface: TikTok Shop Partner API — 주문 웹훅(ORDER_STATUS_CHANGE·취소·반품) + Finance API(정산). 단일 셀러 custom app 가능. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#34의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-34-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "Partner 앱 승인",
                  "criterion": "TikTok Shop 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-34-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지. 이전 실측·합성 근거(묶음③·L5)는 evidence로 보존.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/webhooks.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/webhook_events.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/tests/test_webhooks.py",
                    "docs/work-log/2026-09-30_pending-sources-readiness/connector-audit.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/sources/tiktok_shop.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/tests/test_tiktok_shop.py",
                    "docs/work-log/2026-09-30_todo-l5-ads-global/synthetic-test-results.json"
                  ],
                  "next": "api_interface: TikTok Shop Partner API — 주문 웹훅(ORDER_STATUS_CHANGE·취소·반품) + Finance API(정산). 단일 셀러 custom app 가능 경로의 account/object, parser, 개인정보 제거기, 웹훅 즉시 + 일 1회 대사 schedule을 원천별로 고정한다.",
                  "criterion": "#34에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-34-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "TikTok Shop 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "TikTok Shop에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-34-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: TikTok Shop 주문 상태·취소·반품 이벤트와 Finance 정산 보고서. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "TikTok Shop 주문 상태·취소·반품 이벤트와 Finance 정산 보고서에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-34-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=상. 근거: 주문 원장 직접 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-34-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 실패 분기 필요. 승인된 폴백: GEC BigQuery VIEW(#13, 임시)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-34-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=웹훅 즉시 + 일 1회 대사. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "웹훅 즉시 + 일 1회 대사 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-34-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#34 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-35",
              "title": "#35 Qoo10 (JP)",
              "status": "partial",
              "detail": "해외 EC · 원천. 목표=api_interface: QAPI 주문·상품(폴링 전용, 웹훅 없음). 정산·광고·방문 API 는 공개 문서에 없음(→ H6); 현재 접근은 원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→15분~1시간 폴링 2회→증거 동결.",
              "source": {
                "row_id": "35",
                "name": "Qoo10 (JP)",
                "kind": "원천",
                "transport": "api",
                "cadence": "15분~1시간 폴링",
                "target_method": "api_interface: QAPI 주문·상품(폴링 전용, 웹훅 없음). 정산·광고·방문 API 는 공개 문서에 없음(→ H6)",
                "current_state": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                "conditions": "발급: 담당 영업매니저 메일 신청(출점심사 완료·서비스포인트 0점 이상·미처리 없음, 무료·평일) · 기존 물류 연결과 병행 가능 여부",
                "fallback": "QSM 다운로드 자동화(③)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-35-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #35 분류 기준은 있음: 업무=해외 EC, 유형=원천. 36_ 우선 결정은 api_interface: QAPI 주문·상품(폴링 전용, 웹훅 없음). 정산·광고·방문 API 는 공개 문서에 없음(→ H6). 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#35의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-35-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음. 2026-10-14 갱신(묶음②): 수집기 있음(시험 20 통과)·게이트 logistics_parallel_confirmed 닫힘. 38_ 9번 물류 병행 확인 → 키 재발급 → 고객 보관소 입력 대기. 첫 Read 는 core run-job 수동 1회.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "docs/work-log/2026-09-30_partial-read-completion/api-runbook.md"
                  ],
                  "next": "발급: 담당 영업매니저 메일 신청(출점심사 완료·서비스포인트 0점 이상·미처리 없음, 무료·평일) · 기존 물류 연결과 병행 가능 여부",
                  "criterion": "Qoo10 (JP) 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-35-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "api_interface: QAPI 주문·상품(폴링 전용, 웹훅 없음). 정산·광고·방문 API 는 공개 문서에 없음(→ H6) 경로의 account/object, parser, 개인정보 제거기, 15분~1시간 폴링 schedule을 원천별로 고정한다.",
                  "criterion": "#35에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-35-live-read",
                  "title": "실계정 첫 Read",
                  "status": "partial",
                  "detail": "Qoo10 (JP) 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지. 2026-09-29~30 수령 샘플 또는 파생 시트를 파싱해 탭·행 수와 SHA-256 을 기록했다. 운영 경로(ERP·API·포털·수신)의 실 Read 가 아니므로 E4 완료로 세지 않는다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-29_source-read-t0t1t2-resume/read-evidence-sanitized.json"
                  ],
                  "next": "Qoo10 (JP)에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-35-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: Qoo10 주문·상품 페이지; 광고·방문·정산은 H6 등 별도 경로. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "Qoo10 주문·상품 페이지; 광고·방문·정산은 H6 등 별도 경로에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-35-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=상. 근거: 주문 원장 직접 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-35-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 실패 분기 필요. 승인된 폴백: QSM 다운로드 자동화(③)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-35-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=15분~1시간 폴링. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "15분~1시간 폴링 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-35-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#35 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-39a-1",
              "title": "#39a-1 지그재그 — 주문",
              "status": "partial",
              "detail": "채널 · 원천. 목표=api_interface: 지그재그 공식 Open API(GraphQL 폴링, 쇼핑몰별 키·HMAC) — 주문·클레임·상품; 현재 접근은 원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→15분~1시간 폴링 2회→증거 동결.",
              "source": {
                "row_id": "39a-1",
                "name": "지그재그 — 주문",
                "kind": "원천",
                "transport": "api",
                "cadence": "15분~1시간 폴링",
                "target_method": "api_interface: 지그재그 공식 Open API(GraphQL 폴링, 쇼핑몰별 키·HMAC) — 주문·클레임·상품",
                "current_state": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                "conditions": "파트너센터 쇼핑몰별 키(cmslab·suiskin 2개)",
                "fallback": "파트너센터 주문 다운로드(③ 포털). 사방넷 경유는 쓰지 않는다(2026-10-16 결정 20)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-39a-1-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #39a-1 분류 기준은 있음: 업무=채널, 유형=원천. 36_ 우선 결정은 api_interface: 지그재그 공식 Open API(GraphQL 폴링, 쇼핑몰별 키·HMAC) — 주문·클레임·상품. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#39a-1의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-39a-1-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "파트너센터 쇼핑몰별 키(cmslab·suiskin 2개)",
                  "criterion": "지그재그 — 주문 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-39a-1-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지. 이전 실측·합성 근거(묶음③·L4)는 evidence로 보존.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/cmslab_files/channels/zigzag.py",
                    "docs/work-log/2026-09-30_pending-sources-readiness/synthetic-test-results.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/sources/zigzag.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/tests/test_zigzag.py",
                    "docs/work-log/2026-09-30_todo-l4-domestic-api/registry-additions.json"
                  ],
                  "next": "api_interface: 지그재그 공식 Open API(GraphQL 폴링, 쇼핑몰별 키·HMAC) — 주문·클레임·상품 경로의 account/object, parser, 개인정보 제거기, 15분~1시간 폴링 schedule을 원천별로 고정한다.",
                  "criterion": "#39a-1에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-39a-1-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "지그재그 — 주문 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "지그재그 — 주문에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-39a-1-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 지그재그 — 주문 채널 객체: 지그재그 공식 Open API(GraphQL 폴링, 쇼핑몰별 키·HMAC) — 주문·클레임·상품. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "지그재그 — 주문 채널 객체: 지그재그 공식 Open API(GraphQL 폴링, 쇼핑몰별 키·HMAC) — 주문·클레임·상품에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-39a-1-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=상. 근거: 주문 원장을 공식 API 로 직접 받음 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-39a-1-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 실패 분기 필요. 승인된 폴백: 파트너센터 주문 다운로드(③ 포털). 사방넷 경유는 쓰지 않는다(2026-10-16 결정 20)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-39a-1-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=15분~1시간 폴링. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "15분~1시간 폴링 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-39a-1-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#39a-1 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-39b-1",
              "title": "#39b-1 지그재그 — 정산",
              "status": "partial",
              "detail": "채널 · 원천. 목표=api_interface: 지그재그 공식 Open API 정산 조회(주문 단위·스토어 단위, 2025-07 추가). GraphQL·쇼핑몰별 키(HMAC); 현재 접근은 원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→일 1회 2회→증거 동결.",
              "source": {
                "row_id": "39b-1",
                "name": "지그재그 — 정산",
                "kind": "원천",
                "transport": "api",
                "cadence": "일 1회",
                "target_method": "api_interface: 지그재그 공식 Open API 정산 조회(주문 단위·스토어 단위, 2025-07 추가). GraphQL·쇼핑몰별 키(HMAC)",
                "current_state": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                "conditions": "파트너센터 쇼핑몰별 키 발급(최초 연동은 담당 MD 문의)",
                "fallback": "파트너센터 정산 다운로드(③)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-39b-1-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #39b-1 분류 기준은 있음: 업무=채널, 유형=원천. 36_ 우선 결정은 api_interface: 지그재그 공식 Open API 정산 조회(주문 단위·스토어 단위, 2025-07 추가). GraphQL·쇼핑몰별 키(HMAC). 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#39b-1의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-39b-1-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "파트너센터 쇼핑몰별 키 발급(최초 연동은 담당 MD 문의)",
                  "criterion": "지그재그 — 정산 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-39b-1-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지. 이전 실측·합성 근거(묶음③)는 evidence로 보존.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/cmslab_files/channels/zigzag.py",
                    "docs/work-log/2026-09-30_pending-sources-readiness/synthetic-test-results.json"
                  ],
                  "next": "api_interface: 지그재그 공식 Open API 정산 조회(주문 단위·스토어 단위, 2025-07 추가). GraphQL·쇼핑몰별 키(HMAC) 경로의 account/object, parser, 개인정보 제거기, 일 1회 schedule을 원천별로 고정한다.",
                  "criterion": "#39b-1에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-39b-1-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "지그재그 — 정산 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "지그재그 — 정산에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-39b-1-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 지그재그 — 정산 채널 객체: 지그재그 공식 Open API 정산 조회(주문 단위·스토어 단위, 2025-07 추가). GraphQL·쇼핑몰별 키(HMAC). 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "지그재그 — 정산 채널 객체: 지그재그 공식 Open API 정산 조회(주문 단위·스토어 단위, 2025-07 추가). GraphQL·쇼핑몰별 키(HMAC)에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-39b-1-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=상. 근거: 정산 원장을 공식 API 로 받음. 스토어 부담 쿠폰 차감 산식은 별도 검증 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-39b-1-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 실패 분기 필요. 승인된 폴백: 파트너센터 정산 다운로드(③)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-39b-1-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=일 1회. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "일 1회 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-39b-1-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#39b-1 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-54",
              "title": "#54 카페24 엑스퍼트몰(cfcex)",
              "status": "partial",
              "detail": "자사몰 · 원천. 목표=api_interface: 카페24 Admin API — 주문 웹훅(접수·입금·배송·취소·반품·교환·환불) + GET /orders 보정 폴링(문서에 \"일부 웹훅 누락 가능\" 명시). 일별·시간별 매출 통계 API 는 승인 필요 제한 API; 현재 접근은 원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→웹훅 즉시 + 1시간 보정 폴링 2회→증거 동결.",
              "source": {
                "row_id": "54",
                "name": "카페24 엑스퍼트몰(cfcex)",
                "kind": "원천",
                "transport": "api",
                "cadence": "웹훅 즉시 + 1시간 보정 폴링",
                "target_method": "api_interface: 카페24 Admin API — 주문 웹훅(접수·입금·배송·취소·반품·교환·환불) + GET /orders 보정 폴링(문서에 \"일부 웹훅 누락 가능\" 명시). 일별·시간별 매출 통계 API 는 승인 필요 제한 API",
                "current_state": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                "conditions": "엑스퍼트몰 앱 설치 별도(몰마다 토큰 1세트) · Pharos 카페24 앱(10/6 등록 · 10/12 심사 요청) + Pharos 서버 콜백 중계(등록된 redirect URI 그대로 · CMSLAB 서명 state → 토큰을 CMSLAB 공개키로 암호화해 전달 · 갱신도 중계, 2026-10-16 결정 20) · 대표 운영자 동의(몰별 앱 설치 · 웹훅) · 읽기 전용 scope(read/write 분리됨) · refresh token 2주 회전(Pharos 중계 — 놓치면 브라우저 재인가)",
                "fallback": "관리자 다운로드(④)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-54-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #54 분류 기준은 있음: 업무=자사몰, 유형=원천. 36_ 우선 결정은 api_interface: 카페24 Admin API — 주문 웹훅(접수·입금·배송·취소·반품·교환·환불) + GET /orders 보정 폴링(문서에 \"일부 웹훅 누락 가능\" 명시). 일별·시간별 매출 통계 API 는 승인 필요 제한 API. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#54의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-54-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "엑스퍼트몰 앱 설치 별도(몰마다 토큰 1세트) · Pharos 카페24 앱(10/6 등록 · 10/12 심사 요청) + Pharos 서버 콜백 중계(등록된 redirect URI 그대로 · CMSLAB 서명 state → 토큰을 CMSLAB 공개키로 암호화해 전달 · 갱신도 중계, 2026-10-16 결정 20) · 대표 운영자 동의(몰별 앱 설치 · 웹훅) · 읽기 전용 scope(read/write 분리됨) · refresh token 2주 회전(Pharos 중계 — 놓치면 브라우저 재인가)",
                  "criterion": "카페24 엑스퍼트몰(cfcex) 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-54-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "api_interface: 카페24 Admin API — 주문 웹훅(접수·입금·배송·취소·반품·교환·환불) + GET /orders 보정 폴링(문서에 \"일부 웹훅 누락 가능\" 명시). 일별·시간별 매출 통계 API 는 승인 필요 제한 API 경로의 account/object, parser, 개인정보 제거기, 웹훅 즉시 + 1시간 보정 폴링 schedule을 원천별로 고정한다.",
                  "criterion": "#54에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-54-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "카페24 엑스퍼트몰(cfcex) 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "카페24 엑스퍼트몰(cfcex)에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-54-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 카페24 엑스퍼트몰(cfcex) 자사몰 객체: 카페24 Admin API — 주문 웹훅(접수·입금·배송·취소·반품·교환·환불) + GET /orders 보정 폴링(문서에 \"일부 웹훅 누락 가능\" 명시). 일별·시간별 매출 통계 API 는 승인 필요 제한 API. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "카페24 엑스퍼트몰(cfcex) 자사몰 객체: 카페24 Admin API — 주문 웹훅(접수·입금·배송·취소·반품·교환·환불) + GET /orders 보정 폴링(문서에 \"일부 웹훅 누락 가능\" 명시). 일별·시간별 매출 통계 API 는 승인 필요 제한 API에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-54-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=상. 근거: 주문 원장 직접 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-54-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 실패 분기 필요. 승인된 폴백: 관리자 다운로드(④)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-54-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=웹훅 즉시 + 1시간 보정 폴링. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "웹훅 즉시 + 1시간 보정 폴링 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-54-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#54 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-55",
              "title": "#55 토스페이먼츠",
              "status": "partial",
              "detail": "결제·정산 · 원천. 목표=api_interface: 토스페이먼츠 거래 조회(당일부터)·정산 조회(결제 다음 날부터). 정산 웹훅 없음; 현재 접근은 원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→일 1회 2회→증거 동결.",
              "source": {
                "row_id": "55",
                "name": "토스페이먼츠",
                "kind": "원천",
                "transport": "api",
                "cadence": "일 1회",
                "target_method": "api_interface: 토스페이먼츠 거래 조회(당일부터)·정산 조회(결제 다음 날부터). 정산 웹훅 없음",
                "current_state": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                "conditions": "cfcex MID 에 결제위젯 연동 키(gsk) 또는 API 개별 연동 키(sk)가 있는지 먼저 확인(카페24페이먼츠 위탁 MID 면 없을 수 있음) · 조회 전용 키 없음 — 시크릿 키로 결제 취소까지 가능 → 토스 API 키 접근 정책(IP CIDR 제한, 출시일 미확인)에는 그 키를 쓰는 모든 서버의 IP(카페24 등 결제 처리 서버 포함)를 넣어야 하고 위시켓 IP 만 넣으면 정상 결제가 403 으로 막힘 → 정책 적용 전 키를 쓰는 서버 IP 전수 확인이 선행 조건이며, 확인이 안 되면 정책을 걸지 않고 정산 엑셀 경로(대시보드 다운로드 ④)로 간다(2026-10-16 결정 20) (2026-10-16 정정)",
                "fallback": "대시보드 다운로드(④)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-55-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #55 분류 기준은 있음: 업무=결제·정산, 유형=원천. 36_ 우선 결정은 api_interface: 토스페이먼츠 거래 조회(당일부터)·정산 조회(결제 다음 날부터). 정산 웹훅 없음. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#55의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-55-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "cfcex MID 에 결제위젯 연동 키(gsk) 또는 API 개별 연동 키(sk)가 있는지 먼저 확인(카페24페이먼츠 위탁 MID 면 없을 수 있음) · 조회 전용 키 없음 — 시크릿 키로 결제 취소까지 가능 → 토스 API 키 접근 정책(IP CIDR 제한, 출시일 미확인)에는 그 키를 쓰는 모든 서버의 IP(카페24 등 결제 처리 서버 포함)를 넣어야 하고 위시켓 IP 만 넣으면 정상 결제가 403 으로 막힘 → 정책 적용 전 키를 쓰는 서버 IP 전수 확인이 선행 조건이며, 확인이 안 되면 정책을 걸지 않고 정산 엑셀 경로(대시보드 다운로드 ④)로 간다(2026-10-16 결정 20) (2026-10-16 정정)",
                  "criterion": "토스페이먼츠 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-55-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지. 이전 실측·합성 근거(묶음③·루트 수락)는 evidence로 보존.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "docs/work-log/2026-09-30_pending-sources-readiness/connector-audit.md",
                    "docs/work-log/2026-09-30_pending-sources-readiness/synthetic-test-results.json"
                  ],
                  "next": "api_interface: 토스페이먼츠 거래 조회(당일부터)·정산 조회(결제 다음 날부터). 정산 웹훅 없음 경로의 account/object, parser, 개인정보 제거기, 일 1회 schedule을 원천별로 고정한다.",
                  "criterion": "#55에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-55-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "토스페이먼츠 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "토스페이먼츠에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-55-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 토스페이먼츠 결제·정산 객체: 토스페이먼츠 거래 조회(당일부터)·정산 조회(결제 다음 날부터). 정산 웹훅 없음. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "토스페이먼츠 결제·정산 객체: 토스페이먼츠 거래 조회(당일부터)·정산 조회(결제 다음 날부터). 정산 웹훅 없음에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-55-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=상. 근거: PG 원장 직접 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-55-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 실패 분기 필요. 승인된 폴백: 대시보드 다운로드(④)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-55-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=일 1회. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "일 1회 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-55-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#55 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-56",
              "title": "#56 PAYCO",
              "status": "partial",
              "detail": "결제·정산 · 원천. 목표=api_interface: PAYCO 대사정보 조회 API(결제·정산·포인트 — 가맹점 신청형, ACL(IP)·접속 토큰, 스펙은 파트너센터 가이드 파일) · 대사파일 일 단위; 현재 접근은 원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→일 1회 2회→증거 동결.",
              "source": {
                "row_id": "56",
                "name": "PAYCO",
                "kind": "원천",
                "transport": "api",
                "cadence": "일 1회",
                "target_method": "api_interface: PAYCO 대사정보 조회 API(결제·정산·포인트 — 가맹점 신청형, ACL(IP)·접속 토큰, 스펙은 파트너센터 가이드 파일) · 대사파일 일 단위",
                "current_state": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                "conditions": "9/21 고객확인제도 심사거절 해소 → 파트너센터 「대사정보 조회 API 설정」에서 가맹점이 ACL IP · 접속 토큰을 직접 설정(2026-10-16 결정 20)",
                "fallback": "대사파일 다운로드(③)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-56-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #56 분류 기준은 있음: 업무=결제·정산, 유형=원천. 36_ 우선 결정은 api_interface: PAYCO 대사정보 조회 API(결제·정산·포인트 — 가맹점 신청형, ACL(IP)·접속 토큰, 스펙은 파트너센터 가이드 파일) · 대사파일 일 단위. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#56의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-56-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "9/21 고객확인제도 심사거절 해소 → 파트너센터 「대사정보 조회 API 설정」에서 가맹점이 ACL IP · 접속 토큰을 직접 설정(2026-10-16 결정 20)",
                  "criterion": "PAYCO 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-56-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "api_interface: PAYCO 대사정보 조회 API(결제·정산·포인트 — 가맹점 신청형, ACL(IP)·접속 토큰, 스펙은 파트너센터 가이드 파일) · 대사파일 일 단위 경로의 account/object, parser, 개인정보 제거기, 일 1회 schedule을 원천별로 고정한다.",
                  "criterion": "#56에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-56-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "PAYCO 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "PAYCO에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-56-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: PAYCO 결제·정산 객체: PAYCO 대사정보 조회 API(결제·정산·포인트 — 가맹점 신청형, ACL(IP)·접속 토큰, 스펙은 파트너센터 가이드 파일) · 대사파일 일 단위. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "PAYCO 결제·정산 객체: PAYCO 대사정보 조회 API(결제·정산·포인트 — 가맹점 신청형, ACL(IP)·접속 토큰, 스펙은 파트너센터 가이드 파일) · 대사파일 일 단위에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-56-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=상. 근거: 정산 원장을 API 로 받음(신청 시) 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-56-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 실패 분기 필요. 승인된 폴백: 대사파일 다운로드(③)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-56-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=일 1회. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "일 1회 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-56-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#56 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-57",
              "title": "#57 카카오페이",
              "status": "partial",
              "detail": "결제·정산 · 원천. 목표=api_interface: 카카오페이 파일서비스 API v3.0(2026-02-24) — 결제·매입·정산·입금 내역 JSON 파일(D+1). PG_KEY·bucket_id 발급 + 출발지 IP 방화벽; 현재 접근은 원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→일 1회 2회→증거 동결.",
              "source": {
                "row_id": "57",
                "name": "카카오페이",
                "kind": "원천",
                "transport": "api",
                "cadence": "일 1회",
                "target_method": "api_interface: 카카오페이 파일서비스 API v3.0(2026-02-24) — 결제·매입·정산·입금 내역 JSON 파일(D+1). PG_KEY·bucket_id 발급 + 출발지 IP 방화벽",
                "current_state": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                "conditions": "kakaopay_pg@kakaopaycorp.com 메일 신청(사업자번호 · CID · 가맹점명 · 서버 IP) → PG_KEY · bucket_id 발급 · 출발지 IP 방화벽 등록 · 파일 D+1(2026-10-16 결정 20)",
                "fallback": "파트너어드민 엑셀(③, 30일·6.5만 건)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-57-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #57 분류 기준은 있음: 업무=결제·정산, 유형=원천. 36_ 우선 결정은 api_interface: 카카오페이 파일서비스 API v3.0(2026-02-24) — 결제·매입·정산·입금 내역 JSON 파일(D+1). PG_KEY·bucket_id 발급 + 출발지 IP 방화벽. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#57의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-57-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "kakaopay_pg@kakaopaycorp.com 메일 신청(사업자번호 · CID · 가맹점명 · 서버 IP) → PG_KEY · bucket_id 발급 · 출발지 IP 방화벽 등록 · 파일 D+1(2026-10-16 결정 20)",
                  "criterion": "카카오페이 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-57-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "api_interface: 카카오페이 파일서비스 API v3.0(2026-02-24) — 결제·매입·정산·입금 내역 JSON 파일(D+1). PG_KEY·bucket_id 발급 + 출발지 IP 방화벽 경로의 account/object, parser, 개인정보 제거기, 일 1회 schedule을 원천별로 고정한다.",
                  "criterion": "#57에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-57-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "카카오페이 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "카카오페이에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-57-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 카카오페이 결제·정산 객체: 카카오페이 파일서비스 API v3.0(2026-02-24) — 결제·매입·정산·입금 내역 JSON 파일(D+1). PG_KEY·bucket_id 발급 + 출발지 IP 방화벽. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "카카오페이 결제·정산 객체: 카카오페이 파일서비스 API v3.0(2026-02-24) — 결제·매입·정산·입금 내역 JSON 파일(D+1). PG_KEY·bucket_id 발급 + 출발지 IP 방화벽에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-57-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=상. 근거: 정산 원장 파일을 API 로 받음. PG_KEY 는 파일 조회 전용이라 결제 권한과 분리됨 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-57-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 실패 분기 필요. 승인된 폴백: 파트너어드민 엑셀(③, 30일·6.5만 건)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-57-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=일 1회. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "일 1회 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-57-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#57 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-64",
              "title": "#64 인플루언서 오가닉(YouTube)",
              "status": "partial",
              "detail": "콘텐츠 · 원천. 목표=api_interface: YouTube Data API v3 videos.list(시점 스냅샷). 기본 할당량 10,000 units/일; 현재 접근은 원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→일 1회 2회→증거 동결.",
              "source": {
                "row_id": "64",
                "name": "인플루언서 오가닉(YouTube)",
                "kind": "원천",
                "transport": "api",
                "cadence": "일 1회",
                "target_method": "api_interface: YouTube Data API v3 videos.list(시점 스냅샷). 기본 할당량 10,000 units/일",
                "current_state": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                "conditions": "모니터링 대상 목록 · API 키",
                "fallback": "시트(① 입력 원장)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-64-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #64 분류 기준은 있음: 업무=콘텐츠, 유형=원천. 36_ 우선 결정은 api_interface: YouTube Data API v3 videos.list(시점 스냅샷). 기본 할당량 10,000 units/일. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#64의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-64-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "모니터링 대상 목록 · API 키",
                  "criterion": "인플루언서 오가닉(YouTube) 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-64-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지. 이전 실측·합성 근거(L5)는 evidence로 보존.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/sources/youtube.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/tests/test_youtube.py",
                    "docs/work-log/2026-09-30_todo-l5-ads-global/synthetic-test-results.json"
                  ],
                  "next": "api_interface: YouTube Data API v3 videos.list(시점 스냅샷). 기본 할당량 10,000 units/일 경로의 account/object, parser, 개인정보 제거기, 일 1회 schedule을 원천별로 고정한다.",
                  "criterion": "#64에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-64-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "인플루언서 오가닉(YouTube) 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "인플루언서 오가닉(YouTube)에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-64-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 인플루언서 오가닉(YouTube) 콘텐츠 객체: YouTube Data API v3 videos.list(시점 스냅샷). 기본 할당량 10,000 units/일. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "인플루언서 오가닉(YouTube) 콘텐츠 객체: YouTube Data API v3 videos.list(시점 스냅샷). 기본 할당량 10,000 units/일에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-64-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=상. 근거: 플랫폼 공개 지표 직접(수기 모니터링 대체) 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-64-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 실패 분기 필요. 승인된 폴백: 시트(① 입력 원장)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-64-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=일 1회. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "일 1회 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-64-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#64 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-95",
              "title": "#95 라쿠텐 (RMS)",
              "status": "partial",
              "detail": "해외 EC · 원천. 목표=api_interface: RMS Web Service searchOrder·getOrder(폴링 전용, 1회 100건); 현재 접근은 원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→15분~1시간 폴링 2회→증거 동결.",
              "source": {
                "row_id": "95",
                "name": "라쿠텐 (RMS)",
                "kind": "원천",
                "transport": "api",
                "cadence": "15분~1시간 폴링",
                "target_method": "api_interface: RMS Web Service searchOrder·getOrder(폴링 전용, 1회 100건)",
                "current_state": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                "conditions": "RMS WEB API 이용 신청 · licenseKey 90일마다 수동 갱신(자동 갱신 없음) → 만료 D-14 알림 + 사람 갱신(H4)",
                "fallback": "RMS 다운로드(③)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-95-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #95 분류 기준은 있음: 업무=해외 EC, 유형=원천. 36_ 우선 결정은 api_interface: RMS Web Service searchOrder·getOrder(폴링 전용, 1회 100건). 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#95의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-95-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "RMS WEB API 이용 신청 · licenseKey 90일마다 수동 갱신(자동 갱신 없음) → 만료 D-14 알림 + 사람 갱신(H4)",
                  "criterion": "라쿠텐 (RMS) 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-95-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "E3 manifest 상태=incomplete. 코드 경로는 있지만 공식·계정 계약 확정 전에는 완료로 올리지 않는다. 이전 실측·합성 근거(묶음②·L5)는 evidence로 보존.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "docs/work-log/2026-09-30_partial-read-completion/api-runbook.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/sources/rakuten_rms.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/tests/test_rakuten_rms.py",
                    "docs/work-log/2026-09-30_todo-l5-ads-global/synthetic-test-results.json",
                    "docs/work-log/2026-09-30_todo-l5-ads-global/registry-additions.json"
                  ],
                  "next": "api_interface: RMS Web Service searchOrder·getOrder(폴링 전용, 1회 100건) 경로의 account/object, parser, 개인정보 제거기, 15분~1시간 폴링 schedule을 원천별로 고정한다.",
                  "criterion": "#95에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-95-live-read",
                  "title": "실계정 첫 Read",
                  "status": "partial",
                  "detail": "라쿠텐 (RMS) 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지. 2026-09-29~30 수령 샘플 또는 파생 시트를 파싱해 탭·행 수와 SHA-256 을 기록했다. 운영 경로(ERP·API·포털·수신)의 실 Read 가 아니므로 E4 완료로 세지 않는다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-29_source-read-t0t1t2-resume/read-evidence-sanitized.json"
                  ],
                  "next": "라쿠텐 (RMS)에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-95-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 라쿠텐 RMS searchOrder·getOrder; 100건 페이지 경계와 15분~1시간 폴링 창. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "라쿠텐 RMS searchOrder·getOrder; 100건 페이지 경계와 15분~1시간 폴링 창에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-95-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=상. 근거: 주문 원장 직접 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-95-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 실패 분기 필요. 승인된 폴백: RMS 다운로드(③)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-95-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=15분~1시간 폴링. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "15분~1시간 폴링 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-95-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#95 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-97a",
              "title": "#97a CJ온스타일 — 주문",
              "status": "partial",
              "detail": "채널 · 원천. 목표=api_interface: CJ온스타일 표준 API(협력사 대상, 주문·배송·반품 등 56종) 직접; 현재 접근은 원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→15분~1시간 폴링 2회→증거 동결.",
              "source": {
                "row_id": "97a",
                "name": "CJ온스타일 — 주문",
                "kind": "원천",
                "transport": "api",
                "cadence": "15분~1시간 폴링",
                "target_method": "api_interface: CJ온스타일 표준 API(협력사 대상, 주문·배송·반품 등 56종) 직접",
                "current_state": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                "conditions": "계약 → API 키 → IP 등록",
                "fallback": "파트너센터 주문 다운로드(③ 포털). 사방넷 경유는 쓰지 않는다(2026-10-16 결정 20)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-97a-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #97a 분류 기준은 있음: 업무=채널, 유형=원천. 36_ 우선 결정은 api_interface: CJ온스타일 표준 API(협력사 대상, 주문·배송·반품 등 56종) 직접. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#97a의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-97a-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "계약 → API 키 → IP 등록",
                  "criterion": "CJ온스타일 — 주문 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-97a-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "api_interface: CJ온스타일 표준 API(협력사 대상, 주문·배송·반품 등 56종) 직접 경로의 account/object, parser, 개인정보 제거기, 15분~1시간 폴링 schedule을 원천별로 고정한다.",
                  "criterion": "#97a에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-97a-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "CJ온스타일 — 주문 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "CJ온스타일 — 주문에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-97a-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: CJ 표준 API 주문·배송·반품 자원군; 직접 연동이 정본(사방넷 경유 안 함). 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "CJ 표준 API 주문·배송·반품 자원군; 직접 연동이 정본(사방넷 경유 안 함)에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-97a-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=상. 근거: 주문 원장을 공식 API 로 받음 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-97a-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 실패 분기 필요. 승인된 폴백: 파트너센터 주문 다운로드(③ 포털). 사방넷 경유는 쓰지 않는다(2026-10-16 결정 20)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-97a-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=15분~1시간 폴링. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "15분~1시간 폴링 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-97a-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#97a 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-98a",
              "title": "#98a 카카오쇼핑 — 주문",
              "status": "partial",
              "detail": "채널 · 원천. 목표=api_interface: 카카오쇼핑 API(선물하기·톡스토어, 심사·계약형 — 직접 연동도 연동대행사 앱 필요); 현재 접근은 원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→15분~1시간 폴링 2회→증거 동결.",
              "source": {
                "row_id": "98a",
                "name": "카카오쇼핑 — 주문",
                "kind": "원천",
                "transport": "api",
                "cadence": "15분~1시간 폴링",
                "target_method": "api_interface: 카카오쇼핑 API(선물하기·톡스토어, 심사·계약형 — 직접 연동도 연동대행사 앱 필요)",
                "current_state": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                "conditions": "연동 검토 신청 → 계약 → 관리자 키 권한(연동대행사 앱) · 거절 시 파트너센터 다운로드",
                "fallback": "파트너센터 주문 다운로드(③ 포털). 사방넷 경유는 쓰지 않는다(2026-10-16 결정 20)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-98a-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #98a 분류 기준은 있음: 업무=채널, 유형=원천. 36_ 우선 결정은 api_interface: 카카오쇼핑 API(선물하기·톡스토어, 심사·계약형 — 직접 연동도 연동대행사 앱 필요). 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#98a의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-98a-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "연동 검토 신청 → 계약 → 관리자 키 권한(연동대행사 앱) · 거절 시 파트너센터 다운로드",
                  "criterion": "카카오쇼핑 — 주문 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-98a-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지. 이전 실측·합성 근거(L4)는 evidence로 보존.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/sources/kakao_shopping.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/tests/test_kakao_shopping.py",
                    "docs/work-log/2026-09-30_todo-l4-domestic-api/synthetic-test-results.json",
                    "docs/work-log/2026-09-30_todo-l4-domestic-api/issuance-procedures.md"
                  ],
                  "next": "api_interface: 카카오쇼핑 API(선물하기·톡스토어, 심사·계약형 — 직접 연동도 연동대행사 앱 필요) 경로의 account/object, parser, 개인정보 제거기, 15분~1시간 폴링 schedule을 원천별로 고정한다.",
                  "criterion": "#98a에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-98a-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "카카오쇼핑 — 주문 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "카카오쇼핑 — 주문에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-98a-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 카카오쇼핑 선물하기·톡스토어 주문; 연동대행사 앱 직접 연동이 정본(사방넷 경유 안 함). 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "카카오쇼핑 선물하기·톡스토어 주문; 연동대행사 앱 직접 연동이 정본(사방넷 경유 안 함)에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-98a-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=상. 근거: 주문 원장을 공식 API 로 받음(심사 통과 시) 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-98a-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 실패 분기 필요. 승인된 폴백: 파트너센터 주문 다운로드(③ 포털). 사방넷 경유는 쓰지 않는다(2026-10-16 결정 20)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-98a-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=15분~1시간 폴링. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "15분~1시간 폴링 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-98a-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#98a 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-98b",
              "title": "#98b 카카오쇼핑 — 정산",
              "status": "partial",
              "detail": "채널 · 원천. 목표=api_interface: 카카오쇼핑 정산 API(주문 단위·기타공제·지급내역, 2024-09 제공) — 심사 통과 시. 거절 시 톡스토어 정산관리 다운로드; 현재 접근은 원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→일 1회(09:00 이후) 2회→증거 동결.",
              "source": {
                "row_id": "98b",
                "name": "카카오쇼핑 — 정산",
                "kind": "원천",
                "transport": "api",
                "cadence": "일 1회(09:00 이후)",
                "target_method": "api_interface: 카카오쇼핑 정산 API(주문 단위·기타공제·지급내역, 2024-09 제공) — 심사 통과 시. 거절 시 톡스토어 정산관리 다운로드",
                "current_state": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                "conditions": "초대 계정 · 약관",
                "fallback": "톡스토어 정산관리 다운로드(③)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-98b-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #98b 분류 기준은 있음: 업무=채널, 유형=원천. 36_ 우선 결정은 api_interface: 카카오쇼핑 정산 API(주문 단위·기타공제·지급내역, 2024-09 제공) — 심사 통과 시. 거절 시 톡스토어 정산관리 다운로드. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#98b의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-98b-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "초대 계정 · 약관",
                  "criterion": "카카오쇼핑 — 정산 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-98b-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지. 이전 실측·합성 근거(L4)는 evidence로 보존.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/sources/kakao_shopping.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/tests/test_kakao_shopping.py",
                    "docs/work-log/2026-09-30_todo-l4-domestic-api/synthetic-test-results.json",
                    "docs/work-log/2026-09-30_todo-l4-domestic-api/issuance-procedures.md"
                  ],
                  "next": "api_interface: 카카오쇼핑 정산 API(주문 단위·기타공제·지급내역, 2024-09 제공) — 심사 통과 시. 거절 시 톡스토어 정산관리 다운로드 경로의 account/object, parser, 개인정보 제거기, 일 1회(09:00 이후) schedule을 원천별로 고정한다.",
                  "criterion": "#98b에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-98b-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "카카오쇼핑 — 정산 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "카카오쇼핑 — 정산에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-98b-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 카카오쇼핑 주문단위 정산·기타공제·지급내역; 09:00 이후 일일 창. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "카카오쇼핑 주문단위 정산·기타공제·지급내역; 09:00 이후 일일 창에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-98b-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=상. 근거: 정산 원장을 공식 API 로 받음(심사 통과 시) 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-98b-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 실패 분기 필요. 승인된 폴백: 톡스토어 정산관리 다운로드(③)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-98b-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=일 1회(09:00 이후). 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "일 1회(09:00 이후) 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-98b-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#98b 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-99",
              "title": "#99 임직원몰",
              "status": "partial",
              "detail": "채널 · 원천. 목표=플랫폼 확인 후 API Read; API 없으면 포털 일 1회; 현재 접근은 원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→원천 발행: 월 1회; 미발행 여부 매일 확인 2회→증거 동결.",
              "source": {
                "row_id": "99",
                "name": "임직원몰",
                "kind": "원천",
                "transport": "api",
                "cadence": "원천 발행: 월 1회; 미발행 여부 매일 확인",
                "target_method": "플랫폼 확인 후 API Read; API 없으면 포털 일 1회",
                "current_state": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                "conditions": "몰 플랫폼 확인",
                "fallback": "API 확인 → 허용된 포털 자동화 → 파일 수신 협의 → 잔여 수동 공개",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-99-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #99 분류 기준은 있음: 업무=채널, 유형=원천. 36_ 우선 결정은 플랫폼 확인 후 API Read; API 없으면 포털 일 1회. 실객체·기간·권위 범위 승인은 남음. 2026-10-14 갱신(묶음② · live-read-1011): 수령 CSV 헤더로 플랫폼 추정: 호스팅형 몰 솔루션, 메이크샵 가능성 높음(파워앱할인금액 등) > 카페24. 둘 다 기존 수집기 재사용 가능 — 플랫폼 확인(35_ 16번, 38 초안 D)이 선행. 2026-10-11 갱신: 10/8 회신 #16: 임직원몰 = 메이크샵(RBD1팀 김가을). 월 확정 매출은 #103 영업그룹 「임직원몰」.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-30_partial-read-completion/api-runbook.md",
                    "docs/work-log/2026-10-11_live-read/reconcile-summary.json"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#99의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-99-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "몰 플랫폼 확인",
                  "criterion": "임직원몰 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-99-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "pending",
                  "detail": "원천별 connector 매핑과 합성 계약 시험부터 필요.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "플랫폼 확인 후 API Read; API 없으면 포털 일 1회 경로의 account/object, parser, 개인정보 제거기, 원천 발행: 월 1회; 미발행 여부 매일 확인 schedule을 원천별로 고정한다.",
                  "criterion": "#99에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-99-live-read",
                  "title": "실계정 첫 Read",
                  "status": "partial",
                  "detail": "임직원몰 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지. 2026-09-29~30 수령 샘플 또는 파생 시트를 파싱해 탭·행 수와 SHA-256 을 기록했다. 운영 경로(ERP·API·포털·수신)의 실 Read 가 아니므로 E4 완료로 세지 않는다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-29_source-read-t0t1t2-resume/read-evidence-sanitized.json"
                  ],
                  "next": "임직원몰에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-99-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 임직원몰 채널 객체: 담당자 월 1회 CSV 반출 → 동기화 폴더. 플랫폼 확인 시 API 검토. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "임직원몰 채널 객체: 담당자 월 1회 CSV 반출 → 동기화 폴더. 플랫폼 확인 시 API 검토에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-99-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 몰 원장 반출 파일 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-99-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 실패 분기 필요. 승인된 폴백: API 확인 → 허용된 포털 자동화 → 파일 수신 협의 → 잔여 수동 공개",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-99-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=원천 발행: 월 1회; 미발행 여부 매일 확인. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "원천 발행: 월 1회; 미발행 여부 매일 확인 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-99-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#99 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-h1",
              "title": "#H1 네이버 스마트스토어(커머스API)",
              "status": "partial",
              "detail": "채널 · 원천. 목표=api_interface: 커머스API 변경 주문 조회(last-changed-statuses, 24시간 창·300건 페이징) → 상세 조회 · 정산 API(일별·건별·수수료). 웹훅 없음(공식 답변); 현재 접근은 원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→15분~1시간 폴링 · 정산 일 1회 2회→증거 동결.",
              "source": {
                "row_id": "H1",
                "name": "네이버 스마트스토어(커머스API)",
                "kind": "원천",
                "transport": "api",
                "cadence": "15분~1시간 폴링 · 정산 일 1회",
                "target_method": "api_interface: 커머스API 변경 주문 조회(last-changed-statuses, 24시간 창·300건 페이징) → 상세 조회 · 정산 API(일별·건별·수수료). 웹훅 없음(공식 답변)",
                "current_state": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                "conditions": "통합매니저 권한 스토어 · 통합매니저 인증 연 2회(사람, 근거 미확인) · 호출 IP 는 '내 스토어 애플리케이션'당 IPv4 최대 3개(확대 계획 없음 — 공식 FAQ #2291·답변 #3786). 기존 외부업체가 CMSLAB 의 같은 앱을 쓰는지 확인",
                "fallback": "스마트스토어센터 다운로드(③)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-h1-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #H1 분류 기준은 있음: 업무=채널, 유형=원천. 36_ 우선 결정은 api_interface: 커머스API 변경 주문 조회(last-changed-statuses, 24시간 창·300건 페이징) → 상세 조회 · 정산 API(일별·건별·수수료). 웹훅 없음(공식 답변). 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#H1의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-h1-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "통합매니저 권한 스토어 · 통합매니저 인증 연 2회(사람, 근거 미확인) · 호출 IP 는 '내 스토어 애플리케이션'당 IPv4 최대 3개(확대 계획 없음 — 공식 FAQ #2291·답변 #3786). 기존 외부업체가 CMSLAB 의 같은 앱을 쓰는지 확인",
                  "criterion": "네이버 스마트스토어(커머스API) 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-h1-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "api_interface: 커머스API 변경 주문 조회(last-changed-statuses, 24시간 창·300건 페이징) → 상세 조회 · 정산 API(일별·건별·수수료). 웹훅 없음(공식 답변) 경로의 account/object, parser, 개인정보 제거기, 15분~1시간 폴링 · 정산 일 1회 schedule을 원천별로 고정한다.",
                  "criterion": "#H1에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-h1-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "네이버 스마트스토어(커머스API) 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "네이버 스마트스토어(커머스API)에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-h1-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 네이버 변경주문 24시간 창 300건 페이징·상세 조회와 일별 정산. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "네이버 변경주문 24시간 창 300건 페이징·상세 조회와 일별 정산에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-h1-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=상. 근거: 주문·정산 원장 직접. #77·#78·#81 시트와 #79(품고와 함께)의 원천 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-h1-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 실패 분기 필요. 승인된 폴백: 스마트스토어센터 다운로드(③)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-h1-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=15분~1시간 폴링 · 정산 일 1회. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "15분~1시간 폴링 · 정산 일 1회 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-h1-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#H1 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-h2",
              "title": "#H2 쿠팡 Wing(마켓플레이스)",
              "status": "partial",
              "detail": "채널 · 원천. 목표=api_interface: 쿠팡 Wing Open API — 주문 분 단위 목록 폴링·매출내역(D+1, 매출인식일 기준)·로켓그로스 주문·재고. 키 180일·호출 IP 최대 10개·키당 연동사 1곳; 현재 접근은 원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→15분 폴링 · 매출내역 일 1회 2회→증거 동결.",
              "source": {
                "row_id": "H2",
                "name": "쿠팡 Wing(마켓플레이스)",
                "kind": "원천",
                "transport": "api",
                "cadence": "15분 폴링 · 매출내역 일 1회",
                "target_method": "api_interface: 쿠팡 Wing Open API — 주문 분 단위 목록 폴링·매출내역(D+1, 매출인식일 기준)·로켓그로스 주문·재고. 키 180일·호출 IP 최대 10개·키당 연동사 1곳",
                "current_state": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                "conditions": "Wing 사용 여부 · 키 발급 시 호출 IP",
                "fallback": "공식 API·EDI 요청 → 허용된 파일 수신 또는 포털 → 잔여 수동 공개",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-h2-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #H2 분류 기준은 있음: 업무=채널, 유형=원천. 36_ 우선 결정은 api_interface: 쿠팡 Wing Open API — 주문 분 단위 목록 폴링·매출내역(D+1, 매출인식일 기준)·로켓그로스 주문·재고. 키 180일·호출 IP 최대 10개·키당 연동사 1곳. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#H2의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-h2-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "Wing 사용 여부 · 키 발급 시 호출 IP",
                  "criterion": "쿠팡 Wing(마켓플레이스) 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-h2-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지. 이전 실측·합성 근거(묶음③)는 evidence로 보존.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/sources/coupang_wing.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/tests/test_coupang_wing.py",
                    "docs/work-log/2026-09-30_pending-sources-readiness/synthetic-test-results.json",
                    "docs/work-log/2026-09-30_pending-sources-readiness/connector-audit.md"
                  ],
                  "next": "api_interface: 쿠팡 Wing Open API — 주문 분 단위 목록 폴링·매출내역(D+1, 매출인식일 기준)·로켓그로스 주문·재고. 키 180일·호출 IP 최대 10개·키당 연동사 1곳 경로의 account/object, parser, 개인정보 제거기, 15분 폴링 · 매출내역 일 1회 schedule을 원천별로 고정한다.",
                  "criterion": "#H2에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-h2-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "쿠팡 Wing(마켓플레이스) 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "쿠팡 Wing(마켓플레이스)에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-h2-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 쿠팡 Wing 주문 분단위 목록·D+1 매출·로켓그로스 주문·재고; 키별 허용 IP. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "쿠팡 Wing 주문 분단위 목록·D+1 매출·로켓그로스 주문·재고; 키별 허용 IP에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-h2-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=상. 근거: 주문 원장 직접 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-h2-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 실패 분기 필요. 승인된 폴백: 공식 API·EDI 요청 → 허용된 파일 수신 또는 포털 → 잔여 수동 공개",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-h2-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=15분 폴링 · 매출내역 일 1회. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "15분 폴링 · 매출내역 일 1회 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-h2-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#H2 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-h3",
              "title": "#H3 네이버 검색광고·카카오모먼트",
              "status": "partial",
              "detail": "광고 · 원천. 목표=api_interface: 네이버 검색광고 API(Stats 약 2시간 지연, StatReport 는 48시간 안에 변동·보관 14일) · 카카오모먼트 API(권한 신청형, D+1 08:00 전 잠정); 현재 접근은 원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→일 1회(08:00 이후) + 최근 2~7일 재수집 2회→증거 동결.",
              "source": {
                "row_id": "H3",
                "name": "네이버 검색광고·카카오모먼트",
                "kind": "원천",
                "transport": "api",
                "cadence": "일 1회(08:00 이후) + 최근 2~7일 재수집",
                "target_method": "api_interface: 네이버 검색광고 API(Stats 약 2시간 지연, StatReport 는 48시간 안에 변동·보관 14일) · 카카오모먼트 API(권한 신청형, D+1 08:00 전 잠정)",
                "current_state": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                "conditions": "집행 주체·계정 권한",
                "fallback": "대행사 피드(③ 수신)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-h3-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #H3 분류 기준은 있음: 업무=광고, 유형=원천. 36_ 우선 결정은 api_interface: 네이버 검색광고 API(Stats 약 2시간 지연, StatReport 는 48시간 안에 변동·보관 14일) · 카카오모먼트 API(권한 신청형, D+1 08:00 전 잠정). 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#H3의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-h3-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "집행 주체·계정 권한",
                  "criterion": "네이버 검색광고·카카오모먼트 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-h3-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "api_interface: 네이버 검색광고 API(Stats 약 2시간 지연, StatReport 는 48시간 안에 변동·보관 14일) · 카카오모먼트 API(권한 신청형, D+1 08:00 전 잠정) 경로의 account/object, parser, 개인정보 제거기, 일 1회(08:00 이후) + 최근 2~7일 재수집 schedule을 원천별로 고정한다.",
                  "criterion": "#H3에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-h3-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "네이버 검색광고·카카오모먼트 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "네이버 검색광고·카카오모먼트에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-h3-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 네이버 검색광고·카카오모먼트 광고 객체: 네이버 검색광고 API(Stats 약 2시간 지연, StatReport 는 48시간 안에 변동·보관 14일) · 카카오모먼트 API(권한 신청형, D+1 08:00 전 잠정). 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "네이버 검색광고·카카오모먼트 광고 객체: 네이버 검색광고 API(Stats 약 2시간 지연, StatReport 는 48시간 안에 변동·보관 14일) · 카카오모먼트 API(권한 신청형, D+1 08:00 전 잠정)에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-h3-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=상. 근거: 플랫폼 원장 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-h3-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 실패 분기 필요. 승인된 폴백: 대행사 피드(③ 수신)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-h3-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=일 1회(08:00 이후) + 최근 2~7일 재수집. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "일 1회(08:00 이후) + 최근 2~7일 재수집 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-h3-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#H3 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-h7",
              "title": "#H7 틱톡·인스타 크리에이터 지표",
              "status": "partial",
              "detail": "콘텐츠 · 원천. 목표=api_interface: 자사 계정: Instagram Graph(프로페셔널 계정 인사이트)·TikTok 공식 API. 타 크리에이터 게시물: 공식 API 불가(두 플랫폼 원칙) → Helium 10·Apify; 현재 접근은 원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→일 1회 2회→증거 동결.",
              "source": {
                "row_id": "H7",
                "name": "틱톡·인스타 크리에이터 지표",
                "kind": "원천",
                "transport": "api",
                "cadence": "일 1회",
                "target_method": "api_interface: 자사 계정: Instagram Graph(프로페셔널 계정 인사이트)·TikTok 공식 API. 타 크리에이터 게시물: 공식 API 불가(두 플랫폼 원칙) → Helium 10·Apify",
                "current_state": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                "conditions": "자사 계정 연결 · 타인 지표 범위 합의",
                "fallback": "타 크리에이터 지표는 #29 Helium 10(제3자 추정) 또는 Apify(스크래핑, ③)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-h7-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #H7 분류 기준은 있음: 업무=콘텐츠, 유형=원천. 36_ 우선 결정은 api_interface: 자사 계정: Instagram Graph(프로페셔널 계정 인사이트)·TikTok 공식 API. 타 크리에이터 게시물: 공식 API 불가(두 플랫폼 원칙) → Helium 10·Apify. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#H7의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-h7-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "자사 계정 연결 · 타인 지표 범위 합의",
                  "criterion": "틱톡·인스타 크리에이터 지표 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-h7-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "api_interface: 자사 계정: Instagram Graph(프로페셔널 계정 인사이트)·TikTok 공식 API. 타 크리에이터 게시물: 공식 API 불가(두 플랫폼 원칙) → Helium 10·Apify 경로의 account/object, parser, 개인정보 제거기, 일 1회 schedule을 원천별로 고정한다.",
                  "criterion": "#H7에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-h7-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "틱톡·인스타 크리에이터 지표 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "틱톡·인스타 크리에이터 지표에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-h7-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 틱톡·인스타 크리에이터 지표 콘텐츠 객체: 자사 계정: Instagram Graph(프로페셔널 계정 인사이트)·TikTok 공식 API. 타 크리에이터 게시물: 공식 API 불가(두 플랫폼 원칙) → Helium 10·Apify. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "틱톡·인스타 크리에이터 지표 콘텐츠 객체: 자사 계정: Instagram Graph(프로페셔널 계정 인사이트)·TikTok 공식 API. 타 크리에이터 게시물: 공식 API 불가(두 플랫폼 원칙) → Helium 10·Apify에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-h7-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 자사 계정 지표는 상, 타인 게시물은 비공식 수집이라 하 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-h7-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 실패 분기 필요. 승인된 폴백: 타 크리에이터 지표는 #29 Helium 10(제3자 추정) 또는 Apify(스크래핑, ③)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-h7-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=일 1회. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "일 1회 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-h7-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#H7 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-h8-1",
              "title": "#H8-1 Amazon Ads(마켓 광고비)",
              "status": "partial",
              "detail": "광고 · 원천. 목표=api_interface: Amazon Ads API v3 리포트(24~48시간, 72시간 뒤 재수집). 준실시간이 필요하면 Amazon Marketing Stream(30~90분); 현재 접근은 원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→일 1회 + 최근 3일 재수집 2회→증거 동결.",
              "source": {
                "row_id": "H8-1",
                "name": "Amazon Ads(마켓 광고비)",
                "kind": "원천",
                "transport": "api",
                "cadence": "일 1회 + 최근 3일 재수집",
                "target_method": "api_interface: Amazon Ads API v3 리포트(24~48시간, 72시간 뒤 재수집). 준실시간이 필요하면 Amazon Marketing Stream(30~90분)",
                "current_state": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                "conditions": "Ads API 신청·광고 계정 권한(SP-API 와 별개)",
                "fallback": "광고 콘솔 리포트 다운로드(④)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-h8-1-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #H8-1 분류 기준은 있음: 업무=광고, 유형=원천. 36_ 우선 결정은 api_interface: Amazon Ads API v3 리포트(24~48시간, 72시간 뒤 재수집). 준실시간이 필요하면 Amazon Marketing Stream(30~90분). 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#H8-1의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-h8-1-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "Ads API 신청·광고 계정 권한(SP-API 와 별개)",
                  "criterion": "Amazon Ads(마켓 광고비) 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-h8-1-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지. 이전 실측·합성 근거(묶음③·루트 수락)는 evidence로 보존.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "docs/work-log/2026-09-30_pending-sources-readiness/connector-audit.md",
                    "docs/work-log/2026-09-30_pending-sources-readiness/synthetic-test-results.json"
                  ],
                  "next": "api_interface: Amazon Ads API v3 리포트(24~48시간, 72시간 뒤 재수집). 준실시간이 필요하면 Amazon Marketing Stream(30~90분) 경로의 account/object, parser, 개인정보 제거기, 일 1회 + 최근 3일 재수집 schedule을 원천별로 고정한다.",
                  "criterion": "#H8-1에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-h8-1-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "Amazon Ads(마켓 광고비) 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "Amazon Ads(마켓 광고비)에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-h8-1-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: Amazon Ads v3 일별 리포트; 최근 3일 재수집과 24~48시간 지연 표시. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "Amazon Ads v3 일별 리포트; 최근 3일 재수집과 24~48시간 지연 표시에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-h8-1-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=상. 근거: 플랫폼 원장. 리포트가 사후에 확정됨 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-h8-1-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "pagination cursor·rate limit/429·재시도·웹훅/폴링 대사·수정/삭제 backfill 실패 분기 필요. 승인된 폴백: 광고 콘솔 리포트 다운로드(④)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-h8-1-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=일 1회 + 최근 3일 재수집. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "일 1회 + 최근 3일 재수집 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-h8-1-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#H8-1 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            }
          ]
        },
        {
          "id": "read-sheets",
          "title": "Google Sheets Read",
          "items": [
            {
              "id": "source-7",
              "title": "#7 SCM 공급계획 마스터",
              "status": "done",
              "detail": "공급계획 · 입력 원장. 목표=api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림; E1–E9 루트 서명 2026-09-29T00:14:01Z READ_COMPLETE, manifest SHA-256 55f5808e5da4. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-source7-signature.json",
                "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1-source7/source-7.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "7",
                "name": "SCM 공급계획 마스터",
                "kind": "입력 원장",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림",
                "current_state": "E1–E9 루트 서명 2026-09-29T00:14:01Z READ_COMPLETE, manifest SHA-256 55f5808e5da4. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "무인 인증 주체(서비스 계정 재공유 또는 읽기 전용 위임)",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-7-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:14:01Z READ_COMPLETE, manifest SHA-256 55f5808e5da4.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-source7-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1-source7/source-7.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-7-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-09-29T00:14:01Z READ_COMPLETE, manifest SHA-256 55f5808e5da4.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-source7-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1-source7/source-7.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-7-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:14:01Z READ_COMPLETE, manifest SHA-256 55f5808e5da4.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-source7-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1-source7/source-7.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-7-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-09-29T00:14:01Z READ_COMPLETE, manifest SHA-256 55f5808e5da4.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-source7-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1-source7/source-7.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-28_google-correct-account/checklist-release-public-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-7-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-09-29T00:14:01Z READ_COMPLETE, manifest SHA-256 55f5808e5da4.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-source7-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1-source7/source-7.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-7-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-09-29T00:14:01Z READ_COMPLETE, manifest SHA-256 55f5808e5da4.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-source7-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1-source7/source-7.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-7-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:14:01Z READ_COMPLETE, manifest SHA-256 55f5808e5da4.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-source7-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1-source7/source-7.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-7-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-09-29T00:14:01Z READ_COMPLETE, manifest SHA-256 55f5808e5da4.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-source7-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1-source7/source-7.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-7-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-09-29T00:14:01Z READ_COMPLETE, manifest SHA-256 55f5808e5da4. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-source7-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1-source7/source-7.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-8",
              "title": "#8 구매 입고정보·영업 공유 시트",
              "status": "done",
              "detail": "입고계획 · 입력 원장. 목표=api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림; E1–E9 루트 수용 2026-09-28T05:13:55Z READ_COMPLETE · r2 closure 바인딩 대체 2026-09-28T05:15:36Z, manifest SHA-256 aea7f790706e. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-source8-e1-e9-closure-r2-20260928T051536Z.json",
                "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-source8-e1-e9-closure-20260928T051355Z.json",
                "docs/work-log/2026-09-28_source-read-three-lanes/approvals/lane-b-source-8-remaining-criteria/closure-manifest-r2.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "8",
                "name": "구매 입고정보·영업 공유 시트",
                "kind": "입력 원장",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림",
                "current_state": "E1–E9 루트 수용 2026-09-28T05:13:55Z READ_COMPLETE · r2 closure 바인딩 대체 2026-09-28T05:15:36Z, manifest SHA-256 aea7f790706e. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "무인 인증 주체(서비스 계정 재공유 또는 읽기 전용 위임)",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-8-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 PASS · 루트 수용 2026-09-28T05:13:55Z READ_COMPLETE · r2 closure 바인딩 대체 2026-09-28T05:15:36Z, manifest SHA-256 aea7f790706e.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-source8-e1-e9-closure-r2-20260928T051536Z.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-source8-e1-e9-closure-20260928T051355Z.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/lane-b-source-8-remaining-criteria/closure-manifest-r2.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-8-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 수용 2026-09-28T05:13:55Z READ_COMPLETE · r2 closure 바인딩 대체 2026-09-28T05:15:36Z, manifest SHA-256 aea7f790706e.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-source8-e1-e9-closure-r2-20260928T051536Z.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-source8-e1-e9-closure-20260928T051355Z.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/lane-b-source-8-remaining-criteria/closure-manifest-r2.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-8-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 PASS · 루트 수용 2026-09-28T05:13:55Z READ_COMPLETE · r2 closure 바인딩 대체 2026-09-28T05:15:36Z, manifest SHA-256 aea7f790706e.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-source8-e1-e9-closure-r2-20260928T051536Z.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-source8-e1-e9-closure-20260928T051355Z.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/lane-b-source-8-remaining-criteria/closure-manifest-r2.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-8-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 수용 2026-09-28T05:13:55Z READ_COMPLETE · r2 closure 바인딩 대체 2026-09-28T05:15:36Z, manifest SHA-256 aea7f790706e.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-source8-e1-e9-closure-r2-20260928T051536Z.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-source8-e1-e9-closure-20260928T051355Z.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/lane-b-source-8-remaining-criteria/closure-manifest-r2.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-28_google-correct-account/checklist-release-public-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-8-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 수용 2026-09-28T05:13:55Z READ_COMPLETE · r2 closure 바인딩 대체 2026-09-28T05:15:36Z, manifest SHA-256 aea7f790706e.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-source8-e1-e9-closure-r2-20260928T051536Z.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-source8-e1-e9-closure-20260928T051355Z.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/lane-b-source-8-remaining-criteria/closure-manifest-r2.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-8-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 수용 2026-09-28T05:13:55Z READ_COMPLETE · r2 closure 바인딩 대체 2026-09-28T05:15:36Z, manifest SHA-256 aea7f790706e.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-source8-e1-e9-closure-r2-20260928T051536Z.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-source8-e1-e9-closure-20260928T051355Z.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/lane-b-source-8-remaining-criteria/closure-manifest-r2.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-8-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 PASS · 루트 수용 2026-09-28T05:13:55Z READ_COMPLETE · r2 closure 바인딩 대체 2026-09-28T05:15:36Z, manifest SHA-256 aea7f790706e.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-source8-e1-e9-closure-r2-20260928T051536Z.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-source8-e1-e9-closure-20260928T051355Z.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/lane-b-source-8-remaining-criteria/closure-manifest-r2.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-8-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 수용 2026-09-28T05:13:55Z READ_COMPLETE · r2 closure 바인딩 대체 2026-09-28T05:15:36Z, manifest SHA-256 aea7f790706e.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-source8-e1-e9-closure-r2-20260928T051536Z.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-source8-e1-e9-closure-20260928T051355Z.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/lane-b-source-8-remaining-criteria/closure-manifest-r2.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-8-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 수용 2026-09-28T05:13:55Z READ_COMPLETE · r2 closure 바인딩 대체 2026-09-28T05:15:36Z, manifest SHA-256 aea7f790706e. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-source8-e1-e9-closure-r2-20260928T051536Z.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-source8-e1-e9-closure-20260928T051355Z.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/lane-b-source-8-remaining-criteria/closure-manifest-r2.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-9",
              "title": "#9 ERP-WMS 일일 대조",
              "status": "done",
              "detail": "재고 대사 · 파생. 목표=api_interface: Sheets API 로 읽되 대사용. 원천 #2·WMS 연결 후 격하; E1–E9 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 ec9fa8256757. sheets-pii/v2 이름 규칙이 비개인정보 1열을 staging 에서 뺀다(raw 보존) — Read 범위 예외로 수락. E4 staging 은 private staging-equivalent jsonl. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-9.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "9",
                "name": "ERP-WMS 일일 대조",
                "kind": "파생",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 로 읽되 대사용. 원천 #2·WMS 연결 후 격하",
                "current_state": "E1–E9 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 ec9fa8256757. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "—",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-9-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 ec9fa8256757.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-9.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-9-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 ec9fa8256757.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-9.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-9-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 ec9fa8256757.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-9.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-9-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 ec9fa8256757.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-9.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-28_google-correct-account/checklist-release-public-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-9-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 ec9fa8256757.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-9.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-9-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 ec9fa8256757.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-9.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-9-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 ec9fa8256757.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-9.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-9-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 ec9fa8256757.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-9.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-9-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 ec9fa8256757. sheets-pii/v2 이름 규칙이 비개인정보 1열을 staging 에서 뺀다(raw 보존) — Read 범위 예외로 수락. E4 staging 은 private staging-equivalent jsonl. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-9.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-10",
              "title": "#10 SCM 기준 품목 분류",
              "status": "done",
              "detail": "제품마스터 · 입력 원장. 목표=api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림; E1–E9 루트 서명 2026-09-29T06:29:12Z READ_COMPLETE, manifest SHA-256 c480b296c446. E7은 복구된 실패(recovered-failure) E7로 승인됐다. 무결점 실행 E7이 아니다. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r2-source10-signature.json",
                "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r2-source10/source-10.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "10",
                "name": "SCM 기준 품목 분류",
                "kind": "입력 원장",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림",
                "current_state": "E1–E9 루트 서명 2026-09-29T06:29:12Z READ_COMPLETE, manifest SHA-256 c480b296c446. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "무인 인증 주체(서비스 계정 재공유 또는 읽기 전용 위임)",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-10-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-09-29T06:29:12Z READ_COMPLETE, manifest SHA-256 c480b296c446.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r2-source10-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r2-source10/source-10.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-10-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-09-29T06:29:12Z READ_COMPLETE, manifest SHA-256 c480b296c446.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r2-source10-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r2-source10/source-10.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-10-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-09-29T06:29:12Z READ_COMPLETE, manifest SHA-256 c480b296c446.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r2-source10-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r2-source10/source-10.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-10-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-09-29T06:29:12Z READ_COMPLETE, manifest SHA-256 c480b296c446.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r2-source10-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r2-source10/source-10.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-28_google-correct-account/checklist-release-public-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-10-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-09-29T06:29:12Z READ_COMPLETE, manifest SHA-256 c480b296c446.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r2-source10-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r2-source10/source-10.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-10-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-09-29T06:29:12Z READ_COMPLETE, manifest SHA-256 c480b296c446.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r2-source10-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r2-source10/source-10.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-10-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-09-29T06:29:12Z READ_COMPLETE, manifest SHA-256 c480b296c446.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r2-source10-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r2-source10/source-10.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-10-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-09-29T06:29:12Z READ_COMPLETE, manifest SHA-256 c480b296c446.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r2-source10-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r2-source10/source-10.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-10-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-09-29T06:29:12Z READ_COMPLETE, manifest SHA-256 c480b296c446. E7은 복구된 실패(recovered-failure) E7로 승인됐다. 무결점 실행 E7이 아니다. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r2-source10-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r2-source10/source-10.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-11",
              "title": "#11 채널별 판매계획 및 매출취합",
              "status": "done",
              "detail": "판매계획 · 입력 원장. 목표=api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림; E1–E9 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 fb68be850b73. Read 범위 = 통합 문서 전 25탭(숨김 15 포함) 1객체. 계약 객체 매핑은 소유자 탭 매핑 뒤 새 closure revision. 수식 오류 토큰 50,986개 원천 표시값 보존. 파일 ACL 편집자(토큰 readonly). READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-11.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "11",
                "name": "채널별 판매계획 및 매출취합",
                "kind": "입력 원장",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림",
                "current_state": "E1–E9 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 fb68be850b73. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "무인 인증 주체(서비스 계정 재공유 또는 읽기 전용 위임) · 판매계획 탭 내용 읽기 미실측",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-11-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 fb68be850b73.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-11.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-11-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 fb68be850b73.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-11.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-11-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 fb68be850b73.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-11.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-11-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 fb68be850b73.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-11.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-29_source-read-t0t1t2-resume/read-evidence-sanitized.json"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-11-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 fb68be850b73.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-11.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-11-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 fb68be850b73.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-11.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-11-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 fb68be850b73.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-11.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-11-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 fb68be850b73.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-11.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-11-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 fb68be850b73. Read 범위 = 통합 문서 전 25탭(숨김 15 포함) 1객체. 계약 객체 매핑은 소유자 탭 매핑 뒤 새 closure revision. 수식 오류 토큰 50,986개 원천 표시값 보존. 파일 ACL 편집자(토큰 readonly). READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-11.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-23",
              "title": "#23 라플라스",
              "status": "partial",
              "detail": "자사몰 분석 · 원천. 목표=api_interface: 매핑표를 공유 스프레드시트로 옮기면 Sheets API(라플라스도 그 시트를 주기적으로 가져감, 9/14 자사몰 L142~146). 그 전에는 라플라스 매핑 엑셀 반출; 현재 접근은 원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→변경 5분 감지 + 1시간 정합 재수집 2회→증거 동결.",
              "source": {
                "row_id": "23",
                "name": "라플라스",
                "kind": "원천",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: 매핑표를 공유 스프레드시트로 옮기면 Sheets API(라플라스도 그 시트를 주기적으로 가져감, 9/14 자사몰 L142~146). 그 전에는 라플라스 매핑 엑셀 반출",
                "current_state": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                "conditions": "플랜·계정 오너 · 매핑 export 권한",
                "fallback": "라플라스 매핑 엑셀 반출(④)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-23-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #23 분류 기준은 있음: 업무=자사몰 분석, 유형=원천. 36_ 우선 결정은 api_interface: 매핑표를 공유 스프레드시트로 옮기면 Sheets API(라플라스도 그 시트를 주기적으로 가져감, 9/14 자사몰 L142~146). 그 전에는 라플라스 매핑 엑셀 반출. 실객체·기간·권위 범위 승인은 남음. 2026-10-14 갱신(L2): 2026-09-30 L2: 수집 계정에 보이는 스프레드시트 35개 중 라플라스·매핑·기초상품·옵션 이름 0 → 매핑 공유 시트 없음. 38_ 20번(L2-E) 대기.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-30_todo-l2-read-now/evidence/probe-l2.json"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#23의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-23-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "플랜·계정 오너 · 매핑 export 권한",
                  "criterion": "라플라스 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-23-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "api_interface: 매핑표를 공유 스프레드시트로 옮기면 Sheets API(라플라스도 그 시트를 주기적으로 가져감, 9/14 자사몰 L142~146). 그 전에는 라플라스 매핑 엑셀 반출 경로의 account/object, parser, 개인정보 제거기, 변경 5분 감지 + 1시간 정합 재수집 schedule을 원천별로 고정한다.",
                  "criterion": "#23에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 대상 탭·숨김 탭·헤더/2단 헤더·IMPORTRANGE/QUERY·페이지 격자·헤더 drift 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-23-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "라플라스 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "라플라스에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-23-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 라플라스 계약 탭 전체, 숨김 탭 정책, 헤더 행·다단 헤더·수식 결과·IMPORTRANGE/QUERY 의존성. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "라플라스 계약 탭 전체, 숨김 탭 정책, 헤더 행·다단 헤더·수식 결과·IMPORTRANGE/QUERY 의존성에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 대상 탭·숨김 탭·헤더/2단 헤더·IMPORTRANGE/QUERY·페이지 격자·헤더 drift 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-23-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 카페24 를 다시 가공한 2차 데이터. 가치는 담당자가 만든 옵션→기초상품 매핑표 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-23-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "대상 탭·숨김 탭·헤더/2단 헤더·IMPORTRANGE/QUERY·페이지 격자·헤더 drift 실패 분기 필요. 승인된 폴백: 라플라스 매핑 엑셀 반출(④)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-23-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=변경 5분 감지 + 1시간 정합 재수집. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "변경 5분 감지 + 1시간 정합 재수집 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-23-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#23 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-40",
              "title": "#40 신제품 코드 요청·제품정보",
              "status": "blocked",
              "detail": "제품개발 · 입력 원장. 목표=api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림; 현재 접근은 시트 ID·공유·링크 중 하나가 미확정 또는 403/404. 카탈로그의 차단 사유 해소 필요.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→변경 5분 감지 + 1시간 정합 재수집 2회→증거 동결.",
              "source": {
                "row_id": "40",
                "name": "신제품 코드 요청·제품정보",
                "kind": "입력 원장",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림",
                "current_state": "시트 ID·공유·링크 중 하나가 미확정 또는 403/404. 카탈로그의 차단 사유 해소 필요.",
                "conditions": "무인 인증 주체(서비스 계정 재공유 또는 읽기 전용 위임)",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-40-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #40 분류 기준은 있음: 업무=제품개발, 유형=입력 원장. 36_ 우선 결정은 api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림. 실객체·기간·권위 범위 승인은 남음. 2026-10-14 갱신(묶음④): 9/29 T0 done 은 빈 양식 xlsx Read 였고 요청 이력 Read 아님. H1 이면 권위 원천은 ERP 품목마스터이고 #40 은 요청 이력 — 병합·종료 여부 사용자 결정 필요.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/source40-hypotheses.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#40의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-40-access",
                  "title": "읽기 전용 접근",
                  "status": "blocked",
                  "detail": "시트 ID·공유·링크 중 하나가 미확정 또는 403/404. 카탈로그의 차단 사유 해소 필요. 2026-10-14 갱신(묶음④): 원천 목록에 시트 없음. Drive(wishket@) 검색 결과 9/10 빈 양식 1건뿐 — 작성본 미발견. 결과물 적재 위치 가설 H1(메일·메신저→SCM 채번→ERP 품목마스터) 유력, 확인 질문 38-drafts B.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/source40-hypotheses.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/38-drafts.md"
                  ],
                  "next": "무인 인증 주체(서비스 계정 재공유 또는 읽기 전용 위임)",
                  "criterion": "신제품 코드 요청·제품정보 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-40-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림 경로의 account/object, parser, 개인정보 제거기, 변경 5분 감지 + 1시간 정합 재수집 schedule을 원천별로 고정한다.",
                  "criterion": "#40에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 대상 탭·숨김 탭·헤더/2단 헤더·IMPORTRANGE/QUERY·페이지 격자·헤더 drift 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-40-live-read",
                  "title": "실계정 첫 Read",
                  "status": "blocked",
                  "detail": "시트 ID·공유·링크 중 하나가 미확정 또는 403/404. 카탈로그의 차단 사유 해소 필요. 실 Read 완료는 신제품 코드 요청·제품정보 전 범위 원문이 raw lake에 착지한 실행으로 다시 증명해야 함.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "신제품 코드 요청·제품정보에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-40-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 신제품 코드 요청·제품정보 계약 탭 전체, 숨김 탭 정책, 헤더 행·다단 헤더·수식 결과·IMPORTRANGE/QUERY 의존성. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "신제품 코드 요청·제품정보 계약 탭 전체, 숨김 탭 정책, 헤더 행·다단 헤더·수식 결과·IMPORTRANGE/QUERY 의존성에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 대상 탭·숨김 탭·헤더/2단 헤더·IMPORTRANGE/QUERY·페이지 격자·헤더 drift 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-40-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=상. 근거: 그 업무의 유일한 기록(계획·프로모션·기준정보). 단 자유 서식이라 구조 드리프트 감시 필요 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-40-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "대상 탭·숨김 탭·헤더/2단 헤더·IMPORTRANGE/QUERY·페이지 격자·헤더 drift 실패 분기 필요. 승인된 폴백: 읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-40-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=변경 5분 감지 + 1시간 정합 재수집. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "변경 5분 감지 + 1시간 정합 재수집 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-40-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#40 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-43",
              "title": "#43 VOC 수기시트·리포트",
              "status": "partial",
              "detail": "VOC · 원천. 목표=api_interface: 공유되면 Sheets API; 현재 접근은 2026-10-11 병합 판정(추정): #69 과 같은 객체. 고객 10/8 회신(#51 경로1)이 VOC 시트로 「VOC 관련 제품 클레임 시트」를 가리켰고, 그 시트가 #69 품질 클레임(READ_COMPLETE)이다. 별도 VOC 수기 리포트가 있는지는 확인 필요.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→변경 5분 감지 + 1시간 정합 재수집 2회→증거 동결.",
              "source": {
                "row_id": "43",
                "name": "VOC 수기시트·리포트",
                "kind": "원천",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: 공유되면 Sheets API",
                "current_state": "2026-10-11 병합 판정(추정): #69 과 같은 객체. 고객 10/8 회신(#51 경로1)이 VOC 시트로 「VOC 관련 제품 클레임 시트」를 가리켰고, 그 시트가 #69 품질 클레임(READ_COMPLETE)이다. 별도 VOC 수기 리포트가 있는지는 확인 필요.",
                "conditions": "VOC 시트 공유 · 원 시스템 확인",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-43-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #43 분류 기준은 있음: 업무=VOC, 유형=원천. 36_ 우선 결정은 api_interface: 공유되면 Sheets API. 실객체·기간·권위 범위 승인은 남음. 2026-10-14 갱신(live-read-1011): #69 품질 클레임 시트와 같은 객체로 병합 판정(추정 — 10/8 회신 #51 경로1). 별도 VOC 수기 리포트 유무는 RM팀 확인.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#43의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-43-access",
                  "title": "읽기 전용 접근",
                  "status": "partial",
                  "detail": "2026-10-11 병합 판정(추정): #69 과 같은 객체. 고객 10/8 회신(#51 경로1)이 VOC 시트로 「VOC 관련 제품 클레임 시트」를 가리켰고, 그 시트가 #69 품질 클레임(READ_COMPLETE)이다. 별도 VOC 수기 리포트가 있는지는 확인 필요. 2026-10-14 갱신(묶음④): 38_ 14번 회신 대기. 회신 당일 runbook·드라이버 준비(probe→read, 증거는 개수·SHA-256만). #43 은 개인정보 게이트로 헤더 승인 전 값 Read 보류.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/sheets-runbook.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/scripts/reply_day_sheet_read.py"
                  ],
                  "next": "VOC 시트 공유 · 원 시스템 확인",
                  "criterion": "VOC 수기시트·리포트 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-43-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "api_interface: 공유되면 Sheets API 경로의 account/object, parser, 개인정보 제거기, 변경 5분 감지 + 1시간 정합 재수집 schedule을 원천별로 고정한다.",
                  "criterion": "#43에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 대상 탭·숨김 탭·헤더/2단 헤더·IMPORTRANGE/QUERY·페이지 격자·헤더 drift 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-43-live-read",
                  "title": "실계정 첫 Read",
                  "status": "partial",
                  "detail": "#69 의 Read 로 같은 객체를 읽는다(병합 판정 — 고객 확인 전). 이 번호로 따로 읽지 않는다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "VOC 수기시트·리포트에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-43-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: VOC 시트 전체 대상 탭; 개인정보 열을 포함할 수 있어 헤더 고정 뒤 redacted 사본만 stg 진입. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "VOC 시트 전체 대상 탭; 개인정보 열을 포함할 수 있어 헤더 고정 뒤 redacted 사본만 stg 진입에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 대상 탭·숨김 탭·헤더/2단 헤더·IMPORTRANGE/QUERY·페이지 격자·헤더 drift 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-43-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 수기 시트. 원 업무시스템 여부 미확인 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-43-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "대상 탭·숨김 탭·헤더/2단 헤더·IMPORTRANGE/QUERY·페이지 격자·헤더 drift 실패 분기 필요. 승인된 폴백: 읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-43-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=변경 5분 감지 + 1시간 정합 재수집. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "변경 5분 감지 + 1시간 정합 재수집 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-43-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#43 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-52",
              "title": "#52 면세점 매출 취합",
              "status": "done",
              "detail": "매출취합 · 파생. 목표=api_interface: Sheets API 로 읽되 대사용. 원천 #47~51 연결 후 격하; E1–E9 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 bde834a25781. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-52.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "52",
                "name": "면세점 매출 취합",
                "kind": "파생",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 로 읽되 대사용. 원천 #47~51 연결 후 격하",
                "current_state": "E1–E9 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 bde834a25781. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "—",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-52-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 bde834a25781.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-52.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-52-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 bde834a25781.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-52.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-52-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 bde834a25781.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-52.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-52-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 bde834a25781.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-52.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-28_google-correct-account/checklist-release-public-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-52-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 bde834a25781.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-52.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-52-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 bde834a25781.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-52.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-52-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 bde834a25781.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-52.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-52-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 bde834a25781.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-52.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-52-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 bde834a25781. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-52.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-53",
              "title": "#53 다이소 SO 시트",
              "status": "done",
              "detail": "채널 · 파생. 목표=api_interface: Sheets API 로 읽되 대사용. 원천 다이소 포털(행 없음) 연결 후 격하; E1–E9 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 4938f9b40daf. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-53.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "53",
                "name": "다이소 SO 시트",
                "kind": "파생",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 로 읽되 대사용. 원천 다이소 포털(행 없음) 연결 후 격하",
                "current_state": "E1–E9 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 4938f9b40daf. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "다이소 원천 행이 매트릭스에 없음. 협력사 시스템 존재도 공개 자료 없음 → 로그인 URL·파일 종류부터 확보",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-53-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 4938f9b40daf.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-53.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-53-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 4938f9b40daf.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-53.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-53-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 4938f9b40daf.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-53.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-53-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 4938f9b40daf.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-53.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-28_google-correct-account/checklist-release-public-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-53-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 4938f9b40daf.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-53.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-53-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 4938f9b40daf.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-53.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-53-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 4938f9b40daf.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-53.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-53-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 4938f9b40daf.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-53.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-53-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 4938f9b40daf. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-53.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-59",
              "title": "#59 무가 인플루언서 성과",
              "status": "partial",
              "detail": "콘텐츠 · 입력 원장. 목표=api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림; 현재 접근은 2026-09-27 읽기 전용 개발 계정으로 탭 구조만 실측. 고객 값·완전성·반복 수집은 미검증.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→변경 5분 감지 + 1시간 정합 재수집 2회→증거 동결.",
              "source": {
                "row_id": "59",
                "name": "무가 인플루언서 성과",
                "kind": "입력 원장",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림",
                "current_state": "2026-09-27 읽기 전용 개발 계정으로 탭 구조만 실측. 고객 값·완전성·반복 수집은 미검증.",
                "conditions": "무인 인증 주체(서비스 계정 재공유 또는 읽기 전용 위임) · 유튜브분은 YouTube Data API 로 대체(#64)",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-59-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #59 분류 기준은 있음: 업무=콘텐츠, 유형=입력 원장. 36_ 우선 결정은 api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#59의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-59-access",
                  "title": "읽기 전용 접근",
                  "status": "partial",
                  "detail": "2026-09-27 읽기 전용 개발 계정으로 탭 구조만 실측. 고객 값·완전성·반복 수집은 미검증.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "무인 인증 주체(서비스 계정 재공유 또는 읽기 전용 위임) · 유튜브분은 YouTube Data API 로 대체(#64)",
                  "criterion": "무가 인플루언서 성과 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-59-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지. 이전 실측·합성 근거(묶음②·L2)는 evidence로 보존.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "docs/work-log/2026-09-30_partial-read-completion/evidence/probe-59-82.json",
                    "docs/work-log/2026-09-30_partial-read-completion/proposals/59-ordinal13-pin.patch",
                    "docs/work-log/2026-09-30_partial-read-completion/sheets-59-82.md",
                    "docs/work-log/2026-09-30_todo-l2-read-now/decision-59.md"
                  ],
                  "next": "api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림 경로의 account/object, parser, 개인정보 제거기, 변경 5분 감지 + 1시간 정합 재수집 schedule을 원천별로 고정한다.",
                  "criterion": "#59에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 대상 탭·숨김 탭·헤더/2단 헤더·IMPORTRANGE/QUERY·페이지 격자·헤더 drift 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-59-live-read",
                  "title": "실계정 첫 Read",
                  "status": "partial",
                  "detail": "2026-09-27 읽기 전용 개발 계정으로 탭 구조만 실측. 고객 값·완전성·반복 수집은 미검증. 실 Read 완료는 무가 인플루언서 성과 전 범위 원문이 raw lake에 착지한 실행으로 다시 증명해야 함.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "무가 인플루언서 성과에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-59-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 무가 인플루언서 성과의 보이는 전체 탭; 탭별 헤더 위치와 개인정보 사본 검증. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "무가 인플루언서 성과의 보이는 전체 탭; 탭별 헤더 위치와 개인정보 사본 검증에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 대상 탭·숨김 탭·헤더/2단 헤더·IMPORTRANGE/QUERY·페이지 격자·헤더 drift 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-59-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 시딩 목록은 입력 원장, 조회수 등 지표 값은 사람이 옮겨 적은 사본(원천 #64·H7) — 혼합 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-59-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "대상 탭·숨김 탭·헤더/2단 헤더·IMPORTRANGE/QUERY·페이지 격자·헤더 drift 실패 분기 필요. 승인된 폴백: 읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-59-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=변경 5분 감지 + 1시간 정합 재수집. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "변경 5분 감지 + 1시간 정합 재수집 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-59-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#59 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-61",
              "title": "#61 공식몰 상품별 실적",
              "status": "done",
              "detail": "채널 · 파생. 목표=api_interface: Sheets API 로 읽되 대사용. 원천 #19 연결 후 격하; E1–E9 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 405ea2f402e1. 누적 기간 헤더 라벨 정규화(volatile_header) 기준 해시 수락. 수식 오류 토큰 2개 원천 표시값 보존. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-61.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "61",
                "name": "공식몰 상품별 실적",
                "kind": "파생",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 로 읽되 대사용. 원천 #19 연결 후 격하",
                "current_state": "E1–E9 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 405ea2f402e1. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "—",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-61-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 405ea2f402e1.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-61.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-61-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 405ea2f402e1.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-61.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-61-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 405ea2f402e1.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-61.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-61-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 405ea2f402e1.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-61.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-28_google-correct-account/checklist-release-public-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-61-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 405ea2f402e1.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-61.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-61-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 405ea2f402e1.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-61.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-61-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 405ea2f402e1.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-61.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-61-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 405ea2f402e1.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-61.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-61-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 405ea2f402e1. 누적 기간 헤더 라벨 정규화(volatile_header) 기준 해시 수락. 수식 오류 토큰 2개 원천 표시값 보존. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-61.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-62",
              "title": "#62 프로모션 캘린더",
              "status": "done",
              "detail": "프로모션 · 입력 원장. 목표=api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림; E1–E9 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 17c0262c9c61. #67과 같은 Google 객체를 공유하는 별도 권위 계약이다. 두 원천은 각각 평가·서명됐으며 고유 Google 객체 수는 sheet-shared-62-67로 중복 제거한다. 선택 탭 6개 중 빈 탭 1개의 업무 의도는 미해결(소유자 질문, Read 차단 사유 아님). READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4-source62-67/source-62.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "62",
                "name": "프로모션 캘린더",
                "kind": "입력 원장",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림",
                "current_state": "E1–E9 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 17c0262c9c61. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "무인 인증 주체(서비스 계정 재공유 또는 읽기 전용 위임)",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-62-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 17c0262c9c61.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4-source62-67/source-62.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-62-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 17c0262c9c61.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4-source62-67/source-62.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-62-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 17c0262c9c61.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4-source62-67/source-62.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-62-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 17c0262c9c61.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4-source62-67/source-62.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-28_google-correct-account/checklist-release-public-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-62-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 17c0262c9c61.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4-source62-67/source-62.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-62-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 17c0262c9c61.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4-source62-67/source-62.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-62-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 17c0262c9c61.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4-source62-67/source-62.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-62-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 17c0262c9c61.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4-source62-67/source-62.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-62-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 17c0262c9c61. #67과 같은 Google 객체를 공유하는 별도 권위 계약이다. 두 원천은 각각 평가·서명됐으며 고유 Google 객체 수는 sheet-shared-62-67로 중복 제거한다. 선택 탭 6개 중 빈 탭 1개의 업무 의도는 미해결(소유자 질문, Read 차단 사유 아님). READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4-source62-67/source-62.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-63",
              "title": "#63 예산(전사 광고선전비)",
              "status": "done",
              "detail": "예산 · 입력 원장. 목표=api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림; E1–E9 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 27992a9f64ed. Read 범위 = 보이는 9탭 1객체(숨김 1탭 제외) · 탭별 머리행 자동 감지. 카탈로그 BLOCKED 를 러너가 ACTIVE 로 덮어 읽음(D-63-CATALOG 승인). 수식 오류 토큰 2개 원천 표시값 보존. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                "docs/work-log/2026-10-11_read-occurrence/manifests/source-63.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "63",
                "name": "예산(전사 광고선전비)",
                "kind": "입력 원장",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림",
                "current_state": "E1–E9 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 27992a9f64ed. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "무인 인증 주체(서비스 계정 재공유 또는 읽기 전용 위임) · MC팀 공유",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-63-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 27992a9f64ed.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-63.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-63-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 27992a9f64ed.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-63.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-63-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 27992a9f64ed.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-63.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-63-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 27992a9f64ed.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-63.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-11_live-read/read-evidence-sanitized.json"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-63-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 27992a9f64ed.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-63.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-63-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 27992a9f64ed.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-63.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-63-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 27992a9f64ed.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-63.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-63-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 27992a9f64ed.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-63.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-63-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 27992a9f64ed. Read 범위 = 보이는 9탭 1객체(숨김 1탭 제외) · 탭별 머리행 자동 감지. 카탈로그 BLOCKED 를 러너가 ACTIVE 로 덮어 읽음(D-63-CATALOG 승인). 수식 오류 토큰 2개 원천 표시값 보존. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-63.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-66",
              "title": "#66 2026 마케팅 캘린더",
              "status": "done",
              "detail": "프로모션 · 입력 원장. 목표=api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림; E1–E9 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 656827fbfcbc. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-66.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "66",
                "name": "2026 마케팅 캘린더",
                "kind": "입력 원장",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림",
                "current_state": "E1–E9 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 656827fbfcbc. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "무인 인증 주체(서비스 계정 재공유 또는 읽기 전용 위임)",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-66-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 656827fbfcbc.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-66.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-66-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 656827fbfcbc.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-66.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-66-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 656827fbfcbc.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-66.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-66-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 656827fbfcbc.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-66.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-28_google-correct-account/checklist-release-public-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-66-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 656827fbfcbc.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-66.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-66-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 656827fbfcbc.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-66.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-66-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 656827fbfcbc.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-66.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-66-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 656827fbfcbc.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-66.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-66-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 656827fbfcbc. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-66.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-67",
              "title": "#67 채널별 프로모션 취합",
              "status": "done",
              "detail": "프로모션 · 입력 원장. 목표=api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림; E1–E9 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 104c9e710878. READ_COMPLETE는 권위 원천 주장이 아니다(카탈로그상 비권위, 권위는 #62). 탭 분리 뒤 더 좁은 #67 selector는 새 closure revision이 필요하다. #62와 같은 Google 객체이며 고유 객체 수는 sheet-shared-62-67로 중복 제거한다. 빈 탭 1개의 업무 의도는 미해결. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4-source62-67/source-67.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "67",
                "name": "채널별 프로모션 취합",
                "kind": "입력 원장",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림",
                "current_state": "E1–E9 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 104c9e710878. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "무인 인증 주체(서비스 계정 재공유 또는 읽기 전용 위임)",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-67-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 104c9e710878.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4-source62-67/source-67.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-67-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 104c9e710878.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4-source62-67/source-67.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-67-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 104c9e710878.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4-source62-67/source-67.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-67-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 104c9e710878.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4-source62-67/source-67.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-28_google-correct-account/checklist-release-public-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-67-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 104c9e710878.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4-source62-67/source-67.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-67-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 104c9e710878.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4-source62-67/source-67.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-67-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 104c9e710878.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4-source62-67/source-67.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-67-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 104c9e710878.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4-source62-67/source-67.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-67-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 104c9e710878. READ_COMPLETE는 권위 원천 주장이 아니다(카탈로그상 비권위, 권위는 #62). 탭 분리 뒤 더 좁은 #67 selector는 새 closure revision이 필요하다. #62와 같은 Google 객체이며 고유 객체 수는 sheet-shared-62-67로 중복 제거한다. 빈 탭 1개의 업무 의도는 미해결. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4-source62-67/source-67.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-69",
              "title": "#69 품질 클레임(RM CS)",
              "status": "done",
              "detail": "CS·품질 · 입력 원장. 목표=api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림; E1–E9 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 582f55300abd. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-69.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "69",
                "name": "품질 클레임(RM CS)",
                "kind": "입력 원장",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림",
                "current_state": "E1–E9 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 582f55300abd. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "무인 인증 주체(서비스 계정 재공유 또는 읽기 전용 위임)",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-69-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 582f55300abd.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-69.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-69-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 582f55300abd.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-69.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-69-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 582f55300abd.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-69.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-69-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 582f55300abd.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-69.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-28_google-correct-account/checklist-release-public-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-69-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 582f55300abd.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-69.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-69-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 582f55300abd.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-69.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-69-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 582f55300abd.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-69.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-69-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 582f55300abd.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-69.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-69-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-09-29T17:11:37Z READ_COMPLETE, manifest SHA-256 582f55300abd. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-09-30_read-complete-e5-e9/approvals/root-read-complete-e5-e9-r1-signature.json",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/manifests/source-69.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-70",
              "title": "#70 시장출하적부판정서(RM QC)",
              "status": "done",
              "detail": "품질 · 파생. 목표=api_interface: Sheets API 로 읽되 대사용. 원천 확인 필요 연결 후 격하; E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 39997c5a15c2. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-70.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "70",
                "name": "시장출하적부판정서(RM QC)",
                "kind": "파생",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 로 읽되 대사용. 원천 확인 필요 연결 후 격하",
                "current_state": "E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 39997c5a15c2. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "다운로드 원 시스템 확인",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-70-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 39997c5a15c2.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-70.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-70-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 39997c5a15c2.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-70.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-70-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 39997c5a15c2.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-70.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-70-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 39997c5a15c2.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-70.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-28_google-correct-account/checklist-release-public-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-70-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 39997c5a15c2.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-70.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-70-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 39997c5a15c2.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-70.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-70-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 39997c5a15c2.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-70.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-70-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 39997c5a15c2.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-70.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-70-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 39997c5a15c2. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-70.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-71",
              "title": "#71 <필수> 기준정보(Apps Script)",
              "status": "blocked",
              "detail": "기준정보 · 입력 원장. 목표=api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림; 현재 접근은 시트 ID·공유·링크 중 하나가 미확정 또는 403/404. 카탈로그의 차단 사유 해소 필요.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→변경 5분 감지 + 1시간 정합 재수집 2회→증거 동결.",
              "source": {
                "row_id": "71",
                "name": "<필수> 기준정보(Apps Script)",
                "kind": "입력 원장",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림",
                "current_state": "시트 ID·공유·링크 중 하나가 미확정 또는 403/404. 카탈로그의 차단 사유 해소 필요.",
                "conditions": "무인 인증 주체(서비스 계정 재공유 또는 읽기 전용 위임) · 기반 시트 ID 확인",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-71-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #71 분류 기준은 있음: 업무=기준정보, 유형=입력 원장. 36_ 우선 결정은 api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#71의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-71-access",
                  "title": "읽기 전용 접근",
                  "status": "blocked",
                  "detail": "시트 ID·공유·링크 중 하나가 미확정 또는 403/404. 카탈로그의 차단 사유 해소 필요. 2026-10-14 갱신(묶음④): 38_ 14번 회신 대기. 회신 당일 runbook·드라이버 준비(probe→read, 증거는 개수·SHA-256만).",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/sheets-runbook.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/scripts/reply_day_sheet_read.py"
                  ],
                  "next": "무인 인증 주체(서비스 계정 재공유 또는 읽기 전용 위임) · 기반 시트 ID 확인",
                  "criterion": "<필수> 기준정보(Apps Script) 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-71-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림 경로의 account/object, parser, 개인정보 제거기, 변경 5분 감지 + 1시간 정합 재수집 schedule을 원천별로 고정한다.",
                  "criterion": "#71에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 대상 탭·숨김 탭·헤더/2단 헤더·IMPORTRANGE/QUERY·페이지 격자·헤더 drift 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-71-live-read",
                  "title": "실계정 첫 Read",
                  "status": "blocked",
                  "detail": "시트 ID·공유·링크 중 하나가 미확정 또는 403/404. 카탈로그의 차단 사유 해소 필요. 실 Read 완료는 <필수> 기준정보(Apps Script) 전 범위 원문이 raw lake에 착지한 실행으로 다시 증명해야 함.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "<필수> 기준정보(Apps Script)에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-71-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: <필수> 기준정보(Apps Script) 계약 탭 전체, 숨김 탭 정책, 헤더 행·다단 헤더·수식 결과·IMPORTRANGE/QUERY 의존성. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "<필수> 기준정보(Apps Script) 계약 탭 전체, 숨김 탭 정책, 헤더 행·다단 헤더·수식 결과·IMPORTRANGE/QUERY 의존성에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 대상 탭·숨김 탭·헤더/2단 헤더·IMPORTRANGE/QUERY·페이지 격자·헤더 drift 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-71-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=상. 근거: 그 업무의 유일한 기록(계획·프로모션·기준정보). 단 자유 서식이라 구조 드리프트 감시 필요 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-71-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "대상 탭·숨김 탭·헤더/2단 헤더·IMPORTRANGE/QUERY·페이지 격자·헤더 drift 실패 분기 필요. 승인된 폴백: 읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-71-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=변경 5분 감지 + 1시간 정합 재수집. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "변경 5분 감지 + 1시간 정합 재수집 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-71-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#71 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-74",
              "title": "#74 올리브영 프로모션 캘린더",
              "status": "done",
              "detail": "프로모션 · 입력 원장. 목표=api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림; E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 b77dcd66a6ed. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-74.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "74",
                "name": "올리브영 프로모션 캘린더",
                "kind": "입력 원장",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림",
                "current_state": "E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 b77dcd66a6ed. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "무인 인증 주체(서비스 계정 재공유 또는 읽기 전용 위임)",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-74-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 b77dcd66a6ed.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-74.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-74-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 b77dcd66a6ed.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-74.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-74-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 b77dcd66a6ed.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-74.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-74-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 b77dcd66a6ed.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-74.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-28_google-correct-account/checklist-release-public-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-74-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 b77dcd66a6ed.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-74.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-74-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 b77dcd66a6ed.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-74.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-74-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 b77dcd66a6ed.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-74.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-74-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 b77dcd66a6ed.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-74.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-74-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 b77dcd66a6ed. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-74.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-75",
              "title": "#75 올리브영 셀아웃 시트",
              "status": "done",
              "detail": "채널 · 파생. 목표=api_interface: Sheets API 로 읽되 대사용. 원천 #17 연결 후 격하; E1–E9 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 945fe579f0fe. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-75.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "75",
                "name": "올리브영 셀아웃 시트",
                "kind": "파생",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 로 읽되 대사용. 원천 #17 연결 후 격하",
                "current_state": "E1–E9 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 945fe579f0fe. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "—",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-75-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 945fe579f0fe.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-75.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-75-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 945fe579f0fe.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-75.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-75-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 945fe579f0fe.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-75.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-75-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 945fe579f0fe.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-75.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-28_google-correct-account/checklist-release-public-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-75-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 945fe579f0fe.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-75.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-75-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 945fe579f0fe.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-75.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-75-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 945fe579f0fe.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-75.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-75-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 945fe579f0fe.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-75.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-75-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-09-29T07:57:35Z READ_COMPLETE, manifest SHA-256 945fe579f0fe. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r4/source-75.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-76",
              "title": "#76 품고 재고 상태 체크(네이버)",
              "status": "done",
              "detail": "재고 · 파생. 목표=api_interface: Sheets API 로 읽되 대사용. 원천 #4 연결 후 격하; E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 9c77ee5a3c7e. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-76.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "76",
                "name": "품고 재고 상태 체크(네이버)",
                "kind": "파생",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 로 읽되 대사용. 원천 #4 연결 후 격하",
                "current_state": "E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 9c77ee5a3c7e. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "—",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-76-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 9c77ee5a3c7e.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-76.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-76-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 9c77ee5a3c7e.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-76.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-76-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 9c77ee5a3c7e.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-76.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-76-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 9c77ee5a3c7e.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-76.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-28_google-correct-account/checklist-release-public-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-76-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 9c77ee5a3c7e.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-76.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-76-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 9c77ee5a3c7e.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-76.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-76-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 9c77ee5a3c7e.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-76.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-76-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 9c77ee5a3c7e.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-76.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-76-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 9c77ee5a3c7e. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-76.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-77",
              "title": "#77 네이버 셀아웃 원장·SUS",
              "status": "done",
              "detail": "채널 · 파생. 목표=api_interface: Sheets API 로 읽되 대사용. 원천 H1 연결 후 격하; E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 660a496cdf44. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-77.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "77",
                "name": "네이버 셀아웃 원장·SUS",
                "kind": "파생",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 로 읽되 대사용. 원천 H1 연결 후 격하",
                "current_state": "E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 660a496cdf44. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "—",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-77-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 660a496cdf44.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-77.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-77-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 660a496cdf44.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-77.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-77-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 660a496cdf44.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-77.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-77-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 660a496cdf44.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-77.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-28_google-correct-account/checklist-release-public-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-77-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 660a496cdf44.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-77.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-77-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 660a496cdf44.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-77.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-77-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 660a496cdf44.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-77.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-77-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 660a496cdf44.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-77.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-77-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 660a496cdf44. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-77.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-78",
              "title": "#78 네이버 셀아웃 원장·CFC",
              "status": "done",
              "detail": "채널 · 파생. 목표=api_interface: Sheets API 로 읽되 대사용. 원천 H1 연결 후 격하; E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 e070eaff86e2. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-78.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "78",
                "name": "네이버 셀아웃 원장·CFC",
                "kind": "파생",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 로 읽되 대사용. 원천 H1 연결 후 격하",
                "current_state": "E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 e070eaff86e2. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "—",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-78-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 e070eaff86e2.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-78.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-78-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 e070eaff86e2.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-78.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-78-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 e070eaff86e2.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-78.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-78-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 e070eaff86e2.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-78.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-28_google-correct-account/checklist-release-public-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-78-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 e070eaff86e2.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-78.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-78-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 e070eaff86e2.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-78.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-78-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 e070eaff86e2.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-78.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-78-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 e070eaff86e2.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-78.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-78-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 e070eaff86e2. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-78.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-79",
              "title": "#79 네이버 셀아웃 최종(품고 기반)",
              "status": "done",
              "detail": "채널 · 파생. 목표=api_interface: Sheets API 로 읽되 대사용. 원천 #4·H1 연결 후 격하; E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 c966c0923d5e. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-79.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "79",
                "name": "네이버 셀아웃 최종(품고 기반)",
                "kind": "파생",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 로 읽되 대사용. 원천 #4·H1 연결 후 격하",
                "current_state": "E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 c966c0923d5e. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "Y: 드라이브 사본은 Workspace API 로 못 읽음",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-79-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 c966c0923d5e.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-79.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-79-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 c966c0923d5e.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-79.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-79-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 c966c0923d5e.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-79.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-79-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 c966c0923d5e.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-79.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-28_google-correct-account/checklist-release-public-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-79-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 c966c0923d5e.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-79.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-79-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 c966c0923d5e.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-79.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-79-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 c966c0923d5e.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-79.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-79-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 c966c0923d5e.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-79.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-79-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 c966c0923d5e. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-79.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-80",
              "title": "#80 네이버 운영코드 원장",
              "status": "done",
              "detail": "기준정보 · 입력 원장. 목표=api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림; E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 453f4b517f42. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-80.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "80",
                "name": "네이버 운영코드 원장",
                "kind": "입력 원장",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림",
                "current_state": "E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 453f4b517f42. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "무인 인증 주체(서비스 계정 재공유 또는 읽기 전용 위임)",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-80-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 453f4b517f42.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-80.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-80-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 453f4b517f42.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-80.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-80-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 453f4b517f42.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-80.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-80-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 453f4b517f42.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-80.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-28_google-correct-account/checklist-release-public-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-80-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 453f4b517f42.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-80.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-80-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 453f4b517f42.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-80.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-80-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 453f4b517f42.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-80.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-80-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 453f4b517f42.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-80.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-80-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 453f4b517f42. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-80.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-81",
              "title": "#81 네이버 월별 지출 정산",
              "status": "done",
              "detail": "정산 · 파생. 목표=api_interface: Sheets API 로 읽되 대사용. 원천 H1 연결 후 격하; E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 93474c6f75cc. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-81.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "81",
                "name": "네이버 월별 지출 정산",
                "kind": "파생",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 로 읽되 대사용. 원천 H1 연결 후 격하",
                "current_state": "E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 93474c6f75cc. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "—",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-81-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 93474c6f75cc.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-81.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-81-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 93474c6f75cc.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-81.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-81-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 93474c6f75cc.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-81.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-81-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 93474c6f75cc.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-81.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-28_google-correct-account/checklist-release-public-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-81-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 93474c6f75cc.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-81.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-81-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 93474c6f75cc.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-81.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-81-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 93474c6f75cc.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-81.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-81-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 93474c6f75cc.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-81.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-81-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 93474c6f75cc. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-81.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-82",
              "title": "#82 온라인 전체 월간 매출",
              "status": "partial",
              "detail": "매출취합 · 파생. 목표=api_interface: Sheets API 로 읽되 대사용. 원천 #39·H1 연결 후 격하; 현재 접근은 2026-09-27 승인된 읽기 전용 신원으로 exact 문서·선택 gid를 확인하고 private canonical one-shot을 완료. 장기 실행 주체와 반복 운영 승인은 남음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→변경 5분 감지 + 1시간 정합 재수집 2회→증거 동결.",
              "source": {
                "row_id": "82",
                "name": "온라인 전체 월간 매출",
                "kind": "파생",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 로 읽되 대사용. 원천 #39·H1 연결 후 격하",
                "current_state": "2026-09-27 승인된 읽기 전용 신원으로 exact 문서·선택 gid를 확인하고 private canonical one-shot을 완료. 장기 실행 주체와 반복 운영 승인은 남음.",
                "conditions": "두 번째 링크 공유",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-82-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #82 분류 기준은 있음: 업무=매출취합, 유형=파생. 36_ 우선 결정은 api_interface: Sheets API 로 읽되 대사용. 원천 #39·H1 연결 후 격하. 실객체·기간·권위 범위 승인은 남음. 2026-10-14 갱신(발생1011): 2026-10-11 read-occurrence: 범위 manifest(객체·탭·숨김 정책·헤더·권위·기간) 작성. 루트 E1 승인 대기. 범위 = 주 문서(main)만 — 보조 문서(second) HTTP 404, D-82-SECONDARY. 판정 ROOT_APPROVABLE.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-82.json"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#82의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-82-access",
                  "title": "읽기 전용 접근",
                  "status": "partial",
                  "detail": "2026-09-27 승인된 읽기 전용 신원으로 exact 문서·선택 gid를 확인하고 private canonical one-shot을 완료. 장기 실행 주체와 반복 운영 승인은 남음. 2026-10-14 갱신(공유실측1003 · 재바인딩1011 · 발생1011): 10/3 수집 계정 조회: 주 스프레드시트(9/30 200)와 보조 문서 모두 404 — 공유 해제 또는 이동. 재공유 전 E4 이후 진행 불가. 2026-10-11 갱신: 10/8 RBD1팀이 새 파일(「1. RBD_온오프_매출관리 파일」, 문서 ID 변경)로 다시 공유했고 카탈로그 · 바인딩을 새 ID 로 옮겼다(gid 366360526 그대로) — 주 문서는 다시 열림(partial 유지). 보조 문서(17Telw…)는 여전히 404. 2026-10-11 read-occurrence: 수집 계정 gws 읽기 전용, GET 3종 허용 목록, 원천 쓰기 호출 0 — A·R·B 세 발생 접근 증거. 판정 PASS.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "docs/work-log/2026-10-03_share-status/share-probe-sanitized.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-82.json"
                  ],
                  "next": "두 번째 링크 공유",
                  "criterion": "온라인 전체 월간 매출 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-82-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지. 이전 실측·합성 근거(발생1011)는 evidence로 보존.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-82.json"
                  ],
                  "next": "api_interface: Sheets API 로 읽되 대사용. 원천 #39·H1 연결 후 격하 경로의 account/object, parser, 개인정보 제거기, 변경 5분 감지 + 1시간 정합 재수집 schedule을 원천별로 고정한다.",
                  "criterion": "#82에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 대상 탭·숨김 탭·헤더/2단 헤더·IMPORTRANGE/QUERY·페이지 격자·헤더 drift 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-82-live-read",
                  "title": "실계정 첫 Read",
                  "status": "partial",
                  "detail": "2026-09-27 primary spreadsheet의 canonical raw·manifest·private staging 적재와 SHA-256을 검증. 두 번째 spreadsheet는 403이라 #82 전체 E4는 partial이며 E5~E9도 미완료. 2026-10-14 갱신(묶음②·L2 · live-read-1011 · 발생1011): 2026-09-30 01:24 KST 수집 계정 재조회: 주 스프레드시트 200(21탭), 보조 스프레드시트 Sheets 403 · Drive 404(미공유). 35_ 15번의 「#82 해소」는 주 문서에만 맞다. 보조 공유 전 E5~E8 진행 불가. 2026-09-30 L2 재조회(11:32Z, 수집 계정 authorized-user): 주 문서 200·21탭, 보조 문서 Sheets 403 · Drive 404 그대로. E5~E8 진행 불가 — 38_ 14번(L2-D). 2026-10-11 갱신: 새 주 스프레드시트(10/8 재공유) 전 탭 첫 실 Read(탭 21) — 레이크 착지 · SHA-256 기록. 보조 문서(17Telw…)는 여전히 404 라 E4 는 partial 유지. 2026-10-11 read-occurrence: 플랫폼 수집기 경로 A·B — FORMATTED_VALUE raw 착지·SHA-256·Drive modifiedTime→source_as_of≤extracted·수집 상태 확정, 비공개 staging 동등 행. 범위 = 주 문서(main)만 — 보조 문서(second) HTTP 404, D-82-SECONDARY. 판정 PASS.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-28_google-correct-account/checklist-release-public-evidence.md",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-82.json",
                    "docs/work-log/2026-09-30_partial-read-completion/evidence/probe-59-82.json",
                    "docs/work-log/2026-09-30_partial-read-completion/sheets-59-82.md",
                    "docs/work-log/2026-09-30_todo-l2-read-now/evidence/probe-l2.json",
                    "docs/work-log/2026-10-11_live-read/read-evidence-sanitized.json"
                  ],
                  "next": "온라인 전체 월간 매출에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-82-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "partial",
                  "detail": "원천별 Read 범위: 온라인 월간 매출 두 스프레드시트; 주 파일과 접근 막힌 보조 파일을 한 계약 범위로 대조. 아직 전체 객체의 누락 검증 증거 없음. 2026-10-14 갱신(발생1011): 2026-10-11 read-occurrence: 객체별 예상 탭 수=실제=range 수, raw 행=staging 행, 중복 identity 0, 비GRID 제외 0. 범위 = 주 문서(main)만 — 보조 문서(second) HTTP 404, D-82-SECONDARY. 판정 PASS.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-82.json"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "온라인 월간 매출 두 스프레드시트; 주 파일과 접근 막힌 보조 파일을 한 계약 범위로 대조에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 대상 탭·숨김 탭·헤더/2단 헤더·IMPORTRANGE/QUERY·페이지 격자·헤더 drift 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-82-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "partial",
                  "detail": "신뢰성=하. 근거: 사람이 원천을 옮겨 적은 사본 — 원천과 어긋나도 알 수 없음 실 Read 결과의 행 수·통제 합계·형식 대조는 남음. 2026-10-14 갱신(발생1011): 2026-10-11 read-occurrence: 칸 단위 대조 불일치 0, 결정론 통제 합계 raw=staging, 필수키 NULL 0, 헤더 기준 해시 일치, PII 잔존 0. 판정 PASS.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-82.json"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-82-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "대상 탭·숨김 탭·헤더/2단 헤더·IMPORTRANGE/QUERY·페이지 격자·헤더 drift 실패 분기 필요. 승인된 폴백: 읽기 전용 공유 복구; 사용자 파일에 쓰지 않음 2026-10-14 갱신(발생1011): 2026-10-11 read-occurrence: 503×4 강제 실패(확정 0)·착지 후 크래시(대기 상태만)·429 재시도 복구(raw 재기록 0·중복 0). 판정 ROOT_APPROVABLE.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-82.json"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-82-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "partial",
                  "detail": "채택 주기=변경 5분 감지 + 1시간 정합 재수집. 서로 다른 두 예정 실행의 연속 성공 증거 없음. 2026-10-14 갱신(발생1011): 2026-10-11 read-occurrence: 서로 다른 수동 발생 A·B(A 종료 1시간 이상 뒤), 스케줄 비활성. 판정 PASS.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-82.json"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "변경 5분 감지 + 1시간 정합 재수집 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-82-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "partial",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음. 2026-10-14 갱신(발생1011): 2026-10-11 read-occurrence: 원천별 manifest·서명 요청 묶음 작성. 루트 E9 서명 대기. 판정 PENDING_ROOT_SIGNATURE.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-82.json"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#82 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-83",
              "title": "#83 온라인 전체 가격 가이드",
              "status": "done",
              "detail": "가격 · 입력 원장. 목표=api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림; E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 998b92e566e4. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-83.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "83",
                "name": "온라인 전체 가격 가이드",
                "kind": "입력 원장",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림",
                "current_state": "E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 998b92e566e4. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "무인 인증 주체(서비스 계정 재공유 또는 읽기 전용 위임)",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-83-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 998b92e566e4.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-83.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-83-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 998b92e566e4.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-83.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-83-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 998b92e566e4.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-83.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-83-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 998b92e566e4.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-83.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-28_google-correct-account/checklist-release-public-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-83-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 998b92e566e4.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-83.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-83-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 998b92e566e4.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-83.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-83-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 998b92e566e4.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-83.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-83-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 998b92e566e4.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-83.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-83-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 998b92e566e4. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-83.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-84",
              "title": "#84 온라인 전체 A가 리스트",
              "status": "done",
              "detail": "가격 · 입력 원장. 목표=api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림; E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 1ebb53387f71. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-84.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "84",
                "name": "온라인 전체 A가 리스트",
                "kind": "입력 원장",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림",
                "current_state": "E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 1ebb53387f71. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "무인 인증 주체(서비스 계정 재공유 또는 읽기 전용 위임)",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-84-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 1ebb53387f71.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-84.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-84-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 1ebb53387f71.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-84.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-84-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 1ebb53387f71.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-84.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-84-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 1ebb53387f71.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-84.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-28_google-correct-account/checklist-release-public-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-84-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 1ebb53387f71.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-84.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-84-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 1ebb53387f71.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-84.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-84-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 1ebb53387f71.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-84.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-84-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 1ebb53387f71.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-84.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-84-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 1ebb53387f71. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-84.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-85",
              "title": "#85 RBD1 프로모션 캘린더(버티컬)",
              "status": "done",
              "detail": "프로모션 · 입력 원장. 목표=api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림; E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 eaa74424611a. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-85.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "85",
                "name": "RBD1 프로모션 캘린더(버티컬)",
                "kind": "입력 원장",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림",
                "current_state": "E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 eaa74424611a. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "무인 인증 주체(서비스 계정 재공유 또는 읽기 전용 위임)",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-85-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 eaa74424611a.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-85.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-85-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 eaa74424611a.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-85.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-85-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 eaa74424611a.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-85.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-85-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 eaa74424611a.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-85.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-28_google-correct-account/checklist-release-public-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-85-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 eaa74424611a.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-85.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-85-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 eaa74424611a.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-85.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-85-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 eaa74424611a.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-85.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-85-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 eaa74424611a.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-85.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-85-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 eaa74424611a. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-85.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-86",
              "title": "#86 비마트 매출/발주 시트",
              "status": "done",
              "detail": "채널 · 파생. 목표=api_interface: Sheets API 로 읽되 대사용. 원천 #37 연결 후 격하; E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 309e9f706420. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-86.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "86",
                "name": "비마트 매출/발주 시트",
                "kind": "파생",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 로 읽되 대사용. 원천 #37 연결 후 격하",
                "current_state": "E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 309e9f706420. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "—",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-86-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 309e9f706420.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-86.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-86-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 309e9f706420.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-86.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-86-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 309e9f706420.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-86.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-86-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 309e9f706420.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-86.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-28_google-correct-account/checklist-release-public-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-86-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 309e9f706420.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-86.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-86-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 309e9f706420.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-86.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-86-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 309e9f706420.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-86.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-86-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 309e9f706420.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-86.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-86-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 309e9f706420. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-86.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-87",
              "title": "#87 컬리 매출/발주 시트",
              "status": "done",
              "detail": "채널 · 파생. 목표=api_interface: Sheets API 로 읽되 대사용. 원천 #38 연결 후 격하; E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 b83b11c82042. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-87.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "87",
                "name": "컬리 매출/발주 시트",
                "kind": "파생",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 로 읽되 대사용. 원천 #38 연결 후 격하",
                "current_state": "E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 b83b11c82042. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "—",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-87-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 b83b11c82042.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-87.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-87-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 b83b11c82042.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-87.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-87-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 b83b11c82042.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-87.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-87-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 b83b11c82042.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-87.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-28_google-correct-account/checklist-release-public-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-87-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 b83b11c82042.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-87.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-87-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 b83b11c82042.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-87.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-87-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 b83b11c82042.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-87.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-87-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 b83b11c82042.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-87.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-87-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 b83b11c82042. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-87.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-88",
              "title": "#88 쿠팡 셀아웃 시트",
              "status": "done",
              "detail": "채널 · 파생. 목표=api_interface: Sheets API 로 읽되 대사용. 원천 #18 연결 후 격하; E1–E9 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 8f28b1bad2ed. Read 범위 = 지정 탭 1(「1)판매수량_2026」). 수식 오류 #N/A 8,093개는 미도래 날짜 열(11/1~12/25)·11·12월 합계에만 — 원천 표시값 보존. 기말재고 탭은 #111. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                "docs/work-log/2026-10-11_read-occurrence/manifests/source-88.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "88",
                "name": "쿠팡 셀아웃 시트",
                "kind": "파생",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 로 읽되 대사용. 원천 #18 연결 후 격하",
                "current_state": "E1–E9 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 8f28b1bad2ed. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "—",
                "fallback": "원천 #18(쿠팡 서플라이어 허브) 경로",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-88-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 8f28b1bad2ed.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-88.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-88-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 8f28b1bad2ed.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-88.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-88-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 8f28b1bad2ed.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-88.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-88-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 8f28b1bad2ed.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-88.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-11_live-read/read-evidence-sanitized.json"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-88-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 8f28b1bad2ed.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-88.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-88-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 8f28b1bad2ed.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-88.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-88-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 8f28b1bad2ed.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-88.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-88-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 8f28b1bad2ed.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-88.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-88-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 8f28b1bad2ed. Read 범위 = 지정 탭 1(「1)판매수량_2026」). 수식 오류 #N/A 8,093개는 미도래 날짜 열(11/1~12/25)·11·12월 합계에만 — 원천 표시값 보존. 기말재고 탭은 #111. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-88.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-89",
              "title": "#89 RBD1 프로모션 캘린더(쿠팡)",
              "status": "done",
              "detail": "프로모션 · 입력 원장. 목표=api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림; E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 4881fc0488f2. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-89.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "89",
                "name": "RBD1 프로모션 캘린더(쿠팡)",
                "kind": "입력 원장",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림",
                "current_state": "E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 4881fc0488f2. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "무인 인증 주체(서비스 계정 재공유 또는 읽기 전용 위임)",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-89-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 4881fc0488f2.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-89.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-89-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 4881fc0488f2.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-89.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-89-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 4881fc0488f2.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-89.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-89-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 4881fc0488f2.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-89.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-28_google-correct-account/checklist-release-public-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-89-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 4881fc0488f2.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-89.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-89-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 4881fc0488f2.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-89.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-89-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 4881fc0488f2.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-89.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-89-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 4881fc0488f2.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-89.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-89-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 4881fc0488f2. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-89.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-91",
              "title": "#91 메타 프로모션별 성과",
              "status": "done",
              "detail": "광고 · 파생. 목표=api_interface: Sheets API 로 읽되 대사용. 원천 #25 연결 후 격하; E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 9d1759033532. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-91.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "91",
                "name": "메타 프로모션별 성과",
                "kind": "파생",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 로 읽되 대사용. 원천 #25 연결 후 격하",
                "current_state": "E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 9d1759033532. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "—",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-91-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 9d1759033532.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-91.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-91-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 9d1759033532.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-91.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-91-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 9d1759033532.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-91.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-91-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 9d1759033532.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-91.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-28_google-correct-account/checklist-release-public-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-91-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 9d1759033532.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-91.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-91-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 9d1759033532.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-91.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-91-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 9d1759033532.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-91.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-91-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 9d1759033532.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-91.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-91-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 9d1759033532. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-91.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-92",
              "title": "#92 광고성과(동북아MC)",
              "status": "done",
              "detail": "광고 · 파생. 목표=api_interface: Sheets API 로 읽되 대사용. 원천 확인 필요 연결 후 격하; E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 935fae65a22a. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-92.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "92",
                "name": "광고성과(동북아MC)",
                "kind": "파생",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 로 읽되 대사용. 원천 확인 필요 연결 후 격하",
                "current_state": "E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 935fae65a22a. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "—",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-92-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 935fae65a22a.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-92.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-92-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 935fae65a22a.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-92.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-92-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 935fae65a22a.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-92.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-92-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 935fae65a22a.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-92.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-28_google-correct-account/checklist-release-public-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-92-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 935fae65a22a.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-92.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-92-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 935fae65a22a.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-92.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-92-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 935fae65a22a.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-92.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-92-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 935fae65a22a.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-92.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-92-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 935fae65a22a. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-92.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-94",
              "title": "#94 일본 B2C 채널 일정",
              "status": "done",
              "detail": "프로모션 · 입력 원장. 목표=api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림; E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 7725eee4ae2f. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-94.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "94",
                "name": "일본 B2C 채널 일정",
                "kind": "입력 원장",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림",
                "current_state": "E1–E9 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 7725eee4ae2f. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "무인 인증 주체(서비스 계정 재공유 또는 읽기 전용 위임)",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-94-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 7725eee4ae2f.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-94.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-94-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 7725eee4ae2f.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-94.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-94-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 7725eee4ae2f.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-94.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-94-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 7725eee4ae2f.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-94.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-28_google-correct-account/checklist-release-public-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-94-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 7725eee4ae2f.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-94.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-94-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 7725eee4ae2f.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-94.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-94-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 7725eee4ae2f.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-94.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-94-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 7725eee4ae2f.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-94.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-94-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-09-29T00:11:53Z READ_COMPLETE, manifest SHA-256 7725eee4ae2f. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r1-signature.json",
                    "docs/work-log/2026-09-28_source-read-three-lanes/lanes/sheets-drive/evidence/read-complete-closure-r1/source-94.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-108",
              "title": "#108 '26년 글로벌사업팀 거래처별 매출 현황",
              "status": "done",
              "detail": "채널 · 입력 원장. 목표=api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림. 탭 2개(거래처정보(Summary) · '26년 국가별 월별 매출 현황)만; E1–E9 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 23054db36a09. Read 범위 = 지정 탭 2(거래처정보 · 국가별 월별 매출). 업체 담당자 이름 · 연락처 · 이메일 3열은 가림 사본 · staging 에서 제외(raw 는 비공개 레이크 전용). 파일 ACL 편집자(토큰 readonly) — 뷰어 하향 요청. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                "docs/work-log/2026-10-11_read-occurrence/manifests/source-108.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "108",
                "name": "'26년 글로벌사업팀 거래처별 매출 현황",
                "kind": "입력 원장",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림. 탭 2개(거래처정보(Summary) · '26년 국가별 월별 매출 현황)만",
                "current_state": "E1–E9 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 23054db36a09. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "무인 인증 주체(서비스 계정 재공유 또는 읽기 전용 위임) · 업체 담당자 이름 · 연락처 · 이메일(개인정보) 열 제외",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-108-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 23054db36a09.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-108.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-108-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 23054db36a09.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-108.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-108-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 23054db36a09.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-108.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-108-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 23054db36a09.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-108.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-11_live-read/read-evidence-sanitized.json"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-108-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 23054db36a09.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-108.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-108-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 23054db36a09.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-108.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-108-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 23054db36a09.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-108.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-108-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 23054db36a09.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-108.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-108-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 23054db36a09. Read 범위 = 지정 탭 2(거래처정보 · 국가별 월별 매출). 업체 담당자 이름 · 연락처 · 이메일 3열은 가림 사본 · staging 에서 제외(raw 는 비공개 레이크 전용). 파일 ACL 편집자(토큰 readonly) — 뷰어 하향 요청. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-108.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-109",
              "title": "#109 CMSLAB GWS 계정 정보",
              "status": "done",
              "detail": "조직·권한 · 입력 원장. 목표=api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림; E1–E9 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 9e24d2390c6f. Read 범위 = 단일 탭. 이름 · 이메일 2열은 가림 사본 · staging 에서 제외(stg 에는 부서 · 상태만). READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                "docs/work-log/2026-10-11_read-occurrence/manifests/source-109.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "109",
                "name": "CMSLAB GWS 계정 정보",
                "kind": "입력 원장",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림",
                "current_state": "E1–E9 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 9e24d2390c6f. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "개인정보(이름 · 이메일) — 제한 열람 · 사람 → 팀 대응 키(이메일 해시) 설계",
                "fallback": "Admin SDK Directory API(읽기 전용) — 위임 승인 뒤",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-109-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 9e24d2390c6f.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-109.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-109-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 9e24d2390c6f.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-109.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-109-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 9e24d2390c6f.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-109.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-109-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 9e24d2390c6f.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-109.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-11_live-read/read-evidence-sanitized.json"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-109-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 9e24d2390c6f.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-109.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-109-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 9e24d2390c6f.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-109.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-109-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 9e24d2390c6f.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-109.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-109-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 9e24d2390c6f.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-109.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-109-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 9e24d2390c6f. Read 범위 = 단일 탭. 이름 · 이메일 2열은 가림 사본 · staging 에서 제외(stg 에는 부서 · 상태만). READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-109.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-110",
              "title": "#110 RBD1 재고분배(프로모션 캘린더 「재고분배」 탭)",
              "status": "done",
              "detail": "재고 · 입력 원장. 목표=api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림; E1–E9 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 d7f909bdd0b1. Read 범위 = 지정 탭 1(「재고분배」) — 국내 B2C 공식 배정 기록(10/11 사용자 확정). 입고 회차 라벨은 volatile_header 로 가림. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                "docs/work-log/2026-10-11_read-occurrence/manifests/source-110.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "110",
                "name": "RBD1 재고분배(프로모션 캘린더 「재고분배」 탭)",
                "kind": "입력 원장",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 스냅샷(raw JSON) + Drive changes 변경 감지 + 헤더 해시 드리프트 알림",
                "current_state": "E1–E9 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 d7f909bdd0b1. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "무인 인증 주체(서비스 계정 재공유 또는 읽기 전용 위임) · 배정 정본 확인(10/7 C-4 대 #18, 10/12 미팅)",
                "fallback": "읽기 전용 공유 복구; 사용자 파일에 쓰지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-110-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 d7f909bdd0b1.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-110.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-110-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 d7f909bdd0b1.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-110.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-110-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 d7f909bdd0b1.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-110.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-110-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 d7f909bdd0b1.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-110.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-11_live-read/read-evidence-sanitized.json"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-110-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 d7f909bdd0b1.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-110.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-110-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 d7f909bdd0b1.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-110.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-110-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 d7f909bdd0b1.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-110.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-110-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 d7f909bdd0b1.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-110.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-110-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 d7f909bdd0b1. Read 범위 = 지정 탭 1(「재고분배」) — 국내 B2C 공식 배정 기록(10/11 사용자 확정). 입고 회차 라벨은 volatile_header 로 가림. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-110.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            },
            {
              "id": "source-111",
              "title": "#111 쿠팡 기말재고(쿠팡 셀아웃 「기말재고」 탭)",
              "status": "done",
              "detail": "재고 · 파생. 목표=api_interface: Sheets API 로 읽되 대사용. 원천 #18 연결 후 격하; E1–E9 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 2874cca65056. Read 범위 = 지정 탭 1(「기말재고」) 월 요약표 A2:M. 수식 오류 토큰 3개 원천 표시값 보존. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
              "evidence": [
                "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                "docs/work-log/2026-10-11_read-occurrence/manifests/source-111.json",
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "READ_COMPLETE 서명 완료. 운영 스케줄 활성화·게시는 별도 승인 대상.",
              "source": {
                "row_id": "111",
                "name": "쿠팡 기말재고(쿠팡 셀아웃 「기말재고」 탭)",
                "kind": "파생",
                "transport": "sheets",
                "cadence": "변경 5분 감지 + 1시간 정합 재수집",
                "target_method": "api_interface: Sheets API 로 읽되 대사용. 원천 #18 연결 후 격하",
                "current_state": "E1–E9 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 2874cca65056. 서명 시점 기준 publish_hold·미게시·스케줄 비활성·배포/게시 미승인.",
                "conditions": "—",
                "fallback": "원천 #18(쿠팡 서플라이어 허브) 경로",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-111-scope",
                  "title": "범위·권위 승인 (루트 E1 정의)",
                  "status": "done",
                  "detail": "E1 ROOT_APPROVABLE · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 2874cca65056.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-111.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E1 정의(Lane B 계획 lanes/sheets-drive/plan.md): 모든 객체·탭·숨김 탭 정책·파일·페이지·포함/제외 기간·날짜 창·수식/IMPORT 의존성에 대한 권위와 범위가 승인되고 원천 계약과 매핑된다.",
                  "stage": "scope",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-111-access",
                  "title": "읽기 전용 접근 (루트 E2 정의)",
                  "status": "done",
                  "detail": "E2 PASS · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 2874cca65056.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-111.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E2 정의(Lane B 계획 lanes/sheets-drive/plan.md): 정확한 principal·runner, 읽기 전용 scope·역할, 원천 쓰기 0, 인증 시각, 대상 객체 접근이 증거로 남는다.",
                  "stage": "access",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-111-connector",
                  "title": "수집 코드·계약 매핑 (루트 E3 정의)",
                  "status": "done",
                  "detail": "E3 ROOT_APPROVABLE · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 2874cca65056.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-111.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E3 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 계약이 collector·parser·redactor·schedule 설정에 매핑되고 원천별 selector·header 정책과 시험이 있다.",
                  "stage": "connector",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-111-live-read",
                  "title": "실계정 실제 Read (루트 E4 정의)",
                  "status": "done",
                  "detail": "E4 PASS · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 2874cca65056.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-111.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-11_live-read/read-evidence-sanitized.json"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E4 정의(Lane B 계획 lanes/sheets-drive/plan.md): 필요한 모든 객체의 실제 Read가 시작/종료 UTC, source-as-of, 불변 canonical raw 바이트, SHA-256, manifest 바인딩, 비공개 저장, batch/load identity, 비공개 staging 일치와 함께 남는다.",
                  "stage": "live_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-111-completeness",
                  "title": "객체·탭·기간 완전성 (루트 E5 정의)",
                  "status": "done",
                  "detail": "E5 PASS · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 2874cca65056.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-111.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E5 정의(Lane B 계획 lanes/sheets-drive/plan.md): 객체·탭·파일·페이지·기간의 예상 대비 실제 수, 페이지네이션·절단 증명, 누락 0, 중복 0, 미지원·제외 객체의 명시 승인이 남는다.",
                  "stage": "completeness",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-111-validation",
                  "title": "통제 합계·행 대사·형식 검증 (루트 E6 정의)",
                  "status": "done",
                  "detail": "E6 PASS · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 2874cca65056.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-111.json",
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E6 정의(Lane B 계획 lanes/sheets-drive/plan.md): 같은 as-of의 업무 통제 합계 또는 승인된 결정론적 통제 공식(approved deterministic control formula), raw·staging 행 대사, 필수키 NULL 수, 중복 identity 수, 필드·형식 검사와 승인된 예외가 남는다. 구조적 행 일치만으로는 부족하다.",
                  "stage": "validation",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-111-recovery",
                  "title": "재시도·재시작·실패 복구 (루트 E7 정의)",
                  "status": "done",
                  "detail": "E7 ROOT_APPROVABLE · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 2874cca65056.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-111.json",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E7 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 경로의 재시도·재시작·실패 복구가 batch·load·staging identity 중복 없이, 원천 쓰기 0으로 증명된다.",
                  "stage": "recovery",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-111-repeat",
                  "title": "승인된 서로 다른 2회 발생 (루트 E8 정의)",
                  "status": "done",
                  "detail": "E8 PASS · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 2874cca65056.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-111.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E8 정의(Lane B 계획 lanes/sheets-drive/plan.md): 승인된 같은 설정으로 서로 다른 예정 또는 명시 승인된 수동 발생 2회(A·B)가 변경/무변경 처리와 digest·지연·행 수 증거와 함께 남는다. 스케줄 활성화는 요구하지 않으며 별도 승인 전까지 금지된다. 운영 예정 주기 실행 증거가 아니다.",
                  "stage": "repeat_read",
                  "criterion_basis": "root_signature"
                },
                {
                  "id": "source-111-proof",
                  "title": "Read 완료 증거 서명 (루트 E9 정의)",
                  "status": "done",
                  "detail": "E9 SIGNED · 루트 서명 2026-10-12T00:47:05Z READ_COMPLETE, manifest SHA-256 2874cca65056. Read 범위 = 지정 탭 1(「기말재고」) 월 요약표 A2:M. 수식 오류 토큰 3개 원천 표시값 보존. READ_COMPLETE는 Read 범위 한정이다. 업무 의미(business semantics)는 미확정이며 운영 스케줄 활성화와 게시는 별도 승인 대상이다.",
                  "evidence": [
                    "docs/work-log/2026-10-11_read-occurrence/approvals/root-read-occurrence-1011-r1-signature.json",
                    "docs/work-log/2026-10-11_read-occurrence/manifests/source-111.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "운영 스케줄 활성화·게시는 별도 승인 대상. 범위·selector가 바뀌면 새 closure revision이 필요하다.",
                  "criterion": "루트 E9 정의(Lane B 계획 lanes/sheets-drive/plan.md): 원천별 비공개·결정론적·redacted 증거 manifest가 모든 E1–E8 판정, publish_hold=true, 미게시 상태, 스케줄 비활성을 명시 기록하고 해당 원천에 대해 서명·승인된다.",
                  "stage": "proof",
                  "criterion_basis": "root_signature"
                }
              ]
            }
          ]
        },
        {
          "id": "read-drive",
          "title": "Drive·문서 감시",
          "items": [
            {
              "id": "source-12",
              "title": "#12 도서관파일(재경 회계매출)",
              "status": "partial",
              "detail": "회계매출 · 파생. 목표=문서 감시; 재경 Drive 폴더 변경·발행기한 Read; 현재 접근은 2026-10-11 병합 판정(추정): #103 과 같은 객체. 9/3 경영지원실이 제공하겠다고 한 자료군 4개(영업그룹별 손익 · 일간매출 · 도서관 · 예산 취합)와 받은 파일 4개가 하나씩 대응하고, 나머지 셋을 짝지으면 「도서관」은 통합매출이다(소거법). 10/7 「경영지원실 데이터」 폴더의 통합매출(#103)로 열리고 10/11 첫 실 Read 를 했다.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→Drive 변경 5분 감지 + 매일 발행 예정 확인 2회→증거 동결.",
              "source": {
                "row_id": "12",
                "name": "도서관파일(재경 회계매출)",
                "kind": "파생",
                "transport": "drive",
                "cadence": "Drive 변경 5분 감지 + 매일 발행 예정 확인",
                "target_method": "문서 감시; 재경 Drive 폴더 변경·발행기한 Read",
                "current_state": "2026-10-11 병합 판정(추정): #103 과 같은 객체. 9/3 경영지원실이 제공하겠다고 한 자료군 4개(영업그룹별 손익 · 일간매출 · 도서관 · 예산 취합)와 받은 파일 4개가 하나씩 대응하고, 나머지 셋을 짝지으면 「도서관」은 통합매출이다(소거법). 10/7 「경영지원실 데이터」 폴더의 통합매출(#103)로 열리고 10/11 첫 실 Read 를 했다.",
                "conditions": "드롭 폴더 운영 합의",
                "fallback": "지정 폴더 공유 복구; 사람의 별도 업로드 절차는 만들지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-12-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #12 분류 기준은 있음: 업무=회계매출, 유형=파생. 36_ 우선 결정은 문서 감시; 재경 Drive 폴더 변경·발행기한 Read. 실객체·기간·권위 범위 승인은 남음. 2026-10-14 갱신(live-read-1011 · core-complete-1011): #103 통합매출과 같은 객체로 병합 판정(추정 — 9/3 인터뷰 자료군 4개 ↔ 파일 4개 소거법). 이 번호로 따로 수집하지 않는다. core-complete-1011: 14차 목적지 판정 = 목적지 없음(derived_duplicate — #103 이 정본, 같은 매출을 두 번 세지 않는다).",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-11_live-read/reconcile-summary.json",
                    "docs/work-log/2026-10-11_core-complete/result.md",
                    "docs/work-log/2026-10-11_core-14th/result.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#12의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-12-access",
                  "title": "읽기 전용 접근",
                  "status": "partial",
                  "detail": "2026-10-11 병합 판정(추정): #103 과 같은 객체. 9/3 경영지원실이 제공하겠다고 한 자료군 4개(영업그룹별 손익 · 일간매출 · 도서관 · 예산 취합)와 받은 파일 4개가 하나씩 대응하고, 나머지 셋을 짝지으면 「도서관」은 통합매출이다(소거법). 10/7 「경영지원실 데이터」 폴더의 통합매출(#103)로 열리고 10/11 첫 실 Read 를 했다. 2026-10-14 갱신(묶음④): 9/30 Drive 탐색 확장(공유 드라이브 0개 · 폴더 제목 부분 일치 · 01_고객원본 동명 파일 상위 폴더). 후보는 #16 「팀별 자료/경영지원」뿐 — 9/10 일괄 업로드 뒤 추가·수정 없음이라 운영 감시 폴더가 아닌 전달 사본으로 판단, 자동 바인딩 안 함. 운영 폴더 링크·공유 요청 초안(38-drafts A).",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/evidence/folder-candidates-sanitized.json",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/scripts/discover_watch_folders.py",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/38-drafts.md"
                  ],
                  "next": "드롭 폴더 운영 합의",
                  "criterion": "도서관파일(재경 회계매출) 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-12-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "문서 감시; 재경 Drive 폴더 변경·발행기한 Read 경로의 account/object, parser, 개인정보 제거기, Drive 변경 5분 감지 + 매일 발행 예정 확인 schedule을 원천별로 고정한다.",
                  "criterion": "#12에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-12-live-read",
                  "title": "실계정 첫 Read",
                  "status": "partial",
                  "detail": "#103 의 Read 로 같은 객체를 읽는다(병합 판정 — 고객 확인 전). 이 번호로 따로 읽지 않는다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "도서관파일(재경 회계매출)에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-12-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 도서관파일(재경 회계매출) 지정 폴더의 신규·수정 파일, 최대 탐색 깊이, 발행 예정일과 중복 파일. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "도서관파일(재경 회계매출) 지정 폴더의 신규·수정 파일, 최대 탐색 깊이, 발행 예정일과 중복 파일에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-12-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 재경이 ERP 에서 가공한 마감본 — 대사 기준으로 가치, 원천은 ERP 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-12-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 실패 분기 필요. 승인된 폴백: 지정 폴더 공유 복구; 사람의 별도 업로드 절차는 만들지 않음",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-12-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=Drive 변경 5분 감지 + 매일 발행 예정 확인. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "Drive 변경 5분 감지 + 매일 발행 예정 확인 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-12-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#12 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-16",
              "title": "#16 Google Drive (공유 폴더)",
              "status": "partial",
              "detail": "문서 저장소 · 원천. 목표=api_interface: Drive API changes 피드(변경 알림 또는 폴링)로 신규·수정 파일 수집; 현재 접근은 2026-09-28 승인된 읽기 전용 신원으로 Drive metadata inventory를 확인하고 private canonical one-shot을 완료. 장기 실행 주체와 반복 운영 승인은 남음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→변경 감지 즉시 2회→증거 동결.",
              "source": {
                "row_id": "16",
                "name": "Google Drive (공유 폴더)",
                "kind": "원천",
                "transport": "drive",
                "cadence": "변경 감지 즉시",
                "target_method": "api_interface: Drive API changes 피드(변경 알림 또는 폴링)로 신규·수정 파일 수집",
                "current_state": "2026-09-28 승인된 읽기 전용 신원으로 Drive metadata inventory를 확인하고 private canonical one-shot을 완료. 장기 실행 주체와 반복 운영 승인은 남음.",
                "conditions": "무인 인증 주체",
                "fallback": "지정 폴더 공유 복구; 사람의 별도 업로드 절차는 만들지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-16-scope",
                  "title": "범위·정본 확정",
                  "status": "blocked",
                  "detail": "32_ #16 분류 기준은 있음: 업무=문서 저장소, 유형=원천. 36_ 우선 결정은 api_interface: Drive API changes 피드(변경 알림 또는 폴링)로 신규·수정 파일 수집. 실객체·기간·권위 범위 승인은 남음. 2026-10-14 갱신(묶음①·L2): 2026-09-30 묶음 ①: 본문 Read 안 함. 메타데이터만(A) vs 본문 계약(B) 비교, 권고 A+개별 원천 승격. 소유자 E1 결정 대기 2026-09-30 L2: 본문 Read 안 함. 소유자 승인 요청 decision-16.md(A 메타데이터만 권장, 영향 1행) — 승인 시 새 호출 없이 closure 서명 가능.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/source-16-options.md",
                    "docs/work-log/2026-09-30_read-complete-e5-e9/38-drafts.md",
                    "docs/work-log/2026-09-30_todo-l2-read-now/decision-16.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#16의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-16-access",
                  "title": "읽기 전용 접근",
                  "status": "partial",
                  "detail": "2026-09-28 승인된 읽기 전용 신원으로 Drive metadata inventory를 확인하고 private canonical one-shot을 완료. 장기 실행 주체와 반복 운영 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "무인 인증 주체",
                  "criterion": "Google Drive (공유 폴더) 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-16-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "api_interface: Drive API changes 피드(변경 알림 또는 폴링)로 신규·수정 파일 수집 경로의 account/object, parser, 개인정보 제거기, 변경 감지 즉시 schedule을 원천별로 고정한다.",
                  "criterion": "#16에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-16-live-read",
                  "title": "실계정 첫 Read",
                  "status": "done",
                  "detail": "2026-09-28 canonical Drive metadata inventory raw·manifest·private staging 적재와 SHA-256을 검증. 파일 본문 수집을 뜻하지 않으며 계약은 proposed·publish_hold이고 E5~E9는 미완료.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-28_google-correct-account/checklist-release-public-evidence.md"
                  ],
                  "next": "E5 완전성: 예상 탭·기간·계정을 고정하고 누락·중복 객체를 대사한다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-16-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: Google Drive (공유 폴더) 지정 폴더의 신규·수정 파일, 최대 탐색 깊이, 발행 예정일과 중복 파일. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "Google Drive (공유 폴더) 지정 폴더의 신규·수정 파일, 최대 탐색 깊이, 발행 예정일과 중복 파일에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-16-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=상. 근거: 파일을 바이트 그대로 받음(내용 신뢰성은 파일에 따라 다름) 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-16-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 실패 분기 필요. 승인된 폴백: 지정 폴더 공유 복구; 사람의 별도 업로드 절차는 만들지 않음",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-16-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=변경 감지 즉시. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "변경 감지 즉시 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-16-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음. READ_COMPLETE 서명 제외: 등록 의무가 파일 본문 수집이므로 소유자의 metadata-only E1 승인 또는 본문 Read 계약이 필요하다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "docs/work-log/2026-09-28_source-read-three-lanes/approvals/root-lane-b-read-complete-closure-r4-signature.json"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#16 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-22",
              "title": "#22 사방넷",
              "status": "partial",
              "detail": "주문 통합 · 원천. 목표=automated_batch: Drive 업로드 폴더 감시 — 기획팀·영업관리 담당자가 사방넷에서 내려받은 주문 엑셀 원본을 올림(2026-10-16 결정 20). 사방넷 API 3.0 은 기본 사용료에 없는 유료 부가서비스(플랜별 월 5만~50만 원)라 고객에게 가입을 요청하지 않는다. 3.0 에도 정산 API 는 없다; 현재 접근은 2026-10-16 사방넷 API 3.0(유료 가입 요청 안 함) 대신 Drive 업로드 폴더로 전환(36_ 결정 20). 업로드 폴더 미생성 · 업로드 담당 미지정 · 원본 주문 엑셀 양식 미수령.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→업로드 일 1회(기획팀 새벽 취합 뒤) · 폴더 변경 5분 감지 2회→증거 동결.",
              "source": {
                "row_id": "22",
                "name": "사방넷",
                "kind": "원천",
                "transport": "drive",
                "cadence": "업로드 일 1회(기획팀 새벽 취합 뒤) · 폴더 변경 5분 감지",
                "target_method": "automated_batch: Drive 업로드 폴더 감시 — 기획팀·영업관리 담당자가 사방넷에서 내려받은 주문 엑셀 원본을 올림(2026-10-16 결정 20). 사방넷 API 3.0 은 기본 사용료에 없는 유료 부가서비스(플랜별 월 5만~50만 원)라 고객에게 가입을 요청하지 않는다. 3.0 에도 정산 API 는 없다",
                "current_state": "2026-10-16 사방넷 API 3.0(유료 가입 요청 안 함) 대신 Drive 업로드 폴더로 전환(36_ 결정 20). 업로드 폴더 미생성 · 업로드 담당 미지정 · 원본 주문 엑셀 양식 미수령.",
                "conditions": "업로드 폴더 · 담당 지정(기획팀 · 영업관리) · 사방넷 주문 다운로드 원본 양식 1부(가공본 아님) · 연결 쇼핑몰 목록(몰 직접 API 와 중복 제거)",
                "fallback": "업로드 미도착 알림 → 담당자 재업로드 → 사방넷 웹 주문 다운로드 자동화(③ 포털) → 고객이 스스로 API 3.0 에 가입하면 ① 승격",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-22-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #22 분류 기준은 있음: 업무=주문 통합, 유형=원천. 36_ 우선 결정은 automated_batch: Drive 업로드 폴더 감시 — 기획팀·영업관리 담당자가 사방넷에서 내려받은 주문 엑셀 원본을 올림(2026-10-16 결정 20). 사방넷 API 3.0 은 기본 사용료에 없는 유료 부가서비스(플랜별 월 5만~50만 원)라 고객에게 가입을 요청하지 않는다. 3.0 에도 정산 API 는 없다. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#22의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-22-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "2026-10-16 사방넷 API 3.0(유료 가입 요청 안 함) 대신 Drive 업로드 폴더로 전환(36_ 결정 20). 업로드 폴더 미생성 · 업로드 담당 미지정 · 원본 주문 엑셀 양식 미수령.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
                  ],
                  "next": "업로드 폴더 · 담당 지정(기획팀 · 영업관리) · 사방넷 주문 다운로드 원본 양식 1부(가공본 아님) · 연결 쇼핑몰 목록(몰 직접 API 와 중복 제거)",
                  "criterion": "사방넷 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-22-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "files 파서와 Drive 폴더 감시(reception DriveRoute) 존재. 이 원천의 업로드 폴더 route · 원본 파일 계약(사방넷 · 파트너센터 주문 엑셀)은 없음. 사방넷 API 수집기(E3 합성 시험 완료)는 36_ 결정 20 으로 운영 경로가 아니다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "automated_batch: Drive 업로드 폴더 감시 — 기획팀·영업관리 담당자가 사방넷에서 내려받은 주문 엑셀 원본을 올림(2026-10-16 결정 20). 사방넷 API 3.0 은 기본 사용료에 없는 유료 부가서비스(플랜별 월 5만~50만 원)라 고객에게 가입을 요청하지 않는다. 3.0 에도 정산 API 는 없다 경로의 account/object, parser, 개인정보 제거기, 업로드 일 1회(기획팀 새벽 취합 뒤) · 폴더 변경 5분 감지 schedule을 원천별로 고정한다.",
                  "criterion": "#22에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-22-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "사방넷 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "사방넷에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-22-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 사방넷 주문 다운로드 엑셀 원본(업로드 폴더); 연결 쇼핑몰별 분리 · 몰 직접 API 수집분과 중복 제거 · 재업로드 중복 · 가공본 거부. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "사방넷 주문 다운로드 엑셀 원본(업로드 폴더); 연결 쇼핑몰별 분리 · 몰 직접 API 수집분과 중복 제거 · 재업로드 중복 · 가공본 거부에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-22-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 몰 주문의 복제본. 사방넷 수집 주기(스케줄러 없으면 사람이 실행) · 주문서 확정 처리 · 담당자 업로드 시점이 끼어듦 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-22-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 실패 분기 필요. 승인된 폴백: 업로드 미도착 알림 → 담당자 재업로드 → 사방넷 웹 주문 다운로드 자동화(③ 포털) → 고객이 스스로 API 3.0 에 가입하면 ① 승격",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-22-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=업로드 일 1회(기획팀 새벽 취합 뒤) · 폴더 변경 5분 감지. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "업로드 일 1회(기획팀 새벽 취합 뒤) · 폴더 변경 5분 감지 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-22-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#22 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-39a-2",
              "title": "#39a-2 무신사·에이블리 — 주문",
              "status": "partial",
              "detail": "채널 · 원천. 목표=automated_batch: Drive 업로드 폴더 감시 — 담당자가 무신사 · 에이블리 파트너센터(또는 사방넷)에서 내려받은 주문 엑셀 원본을 올림(2026-10-16 결정 20). 두 몰은 공개 API 가 없고(연동솔루션 전용) 사방넷 API 3.0 은 유료라 요청하지 않는다; 현재 접근은 2026-10-16 사방넷 API 3.0(유료 가입 요청 안 함) 대신 Drive 업로드 폴더로 전환(36_ 결정 20). 업로드 폴더 미생성 · 업로드 담당 미지정 · 원본 주문 엑셀 양식 미수령.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→#22 와 동일 2회→증거 동결.",
              "source": {
                "row_id": "39a-2",
                "name": "무신사·에이블리 — 주문",
                "kind": "원천",
                "transport": "drive",
                "cadence": "#22 와 동일",
                "target_method": "automated_batch: Drive 업로드 폴더 감시 — 담당자가 무신사 · 에이블리 파트너센터(또는 사방넷)에서 내려받은 주문 엑셀 원본을 올림(2026-10-16 결정 20). 두 몰은 공개 API 가 없고(연동솔루션 전용) 사방넷 API 3.0 은 유료라 요청하지 않는다",
                "current_state": "2026-10-16 사방넷 API 3.0(유료 가입 요청 안 함) 대신 Drive 업로드 폴더로 전환(36_ 결정 20). 업로드 폴더 미생성 · 업로드 담당 미지정 · 원본 주문 엑셀 양식 미수령.",
                "conditions": "업로드 폴더 · 담당 지정 · 몰별 주문 다운로드 원본 양식 1부(가공본 아님) · 에이블리 셀러스/파트너스 확인",
                "fallback": "업로드 미도착 알림 → 담당자 재업로드 → 몰별 파트너센터 주문 다운로드 자동화(③ 포털 — 최대 4계정 · 무신사 OTP)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-39a-2-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #39a-2 분류 기준은 있음: 업무=채널, 유형=원천. 36_ 우선 결정은 automated_batch: Drive 업로드 폴더 감시 — 담당자가 무신사 · 에이블리 파트너센터(또는 사방넷)에서 내려받은 주문 엑셀 원본을 올림(2026-10-16 결정 20). 두 몰은 공개 API 가 없고(연동솔루션 전용) 사방넷 API 3.0 은 유료라 요청하지 않는다. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#39a-2의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-39a-2-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "2026-10-16 사방넷 API 3.0(유료 가입 요청 안 함) 대신 Drive 업로드 폴더로 전환(36_ 결정 20). 업로드 폴더 미생성 · 업로드 담당 미지정 · 원본 주문 엑셀 양식 미수령.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
                  ],
                  "next": "업로드 폴더 · 담당 지정 · 몰별 주문 다운로드 원본 양식 1부(가공본 아님) · 에이블리 셀러스/파트너스 확인",
                  "criterion": "무신사·에이블리 — 주문 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-39a-2-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "files 파서와 Drive 폴더 감시(reception DriveRoute) 존재. 이 원천의 업로드 폴더 route · 원본 파일 계약(사방넷 · 파트너센터 주문 엑셀)은 없음. 사방넷 API 수집기(E3 합성 시험 완료)는 36_ 결정 20 으로 운영 경로가 아니다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "automated_batch: Drive 업로드 폴더 감시 — 담당자가 무신사 · 에이블리 파트너센터(또는 사방넷)에서 내려받은 주문 엑셀 원본을 올림(2026-10-16 결정 20). 두 몰은 공개 API 가 없고(연동솔루션 전용) 사방넷 API 3.0 은 유료라 요청하지 않는다 경로의 account/object, parser, 개인정보 제거기, #22 와 동일 schedule을 원천별로 고정한다.",
                  "criterion": "#39a-2에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-39a-2-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "무신사·에이블리 — 주문 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "무신사·에이블리 — 주문에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-39a-2-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 무신사 · 에이블리 주문 엑셀 원본(업로드 폴더)을 몰 · 계정별로 분리; 파일명 날짜 · 기간 · 재업로드 중복 · 가공본 거부. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "무신사 · 에이블리 주문 엑셀 원본(업로드 폴더)을 몰 · 계정별로 분리; 파일명 날짜 · 기간 · 재업로드 중복 · 가공본 거부에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-39a-2-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 몰 주문 원본 엑셀(파트너센터) 또는 사방넷 복제본. 담당자 업로드 시점이 끼어듦 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-39a-2-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 실패 분기 필요. 승인된 폴백: 업로드 미도착 알림 → 담당자 재업로드 → 몰별 파트너센터 주문 다운로드 자동화(③ 포털 — 최대 4계정 · 무신사 OTP)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-39a-2-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=#22 와 동일. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "#22 와 동일 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-39a-2-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#39a-2 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-41",
              "title": "#41 원료·전성분·BOM",
              "status": "blocked",
              "detail": "원료·처방 · 원천. 목표=문서 감시; BOM 폴더 Read + ERP 신규 품목 대비 누락 검출; 현재 접근은 기존 원료리스트 단일 파일은 읽기 전용 접근과 30분 정리 가동을 완료했다. 문서감시 폴더 4개와 BOM·전성분 전체 접근, 플랫폼 착지는 미완이라 전체 상태는 blocked다.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                "docs/work-log/2026-09-30_blocked-sources-unblock/evidence/folder-candidates-sanitized.json",
                "docs/work-log/2026-09-30_blocked-sources-unblock/scripts/discover_watch_folders.py",
                "docs/work-log/2026-09-30_blocked-sources-unblock/38-drafts.md",
                "docs/work-log/2026-10-14_material-automation-status-refresh/public-material-automation-status.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→Drive 변경 5분 감지 + 매일 발행 예정 확인 2회→증거 동결.",
              "source": {
                "row_id": "41",
                "name": "원료·전성분·BOM",
                "kind": "원천",
                "transport": "drive",
                "cadence": "Drive 변경 5분 감지 + 매일 발행 예정 확인",
                "target_method": "문서 감시; BOM 폴더 Read + ERP 신규 품목 대비 누락 검출",
                "current_state": "기존 원료리스트 단일 파일은 읽기 전용 접근과 30분 정리 가동을 완료했다. 문서감시 폴더 4개와 BOM·전성분 전체 접근, 플랫폼 착지는 미완이라 전체 상태는 blocked다.",
                "conditions": "BOM 관리 주체 · 처방은 기밀 권한",
                "fallback": "지정 폴더 공유 복구; 사람의 별도 업로드 절차는 만들지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-41-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #41 분류 기준은 있음: 업무=원료·처방, 유형=원천. 36_ 우선 결정은 문서 감시; BOM 폴더 Read + ERP 신규 품목 대비 누락 검출. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#41의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-41-access",
                  "title": "읽기 전용 접근",
                  "status": "blocked",
                  "detail": "문서 감시 폴더 4개의 ID가 제공되지 않아 접근 대상을 지정할 수 없음. 폴더 식별·공유 권한 제공 뒤 실제 Read를 검증한다. 2026-10-14 갱신(묶음④ · 원료리스트-1014): 9/30 Drive 탐색 확장(공유 드라이브 0개 · 폴더 제목 부분 일치 · 01_고객원본 동명 파일 상위 폴더). 후보는 #16 「팀별 자료/연구소(+하위 COA·MSDS 폴더)」뿐 — 9/10 일괄 업로드 뒤 추가·수정 없음이라 운영 감시 폴더가 아닌 전달 사본으로 판단, 자동 바인딩 안 함. 운영 폴더 링크·공유 요청 초안(38-drafts A). 10/14 기존 원료리스트 단일 파일은 승인된 읽기 전용 계정으로 접근·정리 가동을 완료했다. 문서감시 폴더 4개와 BOM·전성분 전체 접근은 아직 없어 E2 전체 상태는 blocked를 유지한다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/evidence/folder-candidates-sanitized.json",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/scripts/discover_watch_folders.py",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/38-drafts.md",
                    "docs/work-log/2026-10-14_material-automation-status-refresh/public-material-automation-status.md"
                  ],
                  "next": "BOM 관리 주체 · 처방은 기밀 권한",
                  "criterion": "원료·전성분·BOM 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-41-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "문서 감시; BOM 폴더 Read + ERP 신규 품목 대비 누락 검출 경로의 account/object, parser, 개인정보 제거기, Drive 변경 5분 감지 + 매일 발행 예정 확인 schedule을 원천별로 고정한다.",
                  "criterion": "#41에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-41-live-read",
                  "title": "실계정 첫 Read",
                  "status": "blocked",
                  "detail": "문서 감시 폴더 4개의 ID가 제공되지 않아 접근 대상을 지정할 수 없음. 폴더 식별·공유 권한 제공 뒤 실제 Read를 검증한다. 실 Read 완료는 원료·전성분·BOM 전 범위 원문이 raw lake에 착지한 실행으로 다시 증명해야 함. 2026-10-14 갱신(원료리스트-1014): 10/14 기존 원료리스트 단일 파일을 실제 Drive 원본에서 읽어 비공개 환경에서 정리했고 30분 작업을 가동했다. 이 실행은 단일 파일 범위다. 문서감시 폴더 4개, BOM·전성분 전체 원문, 플랫폼 raw lake·DB 착지가 없어 #41 전체 E4는 blocked를 유지한다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-14_material-automation-status-refresh/public-material-automation-status.md"
                  ],
                  "next": "원료·전성분·BOM에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-41-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: BOM·원료·전성분 문서; ERP 신규 품목 대비 문서 누락 0. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "BOM·원료·전성분 문서; ERP 신규 품목 대비 문서 누락 0에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-41-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 원문 문서. 추출 결과는 사람 검수 필요 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-41-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 실패 분기 필요. 승인된 폴백: 지정 폴더 공유 복구; 사람의 별도 업로드 절차는 만들지 않음",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-41-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=Drive 변경 5분 감지 + 매일 발행 예정 확인. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "Drive 변경 5분 감지 + 매일 발행 예정 확인 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-41-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#41 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-42",
              "title": "#42 출하적부·성적서·COA",
              "status": "blocked",
              "detail": "LOT·품질 · 원천. 목표=문서 감시; COA 폴더 Read + ERP LOT 출하 대비 누락 검출; 현재 접근은 문서 감시 폴더 4개의 ID가 제공되지 않아 접근 대상을 지정할 수 없음. 폴더 식별·공유 권한 제공 뒤 실제 Read를 검증한다.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→Drive 변경 5분 감지 + 매일 발행 예정 확인 2회→증거 동결.",
              "source": {
                "row_id": "42",
                "name": "출하적부·성적서·COA",
                "kind": "원천",
                "transport": "drive",
                "cadence": "Drive 변경 5분 감지 + 매일 발행 예정 확인",
                "target_method": "문서 감시; COA 폴더 Read + ERP LOT 출하 대비 누락 검출",
                "current_state": "문서 감시 폴더 4개의 ID가 제공되지 않아 접근 대상을 지정할 수 없음. 폴더 식별·공유 권한 제공 뒤 실제 Read를 검증한다.",
                "conditions": "—",
                "fallback": "지정 폴더 공유 복구; 사람의 별도 업로드 절차는 만들지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-42-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #42 분류 기준은 있음: 업무=LOT·품질, 유형=원천. 36_ 우선 결정은 문서 감시; COA 폴더 Read + ERP LOT 출하 대비 누락 검출. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#42의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-42-access",
                  "title": "읽기 전용 접근",
                  "status": "blocked",
                  "detail": "문서 감시 폴더 4개의 ID가 제공되지 않아 접근 대상을 지정할 수 없음. 폴더 식별·공유 권한 제공 뒤 실제 Read를 검증한다. 2026-10-14 갱신(묶음④): 9/30 Drive 탐색 확장(공유 드라이브 0개 · 폴더 제목 부분 일치 · 01_고객원본 동명 파일 상위 폴더). 후보는 #16 「팀별 자료/RM」뿐 — 9/10 일괄 업로드 뒤 추가·수정 없음이라 운영 감시 폴더가 아닌 전달 사본으로 판단, 자동 바인딩 안 함. 운영 폴더 링크·공유 요청 초안(38-drafts A).",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/evidence/folder-candidates-sanitized.json",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/scripts/discover_watch_folders.py",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/38-drafts.md"
                  ],
                  "next": "—",
                  "criterion": "출하적부·성적서·COA 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-42-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "문서 감시; COA 폴더 Read + ERP LOT 출하 대비 누락 검출 경로의 account/object, parser, 개인정보 제거기, Drive 변경 5분 감지 + 매일 발행 예정 확인 schedule을 원천별로 고정한다.",
                  "criterion": "#42에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-42-live-read",
                  "title": "실계정 첫 Read",
                  "status": "blocked",
                  "detail": "문서 감시 폴더 4개의 ID가 제공되지 않아 접근 대상을 지정할 수 없음. 폴더 식별·공유 권한 제공 뒤 실제 Read를 검증한다. 실 Read 완료는 출하적부·성적서·COA 전 범위 원문이 raw lake에 착지한 실행으로 다시 증명해야 함.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "출하적부·성적서·COA에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-42-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: LOT별 COA·성적서·출하적부 문서; ERP 출하 LOT 대비 문서 누락 0. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "LOT별 COA·성적서·출하적부 문서; ERP 출하 LOT 대비 문서 누락 0에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-42-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 원문 PDF. 표 추출 오류 가능 → 검수 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-42-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 실패 분기 필요. 승인된 폴백: 지정 폴더 공유 복구; 사람의 별도 업로드 절차는 만들지 않음",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-42-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=Drive 변경 5분 감지 + 매일 발행 예정 확인. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "Drive 변경 5분 감지 + 매일 발행 예정 확인 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-42-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#42 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-46",
              "title": "#46 Kantar",
              "status": "partial",
              "detail": "시장정보 · 원천. 목표=automated_batch: Drive 업로드 폴더 감시 — 제조사·거래처에서 받을 때마다 담당자가 원본을 올림(2026-10-16 결정, 10/8 회신: 수시 수령); 현재 접근은 2026-10-16 메일 수신에서 Drive 업로드 폴더로 전환(36_ 결정 17). 수집 계정 소유 업로드 폴더를 만들고 담당자에게 편집 권한을 줬다. 업로드 요청 발송 · 담당 확인 · 첫 업로드는 남음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→원천 발행: 월 1회; 미발행 여부 매일 확인 2회→증거 동결.",
              "source": {
                "row_id": "46",
                "name": "Kantar",
                "kind": "원천",
                "transport": "drive",
                "cadence": "원천 발행: 월 1회; 미발행 여부 매일 확인",
                "target_method": "automated_batch: Drive 업로드 폴더 감시 — 제조사·거래처에서 받을 때마다 담당자가 원본을 올림(2026-10-16 결정, 10/8 회신: 수시 수령)",
                "current_state": "2026-10-16 메일 수신에서 Drive 업로드 폴더로 전환(36_ 결정 17). 수집 계정 소유 업로드 폴더를 만들고 담당자에게 편집 권한을 줬다. 업로드 요청 발송 · 담당 확인 · 첫 업로드는 남음.",
                "conditions": "범위 확정 · 업로드 폴더·담당 지정 · 최근 파일 1부",
                "fallback": "업로드 미도착 알림(발행 예정일 경과) → 담당자 재업로드 → 잔여 수동 사유 공개",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-46-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #46 분류 기준은 있음: 업무=시장정보, 유형=원천. 36_ 우선 결정은 automated_batch: Drive 업로드 폴더 감시 — 제조사·거래처에서 받을 때마다 담당자가 원본을 올림(2026-10-16 결정, 10/8 회신: 수시 수령). 실객체·기간·권위 범위 승인은 남음. 2026-10-14 갱신(L6 · live-read-1011): 파일 표본 저장소에 없음 — 형식·열·기간 표기 미상이라 route 틀 없음. 표본·수신 담당·포털 여부 요청(38-drafts K). 2026-10-11 갱신: 10/8 회신 #28: Kantar 는 정기 구매가 아니라 제조사 · 거래처에서 그때그때 받음 → 받을 때마다 업로드, 지연 알림 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-30_todo-l6-mail-dutyfree/38-drafts.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#46의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-46-access",
                  "title": "읽기 전용 접근",
                  "status": "partial",
                  "detail": "2026-10-16 메일 수신에서 Drive 업로드 폴더로 전환(36_ 결정 17). 수집 계정 소유 업로드 폴더를 만들고 담당자에게 편집 권한을 줬다. 업로드 요청 발송 · 담당 확인 · 첫 업로드는 남음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
                  ],
                  "next": "범위 확정 · 업로드 폴더·담당 지정 · 최근 파일 1부",
                  "criterion": "Kantar 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-46-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "files 파서와 Drive 폴더 감시(reception DriveRoute) 존재. 2026-10-16 업로드 폴더에 route 바인딩(drive-routes.template.json upload-*)하고 Mac mini 5분 주기 감시를 가동(로컬 dev DB · 첫 실행 발견 0). 원본 파일 계약은 첫 실파일로 확정(남은 표본은 부서 가공본이거나 0건).",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "automated_batch: Drive 업로드 폴더 감시 — 제조사·거래처에서 받을 때마다 담당자가 원본을 올림(2026-10-16 결정, 10/8 회신: 수시 수령) 경로의 account/object, parser, 개인정보 제거기, 원천 발행: 월 1회; 미발행 여부 매일 확인 schedule을 원천별로 고정한다.",
                  "criterion": "#46에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-46-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "Kantar 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "Kantar에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-46-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: Kantar 업로드 폴더의 원본 파일, 파일명 날짜·기간, 발행 예정일 미도착, 재업로드 중복, 가공본 거부. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "Kantar 업로드 폴더의 원본 파일, 파일명 날짜·기간, 발행 예정일 미도착, 재업로드 중복, 가공본 거부에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-46-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 유료 패널 추정치 — 시장 규모용, 자사 실적 아님 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-46-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 실패 분기 필요. 승인된 폴백: 업로드 미도착 알림(발행 예정일 경과) → 담당자 재업로드 → 잔여 수동 사유 공개",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-46-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=원천 발행: 월 1회; 미발행 여부 매일 확인. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "원천 발행: 월 1회; 미발행 여부 매일 확인 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-46-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#46 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-47",
              "title": "#47 롯데면세점 SRM",
              "status": "partial",
              "detail": "면세 · 원천. 목표=api_interface: Drive 업로드 폴더 감시 — 담당자가 SRM 원본 일 판매·월 수불 파일을 올림(2026-10-16 결정). MD 매일 자동 발송 합의 시 SES 수신, 유통사 API·EDI 는 비용 승인 시만(9/7 현업: 약 3억); 현재 접근은 2026-10-16 메일 수신에서 Drive 업로드 폴더로 전환(36_ 결정 17). 수집 계정 소유 업로드 폴더를 만들고 담당자에게 편집 권한을 줬다. 업로드 요청 발송 · 담당 확인 · 첫 업로드는 남음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→원천 발행: 일 1회(판매) · 월 1회(수불); 미발행 여부 매일 확인 2회→증거 동결.",
              "source": {
                "row_id": "47",
                "name": "롯데면세점 SRM",
                "kind": "원천",
                "transport": "drive",
                "cadence": "원천 발행: 일 1회(판매) · 월 1회(수불); 미발행 여부 매일 확인",
                "target_method": "api_interface: Drive 업로드 폴더 감시 — 담당자가 SRM 원본 일 판매·월 수불 파일을 올림(2026-10-16 결정). MD 매일 자동 발송 합의 시 SES 수신, 유통사 API·EDI 는 비용 승인 시만(9/7 현업: 약 3억)",
                "current_state": "2026-10-16 메일 수신에서 Drive 업로드 폴더로 전환(36_ 결정 17). 수집 계정 소유 업로드 폴더를 만들고 담당자에게 편집 권한을 줬다. 업로드 요청 발송 · 담당 확인 · 첫 업로드는 남음.",
                "conditions": "업로드 폴더·담당 지정(RBD2) · 원본 파일 계약(가공본 아님) · MD 매일 자동 발송 가능 여부 문의",
                "fallback": "업로드 미도착 알림 → 담당자 재업로드 → MD 매일 자동 발송 합의 시 SES 수신 → API·EDI(비용 승인 시) → 잔여 수동 공개",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-47-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #47 분류 기준은 있음: 업무=면세, 유형=원천. 36_ 우선 결정은 api_interface: Drive 업로드 폴더 감시 — 담당자가 SRM 원본 일 판매·월 수불 파일을 올림(2026-10-16 결정). MD 매일 자동 발송 합의 시 SES 수신, 유통사 API·EDI 는 비용 승인 시만(9/7 현업: 약 3억). 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#47의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-47-access",
                  "title": "읽기 전용 접근",
                  "status": "partial",
                  "detail": "2026-10-16 메일 수신에서 Drive 업로드 폴더로 전환(36_ 결정 17). 수집 계정 소유 업로드 폴더를 만들고 담당자에게 편집 권한을 줬다. 업로드 요청 발송 · 담당 확인 · 첫 업로드는 남음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
                  ],
                  "next": "업로드 폴더·담당 지정(RBD2) · 원본 파일 계약(가공본 아님) · MD 매일 자동 발송 가능 여부 문의",
                  "criterion": "롯데면세점 SRM 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-47-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "files 파서와 Drive 폴더 감시(reception DriveRoute) 존재. 2026-10-16 업로드 폴더에 route 바인딩(drive-routes.template.json upload-*)하고 Mac mini 5분 주기 감시를 가동(로컬 dev DB · 첫 실행 발견 0). 원본 파일 계약은 첫 실파일로 확정(남은 표본은 부서 가공본이거나 0건). 2026-10-14 갱신(L6): 인바운드 허용 목록에 면세 5곳 (원천, 객체) 추가. 월 수불 2계약은 files 파서 재사용(route parser=null) — files+inbound 동시 등록 충돌 0 확인. 수신 route 틀 dutyfree_routes.template.json(provisional). sellout_daily 는 표본·파서 없음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "docs/work-log/2026-09-30_todo-l6-mail-dutyfree/evidence/l6-evidence.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/inbound/contracts/dutyfree_routes.template.json"
                  ],
                  "next": "api_interface: Drive 업로드 폴더 감시 — 담당자가 SRM 원본 일 판매·월 수불 파일을 올림(2026-10-16 결정). MD 매일 자동 발송 합의 시 SES 수신, 유통사 API·EDI 는 비용 승인 시만(9/7 현업: 약 3억) 경로의 account/object, parser, 개인정보 제거기, 원천 발행: 일 1회(판매) · 월 1회(수불); 미발행 여부 매일 확인 schedule을 원천별로 고정한다.",
                  "criterion": "#47에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-47-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "롯데면세점 SRM 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "롯데면세점 SRM에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-47-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 롯데면세 SRM 원본 일 판매 파일과 월 수불 파일(업로드 폴더); 파일별 통제 합계, 가공본 거부. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "롯데면세 SRM 원본 일 판매 파일과 월 수불 파일(업로드 폴더); 파일별 통제 합계, 가공본 거부에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-47-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 셀아웃은 유통사 전산 기록이라 정확(9/7 면세·다이소 L416). 경로가 승인·협상 결과에 달림 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-47-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 실패 분기 필요. 승인된 폴백: 업로드 미도착 알림 → 담당자 재업로드 → MD 매일 자동 발송 합의 시 SES 수신 → API·EDI(비용 승인 시) → 잔여 수동 공개",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-47-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=원천 발행: 일 1회(판매) · 월 1회(수불); 미발행 여부 매일 확인. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "원천 발행: 일 1회(판매) · 월 1회(수불); 미발행 여부 매일 확인 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-47-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#47 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-48",
              "title": "#48 신라면세점 SRM",
              "status": "partial",
              "detail": "면세 · 원천. 목표=api_interface: Drive 업로드 폴더 감시 — 담당자가 SRM 원본 일 판매·월 수불 파일을 올림(2026-10-16 결정). MD 매일 자동 발송 합의 시 SES 수신, 유통사 API·EDI 는 비용 승인 시만(9/7 현업: 약 3억); 현재 접근은 2026-10-16 메일 수신에서 Drive 업로드 폴더로 전환(36_ 결정 17). 수집 계정 소유 업로드 폴더를 만들고 담당자에게 편집 권한을 줬다. 업로드 요청 발송 · 담당 확인 · 첫 업로드는 남음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→원천 발행: 일 1회(판매) · 월 1회(수불); 미발행 여부 매일 확인 2회→증거 동결.",
              "source": {
                "row_id": "48",
                "name": "신라면세점 SRM",
                "kind": "원천",
                "transport": "drive",
                "cadence": "원천 발행: 일 1회(판매) · 월 1회(수불); 미발행 여부 매일 확인",
                "target_method": "api_interface: Drive 업로드 폴더 감시 — 담당자가 SRM 원본 일 판매·월 수불 파일을 올림(2026-10-16 결정). MD 매일 자동 발송 합의 시 SES 수신, 유통사 API·EDI 는 비용 승인 시만(9/7 현업: 약 3억)",
                "current_state": "2026-10-16 메일 수신에서 Drive 업로드 폴더로 전환(36_ 결정 17). 수집 계정 소유 업로드 폴더를 만들고 담당자에게 편집 권한을 줬다. 업로드 요청 발송 · 담당 확인 · 첫 업로드는 남음.",
                "conditions": "업로드 폴더·담당 지정(RBD2) · 원본 파일 계약(가공본 아님) · MD 매일 자동 발송 가능 여부 문의 · 자동 로그인 시도 없음",
                "fallback": "업로드 미도착 알림 → 담당자 재업로드 → MD 매일 자동 발송 합의 시 SES 수신 → API·EDI(비용 승인 시). 자동 로그인 시도 없음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-48-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #48 분류 기준은 있음: 업무=면세, 유형=원천. 36_ 우선 결정은 api_interface: Drive 업로드 폴더 감시 — 담당자가 SRM 원본 일 판매·월 수불 파일을 올림(2026-10-16 결정). MD 매일 자동 발송 합의 시 SES 수신, 유통사 API·EDI 는 비용 승인 시만(9/7 현업: 약 3억). 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#48의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-48-access",
                  "title": "읽기 전용 접근",
                  "status": "partial",
                  "detail": "2026-10-16 메일 수신에서 Drive 업로드 폴더로 전환(36_ 결정 17). 수집 계정 소유 업로드 폴더를 만들고 담당자에게 편집 권한을 줬다. 업로드 요청 발송 · 담당 확인 · 첫 업로드는 남음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
                  ],
                  "next": "업로드 폴더·담당 지정(RBD2) · 원본 파일 계약(가공본 아님) · MD 매일 자동 발송 가능 여부 문의 · 자동 로그인 시도 없음",
                  "criterion": "신라면세점 SRM 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-48-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "files 파서와 Drive 폴더 감시(reception DriveRoute) 존재. 2026-10-16 업로드 폴더에 route 바인딩(drive-routes.template.json upload-*)하고 Mac mini 5분 주기 감시를 가동(로컬 dev DB · 첫 실행 발견 0). 원본 파일 계약은 첫 실파일로 확정(남은 표본은 부서 가공본이거나 0건). 2026-10-14 갱신(L6): 인바운드 허용 목록에 면세 5곳 (원천, 객체) 추가. 월 수불 2계약은 files 파서 재사용(route parser=null) — files+inbound 동시 등록 충돌 0 확인. 수신 route 틀 dutyfree_routes.template.json(provisional). sellout_daily 는 표본·파서 없음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "docs/work-log/2026-09-30_todo-l6-mail-dutyfree/evidence/l6-evidence.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/inbound/contracts/dutyfree_routes.template.json"
                  ],
                  "next": "api_interface: Drive 업로드 폴더 감시 — 담당자가 SRM 원본 일 판매·월 수불 파일을 올림(2026-10-16 결정). MD 매일 자동 발송 합의 시 SES 수신, 유통사 API·EDI 는 비용 승인 시만(9/7 현업: 약 3억) 경로의 account/object, parser, 개인정보 제거기, 원천 발행: 일 1회(판매) · 월 1회(수불); 미발행 여부 매일 확인 schedule을 원천별로 고정한다.",
                  "criterion": "#48에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-48-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "신라면세점 SRM 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "신라면세점 SRM에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-48-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 신라면세 SRM 원본 일 판매 파일과 월 수불 파일(업로드 폴더); 지정일 월 누적 형식, 가공본 거부. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "신라면세 SRM 원본 일 판매 파일과 월 수불 파일(업로드 폴더); 지정일 월 누적 형식, 가공본 거부에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-48-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 셀아웃은 유통사 전산 기록이라 정확(9/7 면세·다이소 L416). 경로가 승인·협상 결과에 달림 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-48-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 실패 분기 필요. 승인된 폴백: 업로드 미도착 알림 → 담당자 재업로드 → MD 매일 자동 발송 합의 시 SES 수신 → API·EDI(비용 승인 시). 자동 로그인 시도 없음",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-48-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=원천 발행: 일 1회(판매) · 월 1회(수불); 미발행 여부 매일 확인. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "원천 발행: 일 1회(판매) · 월 1회(수불); 미발행 여부 매일 확인 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-48-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#48 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-51",
              "title": "#51 아이파크신라면세점",
              "status": "partial",
              "detail": "면세 · 원천. 목표=api_interface: Drive 업로드 폴더 감시 — 담당자가 SRM 원본 일 판매·월 수불 파일을 올림(2026-10-16 결정). MD 매일 자동 발송 합의 시 SES 수신, 유통사 API·EDI 는 비용 승인 시만(9/7 현업: 약 3억); 현재 접근은 2026-10-16 메일 수신에서 Drive 업로드 폴더로 전환(36_ 결정 17). 수집 계정 소유 업로드 폴더를 만들고 담당자에게 편집 권한을 줬다. 업로드 요청 발송 · 담당 확인 · 첫 업로드는 남음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→원천 발행: 일 1회(판매) · 월 1회(수불); 미발행 여부 매일 확인 2회→증거 동결.",
              "source": {
                "row_id": "51",
                "name": "아이파크신라면세점",
                "kind": "원천",
                "transport": "drive",
                "cadence": "원천 발행: 일 1회(판매) · 월 1회(수불); 미발행 여부 매일 확인",
                "target_method": "api_interface: Drive 업로드 폴더 감시 — 담당자가 SRM 원본 일 판매·월 수불 파일을 올림(2026-10-16 결정). MD 매일 자동 발송 합의 시 SES 수신, 유통사 API·EDI 는 비용 승인 시만(9/7 현업: 약 3억)",
                "current_state": "2026-10-16 메일 수신에서 Drive 업로드 폴더로 전환(36_ 결정 17). 수집 계정 소유 업로드 폴더를 만들고 담당자에게 편집 권한을 줬다. 업로드 요청 발송 · 담당 확인 · 첫 업로드는 남음.",
                "conditions": "#48 과 동일",
                "fallback": "업로드 미도착 알림 → 담당자 재업로드 → MD 매일 자동 발송 합의 시 SES 수신 → API·EDI(비용 승인 시). 자동 로그인 시도 없음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-51-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #51 분류 기준은 있음: 업무=면세, 유형=원천. 36_ 우선 결정은 api_interface: Drive 업로드 폴더 감시 — 담당자가 SRM 원본 일 판매·월 수불 파일을 올림(2026-10-16 결정). MD 매일 자동 발송 합의 시 SES 수신, 유통사 API·EDI 는 비용 승인 시만(9/7 현업: 약 3억). 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#51의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-51-access",
                  "title": "읽기 전용 접근",
                  "status": "partial",
                  "detail": "2026-10-16 메일 수신에서 Drive 업로드 폴더로 전환(36_ 결정 17). 수집 계정 소유 업로드 폴더를 만들고 담당자에게 편집 권한을 줬다. 업로드 요청 발송 · 담당 확인 · 첫 업로드는 남음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
                  ],
                  "next": "#48 과 동일",
                  "criterion": "아이파크신라면세점 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-51-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "files 파서와 Drive 폴더 감시(reception DriveRoute) 존재. 2026-10-16 업로드 폴더에 route 바인딩(drive-routes.template.json upload-*)하고 Mac mini 5분 주기 감시를 가동(로컬 dev DB · 첫 실행 발견 0). 원본 파일 계약은 첫 실파일로 확정(남은 표본은 부서 가공본이거나 0건). 2026-10-14 갱신(L6): 인바운드 허용 목록에 면세 5곳 (원천, 객체) 추가. 월 수불 2계약은 files 파서 재사용(route parser=null) — files+inbound 동시 등록 충돌 0 확인. 수신 route 틀 dutyfree_routes.template.json(provisional). sellout_daily 는 표본·파서 없음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "docs/work-log/2026-09-30_todo-l6-mail-dutyfree/evidence/l6-evidence.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/inbound/contracts/dutyfree_routes.template.json"
                  ],
                  "next": "api_interface: Drive 업로드 폴더 감시 — 담당자가 SRM 원본 일 판매·월 수불 파일을 올림(2026-10-16 결정). MD 매일 자동 발송 합의 시 SES 수신, 유통사 API·EDI 는 비용 승인 시만(9/7 현업: 약 3억) 경로의 account/object, parser, 개인정보 제거기, 원천 발행: 일 1회(판매) · 월 1회(수불); 미발행 여부 매일 확인 schedule을 원천별로 고정한다.",
                  "criterion": "#51에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-51-live-read",
                  "title": "실계정 첫 Read",
                  "status": "pending",
                  "detail": "아이파크신라면세점 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "아이파크신라면세점에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-51-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 아이파크신라 SRM 원본 일 판매 파일과 월 수불 파일(업로드 폴더); 신라와 같은 형식, 가공본 거부. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "아이파크신라 SRM 원본 일 판매 파일과 월 수불 파일(업로드 폴더); 신라와 같은 형식, 가공본 거부에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-51-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 셀아웃은 유통사 전산 기록이라 정확(9/7 면세·다이소 L416). 경로가 승인·협상 결과에 달림 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-51-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 실패 분기 필요. 승인된 폴백: 업로드 미도착 알림 → 담당자 재업로드 → MD 매일 자동 발송 합의 시 SES 수신 → API·EDI(비용 승인 시). 자동 로그인 시도 없음",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-51-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=원천 발행: 일 1회(판매) · 월 1회(수불); 미발행 여부 매일 확인. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "원천 발행: 일 1회(판매) · 월 1회(수불); 미발행 여부 매일 확인 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-51-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#51 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-68",
              "title": "#68 품질서류 RM(QA/RA)",
              "status": "blocked",
              "detail": "품질 · 원천. 목표=문서 감시; 품질서류 폴더 Read, 누락 기준 별도 확정; 현재 접근은 문서 감시 폴더 4개의 ID가 제공되지 않아 접근 대상을 지정할 수 없음. 폴더 식별·공유 권한 제공 뒤 실제 Read를 검증한다.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→Drive 변경 5분 감지 + 매일 발행 예정 확인 2회→증거 동결.",
              "source": {
                "row_id": "68",
                "name": "품질서류 RM(QA/RA)",
                "kind": "원천",
                "transport": "drive",
                "cadence": "Drive 변경 5분 감지 + 매일 발행 예정 확인",
                "target_method": "문서 감시; 품질서류 폴더 Read, 누락 기준 별도 확정",
                "current_state": "문서 감시 폴더 4개의 ID가 제공되지 않아 접근 대상을 지정할 수 없음. 폴더 식별·공유 권한 제공 뒤 실제 Read를 검증한다.",
                "conditions": "—",
                "fallback": "지정 폴더 공유 복구; 사람의 별도 업로드 절차는 만들지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-68-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #68 분류 기준은 있음: 업무=품질, 유형=원천. 36_ 우선 결정은 문서 감시; 품질서류 폴더 Read, 누락 기준 별도 확정. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#68의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-68-access",
                  "title": "읽기 전용 접근",
                  "status": "blocked",
                  "detail": "문서 감시 폴더 4개의 ID가 제공되지 않아 접근 대상을 지정할 수 없음. 폴더 식별·공유 권한 제공 뒤 실제 Read를 검증한다. 2026-10-14 갱신(묶음④): 9/30 Drive 탐색 확장(공유 드라이브 0개 · 폴더 제목 부분 일치 · 01_고객원본 동명 파일 상위 폴더). 후보는 #16 「팀별 자료/RM·엑스퍼트」뿐 — 9/10 일괄 업로드 뒤 추가·수정 없음이라 운영 감시 폴더가 아닌 전달 사본으로 판단, 자동 바인딩 안 함. 운영 폴더 링크·공유 요청 초안(38-drafts A).",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/evidence/folder-candidates-sanitized.json",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/scripts/discover_watch_folders.py",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/38-drafts.md"
                  ],
                  "next": "—",
                  "criterion": "품질서류 RM(QA/RA) 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-68-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "done",
                  "detail": "E3 manifest에 원천 계약·수집기·파서·필요한 redactor·등록이 합성 시험 기준으로 완료됨. E2·E4는 별도 게이트로 유지.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "문서 감시; 품질서류 폴더 Read, 누락 기준 별도 확정 경로의 account/object, parser, 개인정보 제거기, Drive 변경 5분 감지 + 매일 발행 예정 확인 schedule을 원천별로 고정한다.",
                  "criterion": "#68에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-68-live-read",
                  "title": "실계정 첫 Read",
                  "status": "blocked",
                  "detail": "문서 감시 폴더 4개의 ID가 제공되지 않아 접근 대상을 지정할 수 없음. 폴더 식별·공유 권한 제공 뒤 실제 Read를 검증한다. 실 Read 완료는 품질서류 RM(QA/RA) 전 범위 원문이 raw lake에 착지한 실행으로 다시 증명해야 함.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "품질서류 RM(QA/RA)에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-68-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 품질서류 RM(QA/RA) 지정 폴더의 신규·수정 파일, 최대 탐색 깊이, 발행 예정일과 중복 파일. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "품질서류 RM(QA/RA) 지정 폴더의 신규·수정 파일, 최대 탐색 깊이, 발행 예정일과 중복 파일에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-68-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 원문 PDF 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-68-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 실패 분기 필요. 승인된 폴백: 지정 폴더 공유 복구; 사람의 별도 업로드 절차는 만들지 않음",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-68-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=Drive 변경 5분 감지 + 매일 발행 예정 확인. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "Drive 변경 5분 감지 + 매일 발행 예정 확인 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-68-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#68 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-96",
              "title": "#96 코스트코",
              "status": "partial",
              "detail": "채널 · 원천. 목표=automated_batch: Drive 업로드 폴더 감시 — 고객 담당이 코스트코 인증 PC에서 뽑은 원본을 올림(2026-10-16 결정 · 발송 주체는 바이어가 아니라 고객 내부); 현재 접근은 2026-10-16 메일 수신에서 Drive 업로드 폴더로 전환(36_ 결정 17). 수집 계정 소유 업로드 폴더를 만들고 담당자에게 편집 권한을 줬다. 업로드 요청 발송 · 담당 확인 · 첫 업로드는 남음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→원천 발행: 주·월; 미발행 여부 매일 확인 2회→증거 동결.",
              "source": {
                "row_id": "96",
                "name": "코스트코",
                "kind": "원천",
                "transport": "drive",
                "cadence": "원천 발행: 주·월; 미발행 여부 매일 확인",
                "target_method": "automated_batch: Drive 업로드 폴더 감시 — 고객 담당이 코스트코 인증 PC에서 뽑은 원본을 올림(2026-10-16 결정 · 발송 주체는 바이어가 아니라 고객 내부)",
                "current_state": "2026-10-16 메일 수신에서 Drive 업로드 폴더로 전환(36_ 결정 17). 수집 계정 소유 업로드 폴더를 만들고 담당자에게 편집 권한을 줬다. 업로드 요청 발송 · 담당 확인 · 첫 업로드는 남음.",
                "conditions": "업로드 폴더·담당 지정 · 인증 PC 원본 양식 1부 · 회원주문 개인정보 판정",
                "fallback": "업로드 미도착 알림(발행 예정일 경과) → 담당자 재업로드 → 잔여 수동 사유 공개",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-96-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #96 분류 기준은 있음: 업무=채널, 유형=원천. 36_ 우선 결정은 automated_batch: Drive 업로드 폴더 감시 — 고객 담당이 코스트코 인증 PC에서 뽑은 원본을 올림(2026-10-16 결정 · 발송 주체는 바이어가 아니라 고객 내부). 실객체·기간·권위 범위 승인은 남음. 2026-10-14 갱신(L6 · live-read-1011): 발송 주체 정정 — 코스트코 파일은 고객 경영지원실 담당이 코스트코 인증 PC 에서 추출(2026-09-07 회의 전사록). 합의 상대는 제3자가 아니라 고객 내부. 38_ 7·7-1 코스트코 부분 정정 필요(38-drafts L). 2026-10-11 갱신: 10/8 회신 #38: 코스트코는 지정 노트북으로만 접속 — 방문 확인. 월 확정 매출은 #103 영업그룹 「코스트코(한국)」.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-30_todo-l6-mail-dutyfree/38-drafts.md",
                    "docs/work-log/2026-10-11_live-read/reconcile-summary.json"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#96의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-96-access",
                  "title": "읽기 전용 접근",
                  "status": "partial",
                  "detail": "2026-10-16 메일 수신에서 Drive 업로드 폴더로 전환(36_ 결정 17). 수집 계정 소유 업로드 폴더를 만들고 담당자에게 편집 권한을 줬다. 업로드 요청 발송 · 담당 확인 · 첫 업로드는 남음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
                  ],
                  "next": "업로드 폴더·담당 지정 · 인증 PC 원본 양식 1부 · 회원주문 개인정보 판정",
                  "criterion": "코스트코 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-96-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "files 파서와 Drive 폴더 감시(reception DriveRoute) 존재. 2026-10-16 업로드 폴더에 route 바인딩(drive-routes.template.json upload-*)하고 Mac mini 5분 주기 감시를 가동(로컬 dev DB · 첫 실행 발견 0). 원본 파일 계약은 첫 실파일로 확정(남은 표본은 부서 가공본이거나 0건). 2026-10-14 갱신(묶음②·L6): route 계약 provisional — 수령 샘플은 부서 통합문서(숨김 16·수식 989칸). 코스트코 원 발송 양식 없음. 부서 모양 파일은 header_drift 로 적재 0 임을 시험으로 확인. route key_prefix 를 SES 규칙 2 실제 접두어(partner/)로 교정 — 이전 템플릿(partner/<원천>/)은 SES 가 만들지 않는 접두어라 수신돼도 수집 0. allow_other_recipients 옵트인 추가(발신처가 기존 수신자 + 우리 주소 Cc 로 보내는 경우).",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "docs/work-log/2026-09-30_partial-read-completion/mail-file-contracts.md",
                    "docs/work-log/2026-09-30_todo-l6-mail-dutyfree/receiving-design.md",
                    "docs/work-log/2026-09-30_todo-l6-mail-dutyfree/evidence/l6-evidence.json"
                  ],
                  "next": "automated_batch: Drive 업로드 폴더 감시 — 고객 담당이 코스트코 인증 PC에서 뽑은 원본을 올림(2026-10-16 결정 · 발송 주체는 바이어가 아니라 고객 내부) 경로의 account/object, parser, 개인정보 제거기, 원천 발행: 주·월; 미발행 여부 매일 확인 schedule을 원천별로 고정한다.",
                  "criterion": "#96에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-96-live-read",
                  "title": "실계정 첫 Read",
                  "status": "partial",
                  "detail": "코스트코 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지. 2026-09-29~30 수령 샘플 또는 파생 시트를 파싱해 탭·행 수와 SHA-256 을 기록했다. 운영 경로(ERP·API·포털·수신)의 실 Read 가 아니므로 E4 완료로 세지 않는다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-29_source-read-t0t1t2-resume/read-evidence-sanitized.json"
                  ],
                  "next": "코스트코에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-96-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 코스트코 업로드 폴더의 원본 파일, 파일명 날짜·기간, 발행 예정일 미도착, 재업로드 중복, 가공본 거부. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "코스트코 업로드 폴더의 원본 파일, 파일명 날짜·기간, 발행 예정일 미도착, 재업로드 중복, 가공본 거부에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-96-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 유통사 산출 실적. 발송이 사람 작업이면 누락 가능 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-96-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 실패 분기 필요. 승인된 폴백: 업로드 미도착 알림(발행 예정일 경과) → 담당자 재업로드 → 잔여 수동 사유 공개",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-96-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=원천 발행: 주·월; 미발행 여부 매일 확인. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "원천 발행: 주·월; 미발행 여부 매일 확인 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-96-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#96 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-101",
              "title": "#101 일본 오프라인 셀인",
              "status": "partial",
              "detail": "채널 · 원천. 목표=automated_batch: Drive 업로드 폴더 감시 — 일본사업팀이 셀인 파일을 받을 때마다 원본을 올림(2026-10-16 결정, 10/8 회신: 비정기); 현재 접근은 2026-10-16 메일 수신에서 Drive 업로드 폴더로 전환(36_ 결정 17). 수집 계정 소유 업로드 폴더를 만들고 담당자에게 편집 권한을 줬다. 업로드 요청 발송 · 담당 확인 · 첫 업로드는 남음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→원천 발행: 월 1회; 미발행 여부 매일 확인 2회→증거 동결.",
              "source": {
                "row_id": "101",
                "name": "일본 오프라인 셀인",
                "kind": "원천",
                "transport": "drive",
                "cadence": "원천 발행: 월 1회; 미발행 여부 매일 확인",
                "target_method": "automated_batch: Drive 업로드 폴더 감시 — 일본사업팀이 셀인 파일을 받을 때마다 원본을 올림(2026-10-16 결정, 10/8 회신: 비정기)",
                "current_state": "2026-10-16 메일 수신에서 Drive 업로드 폴더로 전환(36_ 결정 17). 수집 계정 소유 업로드 폴더를 만들고 담당자에게 편집 권한을 줬다. 업로드 요청 발송 · 담당 확인 · 첫 업로드는 남음.",
                "conditions": "업로드 폴더·담당 지정 · 원본 파일 1부(가공본 아님)",
                "fallback": "업로드 미도착 알림(발행 예정일 경과) → 담당자 재업로드 → 잔여 수동 사유 공개",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-101-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #101 분류 기준은 있음: 업무=채널, 유형=원천. 36_ 우선 결정은 automated_batch: Drive 업로드 폴더 감시 — 일본사업팀이 셀인 파일을 받을 때마다 원본을 올림(2026-10-16 결정, 10/8 회신: 비정기). 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#101의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-101-access",
                  "title": "읽기 전용 접근",
                  "status": "partial",
                  "detail": "2026-10-16 메일 수신에서 Drive 업로드 폴더로 전환(36_ 결정 17). 수집 계정 소유 업로드 폴더를 만들고 담당자에게 편집 권한을 줬다. 업로드 요청 발송 · 담당 확인 · 첫 업로드는 남음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
                  ],
                  "next": "업로드 폴더·담당 지정 · 원본 파일 1부(가공본 아님)",
                  "criterion": "일본 오프라인 셀인 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-101-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "files 파서와 Drive 폴더 감시(reception DriveRoute) 존재. 2026-10-16 업로드 폴더에 route 바인딩(drive-routes.template.json upload-*)하고 Mac mini 5분 주기 감시를 가동(로컬 dev DB · 첫 실행 발견 0). 원본 파일 계약은 첫 실파일로 확정(남은 표본은 부서 가공본이거나 0건). 2026-10-14 갱신(묶음②·L6): 월 파일 기간 규칙(unit=month) 추가 + route 계약 provisional(샘플은 부서 가공 3시트·수식 1,234칸). 원 발송 파일 시트명 확정 전. route key_prefix 를 SES 규칙 2 실제 접두어(partner/)로 교정 — 이전 템플릿(partner/<원천>/)은 SES 가 만들지 않는 접두어라 수신돼도 수집 0. allow_other_recipients 옵트인 추가(발신처가 기존 수신자 + 우리 주소 Cc 로 보내는 경우).",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/inbound/contracts/partner_routes.template.json",
                    "docs/work-log/2026-09-30_partial-read-completion/mail-file-contracts.md",
                    "docs/work-log/2026-09-30_todo-l6-mail-dutyfree/receiving-design.md",
                    "docs/work-log/2026-09-30_todo-l6-mail-dutyfree/evidence/l6-evidence.json"
                  ],
                  "next": "automated_batch: Drive 업로드 폴더 감시 — 일본사업팀이 셀인 파일을 받을 때마다 원본을 올림(2026-10-16 결정, 10/8 회신: 비정기) 경로의 account/object, parser, 개인정보 제거기, 원천 발행: 월 1회; 미발행 여부 매일 확인 schedule을 원천별로 고정한다.",
                  "criterion": "#101에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-101-live-read",
                  "title": "실계정 첫 Read",
                  "status": "partial",
                  "detail": "일본 오프라인 셀인 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지. 2026-09-29~30 수령 샘플 또는 파생 시트를 파싱해 탭·행 수와 SHA-256 을 기록했다. 운영 경로(ERP·API·포털·수신)의 실 Read 가 아니므로 E4 완료로 세지 않는다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-29_source-read-t0t1t2-resume/read-evidence-sanitized.json"
                  ],
                  "next": "일본 오프라인 셀인에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-101-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 일본 오프라인 셀인 업로드 폴더의 원본 파일, 파일명 날짜·기간, 발행 예정일 미도착, 재업로드 중복, 가공본 거부. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "일본 오프라인 셀인 업로드 폴더의 원본 파일, 파일명 날짜·기간, 발행 예정일 미도착, 재업로드 중복, 가공본 거부에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-101-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 파트너 가공 집계. 소비자 주문 아님 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-101-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 실패 분기 필요. 승인된 폴백: 업로드 미도착 알림(발행 예정일 경과) → 담당자 재업로드 → 잔여 수동 사유 공개",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-101-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=원천 발행: 월 1회; 미발행 여부 매일 확인. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "원천 발행: 월 1회; 미발행 여부 매일 확인 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-101-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#101 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-102",
              "title": "#102 중국 시윤 재고",
              "status": "partial",
              "detail": "재고 · 원천. 목표=automated_batch: Drive 업로드 폴더 감시 — 중국사업팀이 재고표 엑셀(기준일 포함)을 주 1회 올림(2026-10-16 결정). 사진 · 비전 추출은 쓰지 않는다 — 엑셀이 안 되면 미연결; 현재 접근은 2026-10-16 메일 수신에서 Drive 업로드 폴더로 전환(36_ 결정 17). 수집 계정 소유 업로드 폴더를 만들고 담당자에게 편집 권한을 줬다. 업로드 요청 발송 · 담당 확인 · 첫 업로드는 남음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→원천 발행: 주 1회; 미발행 여부 매일 확인 2회→증거 동결.",
              "source": {
                "row_id": "102",
                "name": "중국 시윤 재고",
                "kind": "원천",
                "transport": "drive",
                "cadence": "원천 발행: 주 1회; 미발행 여부 매일 확인",
                "target_method": "automated_batch: Drive 업로드 폴더 감시 — 중국사업팀이 재고표 엑셀(기준일 포함)을 주 1회 올림(2026-10-16 결정). 사진 · 비전 추출은 쓰지 않는다 — 엑셀이 안 되면 미연결",
                "current_state": "2026-10-16 메일 수신에서 Drive 업로드 폴더로 전환(36_ 결정 17). 수집 계정 소유 업로드 폴더를 만들고 담당자에게 편집 권한을 줬다. 업로드 요청 발송 · 담당 확인 · 첫 업로드는 남음.",
                "conditions": "주 1회 업로드 가능 여부(중국사업팀, 10/8 회신: 정기 발송 어려움)",
                "fallback": "업로드 미도착 알림 → 담당자 재업로드 → 엑셀이 안 되면 재고 화면에 「미연결」 표시(사진 · 비전 추출은 쓰지 않는다)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-102-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #102 분류 기준은 있음: 업무=재고, 유형=원천. 36_ 우선 결정은 automated_batch: Drive 업로드 폴더 감시 — 중국사업팀이 재고표 엑셀(기준일 포함)을 주 1회 올림(2026-10-16 결정). 사진 · 비전 추출은 쓰지 않는다 — 엑셀이 안 되면 미연결. 실객체·기간·권위 범위 승인은 남음. 2026-10-14 갱신(live-read-1011): 10/8 회신 #49: 중국팀은 정기 발송이 어렵다 — 사진 그대로 주 1회 + 기준일, 불가 시 「미연결」(답변 초안).",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#102의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-102-access",
                  "title": "읽기 전용 접근",
                  "status": "partial",
                  "detail": "2026-10-16 메일 수신에서 Drive 업로드 폴더로 전환(36_ 결정 17). 수집 계정 소유 업로드 폴더를 만들고 담당자에게 편집 권한을 줬다. 업로드 요청 발송 · 담당 확인 · 첫 업로드는 남음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
                  ],
                  "next": "주 1회 업로드 가능 여부(중국사업팀, 10/8 회신: 정기 발송 어려움)",
                  "criterion": "중국 시윤 재고 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-102-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "files 파서와 Drive 폴더 감시(reception DriveRoute) 존재. 2026-10-16 업로드 폴더에 route 바인딩(drive-routes.template.json upload-*)하고 Mac mini 5분 주기 감시를 가동(로컬 dev DB · 첫 실행 발견 0). 원본 파일 계약은 첫 실파일로 확정(남은 표본은 부서 가공본이거나 0건). 2026-10-14 갱신(묶음②·L6): PNG 는 route 첨부 규칙 밖(ambiguous_attachment 격리). 엑셀 양식 요청 초안(38 초안 B)과 요청 양식 route·시험 작성. route key_prefix 를 SES 규칙 2 실제 접두어(partner/)로 교정 — 이전 템플릿(partner/<원천>/)은 SES 가 만들지 않는 접두어라 수신돼도 수집 0. allow_other_recipients 옵트인 추가(발신처가 기존 수신자 + 우리 주소 Cc 로 보내는 경우).",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "docs/work-log/2026-09-30_partial-read-completion/mail-file-contracts.md",
                    "docs/work-log/2026-09-30_partial-read-completion/38-drafts.md",
                    "docs/work-log/2026-09-30_todo-l6-mail-dutyfree/receiving-design.md",
                    "docs/work-log/2026-09-30_todo-l6-mail-dutyfree/evidence/l6-evidence.json"
                  ],
                  "next": "automated_batch: Drive 업로드 폴더 감시 — 중국사업팀이 재고표 엑셀(기준일 포함)을 주 1회 올림(2026-10-16 결정). 사진 · 비전 추출은 쓰지 않는다 — 엑셀이 안 되면 미연결 경로의 account/object, parser, 개인정보 제거기, 원천 발행: 주 1회; 미발행 여부 매일 확인 schedule을 원천별로 고정한다.",
                  "criterion": "#102에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-102-live-read",
                  "title": "실계정 첫 Read",
                  "status": "partial",
                  "detail": "중국 시윤 재고 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지. 2026-09-29~30 수령 샘플 또는 파생 시트를 파싱해 탭·행 수와 SHA-256 을 기록했다. 운영 경로(ERP·API·포털·수신)의 실 Read 가 아니므로 E4 완료로 세지 않는다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-29_source-read-t0t1t2-resume/read-evidence-sanitized.json"
                  ],
                  "next": "중국 시윤 재고에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-102-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 중국 시윤 재고 업로드 폴더의 원본 파일, 파일명 날짜·기간, 발행 예정일 미도착, 재업로드 중복, 가공본 거부. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "중국 시윤 재고 업로드 폴더의 원본 파일, 파일명 날짜·기간, 발행 예정일 미도착, 재업로드 중복, 가공본 거부에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-102-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 목표(엑셀 정기 발송)면 파트너 산출 재고표라 중. 지금 사진은 기준일이 없어 하 수준 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-102-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 실패 분기 필요. 승인된 폴백: 업로드 미도착 알림 → 담당자 재업로드 → 엑셀이 안 되면 재고 화면에 「미연결」 표시(사진 · 비전 추출은 쓰지 않는다)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/reception/drive-routes.template.json"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-102-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=원천 발행: 주 1회; 미발행 여부 매일 확인. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "원천 발행: 주 1회; 미발행 여부 매일 확인 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-102-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#102 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-103",
              "title": "#103 통합매출_2026 누계(경영지원실)",
              "status": "partial",
              "detail": "회계매출 · 입력 원장. 목표=api_interface: Drive API 폴더 감시(「경영지원실 데이터」 폴더) → xlsx 수신(files reception Drive route) → files 파서. 1시트 · 머리 2행 · 9열(일자 · 거래처 · 품목 · 수량 · 매출액 · 매출원가 · 영업그룹); 현재 접근은 2026-10-11 수집 계정(cms-lab 조직 GCP 읽기 전용 OAuth)으로 대상 객체 전 범위 첫 실 Read 성공. 장기 실행 주체와 반복 운영 승인은 남음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→변경 감지 즉시 + 월 마감 발행 확인(일 1회) 2회→증거 동결.",
              "source": {
                "row_id": "103",
                "name": "통합매출_2026 누계(경영지원실)",
                "kind": "입력 원장",
                "transport": "drive",
                "cadence": "변경 감지 즉시 + 월 마감 발행 확인(일 1회)",
                "target_method": "api_interface: Drive API 폴더 감시(「경영지원실 데이터」 폴더) → xlsx 수신(files reception Drive route) → files 파서. 1시트 · 머리 2행 · 9열(일자 · 거래처 · 품목 · 수량 · 매출액 · 매출원가 · 영업그룹)",
                "current_state": "2026-10-11 수집 계정(cms-lab 조직 GCP 읽기 전용 OAuth)으로 대상 객체 전 범위 첫 실 Read 성공. 장기 실행 주체와 반복 운영 승인은 남음.",
                "conditions": "마감 엑셀·월별 확정 버전 여부 재경 확인 · files 파서(9열 누계 양식, 일자 열 정수·문자 혼재) · 연말 누계 40MB 초과 대비",
                "fallback": "지정 폴더 공유 복구; 사람의 별도 업로드 절차는 만들지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-103-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #103 분류 기준은 있음: 업무=회계매출, 유형=입력 원장. 36_ 우선 결정은 api_interface: Drive API 폴더 감시(「경영지원실 데이터」 폴더) → xlsx 수신(files reception Drive route) → files 파서. 1시트 · 머리 2행 · 9열(일자 · 거래처 · 품목 · 수량 · 매출액 · 매출원가 · 영업그룹). 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#103의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-103-access",
                  "title": "읽기 전용 접근",
                  "status": "partial",
                  "detail": "2026-10-11 수집 계정(cms-lab 조직 GCP 읽기 전용 OAuth)으로 대상 객체 전 범위 첫 실 Read 성공. 장기 실행 주체와 반복 운영 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "마감 엑셀·월별 확정 버전 여부 재경 확인 · files 파서(9열 누계 양식, 일자 열 정수·문자 혼재) · 연말 누계 40MB 초과 대비",
                  "criterion": "통합매출_2026 누계(경영지원실) 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-103-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "계약 시드 · Drive route 템플릿(80MiB 상한) · files 파서 FIN103(스트리밍) · 매핑 명세 엔진 실행(→ core.accounting_sales). 운영 러너 route(CMSLAB_FILE_DRIVE_ROUTES) 미등록 · 합성 계약 시험 미실행 · 마이그레이션 원격 미적용이라 완료가 아니다. 2026-10-14 갱신(core-complete-1011 · finance-drive-watch-1016): files 파서 FIN103(스트리밍 · RSS 67MB) · 매핑 명세 엔진 실행(→ core.accounting_sales) · 임시 PG16 e2e 418,588행. 운영 러너 route · 합성 계약 시험 남음. finance-drive-watch-1016: 맥미니 수신 route 바인딩 — `cmslab_files.reception drive-once`(route mgmt-*) 300초 launchd · 수집 계정 읽기 전용 · 로컬 상시 DB. 첫 실행 제출 5/5 → load validated(core 418,588, 10/11 임시 PG16 e2e 와 같은 수). 바뀐 파일이 없으면 제출 0. 합성 계약 시험 · 운영(AWS) 이전 남음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "docs/work-log/2026-10-11_core-complete/result.md",
                    "docs/work-log/2026-10-11_finance-core-map/evidence/e2e-run.txt",
                    "docs/work-log/2026-10-16_finance-drive-watch-mini/result.md",
                    "docs/work-log/2026-10-16_finance-drive-watch-mini/evidence/runs.jsonl"
                  ],
                  "next": "api_interface: Drive API 폴더 감시(「경영지원실 데이터」 폴더) → xlsx 수신(files reception Drive route) → files 파서. 1시트 · 머리 2행 · 9열(일자 · 거래처 · 품목 · 수량 · 매출액 · 매출원가 · 영업그룹) 경로의 account/object, parser, 개인정보 제거기, 변경 감지 즉시 + 월 마감 발행 확인(일 1회) schedule을 원천별로 고정한다.",
                  "criterion": "#103에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-103-live-read",
                  "title": "실계정 첫 Read",
                  "status": "partial",
                  "detail": "2026-10-11 임시 리더로 원천 전 범위를 읽어 로컬 비공개 레이크에 착지(시트는 탭별 CSV — UNFORMATTED_VALUE, 경영지원실 파일은 원본 xlsx)하고 시각 · 탭 수 · 행 수 · SHA-256(재해시 11/11 일치)을 기록했다. 플랫폼 수집기 경로가 아니고 원천 수정 시각 · 탭 이름 매니페스트 · staging 동등 행 · 개인정보 분리 사본이 없어 E4 완료로 세지 않는다. 2026-10-16 갱신(finance-drive-watch-1016): 플랫폼 수신 경로(맥미니 로컬 상시 DB)로 폴더 감시 가동 — 9월 마감분이 새 파일로 오면 자동 제출된다. 배치에 source_as_of(원천 수정 시각) · 통제 합계가 비어 있어(수신기는 Drive 수정 시각을 중복 판정에만 쓴다) E4 완료로 세지 않는다. 10/16 수정(MR !306): 수신기가 Drive 수정 시각을 배치 source_as_of 로, 경영지원실 파서가 원본 data 행 수를 통제 합계(rows)로 싣는다 — 실파일 5개로 확인(통제 합계 = 적재 data 행 수 5/5). 10/7 판 기존 배치는 바이트가 같아 다시 제출해도 unchanged 라 빈칸 그대로 — 9월 마감분부터 채워진다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-11_live-read/read-evidence-sanitized.json",
                    "docs/work-log/2026-10-16_finance-drive-watch-mini/result.md",
                    "docs/work-log/2026-10-16_finance-drive-watch-mini/evidence/runs.jsonl"
                  ],
                  "next": "통합매출_2026 누계(경영지원실)에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-103-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 통합매출_2026 누계(경영지원실) 지정 폴더의 신규·수정 파일, 최대 탐색 깊이, 발행 예정일과 중복 파일. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "통합매출_2026 누계(경영지원실) 지정 폴더의 신규·수정 파일, 최대 탐색 깊이, 발행 예정일과 중복 파일에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-103-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "partial",
                  "detail": "신뢰성=상. 근거: 10/7 결정 C-9 — 돈에 대한 최종 자료 = 경영지원실 마감 엑셀. 거래처 × 품목 매출원가 포함. ERP 가공본이라 ERP 매출 전표와 대사 필요 실 Read 결과의 행 수·통제 합계·형식 대조는 남음. 2026-10-14 갱신(live-read-1011 · core-complete-1011): 1~8월 순매출 합 = 영업그룹별 손익(#104) 월별 시트 순매출, 원가 합 = 원가 3블록 합 — 8개월 0원 차이. 9월 수령 「월분 2607」과 7월 57,884행 같은 순서 · 같은 값(값 미기록). 수치 대사 1회분 — 반복 · 자동 대사와 E5 완전성은 남음. core-complete-1011: 파서 수준 재현(Σ순매출 8/8 정확 · Σ원가 8/8 1원 미만) → core 수준 재현(acceptance SQL — 현재 행 뷰 기준 같은 결과). 창 대체(1~9월 선언 재제출) 뒤 현재 행 = 새 배치뿐.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-11_live-read/reconcile-summary.json",
                    "docs/work-log/2026-10-11_core-complete/result.md",
                    "docs/work-log/2026-10-11_finance-core-map/evidence/e2e-run.txt"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-103-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 실패 분기 필요. 승인된 폴백: 지정 폴더 공유 복구; 사람의 별도 업로드 절차는 만들지 않음",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-103-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=변경 감지 즉시 + 월 마감 발행 확인(일 1회). 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "변경 감지 즉시 + 월 마감 발행 확인(일 1회) 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-103-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#103 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-104",
              "title": "#104 Ⅱ. 영업그룹별 손익(경영지원실)",
              "status": "partial",
              "detail": "손익 · 입력 원장. 목표=api_interface: Drive API 폴더 감시(「경영지원실 데이터」 폴더) → xlsx 수신(files reception Drive route) → files 파서; 현재 접근은 2026-10-11 수집 계정(cms-lab 조직 GCP 읽기 전용 OAuth)으로 대상 객체 전 범위 첫 실 Read 성공. 장기 실행 주체와 반복 운영 승인은 남음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→변경 감지 즉시 + 월 마감 발행 확인(일 1회) 2회→증거 동결.",
              "source": {
                "row_id": "104",
                "name": "Ⅱ. 영업그룹별 손익(경영지원실)",
                "kind": "입력 원장",
                "transport": "drive",
                "cadence": "변경 감지 즉시 + 월 마감 발행 확인(일 1회)",
                "target_method": "api_interface: Drive API 폴더 감시(「경영지원실 데이터」 폴더) → xlsx 수신(files reception Drive route) → files 파서",
                "current_state": "2026-10-11 수집 계정(cms-lab 조직 GCP 읽기 전용 OAuth)으로 대상 객체 전 범위 첫 실 Read 성공. 장기 실행 주체와 반복 운영 승인은 남음.",
                "conditions": "files 파서 · core.pnl_line 신설(08_ PROPOSED_FACTS) · 시트 구성 변경 감시",
                "fallback": "지정 폴더 공유 복구; 사람의 별도 업로드 절차는 만들지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-104-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #104 분류 기준은 있음: 업무=손익, 유형=입력 원장. 36_ 우선 결정은 api_interface: Drive API 폴더 감시(「경영지원실 데이터」 폴더) → xlsx 수신(files reception Drive route) → files 파서. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#104의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-104-access",
                  "title": "읽기 전용 접근",
                  "status": "partial",
                  "detail": "2026-10-11 수집 계정(cms-lab 조직 GCP 읽기 전용 OAuth)으로 대상 객체 전 범위 첫 실 Read 성공. 장기 실행 주체와 반복 운영 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "files 파서 · core.pnl_line 신설(08_ PROPOSED_FACTS) · 시트 구성 변경 감시",
                  "criterion": "Ⅱ. 영업그룹별 손익(경영지원실) 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-104-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "계약 시드 · Drive route 템플릿 · files 파서 PNL104 · 매핑 명세 엔진 실행(→ core.pnl_line · 팀 귀속 제안). 운영 러너 route(CMSLAB_FILE_DRIVE_ROUTES) 미등록 · 합성 계약 시험 미실행 · 마이그레이션 원격 미적용이라 완료가 아니다. 2026-10-14 갱신(core-complete-1011 · finance-drive-watch-1016): files 파서 PNL104 · 매핑 명세 엔진 실행(→ core.pnl_line 21,726행 + 팀 귀속 제안 118, 임시 PG16 e2e). 운영 러너 route · 합성 계약 시험 남음. finance-drive-watch-1016: 맥미니 수신 route 바인딩 — `cmslab_files.reception drive-once`(route mgmt-*) 300초 launchd · 수집 계정 읽기 전용 · 로컬 상시 DB. 첫 실행 제출 5/5 → load validated(core 21,844, 10/11 임시 PG16 e2e 와 같은 수). 바뀐 파일이 없으면 제출 0. 합성 계약 시험 · 운영(AWS) 이전 남음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "docs/work-log/2026-10-11_core-complete/result.md",
                    "docs/work-log/2026-10-11_finance-core-map/evidence/e2e-run.txt",
                    "docs/work-log/2026-10-16_finance-drive-watch-mini/result.md",
                    "docs/work-log/2026-10-16_finance-drive-watch-mini/evidence/runs.jsonl"
                  ],
                  "next": "api_interface: Drive API 폴더 감시(「경영지원실 데이터」 폴더) → xlsx 수신(files reception Drive route) → files 파서 경로의 account/object, parser, 개인정보 제거기, 변경 감지 즉시 + 월 마감 발행 확인(일 1회) schedule을 원천별로 고정한다.",
                  "criterion": "#104에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-104-live-read",
                  "title": "실계정 첫 Read",
                  "status": "partial",
                  "detail": "2026-10-11 임시 리더로 원천 전 범위를 읽어 로컬 비공개 레이크에 착지(시트는 탭별 CSV — UNFORMATTED_VALUE, 경영지원실 파일은 원본 xlsx)하고 시각 · 탭 수 · 행 수 · SHA-256(재해시 11/11 일치)을 기록했다. 플랫폼 수집기 경로가 아니고 원천 수정 시각 · 탭 이름 매니페스트 · staging 동등 행 · 개인정보 분리 사본이 없어 E4 완료로 세지 않는다. 2026-10-16 갱신(finance-drive-watch-1016): 플랫폼 수신 경로(맥미니 로컬 상시 DB)로 폴더 감시 가동 — 9월 마감분이 새 파일로 오면 자동 제출된다. 배치에 source_as_of(원천 수정 시각) · 통제 합계가 비어 있어(수신기는 Drive 수정 시각을 중복 판정에만 쓴다) E4 완료로 세지 않는다. 10/16 수정(MR !306): 수신기가 Drive 수정 시각을 배치 source_as_of 로, 경영지원실 파서가 원본 data 행 수를 통제 합계(rows)로 싣는다 — 실파일 5개로 확인(통제 합계 = 적재 data 행 수 5/5). 10/7 판 기존 배치는 바이트가 같아 다시 제출해도 unchanged 라 빈칸 그대로 — 9월 마감분부터 채워진다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-11_live-read/read-evidence-sanitized.json",
                    "docs/work-log/2026-10-16_finance-drive-watch-mini/result.md",
                    "docs/work-log/2026-10-16_finance-drive-watch-mini/evidence/runs.jsonl"
                  ],
                  "next": "Ⅱ. 영업그룹별 손익(경영지원실)에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-104-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: Ⅱ. 영업그룹별 손익(경영지원실) 지정 폴더의 신규·수정 파일, 최대 탐색 깊이, 발행 예정일과 중복 파일. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "Ⅱ. 영업그룹별 손익(경영지원실) 지정 폴더의 신규·수정 파일, 최대 탐색 깊이, 발행 예정일과 중복 파일에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-104-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "partial",
                  "detail": "신뢰성=상. 근거: 10/7 결정 C-5·C-6 — 플랫폼은 원가·공헌이익을 계산하지 않고 이 손익을 그대로 보인다. 공헌이익·조정공헌이익이 계산돼 온다 실 Read 결과의 행 수·통제 합계·형식 대조는 남음. 2026-10-14 갱신(live-read-1011 · core-complete-1011): 월별 시트 1~8월이 통합매출(#103) 행 합과 0원 일치. 9월 판(Y2026.07) ↔ 10/7 판 1~7월 순매출 · 원가 3블록 · 수량 모두 같음(마감월 불변). 수치 대사 1회분 — 반복 · 자동 대사와 E5 완전성은 남음. core-complete-1011: 요약 매출총이익 산식 3,000칸 불일치 0(반올림 1 · 부분 행 3). core 수준에서 #103 과 0원 대사 재현(acceptance SQL).",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-11_live-read/reconcile-summary.json",
                    "docs/work-log/2026-10-11_core-complete/result.md",
                    "docs/work-log/2026-10-11_finance-core-map/evidence/e2e-run.txt"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-104-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 실패 분기 필요. 승인된 폴백: 지정 폴더 공유 복구; 사람의 별도 업로드 절차는 만들지 않음",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-104-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=변경 감지 즉시 + 월 마감 발행 확인(일 1회). 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "변경 감지 즉시 + 월 마감 발행 확인(일 1회) 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-104-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#104 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-105",
              "title": "#105 Ⅲ. 손익계산서(경영지원실)",
              "status": "partial",
              "detail": "손익 · 입력 원장. 목표=api_interface: Drive API 폴더 감시(「경영지원실 데이터」 폴더) → xlsx 수신(files reception Drive route) → files 파서; 현재 접근은 2026-10-11 수집 계정(cms-lab 조직 GCP 읽기 전용 OAuth)으로 대상 객체 전 범위 첫 실 Read 성공. 장기 실행 주체와 반복 운영 승인은 남음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→변경 감지 즉시 + 월 마감 발행 확인(일 1회) 2회→증거 동결.",
              "source": {
                "row_id": "105",
                "name": "Ⅲ. 손익계산서(경영지원실)",
                "kind": "입력 원장",
                "transport": "drive",
                "cadence": "변경 감지 즉시 + 월 마감 발행 확인(일 1회)",
                "target_method": "api_interface: Drive API 폴더 감시(「경영지원실 데이터」 폴더) → xlsx 수신(files reception Drive route) → files 파서",
                "current_state": "2026-10-11 수집 계정(cms-lab 조직 GCP 읽기 전용 OAuth)으로 대상 객체 전 범위 첫 실 Read 성공. 장기 실행 주체와 반복 운영 승인은 남음.",
                "conditions": "files 파서 · core.pnl_line 신설(08_ PROPOSED_FACTS) · 환율 기준(누계환율) 재경 확인",
                "fallback": "지정 폴더 공유 복구; 사람의 별도 업로드 절차는 만들지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-105-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #105 분류 기준은 있음: 업무=손익, 유형=입력 원장. 36_ 우선 결정은 api_interface: Drive API 폴더 감시(「경영지원실 데이터」 폴더) → xlsx 수신(files reception Drive route) → files 파서. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#105의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-105-access",
                  "title": "읽기 전용 접근",
                  "status": "partial",
                  "detail": "2026-10-11 수집 계정(cms-lab 조직 GCP 읽기 전용 OAuth)으로 대상 객체 전 범위 첫 실 Read 성공. 장기 실행 주체와 반복 운영 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "files 파서 · core.pnl_line 신설(08_ PROPOSED_FACTS) · 환율 기준(누계환율) 재경 확인",
                  "criterion": "Ⅲ. 손익계산서(경영지원실) 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-105-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "계약 시드 · Drive route 템플릿 · files 파서 PNL105 · 매핑 명세 엔진 실행(→ core.pnl_line). 운영 러너 route(CMSLAB_FILE_DRIVE_ROUTES) 미등록 · 합성 계약 시험 미실행 · 마이그레이션 원격 미적용이라 완료가 아니다. 2026-10-14 갱신(core-complete-1011 · finance-drive-watch-1016): files 파서 PNL105 · 매핑 명세 엔진 실행(→ core.pnl_line 4,258행, 임시 PG16 e2e). 운영 러너 route · 합성 계약 시험 남음. finance-drive-watch-1016: 맥미니 수신 route 바인딩 — `cmslab_files.reception drive-once`(route mgmt-*) 300초 launchd · 수집 계정 읽기 전용 · 로컬 상시 DB. 첫 실행 제출 5/5 → load validated(core 4,258, 10/11 임시 PG16 e2e 와 같은 수). 바뀐 파일이 없으면 제출 0. 합성 계약 시험 · 운영(AWS) 이전 남음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "docs/work-log/2026-10-11_core-complete/result.md",
                    "docs/work-log/2026-10-11_finance-core-map/evidence/e2e-run.txt",
                    "docs/work-log/2026-10-16_finance-drive-watch-mini/result.md",
                    "docs/work-log/2026-10-16_finance-drive-watch-mini/evidence/runs.jsonl"
                  ],
                  "next": "api_interface: Drive API 폴더 감시(「경영지원실 데이터」 폴더) → xlsx 수신(files reception Drive route) → files 파서 경로의 account/object, parser, 개인정보 제거기, 변경 감지 즉시 + 월 마감 발행 확인(일 1회) schedule을 원천별로 고정한다.",
                  "criterion": "#105에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-105-live-read",
                  "title": "실계정 첫 Read",
                  "status": "partial",
                  "detail": "2026-10-11 임시 리더로 원천 전 범위를 읽어 로컬 비공개 레이크에 착지(시트는 탭별 CSV — UNFORMATTED_VALUE, 경영지원실 파일은 원본 xlsx)하고 시각 · 탭 수 · 행 수 · SHA-256(재해시 11/11 일치)을 기록했다. 플랫폼 수집기 경로가 아니고 원천 수정 시각 · 탭 이름 매니페스트 · staging 동등 행 · 개인정보 분리 사본이 없어 E4 완료로 세지 않는다. 2026-10-16 갱신(finance-drive-watch-1016): 플랫폼 수신 경로(맥미니 로컬 상시 DB)로 폴더 감시 가동 — 9월 마감분이 새 파일로 오면 자동 제출된다. 배치에 source_as_of(원천 수정 시각) · 통제 합계가 비어 있어(수신기는 Drive 수정 시각을 중복 판정에만 쓴다) E4 완료로 세지 않는다. 10/16 수정(MR !306): 수신기가 Drive 수정 시각을 배치 source_as_of 로, 경영지원실 파서가 원본 data 행 수를 통제 합계(rows)로 싣는다 — 실파일 5개로 확인(통제 합계 = 적재 data 행 수 5/5). 10/7 판 기존 배치는 바이트가 같아 다시 제출해도 unchanged 라 빈칸 그대로 — 9월 마감분부터 채워진다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-11_live-read/read-evidence-sanitized.json",
                    "docs/work-log/2026-10-16_finance-drive-watch-mini/result.md",
                    "docs/work-log/2026-10-16_finance-drive-watch-mini/evidence/runs.jsonl"
                  ],
                  "next": "Ⅲ. 손익계산서(경영지원실)에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-105-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: Ⅲ. 손익계산서(경영지원실) 지정 폴더의 신규·수정 파일, 최대 탐색 깊이, 발행 예정일과 중복 파일. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "Ⅲ. 손익계산서(경영지원실) 지정 폴더의 신규·수정 파일, 최대 탐색 깊이, 발행 예정일과 중복 파일에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-105-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "partial",
                  "detail": "신뢰성=상. 근거: 재경 마감 손익계산서(법인별 · 연결). PL_China 는 누계환율 적용 — 환율 기준 질의의 단서 실 Read 결과의 행 수·통제 합계·형식 대조는 남음. 2026-10-14 갱신(core-complete-1011): 파서 1회: 2,090행 · 거부 0 · 급여 계정 줄 55 제외. core 사슬 대사(임시 PG16): PL_Korea 매출액 − 회계차이 = #104 순매출 1~8월 1원 미만 8/8, (매출원가 + 제품) − 회계차이 = #104 원가 3블록 8/8. 운영 경로 반복 대사 · E5 완전성은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-11_core-complete/result.md",
                    "docs/work-log/2026-10-11_finance-core-map/evidence/e2e-run.txt"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-105-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 실패 분기 필요. 승인된 폴백: 지정 폴더 공유 복구; 사람의 별도 업로드 절차는 만들지 않음",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-105-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=변경 감지 즉시 + 월 마감 발행 확인(일 1회). 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "변경 감지 즉시 + 월 마감 발행 확인(일 1회) 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-105-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#105 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-106",
              "title": "#106 Ⅰ. 판매비와관리비(경영지원실)",
              "status": "partial",
              "detail": "비용 · 입력 원장. 목표=경영지원실 Drive 파일 수신 — 제한(재무·기밀). 급여 계정 행 · 작성사원명 열을 버리는 파서가 생긴 뒤에만 수집 경로를 연다; 현재 접근은 2026-10-10 수집 계정(읽기 전용)으로 「경영지원실 데이터」 폴더 파일이 열림. 2026-10-11 시트 · 머리행 구조 실측(값 미기록) 뒤 파서 · 원본 미보관 경로로 로컬 관통. 운영 반복 수신은 남음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→변경 감지 즉시 + 월 마감 발행 확인(일 1회) 2회→증거 동결.",
              "source": {
                "row_id": "106",
                "name": "Ⅰ. 판매비와관리비(경영지원실)",
                "kind": "입력 원장",
                "transport": "drive",
                "cadence": "변경 감지 즉시 + 월 마감 발행 확인(일 1회)",
                "target_method": "경영지원실 Drive 파일 수신 — 제한(재무·기밀). 급여 계정 행 · 작성사원명 열을 버리는 파서가 생긴 뒤에만 수집 경로를 연다",
                "current_state": "2026-10-10 수집 계정(읽기 전용)으로 「경영지원실 데이터」 폴더 파일이 열림. 2026-10-11 시트 · 머리행 구조 실측(값 미기록) 뒤 파서 · 원본 미보관 경로로 로컬 관통. 운영 반복 수신은 남음.",
                "conditions": "급여 계정 행 제외(계정명에 급여·상여·퇴직 — 2026-10-11 기본값) · 작성사원명(개인정보) 열 제외 · 재무 열람 묶음(cmslab_finance)",
                "fallback": "지정 폴더 공유 복구; 사람의 별도 업로드 절차는 만들지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-106-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #106 분류 기준은 있음: 업무=비용, 유형=입력 원장. 36_ 우선 결정은 경영지원실 Drive 파일 수신 — 제한(재무·기밀). 급여 계정 행 · 작성사원명 열을 버리는 파서가 생긴 뒤에만 수집 경로를 연다. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#106의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-106-access",
                  "title": "읽기 전용 접근",
                  "status": "partial",
                  "detail": "2026-10-10 수집 계정(읽기 전용)으로 「경영지원실 데이터」 폴더 파일이 열림. 2026-10-11 시트 · 머리행 구조 실측(값 미기록) 뒤 파서 · 원본 미보관 경로로 로컬 관통. 운영 반복 수신은 남음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "급여 계정 행 제외(계정명에 급여·상여·퇴직 — 2026-10-11 기본값) · 작성사원명(개인정보) 열 제외 · 재무 열람 묶음(cmslab_finance)",
                  "criterion": "Ⅰ. 판매비와관리비(경영지원실) 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-106-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "계약 시드(원본 미보관 raw_retention none) · 선별기 · Drive route 템플릿 mgmt-sga-ledger · files 파서 SGA106. 목적지 없음이라 stg 까지. 운영 러너 route(CMSLAB_FILE_DRIVE_ROUTES) 미등록 · 합성 계약 시험 미실행 · 마이그레이션 원격 미적용이라 완료가 아니다. 2026-10-14 갱신(core-complete-1011 · finance-drive-watch-1016): 원본 미보관 계약(raw_retention none, …200013) · 선별기 PayrollRowSanitizer · Drive route mgmt-sga-ledger 템플릿. 실파일 로컬 관통: 원본 해시와 같은 레이크 객체 0 · stg 25,563행 = 원본 직접 파싱 · fail-closed 6가지. 마이그레이션 적용 → 워커 배포 → 러너 route 남음. finance-drive-watch-1016: 맥미니 수신 route 바인딩 — `cmslab_files.reception drive-once`(route mgmt-*) 300초 launchd · 수집 계정 읽기 전용 · 로컬 상시 DB. 첫 실행 제출 5/5 → load validated(stg 25,563(목적지 없음), 10/11 임시 PG16 e2e 와 같은 수). 바뀐 파일이 없으면 제출 0. 합성 계약 시험 · 운영(AWS) 이전 남음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "docs/work-log/2026-10-11_core-complete/result.md",
                    "docs/work-log/2026-10-11_restricted-no-raw/evidence/no-raw-run.json",
                    "docs/work-log/2026-10-16_finance-drive-watch-mini/result.md",
                    "docs/work-log/2026-10-16_finance-drive-watch-mini/evidence/runs.jsonl"
                  ],
                  "next": "경영지원실 Drive 파일 수신 — 제한(재무·기밀). 급여 계정 행 · 작성사원명 열을 버리는 파서가 생긴 뒤에만 수집 경로를 연다 경로의 account/object, parser, 개인정보 제거기, 변경 감지 즉시 + 월 마감 발행 확인(일 1회) schedule을 원천별로 고정한다.",
                  "criterion": "#106에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-106-live-read",
                  "title": "실계정 첫 Read",
                  "status": "partial",
                  "detail": "2026-10-10 수집 계정(읽기 전용)으로 「경영지원실 데이터」 폴더 파일이 열림. 2026-10-11 시트 · 머리행 구조 실측(값 미기록) 뒤 파서 · 원본 미보관 경로로 로컬 관통. 운영 반복 수신은 남음. 실 Read 완료는 Ⅰ. 판매비와관리비(경영지원실) 전 범위 원문이 raw lake에 착지한 실행으로 다시 증명해야 함. 2026-10-14 갱신(live-read-1011 · core-complete-1011 · finance-drive-watch-1016): 원본 xlsx 는 레이크에 두지 않았다 — 급여 계정 행 · 작성사원명이 있어 이를 버리는 파서 산출물만 착지한다(10/11 기본값). 10/11 시트 · 머리행 구조만 확인. core-complete-1011: 10/11 Drive Read(0700 임시 폴더 → 메모리 → 제출 전 삭제)를 원본 미보관 경로로 로컬 관통. 운영 경로(러너) Read 아님. finance-drive-watch-1016: 플랫폼 수신 경로(맥미니 로컬 상시 DB)로 폴더 감시 가동 — 9월 마감분이 새 파일로 오면 자동 제출된다. 배치에 source_as_of(원천 수정 시각) · 통제 합계가 비어 있어(수신기는 Drive 수정 시각을 중복 판정에만 쓴다) E4 완료로 세지 않는다. 10/16 수정(MR !306): 수신기가 Drive 수정 시각을 배치 source_as_of 로, 경영지원실 파서가 원본 data 행 수를 통제 합계(rows)로 싣는다 — 실파일 5개로 확인(통제 합계 = 적재 data 행 수 5/5). 10/7 판 기존 배치는 바이트가 같아 다시 제출해도 unchanged 라 빈칸 그대로 — 9월 마감분부터 채워진다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-11_live-read/read-evidence-sanitized.json",
                    "docs/work-log/2026-10-11_core-complete/result.md",
                    "docs/work-log/2026-10-11_restricted-no-raw/evidence/no-raw-run.json",
                    "docs/work-log/2026-10-16_finance-drive-watch-mini/result.md",
                    "docs/work-log/2026-10-16_finance-drive-watch-mini/evidence/runs.jsonl"
                  ],
                  "next": "Ⅰ. 판매비와관리비(경영지원실)에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-106-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: Ⅰ. 판매비와관리비(경영지원실) 지정 폴더의 신규·수정 파일, 최대 탐색 깊이, 발행 예정일과 중복 파일. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "Ⅰ. 판매비와관리비(경영지원실) 지정 폴더의 신규·수정 파일, 최대 탐색 깊이, 발행 예정일과 중복 파일에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-106-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "partial",
                  "detail": "신뢰성=상. 근거: 재경 계정별 원장. 급여 행(계정명 급여 · 상여 · 퇴직 233행 + 원가중심 「임원(급여용)」 51행 = 284행 — 2026-10-11 파서 · 원본 미보관 실측 · docs/work-log/2026-10-11_restricted-no-raw)이 팀 C/C 단위로 있어 작은 팀은 개인 급여가 드러난다 실 Read 결과의 행 수·통제 합계·형식 대조는 남음. 2026-10-14 갱신(core-complete-1011): 급여 행 284 제외(계정명 233 + 임원 원가중심 51) · 남은 급여 행 0 · 사람 열 0 · skipped_row_count 284 기록 · 레이크 산출물 다시 열기: 표지 밖 급여 라벨 0 · 사람 칸 0 · PII 모양 0. 통제 합계 대조는 하지 않았다(#106 은 목적지 없음).",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-11_core-complete/result.md",
                    "docs/work-log/2026-10-11_restricted-no-raw/evidence/no-raw-run.json"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-106-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 실패 분기 필요. 승인된 폴백: 지정 폴더 공유 복구; 사람의 별도 업로드 절차는 만들지 않음",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-106-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=변경 감지 즉시 + 월 마감 발행 확인(일 1회). 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "변경 감지 즉시 + 월 마감 발행 확인(일 1회) 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-106-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#106 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-107",
              "title": "#107 0. 경영관리팀 실행계획 취합(경영지원실)",
              "status": "partial",
              "detail": "판매계획(목표) · 입력 원장. 목표=api_interface: Drive API 폴더 감시(「경영지원실 데이터」 폴더) → xlsx 수신(files reception Drive route) → files 파서; 현재 접근은 2026-10-11 수집 계정(cms-lab 조직 GCP 읽기 전용 OAuth)으로 대상 객체 전 범위 첫 실 Read 성공. 장기 실행 주체와 반복 운영 승인은 남음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→변경 감지 즉시 + 주 발행 확인(일 1회) 2회→증거 동결.",
              "source": {
                "row_id": "107",
                "name": "0. 경영관리팀 실행계획 취합(경영지원실)",
                "kind": "입력 원장",
                "transport": "drive",
                "cadence": "변경 감지 즉시 + 주 발행 확인(일 1회)",
                "target_method": "api_interface: Drive API 폴더 감시(「경영지원실 데이터」 폴더) → xlsx 수신(files reception Drive route) → files 파서",
                "current_state": "2026-10-11 수집 계정(cms-lab 조직 GCP 읽기 전용 OAuth)으로 대상 객체 전 범위 첫 실 Read 성공. 장기 실행 주체와 반복 운영 승인은 남음.",
                "conditions": "목표 정본 결정(#11 판매계획 대 이 파일 — 재경 질의) · files 파서",
                "fallback": "지정 폴더 공유 복구; 사람의 별도 업로드 절차는 만들지 않음",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-107-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #107 분류 기준은 있음: 업무=판매계획(목표), 유형=입력 원장. 36_ 우선 결정은 api_interface: Drive API 폴더 감시(「경영지원실 데이터」 폴더) → xlsx 수신(files reception Drive route) → files 파서. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#107의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-107-access",
                  "title": "읽기 전용 접근",
                  "status": "partial",
                  "detail": "2026-10-11 수집 계정(cms-lab 조직 GCP 읽기 전용 OAuth)으로 대상 객체 전 범위 첫 실 Read 성공. 장기 실행 주체와 반복 운영 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "목표 정본 결정(#11 판매계획 대 이 파일 — 재경 질의) · files 파서",
                  "criterion": "0. 경영관리팀 실행계획 취합(경영지원실) 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-107-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "계약 시드 · Drive route 템플릿 · files 파서 PLAN107. 목적지 후보라 매핑 명세는 Proposed(stg 까지). 운영 러너 route(CMSLAB_FILE_DRIVE_ROUTES) 미등록 · 합성 계약 시험 미실행 · 마이그레이션 원격 미적용이라 완료가 아니다. 2026-10-14 갱신(core-complete-1011 · finance-drive-watch-1016): files 파서 PLAN107(389행 · 거부 0). 목적지 후보라 매핑 명세는 Proposed(stg 까지). 운영 러너 route 남음. finance-drive-watch-1016: 맥미니 수신 route 바인딩 — `cmslab_files.reception drive-once`(route mgmt-*) 300초 launchd · 수집 계정 읽기 전용 · 로컬 상시 DB. 첫 실행 제출 5/5 → load validated(stg 389(Proposed), 10/11 임시 PG16 e2e 와 같은 수). 바뀐 파일이 없으면 제출 0. 합성 계약 시험 · 운영(AWS) 이전 남음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "docs/work-log/2026-10-11_core-complete/result.md",
                    "docs/work-log/2026-10-11_finance-core-map/evidence/e2e-run.txt",
                    "docs/work-log/2026-10-16_finance-drive-watch-mini/result.md",
                    "docs/work-log/2026-10-16_finance-drive-watch-mini/evidence/runs.jsonl"
                  ],
                  "next": "api_interface: Drive API 폴더 감시(「경영지원실 데이터」 폴더) → xlsx 수신(files reception Drive route) → files 파서 경로의 account/object, parser, 개인정보 제거기, 변경 감지 즉시 + 주 발행 확인(일 1회) schedule을 원천별로 고정한다.",
                  "criterion": "#107에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-107-live-read",
                  "title": "실계정 첫 Read",
                  "status": "partial",
                  "detail": "2026-10-11 임시 리더로 원천 전 범위를 읽어 로컬 비공개 레이크에 착지(시트는 탭별 CSV — UNFORMATTED_VALUE, 경영지원실 파일은 원본 xlsx)하고 시각 · 탭 수 · 행 수 · SHA-256(재해시 11/11 일치)을 기록했다. 플랫폼 수집기 경로가 아니고 원천 수정 시각 · 탭 이름 매니페스트 · staging 동등 행 · 개인정보 분리 사본이 없어 E4 완료로 세지 않는다. 2026-10-16 갱신(finance-drive-watch-1016): 플랫폼 수신 경로(맥미니 로컬 상시 DB)로 폴더 감시 가동 — 9월 마감분이 새 파일로 오면 자동 제출된다. 배치에 source_as_of(원천 수정 시각) · 통제 합계가 비어 있어(수신기는 Drive 수정 시각을 중복 판정에만 쓴다) E4 완료로 세지 않는다. 10/16 수정(MR !306): 수신기가 Drive 수정 시각을 배치 source_as_of 로, 경영지원실 파서가 원본 data 행 수를 통제 합계(rows)로 싣는다 — 실파일 5개로 확인(통제 합계 = 적재 data 행 수 5/5). 10/7 판 기존 배치는 바이트가 같아 다시 제출해도 unchanged 라 빈칸 그대로 — 9월 마감분부터 채워진다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-11_live-read/read-evidence-sanitized.json",
                    "docs/work-log/2026-10-16_finance-drive-watch-mini/result.md",
                    "docs/work-log/2026-10-16_finance-drive-watch-mini/evidence/runs.jsonl"
                  ],
                  "next": "0. 경영관리팀 실행계획 취합(경영지원실)에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-107-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 0. 경영관리팀 실행계획 취합(경영지원실) 지정 폴더의 신규·수정 파일, 최대 탐색 깊이, 발행 예정일과 중복 파일. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "0. 경영관리팀 실행계획 취합(경영지원실) 지정 폴더의 신규·수정 파일, 최대 탐색 깊이, 발행 예정일과 중복 파일에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-107-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 매출 목표(사업계획 · 실행계획) 후보. #11 판매계획과 목표 기준이 둘이 될 수 있어 정본 결정 전까지 비권위 실 Read 결과의 행 수·통제 합계·형식 대조는 남음. 2026-10-14 갱신(core-complete-1011): 파서 1회 행 수만(389 · 거부 0). 채널별_2026 2Q 블록 #REF! 145칸(원천 수식 깨짐) · 실행계획 단위 확인 전이라 수치 대조는 없다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-11_core-complete/result.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-107-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 실패 분기 필요. 승인된 폴백: 지정 폴더 공유 복구; 사람의 별도 업로드 절차는 만들지 않음",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-107-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=변경 감지 즉시 + 주 발행 확인(일 1회). 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "변경 감지 즉시 + 주 발행 확인(일 1회) 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-107-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#107 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-113",
              "title": "#113 엠브레인 조사 결과",
              "status": "blocked",
              "detail": "시장정보 · 원천. 목표=api_interface: Drive API(파일 공유 뒤 — 문서 ID 1tquFOJwTF…); 현재 접근은 2026-10-11 수집 계정 조회 404 — 기획팀 재공유 필요. 내용·범위 미확인.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→발행 시(변경 감지) 2회→증거 동결.",
              "source": {
                "row_id": "113",
                "name": "엠브레인 조사 결과",
                "kind": "원천",
                "transport": "drive",
                "cadence": "발행 시(변경 감지)",
                "target_method": "api_interface: Drive API(파일 공유 뒤 — 문서 ID 1tquFOJwTF…)",
                "current_state": "2026-10-11 수집 계정 조회 404 — 기획팀 재공유 필요. 내용·범위 미확인.",
                "conditions": "수집 계정 공유(지금 404) · 내용 · 범위 확인",
                "fallback": "기획팀 MI 업로드(mi_signal CSV, 11차 G3)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-113-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #113 분류 기준은 있음: 업무=시장정보, 유형=원천. 36_ 우선 결정은 api_interface: Drive API(파일 공유 뒤 — 문서 ID 1tquFOJwTF…). 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#113의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-113-access",
                  "title": "읽기 전용 접근",
                  "status": "blocked",
                  "detail": "2026-10-11 수집 계정 조회 404 — 기획팀 재공유 필요. 내용·범위 미확인.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "수집 계정 공유(지금 404) · 내용 · 범위 확인",
                  "criterion": "엠브레인 조사 결과 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-113-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "Drive 폴더 수집·문서 누락 판정 틀 존재. 폴더 ID와 본문 추출은 원천별로 남음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "api_interface: Drive API(파일 공유 뒤 — 문서 ID 1tquFOJwTF…) 경로의 account/object, parser, 개인정보 제거기, 발행 시(변경 감지) schedule을 원천별로 고정한다.",
                  "criterion": "#113에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-113-live-read",
                  "title": "실계정 첫 Read",
                  "status": "blocked",
                  "detail": "2026-10-11 수집 계정 조회 404 — 기획팀 재공유 필요. 내용·범위 미확인. 실 Read 완료는 엠브레인 조사 결과 전 범위 원문이 raw lake에 착지한 실행으로 다시 증명해야 함.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "엠브레인 조사 결과에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-113-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 엠브레인 조사 결과 지정 폴더의 신규·수정 파일, 최대 탐색 깊이, 발행 예정일과 중복 파일. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "엠브레인 조사 결과 지정 폴더의 신규·수정 파일, 최대 탐색 깊이, 발행 예정일과 중복 파일에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-113-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 외부 조사 결과(추정) — 내용 확인 전 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-113-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "changes 가시성·폴더 깊이·파일 version·발행예정·중복/누락·문서-ERP 대조 실패 분기 필요. 승인된 폴백: 기획팀 MI 업로드(mi_signal CSV, 11차 G3)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/sheets/docs/E3-evidence.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-113-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=발행 시(변경 감지). 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "발행 시(변경 감지) 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-113-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#113 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            }
          ]
        },
        {
          "id": "read-portal",
          "title": "포털·크롤링 Read",
          "items": [
            {
              "id": "source-3",
              "title": "#3 가온 (한익스프레스 WMS)",
              "status": "blocked",
              "detail": "WMS 이천 메인 · 원천. 목표=automated_batch: 공개 API·연계 스펙 없음(한익 IT 연계는 공개 스펙 없는 개별 구축형 — 견적 필요) → 가온 웹 조회 전용 봇 계정 + 결정론 다운로드(상품·입고·수주·재고 4화면 엑셀, 2026-10-16 결정); 현재 접근은 봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→일 1회(업무 시작 전), 연계 시 1시간 2회→증거 동결.",
              "source": {
                "row_id": "3",
                "name": "가온 (한익스프레스 WMS)",
                "kind": "원천",
                "transport": "portal",
                "cadence": "일 1회(업무 시작 전), 연계 시 1시간",
                "target_method": "automated_batch: 공개 API·연계 스펙 없음(한익 IT 연계는 공개 스펙 없는 개별 구축형 — 견적 필요) → 가온 웹 조회 전용 봇 계정 + 결정론 다운로드(상품·입고·수주·재고 4화면 엑셀, 2026-10-16 결정)",
                "current_state": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
                "conditions": "가온 계정이 조회 전용인지 확인 · 자동 접근 동의(10/8 회신: 계정목록 참고) · 약관 · 한익 연계 범위·비용(승격 시)",
                "fallback": "한익 연계 API(견적·스펙 확보 시 ① 승격) · 자동 조회 승인 전에는 담당자 원본 Drive 업로드(36_ 결정 17 방식) · 한익 일일 파일 자동 발송 합의 시 SES 수신(③ 수신)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-3-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #3 분류 기준은 있음: 업무=WMS 이천 메인, 유형=원천. 36_ 우선 결정은 automated_batch: 공개 API·연계 스펙 없음(한익 IT 연계는 공개 스펙 없는 개별 구축형 — 견적 필요) → 가온 웹 조회 전용 봇 계정 + 결정론 다운로드(상품·입고·수주·재고 4화면 엑셀, 2026-10-16 결정). 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#3의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-3-access",
                  "title": "읽기 전용 접근",
                  "status": "blocked",
                  "detail": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "가온 계정이 조회 전용인지 확인 · 자동 접근 동의(10/8 회신: 계정목록 참고) · 약관 · 한익 연계 범위·비용(승격 시)",
                  "criterion": "가온 (한익스프레스 WMS) 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-3-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "14개 포털 공통 실행기와 가짜 포털 E2E 존재. 이 원천 selector·실로그인·다운로드 정의는 없음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "automated_batch: 공개 API·연계 스펙 없음(한익 IT 연계는 공개 스펙 없는 개별 구축형 — 견적 필요) → 가온 웹 조회 전용 봇 계정 + 결정론 다운로드(상품·입고·수주·재고 4화면 엑셀, 2026-10-16 결정) 경로의 account/object, parser, 개인정보 제거기, 일 1회(업무 시작 전), 연계 시 1시간 schedule을 원천별로 고정한다.",
                  "criterion": "#3에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-3-live-read",
                  "title": "실계정 첫 Read",
                  "status": "blocked",
                  "detail": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회. 실 Read 완료는 가온 (한익스프레스 WMS) 전 범위 원문이 raw lake에 착지한 실행으로 다시 증명해야 함.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "가온 (한익스프레스 WMS)에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-3-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 가온 (한익스프레스 WMS)의 WMS 이천 메인 보고서, 조회 조건·기준시각·페이지·다운로드 파일·화면 통제 합계. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "가온 (한익스프레스 WMS)의 WMS 이천 메인 보고서, 조회 조건·기준시각·페이지·다운로드 파일·화면 통제 합계에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-3-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 물리 재고 원천이지만 수령 파일에 스냅샷 시각이 없음(실측)·2단 헤더. 파일 발송이 사람 작업이면 누락 위험 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-3-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 실패 분기 필요. 승인된 폴백: 한익 연계 API(견적·스펙 확보 시 ① 승격) · 자동 조회 승인 전에는 담당자 원본 Drive 업로드(36_ 결정 17 방식) · 한익 일일 파일 자동 발송 합의 시 SES 수신(③ 수신)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-3-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=일 1회(업무 시작 전), 연계 시 1시간. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "일 1회(업무 시작 전), 연계 시 1시간 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-3-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#3 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-4",
              "title": "#4 품고나우 (품고 WMS)",
              "status": "blocked",
              "detail": "WMS 네이버 · 원천. 목표=automated_batch: 품고 OpenAPI 공개 명세는 송장·추적뿐(재고·입출고 명세 없음) → 품고나우 셀러센터 봇 전용 계정 + 결정론 다운로드([재고]>[SKU별재고조회] · [송장]>[조회]>[마감됨] 엑셀, 2026-10-16 결정); 현재 접근은 봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→일 1회(현업 요구 \"일일 반영이면 충분\") · 재고 API 명세 확인 시 15분~1시간 폴링 2회→증거 동결.",
              "source": {
                "row_id": "4",
                "name": "품고나우 (품고 WMS)",
                "kind": "원천",
                "transport": "portal",
                "cadence": "일 1회(현업 요구 \"일일 반영이면 충분\") · 재고 API 명세 확인 시 15분~1시간 폴링",
                "target_method": "automated_batch: 품고 OpenAPI 공개 명세는 송장·추적뿐(재고·입출고 명세 없음) → 품고나우 셀러센터 봇 전용 계정 + 결정론 다운로드([재고]>[SKU별재고조회] · [송장]>[조회]>[마감됨] 엑셀, 2026-10-16 결정)",
                "current_state": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
                "conditions": "품고나우 봇 전용 계정(지금은 개인별 계정 — 10/8 회신: 계정목록 참고) · 자동 접근 동의 · 약관 · 재고 API 명세·키 발급 주체·비용(승격 시) — 9/8 네이버·컬리·비마트 L220 \"있어요 봤어요 근데 발급을 안 했네\"(품고·네이버 중 어느 키인지 불명확 — 갱신주기 근거표)",
                "fallback": "품고 재고 API(명세·키 확보 시 ① 승격) · 계정 발급 전에는 담당자 원본 Drive 업로드(36_ 결정 17 방식)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-4-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #4 분류 기준은 있음: 업무=WMS 네이버, 유형=원천. 36_ 우선 결정은 automated_batch: 품고 OpenAPI 공개 명세는 송장·추적뿐(재고·입출고 명세 없음) → 품고나우 셀러센터 봇 전용 계정 + 결정론 다운로드([재고]>[SKU별재고조회] · [송장]>[조회]>[마감됨] 엑셀, 2026-10-16 결정). 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#4의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-4-access",
                  "title": "읽기 전용 접근",
                  "status": "blocked",
                  "detail": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "품고나우 봇 전용 계정(지금은 개인별 계정 — 10/8 회신: 계정목록 참고) · 자동 접근 동의 · 약관 · 재고 API 명세·키 발급 주체·비용(승격 시) — 9/8 네이버·컬리·비마트 L220 \"있어요 봤어요 근데 발급을 안 했네\"(품고·네이버 중 어느 키인지 불명확 — 갱신주기 근거표)",
                  "criterion": "품고나우 (품고 WMS) 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-4-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "14개 포털 공통 실행기와 가짜 포털 E2E 존재. 이 원천 selector·실로그인·다운로드 정의는 없음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "automated_batch: 품고 OpenAPI 공개 명세는 송장·추적뿐(재고·입출고 명세 없음) → 품고나우 셀러센터 봇 전용 계정 + 결정론 다운로드([재고]>[SKU별재고조회] · [송장]>[조회]>[마감됨] 엑셀, 2026-10-16 결정) 경로의 account/object, parser, 개인정보 제거기, 일 1회(현업 요구 \"일일 반영이면 충분\") · 재고 API 명세 확인 시 15분~1시간 폴링 schedule을 원천별로 고정한다.",
                  "criterion": "#4에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-4-live-read",
                  "title": "실계정 첫 Read",
                  "status": "blocked",
                  "detail": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회. 실 Read 완료는 품고나우 (품고 WMS) 전 범위 원문이 raw lake에 착지한 실행으로 다시 증명해야 함.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "품고나우 (품고 WMS)에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-4-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 품고나우 (품고 WMS)의 WMS 네이버 보고서, 조회 조건·기준시각·페이지·다운로드 파일·화면 통제 합계. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "품고나우 (품고 WMS)의 WMS 네이버 보고서, 조회 조건·기준시각·페이지·다운로드 파일·화면 통제 합계에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-4-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=상. 근거: 네이버 물량의 물리 재고 원천. API 면 조회 시각이 고정됨 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-4-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 실패 분기 필요. 승인된 폴백: 품고 재고 API(명세·키 확보 시 ① 승격) · 계정 발급 전에는 담당자 원본 Drive 업로드(36_ 결정 17 방식)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-4-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=일 1회(현업 요구 \"일일 반영이면 충분\") · 재고 API 명세 확인 시 15분~1시간 폴링. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "일 1회(현업 요구 \"일일 반영이면 충분\") · 재고 API 명세 확인 시 15분~1시간 폴링 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-4-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#4 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-5",
              "title": "#5 HGLIS (현대글로비스)",
              "status": "blocked",
              "detail": "WMS 일본 · 원천. 목표=조건부 실시간 브라우저 Read; 2회→4회→업무시간 정시 램프; 현재 접근은 봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→06:00·13:00 → 하루 4회 → 수요 확인 시 업무시간 매 정시, 단계별 2주 무이상 램프 2회→증거 동결.",
              "source": {
                "row_id": "5",
                "name": "HGLIS (현대글로비스)",
                "kind": "원천",
                "transport": "portal",
                "cadence": "06:00·13:00 → 하루 4회 → 수요 확인 시 업무시간 매 정시, 단계별 2주 무이상 램프",
                "target_method": "조건부 실시간 브라우저 Read; 2회→4회→업무시간 정시 램프",
                "current_state": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
                "conditions": "HGLIS 조회 비밀번호 · 약관",
                "fallback": "재고 API·EDI 요청 → HGLIS 화면 램프 → 글로비스 정기 파일 수신",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-5-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #5 분류 기준은 있음: 업무=WMS 일본, 유형=원천. 36_ 우선 결정은 조건부 실시간 브라우저 Read; 2회→4회→업무시간 정시 램프. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#5의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-5-access",
                  "title": "읽기 전용 접근",
                  "status": "blocked",
                  "detail": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회. 2026-10-14 갱신(묶음④): 실제 로그인 0회. 조회 전용 봇 계정·허용 빈도·포털 주소 미확인. 1순위는 재고 API·EDI(38-drafts D). 포털별 질문 초안은 38-drafts E(다이소 C·HGLIS D).",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/result.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/38-drafts.md"
                  ],
                  "next": "HGLIS 조회 비밀번호 · 약관",
                  "criterion": "HGLIS (현대글로비스) 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-5-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "14개 포털 공통 실행기와 가짜 포털 E2E 존재. 이 원천 selector·실로그인·다운로드 정의는 없음. 2026-10-14 갱신(묶음④): 원천별 흐름 골격(wms_glovis_hglis) 추가 — URL·selector 자리표시자라 assertExecutable 이 거부(config_invalid), 게이트 닫힘 확인. 합성 쌍둥이로 기록→승인→재생 E2E 통과(모델 호출 0, 결정론 SHA-256). 다운로드는 합성 CSV로만 시험. 실 selector·다운로드 정의는 남음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/src/portals/skeletons/index.ts",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/test/unit/sourceSkeletons.test.ts",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/test/e2e/sourceFlows.e2e.test.ts",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/result.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/38-drafts.md"
                  ],
                  "next": "조건부 실시간 브라우저 Read; 2회→4회→업무시간 정시 램프 경로의 account/object, parser, 개인정보 제거기, 06:00·13:00 → 하루 4회 → 수요 확인 시 업무시간 매 정시, 단계별 2주 무이상 램프 schedule을 원천별로 고정한다.",
                  "criterion": "#5에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-5-live-read",
                  "title": "실계정 첫 Read",
                  "status": "blocked",
                  "detail": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회. 실 Read 완료는 HGLIS (현대글로비스) 전 범위 원문이 raw lake에 착지한 실행으로 다시 증명해야 함.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "HGLIS (현대글로비스)에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-5-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: HGLIS 재고·입고·출고 보고서; 06:00·13:00부터 시작하는 단계별 다운로드 창. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "HGLIS 재고·입고·출고 보고서; 06:00·13:00부터 시작하는 단계별 다운로드 창에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-5-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 물리 재고 원천이나 UI 경유. 공개 API 없음 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-5-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 실패 분기 필요. 승인된 폴백: 재고 API·EDI 요청 → HGLIS 화면 램프 → 글로비스 정기 파일 수신",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-5-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=06:00·13:00 → 하루 4회 → 수요 확인 시 업무시간 매 정시, 단계별 2주 무이상 램프. 서로 다른 두 예정 실행의 연속 성공 증거 없음. 2026-10-14 갱신(묶음④): 36_ 램프 2회(06·13시)→4회→업무시간 매 정시, 단계별 14일 무이상. 4회 시각(06·10·13·16시)은 hglisRamp.ts 가정값. 매 정시는 일본 채널 출고 창고 수요 확인 조건(38-drafts D 9번 질문). 1단계 2주 전에는 E8 done 불가.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/src/portals/hglisRamp.ts",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/38-drafts.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "06:00·13:00 → 하루 4회 → 수요 확인 시 업무시간 매 정시, 단계별 2주 무이상 램프 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-5-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#5 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                },
                {
                  "id": "source-5-ramp",
                  "title": "HGLIS 2주 램프 게이트",
                  "status": "pending",
                  "detail": "서로 다른 두 번 성공만으로 정시 Read 완료가 아니다. 2회/일→4회/일→업무시간 매 정시 각 단계의 2주 무이상 증거 필요.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "각 램프 단계에서 2주 동안 로그인 잠금·세션 오류·누락을 관찰하고 0일 때만 다음 단계로 올린다.",
                  "criterion": "하루 2회와 하루 4회 단계가 각각 14일 동안 잠금 0·세션 이상 0·예정 실행 누락 0이다. 수요 게이트 승인 시에만 정시 단계도 같은 14일 기준을 통과한다. 수요 조건 불충족 시 하루 4회 유지 결정으로 마지막 단계의 비적용을 기록한다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-5-demand",
                  "title": "일본 당일 재고 수요 게이트",
                  "status": "pending",
                  "detail": "업무시간 매 정시 목표는 일본 채널 출고가 HGLIS 재고를 쓰는지 확인될 때만 유지. FBA라면 하루 4회에 머문다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "일본 채널 담당자에게 출고 창고와 당일 품절 판단 사용 여부를 확인한 뒤 최종 cadence를 승인한다.",
                  "criterion": "일본 채널 출고가 HGLIS 재고를 사용하고 당일 품절 판단 수요가 확인됐다는 담당자 승인, 또는 조건 불충족으로 하루 4회 유지 결정이 기록된다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-17",
              "title": "#17 올리브영 (협력사 시스템, Nexacro)",
              "status": "blocked",
              "detail": "채널 · 원천. 목표=automated_batch: 협력사 시스템에 공개 API·EDI 없음 → 로그인 후 Nexacro 트랜잭션을 세션으로 재생(일별상품별사업장별실적·매장별재고); 현재 접근은 봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→일 1회 2회→증거 동결.",
              "source": {
                "row_id": "17",
                "name": "올리브영 (협력사 시스템, Nexacro)",
                "kind": "원천",
                "transport": "portal",
                "cadence": "일 1회",
                "target_method": "automated_batch: 협력사 시스템에 공개 API·EDI 없음 → 로그인 후 Nexacro 트랜잭션을 세션으로 재생(일별상품별사업장별실적·매장별재고)",
                "current_state": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
                "conditions": "약관 자동접근 조항 · 고객사 러너",
                "fallback": "Stagehand 화면 다운로드(③) → 사람(④)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-17-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #17 분류 기준은 있음: 업무=채널, 유형=원천. 36_ 우선 결정은 automated_batch: 협력사 시스템에 공개 API·EDI 없음 → 로그인 후 Nexacro 트랜잭션을 세션으로 재생(일별상품별사업장별실적·매장별재고). 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#17의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-17-access",
                  "title": "읽기 전용 접근",
                  "status": "blocked",
                  "detail": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회. 2026-10-14 갱신(묶음④): 실제 로그인 0회. 하위 사용자·약관 로그인 뒤. L6 Nexacro 트랜잭션 재생이 1순위(재생기 없음). 포털별 질문 초안은 38-drafts E(다이소 C·HGLIS D).",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/result.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/38-drafts.md"
                  ],
                  "next": "약관 자동접근 조항 · 고객사 러너",
                  "criterion": "올리브영 (협력사 시스템, Nexacro) 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-17-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "14개 포털 공통 실행기와 가짜 포털 E2E 존재. 이 원천 selector·실로그인·다운로드 정의는 없음. 2026-10-14 갱신(묶음④): 원천별 흐름 골격(portal_oliveyoung) 추가 — URL·selector 자리표시자라 assertExecutable 이 거부(config_invalid), 게이트 닫힘 확인. 합성 쌍둥이로 기록→승인→재생 E2E 통과(모델 호출 0, 결정론 SHA-256). 다운로드는 합성 CSV로만 시험. 실 selector·다운로드 정의는 남음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/src/portals/skeletons/index.ts",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/test/unit/sourceSkeletons.test.ts",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/test/e2e/sourceFlows.e2e.test.ts",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/result.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/38-drafts.md"
                  ],
                  "next": "automated_batch: 협력사 시스템에 공개 API·EDI 없음 → 로그인 후 Nexacro 트랜잭션을 세션으로 재생(일별상품별사업장별실적·매장별재고) 경로의 account/object, parser, 개인정보 제거기, 일 1회 schedule을 원천별로 고정한다.",
                  "criterion": "#17에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-17-live-read",
                  "title": "실계정 첫 Read",
                  "status": "blocked",
                  "detail": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회. 실 Read 완료는 올리브영 (협력사 시스템, Nexacro) 전 범위 원문이 raw lake에 착지한 실행으로 다시 증명해야 함.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "올리브영 (협력사 시스템, Nexacro)에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-17-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 올리브영 (협력사 시스템, Nexacro)의 채널 보고서, 조회 조건·기준시각·페이지·다운로드 파일·화면 통제 합계. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "올리브영 (협력사 시스템, Nexacro)의 채널 보고서, 조회 조건·기준시각·페이지·다운로드 파일·화면 통제 합계에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-17-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 원천 권위는 상(올리브영 POS 실적)이나 경로가 비공개 UI 트랜잭션 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-17-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 실패 분기 필요. 승인된 폴백: Stagehand 화면 다운로드(③) → 사람(④)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-17-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=일 1회. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "일 1회 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-17-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#17 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-18",
              "title": "#18 쿠팡 서플라이어 허브(로켓배송)",
              "status": "blocked",
              "detail": "채널 · 원천. 목표=automated_batch: 공식 API 없음(쿠팡 개발자센터 FAQ: 서플라이허브는 OpenAPI 미지원) → 봇 전용 하위 사용자 + 결정론 다운로드(발주·입고·판매·재고·정산 엑셀); 현재 접근은 봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→일 1회 2회→증거 동결.",
              "source": {
                "row_id": "18",
                "name": "쿠팡 서플라이어 허브(로켓배송)",
                "kind": "원천",
                "transport": "portal",
                "cadence": "일 1회",
                "target_method": "automated_batch: 공식 API 없음(쿠팡 개발자센터 FAQ: 서플라이허브는 OpenAPI 미지원) → 봇 전용 하위 사용자 + 결정론 다운로드(발주·입고·판매·재고·정산 엑셀)",
                "current_state": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
                "conditions": "고객사 IP 에서 사람 재현 · 봇 전용 하위 사용자 · 약관",
                "fallback": "담당자 다운로드 + 동기화 폴더(④)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-18-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #18 분류 기준은 있음: 업무=채널, 유형=원천. 36_ 우선 결정은 automated_batch: 공식 API 없음(쿠팡 개발자센터 FAQ: 서플라이허브는 OpenAPI 미지원) → 봇 전용 하위 사용자 + 결정론 다운로드(발주·입고·판매·재고·정산 엑셀). 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#18의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-18-access",
                  "title": "읽기 전용 접근",
                  "status": "blocked",
                  "detail": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "고객사 IP 에서 사람 재현 · 봇 전용 하위 사용자 · 약관",
                  "criterion": "쿠팡 서플라이어 허브(로켓배송) 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-18-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "14개 포털 공통 실행기와 가짜 포털 E2E 존재. 이 원천 selector·실로그인·다운로드 정의는 없음. 2026-10-14 갱신(묶음③·L4): 14개 포털 공통 실행기 게이트에 portal_coupang_supplier 등록(약관 금지 신호 강 — L7 보류). 이 원천 selector·실로그인·다운로드 정의는 없음. 32_ 목표는 ③ 포털 — 생성기 transport 분류(api) 재검토 필요. 2026-09-30 L4: 흐름 골격 coupangSupplier.ts(sales_daily) + 계약 시험(unit 5·e2e 게이트 폐쇄 3 — 로그인 POST 0). 쿠팡 공식 FAQ: 서플라이허브 OpenAPI 미지원 → 1순위 벤더 매니저 파일 정기 발송(38-drafts L4-D3). 골격이 공용 ALL_SKELETONS(14)에 합류(2026-09-30 레인 통합).",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/src/portals/registry.ts",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/docs/약관판단표.md",
                    "docs/work-log/2026-09-30_pending-sources-readiness/connector-audit.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/src/portals/skeletons/coupangSupplier.ts",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/test/unit/l4Skeletons.test.ts",
                    "docs/work-log/2026-09-30_todo-l4-domestic-api/no-api-routes.md"
                  ],
                  "next": "automated_batch: 공식 API 없음(쿠팡 개발자센터 FAQ: 서플라이허브는 OpenAPI 미지원) → 봇 전용 하위 사용자 + 결정론 다운로드(발주·입고·판매·재고·정산 엑셀) 경로의 account/object, parser, 개인정보 제거기, 일 1회 schedule을 원천별로 고정한다.",
                  "criterion": "#18에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-18-live-read",
                  "title": "실계정 첫 Read",
                  "status": "blocked",
                  "detail": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회. 실 Read 완료는 쿠팡 서플라이어 허브(로켓배송) 전 범위 원문이 raw lake에 착지한 실행으로 다시 증명해야 함.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "쿠팡 서플라이어 허브(로켓배송)에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-18-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 쿠팡 서플라이어 허브(로켓배송)의 채널 보고서, 조회 조건·기준시각·페이지·다운로드 파일·화면 통제 합계. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "쿠팡 서플라이어 허브(로켓배송)의 채널 보고서, 조회 조건·기준시각·페이지·다운로드 파일·화면 통제 합계에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-18-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 원천 권위는 상(쿠팡 산출 실적)이나 9/21 인증 도메인 Access Denied 관측 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-18-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 실패 분기 필요. 승인된 폴백: 담당자 다운로드 + 동기화 폴더(④)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-18-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=일 1회. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "일 1회 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-18-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#18 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-33",
              "title": "#33 YesStyle (Tableau)",
              "status": "blocked",
              "detail": "해외 EC · 원천. 목표=automated_batch: 공급사 API 공개 자료 없음 → Tableau 뷰 CSV 반출을 세션으로 자동 실행; 현재 접근은 봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→일 1회 2회→증거 동결.",
              "source": {
                "row_id": "33",
                "name": "YesStyle (Tableau)",
                "kind": "원천",
                "transport": "portal",
                "cadence": "일 1회",
                "target_method": "automated_batch: 공급사 API 공개 자료 없음 → Tableau 뷰 CSV 반출을 세션으로 자동 실행",
                "current_state": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
                "conditions": "9/21 로그인 오류 해결 · 요약 데이터 다운로드 권한",
                "fallback": "사람 다운로드(④)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-33-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #33 분류 기준은 있음: 업무=해외 EC, 유형=원천. 36_ 우선 결정은 automated_batch: 공급사 API 공개 자료 없음 → Tableau 뷰 CSV 반출을 세션으로 자동 실행. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#33의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-33-access",
                  "title": "읽기 전용 접근",
                  "status": "blocked",
                  "detail": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회. 2026-10-14 갱신(묶음④): 실제 로그인 0회. 9/21 로그인 오류 원인·Tableau 요약 다운로드 권한 미확인. 대안 Tableau 구독 CSV. 포털별 질문 초안은 38-drafts E(다이소 C·HGLIS D).",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/result.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/38-drafts.md"
                  ],
                  "next": "9/21 로그인 오류 해결 · 요약 데이터 다운로드 권한",
                  "criterion": "YesStyle (Tableau) 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-33-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "14개 포털 공통 실행기와 가짜 포털 E2E 존재. 이 원천 selector·실로그인·다운로드 정의는 없음. 2026-10-14 갱신(묶음④): 원천별 흐름 골격(portal_yesstyle) 추가 — URL·selector 자리표시자라 assertExecutable 이 거부(config_invalid), 게이트 닫힘 확인. 합성 쌍둥이로 기록→승인→재생 E2E 통과(모델 호출 0, 결정론 SHA-256). 다운로드는 합성 CSV로만 시험. 실 selector·다운로드 정의는 남음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/src/portals/skeletons/index.ts",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/test/unit/sourceSkeletons.test.ts",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/test/e2e/sourceFlows.e2e.test.ts",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/result.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/38-drafts.md"
                  ],
                  "next": "automated_batch: 공급사 API 공개 자료 없음 → Tableau 뷰 CSV 반출을 세션으로 자동 실행 경로의 account/object, parser, 개인정보 제거기, 일 1회 schedule을 원천별로 고정한다.",
                  "criterion": "#33에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-33-live-read",
                  "title": "실계정 첫 Read",
                  "status": "blocked",
                  "detail": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회. 실 Read 완료는 YesStyle (Tableau) 전 범위 원문이 raw lake에 착지한 실행으로 다시 증명해야 함.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "YesStyle (Tableau)에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-33-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: YesStyle (Tableau)의 해외 EC 보고서, 조회 조건·기준시각·페이지·다운로드 파일·화면 통제 합계. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "YesStyle (Tableau)의 해외 EC 보고서, 조회 조건·기준시각·페이지·다운로드 파일·화면 통제 합계에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-33-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 유통사 BI 요약값만(주문 단위 아님) 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-33-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 실패 분기 필요. 승인된 폴백: 사람 다운로드(④)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-33-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=일 1회. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "일 1회 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-33-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#33 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-37",
              "title": "#37 B마트 SCM",
              "status": "blocked",
              "detail": "채널(셀인) · 원천. 목표=automated_batch: 공개 API 없음(SCM 화면 코드에 API 키 메뉴 없음) → 봇 전용 하위 사용자 + 발주·입고·재고·정산 엑셀 다운로드; 현재 접근은 봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→일 1회 2회→증거 동결.",
              "source": {
                "row_id": "37",
                "name": "B마트 SCM",
                "kind": "원천",
                "transport": "portal",
                "cadence": "일 1회",
                "target_method": "automated_batch: 공개 API 없음(SCM 화면 코드에 API 키 메뉴 없음) → 봇 전용 하위 사용자 + 발주·입고·재고·정산 엑셀 다운로드",
                "current_state": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
                "conditions": "봇 하위 사용자 · 2FA 수신처 · 약관",
                "fallback": "사람(④)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-37-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #37 분류 기준은 있음: 업무=채널(셀인), 유형=원천. 36_ 우선 결정은 automated_batch: 공개 API 없음(SCM 화면 코드에 API 키 메뉴 없음) → 봇 전용 하위 사용자 + 발주·입고·재고·정산 엑셀 다운로드. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#37의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-37-access",
                  "title": "읽기 전용 접근",
                  "status": "blocked",
                  "detail": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "봇 하위 사용자 · 2FA 수신처 · 약관",
                  "criterion": "B마트 SCM 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-37-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "14개 포털 공통 실행기와 가짜 포털 E2E 존재. 이 원천 selector·실로그인·다운로드 정의는 없음. 2026-10-14 갱신(묶음③·L4): 포털 공통 실행기 게이트에 portal_bmart 등록. 이 원천 selector·실로그인·다운로드 정의는 없음. 32_ 목표는 ③ 포털 — 생성기 transport 분류(api) 재검토 필요. 2026-09-30 L4: 흐름 골격 bmart.ts(po_inbound) + 같은 계약 시험. 공급사 공개 API·EDI 문서 없음 → MD 파일 정기 발송 먼저(L4-D3). 골격이 공용 ALL_SKELETONS(14)에 합류(2026-09-30 레인 통합).",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/src/portals/registry.ts",
                    "docs/work-log/2026-09-30_pending-sources-readiness/connector-audit.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/src/portals/skeletons/bmart.ts",
                    "docs/work-log/2026-09-30_todo-l4-domestic-api/no-api-routes.md"
                  ],
                  "next": "automated_batch: 공개 API 없음(SCM 화면 코드에 API 키 메뉴 없음) → 봇 전용 하위 사용자 + 발주·입고·재고·정산 엑셀 다운로드 경로의 account/object, parser, 개인정보 제거기, 일 1회 schedule을 원천별로 고정한다.",
                  "criterion": "#37에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-37-live-read",
                  "title": "실계정 첫 Read",
                  "status": "blocked",
                  "detail": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회. 실 Read 완료는 B마트 SCM 전 범위 원문이 raw lake에 착지한 실행으로 다시 증명해야 함.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "B마트 SCM에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-37-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: B마트 SCM의 채널(셀인) 보고서, 조회 조건·기준시각·페이지·다운로드 파일·화면 통제 합계. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "B마트 SCM의 채널(셀인) 보고서, 조회 조건·기준시각·페이지·다운로드 파일·화면 통제 합계에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-37-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 발주·입고 원장이나 UI 경유 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-37-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 실패 분기 필요. 승인된 폴백: 사람(④)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-37-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=일 1회. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "일 1회 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-37-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#37 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-38",
              "title": "#38 컬리 파트너포털",
              "status": "blocked",
              "detail": "채널(셀인) · 원천. 목표=automated_batch: 1P 파트너포털 공개 API·EDI 자료 없음 → 발주·입고·정산 다운로드 자동화; 현재 접근은 봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→일 1회 2회→증거 동결.",
              "source": {
                "row_id": "38",
                "name": "컬리 파트너포털",
                "kind": "원천",
                "transport": "portal",
                "cadence": "일 1회",
                "target_method": "automated_batch: 1P 파트너포털 공개 API·EDI 자료 없음 → 발주·입고·정산 다운로드 자동화",
                "current_state": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
                "conditions": "조회 기간·메뉴 확인 · 약관",
                "fallback": "사람(④)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-38-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #38 분류 기준은 있음: 업무=채널(셀인), 유형=원천. 36_ 우선 결정은 automated_batch: 1P 파트너포털 공개 API·EDI 자료 없음 → 발주·입고·정산 다운로드 자동화. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#38의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-38-access",
                  "title": "읽기 전용 접근",
                  "status": "blocked",
                  "detail": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회. 2026-10-14 갱신(묶음④): 실제 로그인 0회. 하위 사용자·약관 로그인 뒤. 조회 16일 창 — assertKurlyWindow 계약 시험. 포털별 질문 초안은 38-drafts E(다이소 C·HGLIS D).",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/result.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/38-drafts.md"
                  ],
                  "next": "조회 기간·메뉴 확인 · 약관",
                  "criterion": "컬리 파트너포털 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-38-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "14개 포털 공통 실행기와 가짜 포털 E2E 존재. 이 원천 selector·실로그인·다운로드 정의는 없음. 2026-10-14 갱신(묶음④): 원천별 흐름 골격(portal_kurly) 추가 — URL·selector 자리표시자라 assertExecutable 이 거부(config_invalid), 게이트 닫힘 확인. 게이트 폐쇄·구조 계약만 시험(전체 흐름 E2E 는 대표 5개 원천). 다운로드는 합성 CSV로만 시험. 실 selector·다운로드 정의는 남음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/src/portals/skeletons/index.ts",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/test/unit/sourceSkeletons.test.ts",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/test/e2e/sourceFlows.e2e.test.ts",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/result.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/38-drafts.md"
                  ],
                  "next": "automated_batch: 1P 파트너포털 공개 API·EDI 자료 없음 → 발주·입고·정산 다운로드 자동화 경로의 account/object, parser, 개인정보 제거기, 일 1회 schedule을 원천별로 고정한다.",
                  "criterion": "#38에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-38-live-read",
                  "title": "실계정 첫 Read",
                  "status": "blocked",
                  "detail": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회. 실 Read 완료는 컬리 파트너포털 전 범위 원문이 raw lake에 착지한 실행으로 다시 증명해야 함.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "컬리 파트너포털에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-38-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 컬리 파트너포털의 채널(셀인) 보고서, 조회 조건·기준시각·페이지·다운로드 파일·화면 통제 합계. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "컬리 파트너포털의 채널(셀인) 보고서, 조회 조건·기준시각·페이지·다운로드 파일·화면 통제 합계에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-38-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 발주·입고 원장이나 UI 경유. 조회 16일 단위(수기메모, 공식 확인 전) — 16일 안에만 받으면 누락 없음 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-38-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 실패 분기 필요. 승인된 폴백: 사람(④)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-38-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=일 1회. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "일 1회 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-38-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#38 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-39b-2",
              "title": "#39b-2 무신사·에이블리 — 정산",
              "status": "blocked",
              "detail": "채널 · 원천. 목표=automated_batch: 정산 API 공개 자료 없음(연동솔루션사 문서 기준) → 파트너센터·어드민 정산 다운로드 자동화(무신사 마스터 계정 OTP, 에이블리 월 2회 정산); 현재 접근은 봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→무신사 일 1회 · 에이블리 정산일 2회→증거 동결.",
              "source": {
                "row_id": "39b-2",
                "name": "무신사·에이블리 — 정산",
                "kind": "원천",
                "transport": "portal",
                "cadence": "무신사 일 1회 · 에이블리 정산일",
                "target_method": "automated_batch: 정산 API 공개 자료 없음(연동솔루션사 문서 기준) → 파트너센터·어드민 정산 다운로드 자동화(무신사 마스터 계정 OTP, 에이블리 월 2회 정산)",
                "current_state": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
                "conditions": "몰별 봇 하위 사용자 · 무신사 OTP · 약관",
                "fallback": "정산 파일 메일(③ 수신) → 사람(④)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-39b-2-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #39b-2 분류 기준은 있음: 업무=채널, 유형=원천. 36_ 우선 결정은 automated_batch: 정산 API 공개 자료 없음(연동솔루션사 문서 기준) → 파트너센터·어드민 정산 다운로드 자동화(무신사 마스터 계정 OTP, 에이블리 월 2회 정산). 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#39b-2의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-39b-2-access",
                  "title": "읽기 전용 접근",
                  "status": "blocked",
                  "detail": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회. 2026-10-14 갱신(묶음④): 실제 로그인 0회. 무신사 약관 제11조②9호 사전 동의 경로·OTP 분리 하위 계정, 에이블리 부계정 기능 존재(허용 근거 아님). 포털별 질문 초안은 38-drafts E(다이소 C·HGLIS D).",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/result.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/38-drafts.md"
                  ],
                  "next": "몰별 봇 하위 사용자 · 무신사 OTP · 약관",
                  "criterion": "무신사·에이블리 — 정산 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-39b-2-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "14개 포털 공통 실행기와 가짜 포털 E2E 존재. 이 원천 selector·실로그인·다운로드 정의는 없음. 2026-10-14 갱신(묶음④): 원천별 흐름 골격(portal_musinsa+portal_ably) 추가 — URL·selector 자리표시자라 assertExecutable 이 거부(config_invalid), 게이트 닫힘 확인. 합성 쌍둥이로 기록→승인→재생 E2E 통과(모델 호출 0, 결정론 SHA-256). 다운로드는 합성 CSV로만 시험. 실 selector·다운로드 정의는 남음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/src/portals/skeletons/index.ts",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/test/unit/sourceSkeletons.test.ts",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/test/e2e/sourceFlows.e2e.test.ts",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/result.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/38-drafts.md"
                  ],
                  "next": "automated_batch: 정산 API 공개 자료 없음(연동솔루션사 문서 기준) → 파트너센터·어드민 정산 다운로드 자동화(무신사 마스터 계정 OTP, 에이블리 월 2회 정산) 경로의 account/object, parser, 개인정보 제거기, 무신사 일 1회 · 에이블리 정산일 schedule을 원천별로 고정한다.",
                  "criterion": "#39b-2에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-39b-2-live-read",
                  "title": "실계정 첫 Read",
                  "status": "blocked",
                  "detail": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회. 실 Read 완료는 무신사·에이블리 — 정산 전 범위 원문이 raw lake에 착지한 실행으로 다시 증명해야 함.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "무신사·에이블리 — 정산에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-39b-2-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 무신사 주문단위 정산과 에이블리 정산일 보고서를 각각 분리 다운로드. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "무신사 주문단위 정산과 에이블리 정산일 보고서를 각각 분리 다운로드에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-39b-2-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 정산 원장이나 UI 경유. 매출차감 반영이라 GMV 로 해석 금지 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-39b-2-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 실패 분기 필요. 승인된 폴백: 정산 파일 메일(③ 수신) → 사람(④)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-39b-2-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=무신사 일 1회 · 에이블리 정산일. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "무신사 일 1회 · 에이블리 정산일 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-39b-2-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#39b-2 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-45",
              "title": "#45 트렌디어",
              "status": "blocked",
              "detail": "시장정보 · 원천. 목표=automated_batch: 범위 확정 후 export 자동화(API 여부 미확인); 현재 접근은 봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→원천 발행: 주 1회; 미발행 여부 매일 확인 2회→증거 동결.",
              "source": {
                "row_id": "45",
                "name": "트렌디어",
                "kind": "원천",
                "transport": "portal",
                "cadence": "원천 발행: 주 1회; 미발행 여부 매일 확인",
                "target_method": "automated_batch: 범위 확정 후 export 자동화(API 여부 미확인)",
                "current_state": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
                "conditions": "범위 확정",
                "fallback": "정기 리포트(③ 수신)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-45-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #45 분류 기준은 있음: 업무=시장정보, 유형=원천. 36_ 우선 결정은 automated_batch: 범위 확정 후 export 자동화(API 여부 미확인). 실객체·기간·권위 범위 승인은 남음. 2026-10-14 갱신(live-read-1011): 10/8 회신 #28: 트렌디어는 API 없음 — 서비스 로그인 후 조회 · 엑셀 다운로드. 수집 = 담당자 업로드(봇 로그인 안 함).",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#45의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-45-access",
                  "title": "읽기 전용 접근",
                  "status": "blocked",
                  "detail": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "범위 확정",
                  "criterion": "트렌디어 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-45-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "14개 포털 공통 실행기와 가짜 포털 E2E 존재. 이 원천 selector·실로그인·다운로드 정의는 없음. 2026-10-14 갱신(묶음③·L4): 포털 공통 실행기 게이트에 portal_trendier 등록(범위 확정 전). 이 원천 selector·다운로드 정의는 없음. 32_ 목표는 ③ 포털 — 생성기 transport 분류(api) 재검토 필요. 2026-09-30 L4: 흐름 골격 trendier.ts(trend_report) + 같은 계약 시험. 범위 확정·엔터프라이즈 API/정기 리포트 문의가 먼저(L4-D4). 골격이 공용 ALL_SKELETONS(14)에 합류(2026-09-30 레인 통합).",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/src/portals/registry.ts",
                    "docs/work-log/2026-09-30_pending-sources-readiness/connector-audit.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/src/portals/skeletons/trendier.ts",
                    "docs/work-log/2026-09-30_todo-l4-domestic-api/no-api-routes.md"
                  ],
                  "next": "automated_batch: 범위 확정 후 export 자동화(API 여부 미확인) 경로의 account/object, parser, 개인정보 제거기, 원천 발행: 주 1회; 미발행 여부 매일 확인 schedule을 원천별로 고정한다.",
                  "criterion": "#45에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-45-live-read",
                  "title": "실계정 첫 Read",
                  "status": "blocked",
                  "detail": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회. 실 Read 완료는 트렌디어 전 범위 원문이 raw lake에 착지한 실행으로 다시 증명해야 함.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "트렌디어에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-45-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 트렌디어의 시장정보 보고서, 조회 조건·기준시각·페이지·다운로드 파일·화면 통제 합계. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "트렌디어의 시장정보 보고서, 조회 조건·기준시각·페이지·다운로드 파일·화면 통제 합계에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-45-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 제3자 추정치 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-45-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 실패 분기 필요. 승인된 폴백: 정기 리포트(③ 수신)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-45-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=원천 발행: 주 1회; 미발행 여부 매일 확인. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "원천 발행: 주 1회; 미발행 여부 매일 확인 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-45-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#45 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-65",
              "title": "#65 광고 성과(mediaplex 공유 링크)",
              "status": "partial",
              "detail": "광고 · 원천. 목표=automated_batch: 공유 링크가 부르는 JSON 을 직접 호출(로그인 불필요, 비공식); 현재 접근은 로그인 없는 대행사 공유 링크(비공식 JSON)라 봇 계정 · OTP 가 필요 없다. 링크 유지 · 재발급 합의는 미확인.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→일 1회 2회→증거 동결.",
              "source": {
                "row_id": "65",
                "name": "광고 성과(mediaplex 공유 링크)",
                "kind": "원천",
                "transport": "portal",
                "cadence": "일 1회",
                "target_method": "automated_batch: 공유 링크가 부르는 JSON 을 직접 호출(로그인 불필요, 비공식)",
                "current_state": "로그인 없는 대행사 공유 링크(비공식 JSON)라 봇 계정 · OTP 가 필요 없다. 링크 유지 · 재발급 합의는 미확인.",
                "conditions": "마크업 포함 여부 확인",
                "fallback": "대행사 고정 스키마 피드(③ 수신)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-65-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #65 분류 기준은 있음: 업무=광고, 유형=원천. 36_ 우선 결정은 automated_batch: 공유 링크가 부르는 JSON 을 직접 호출(로그인 불필요, 비공식). 실객체·기간·권위 범위 승인은 남음. 2026-10-14 갱신(L2): 2026-09-30 L2: 공유 토큰이 가리키는 브랜드 현재 릴리스 1객체(표 30) manifest. 권위 아님(대행사 2차)·마크업 포함 spend·pii.none. 판정 ROOT_APPROVABLE.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-30_todo-l2-read-now/manifests/source-65.json"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#65의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-65-access",
                  "title": "읽기 전용 접근",
                  "status": "partial",
                  "detail": "로그인 없는 대행사 공유 링크(비공식 JSON)라 봇 계정 · OTP 가 필요 없다. 링크 유지 · 재발급 합의는 미확인. 2026-10-14 갱신(L2): 2026-09-30 L2: 링크 소지자(자격 없음) 비인증 GET 3종만, A·B 전 호출 200, 원천 쓰기 0. 판정 PASS.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "docs/work-log/2026-09-30_todo-l2-read-now/manifests/source-65.json"
                  ],
                  "next": "마크업 포함 여부 확인",
                  "criterion": "광고 성과(mediaplex 공유 링크) 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-65-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "E3 manifest 상태=partial. 코드 경로는 있지만 공식·계정 계약 확정 전에는 완료로 올리지 않는다. 이전 실측·합성 근거(L2)는 evidence로 보존.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "docs/work-log/2026-09-30_todo-l2-read-now/manifests/source-65.json"
                  ],
                  "next": "automated_batch: 공유 링크가 부르는 JSON 을 직접 호출(로그인 불필요, 비공식) 경로의 account/object, parser, 개인정보 제거기, 일 1회 schedule을 원천별로 고정한다.",
                  "criterion": "#65에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-65-live-read",
                  "title": "실계정 첫 Read",
                  "status": "partial",
                  "detail": "광고 성과(mediaplex 공유 링크) 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지. 2026-10-14 갱신(L2): 2026-09-30 L2: A·B raw 원문 착지(SHA-256 = releaseId), 비공개 staging 동등 행. 판정 PASS.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-30_todo-l2-read-now/manifests/source-65.json"
                  ],
                  "next": "광고 성과(mediaplex 공유 링크)에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-65-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "partial",
                  "detail": "원천별 Read 범위: 광고 성과(mediaplex 공유 링크)의 광고 보고서, 조회 조건·기준시각·페이지·다운로드 파일·화면 통제 합계. 아직 전체 객체의 누락 검증 증거 없음. 2026-10-14 갱신(L2): 2026-09-30 L2: 기대 표 30=실제, raw 행=staging 행 159,940, 중복 키 0, 잘림 검사(포인터 바이트·해시). 판정 PASS.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "docs/work-log/2026-09-30_todo-l2-read-now/manifests/source-65.json"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "광고 성과(mediaplex 공유 링크)의 광고 보고서, 조회 조건·기준시각·페이지·다운로드 파일·화면 통제 합계에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-65-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "partial",
                  "detail": "신뢰성=하. 근거: 대행사가 입력한 2차 데이터 + 비공식 엔드포인트(예고 없이 바뀜) + 마크업 포함 여부 불명 실 Read 결과의 행 수·통제 합계·형식 대조는 남음. 2026-10-14 갱신(L2): 2026-09-30 L2: 표·필드별 결정론 통제 합계 raw=staging, 날짜 NULL·비ISO 0, 숫자/문자 혼재 0. 판정 PASS.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-30_todo-l2-read-now/manifests/source-65.json"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-65-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 실패 분기 필요. 승인된 폴백: 대행사 고정 스키마 피드(③ 수신) 2026-10-14 갱신(L2): 2026-09-30 L2: 릴리스 503 상한·토큰 무효·잘린 본문 → 확정 0 / 착지 후 크래시 → pending 만 / 429 1회 뒤 복구, raw 재기록 0·중복 0. 판정 ROOT_APPROVABLE.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "docs/work-log/2026-09-30_todo-l2-read-now/manifests/source-65.json"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-65-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "partial",
                  "detail": "채택 주기=일 1회. 서로 다른 두 예정 실행의 연속 성공 증거 없음. 2026-10-14 갱신(L2): 2026-09-30 L2: 서로 다른 2회(간격 632초, 하한 600초), B = A 와 같은 바이트, 스케줄 비활성. 판정 PASS.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md",
                    "docs/work-log/2026-09-30_todo-l2-read-now/manifests/source-65.json"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "일 1회 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-65-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "partial",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음. 2026-10-14 갱신(L2): 2026-09-30 L2: 루트 E9 서명 요청(signature-request.json) — 서명 전. 판정 PENDING_ROOT_SIGNATURE.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "docs/work-log/2026-09-30_todo-l2-read-now/manifests/source-65.json"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#65 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-93",
              "title": "#93 광고 성과(mediaplex, 동북아MC)",
              "status": "partial",
              "detail": "광고 · 원천. 목표=automated_batch: #65 와 같은 방식; 현재 접근은 로그인 없는 대행사 공유 링크(비공식 JSON)라 봇 계정 · OTP 가 필요 없다. 링크 유지 · 재발급 합의는 미확인.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→일 1회 2회→증거 동결.",
              "source": {
                "row_id": "93",
                "name": "광고 성과(mediaplex, 동북아MC)",
                "kind": "원천",
                "transport": "portal",
                "cadence": "일 1회",
                "target_method": "automated_batch: #65 와 같은 방식",
                "current_state": "로그인 없는 대행사 공유 링크(비공식 JSON)라 봇 계정 · OTP 가 필요 없다. 링크 유지 · 재발급 합의는 미확인.",
                "conditions": "#65 와 동일",
                "fallback": "#65 와 동일",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-93-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #93 분류 기준은 있음: 업무=광고, 유형=원천. 36_ 우선 결정은 automated_batch: #65 와 같은 방식. 실객체·기간·권위 범위 승인은 남음. 2026-10-14 갱신(L2): 2026-09-30 L2: 공유 토큰이 가리키는 브랜드 현재 릴리스 1객체(표 30) manifest. 권위 아님(대행사 2차)·마크업 포함 spend·pii.none. 판정 ROOT_APPROVABLE.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-30_todo-l2-read-now/manifests/source-93.json"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#93의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-93-access",
                  "title": "읽기 전용 접근",
                  "status": "partial",
                  "detail": "로그인 없는 대행사 공유 링크(비공식 JSON)라 봇 계정 · OTP 가 필요 없다. 링크 유지 · 재발급 합의는 미확인. 2026-10-14 갱신(L2): 2026-09-30 L2: 링크 소지자(자격 없음) 비인증 GET 3종만, A·B 전 호출 200, 원천 쓰기 0. 판정 PASS.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "docs/work-log/2026-09-30_todo-l2-read-now/manifests/source-93.json"
                  ],
                  "next": "#65 와 동일",
                  "criterion": "광고 성과(mediaplex, 동북아MC) 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-93-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "E3 manifest 상태=partial. 코드 경로는 있지만 공식·계정 계약 확정 전에는 완료로 올리지 않는다. 이전 실측·합성 근거(L2)는 evidence로 보존.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "docs/work-log/2026-09-30_todo-l2-read-now/manifests/source-93.json"
                  ],
                  "next": "automated_batch: #65 와 같은 방식 경로의 account/object, parser, 개인정보 제거기, 일 1회 schedule을 원천별로 고정한다.",
                  "criterion": "#93에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-93-live-read",
                  "title": "실계정 첫 Read",
                  "status": "partial",
                  "detail": "광고 성과(mediaplex, 동북아MC) 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지. 2026-10-14 갱신(L2): 2026-09-30 L2: A·B raw 원문 착지(SHA-256 = releaseId), 비공개 staging 동등 행. 판정 PASS.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-30_todo-l2-read-now/manifests/source-93.json"
                  ],
                  "next": "광고 성과(mediaplex, 동북아MC)에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-93-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "partial",
                  "detail": "원천별 Read 범위: 광고 성과(mediaplex, 동북아MC)의 광고 보고서, 조회 조건·기준시각·페이지·다운로드 파일·화면 통제 합계. 아직 전체 객체의 누락 검증 증거 없음. 2026-10-14 갱신(L2): 2026-09-30 L2: 기대 표 30=실제, raw 행=staging 행 159,940, 중복 키 0, 잘림 검사(포인터 바이트·해시). 판정 PASS.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "docs/work-log/2026-09-30_todo-l2-read-now/manifests/source-93.json"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "광고 성과(mediaplex, 동북아MC)의 광고 보고서, 조회 조건·기준시각·페이지·다운로드 파일·화면 통제 합계에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-93-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "partial",
                  "detail": "신뢰성=하. 근거: #65 와 동일 실 Read 결과의 행 수·통제 합계·형식 대조는 남음. 2026-10-14 갱신(L2): 2026-09-30 L2: 표·필드별 결정론 통제 합계 raw=staging, 날짜 NULL·비ISO 0, 숫자/문자 혼재 0. 판정 PASS.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-30_todo-l2-read-now/manifests/source-93.json"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-93-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 실패 분기 필요. 승인된 폴백: #65 와 동일 2026-10-14 갱신(L2): 2026-09-30 L2: 릴리스 503 상한·토큰 무효·잘린 본문 → 확정 0 / 착지 후 크래시 → pending 만 / 429 1회 뒤 복구, raw 재기록 0·중복 0. 판정 ROOT_APPROVABLE.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/cmslab_api/registry.py",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/e3-manifest.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/connectors/api/docs/E3-evidence.md",
                    "docs/work-log/2026-09-30_todo-l2-read-now/manifests/source-93.json"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-93-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "partial",
                  "detail": "채택 주기=일 1회. 서로 다른 두 예정 실행의 연속 성공 증거 없음. 2026-10-14 갱신(L2): 2026-09-30 L2: 서로 다른 2회(간격 632초, 하한 600초), B = A 와 같은 바이트, 스케줄 비활성. 판정 PASS.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md",
                    "docs/work-log/2026-09-30_todo-l2-read-now/manifests/source-93.json"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "일 1회 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-93-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "partial",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음. 2026-10-14 갱신(L2): 2026-09-30 L2: 루트 E9 서명 요청(signature-request.json) — 서명 전. 판정 PENDING_ROOT_SIGNATURE.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "docs/work-log/2026-09-30_todo-l2-read-now/manifests/source-93.json"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#93 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-97b",
              "title": "#97b CJ온스타일 — 정산",
              "status": "blocked",
              "detail": "채널 · 원천. 목표=automated_batch: CJ 표준 API 에 정산·매출 없음 → 파트너 정산·수수료 다운로드 자동화(지급확정 여부 별도); 현재 접근은 봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→일 1회 2회→증거 동결.",
              "source": {
                "row_id": "97b",
                "name": "CJ온스타일 — 정산",
                "kind": "원천",
                "transport": "portal",
                "cadence": "일 1회",
                "target_method": "automated_batch: CJ 표준 API 에 정산·매출 없음 → 파트너 정산·수수료 다운로드 자동화(지급확정 여부 별도)",
                "current_state": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
                "conditions": "계정·약관",
                "fallback": "정산 파일 메일(③ 수신)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-97b-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #97b 분류 기준은 있음: 업무=채널, 유형=원천. 36_ 우선 결정은 automated_batch: CJ 표준 API 에 정산·매출 없음 → 파트너 정산·수수료 다운로드 자동화(지급확정 여부 별도). 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#97b의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-97b-access",
                  "title": "읽기 전용 접근",
                  "status": "blocked",
                  "detail": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회. 2026-10-14 갱신(묶음④): 실제 로그인 0회. 운영자ID 추가 등록 기능 있음(휴대폰 인증). 정산 API 여부 미확인. 포털별 질문 초안은 38-drafts E(다이소 C·HGLIS D).",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/result.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/38-drafts.md"
                  ],
                  "next": "계정·약관",
                  "criterion": "CJ온스타일 — 정산 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-97b-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "14개 포털 공통 실행기와 가짜 포털 E2E 존재. 이 원천 selector·실로그인·다운로드 정의는 없음. 2026-10-14 갱신(묶음④): 원천별 흐름 골격(portal_cj_onstyle) 추가 — URL·selector 자리표시자라 assertExecutable 이 거부(config_invalid), 게이트 닫힘 확인. 합성 쌍둥이로 기록→승인→재생 E2E 통과(모델 호출 0, 결정론 SHA-256). 다운로드는 합성 CSV로만 시험. 실 selector·다운로드 정의는 남음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/src/portals/skeletons/index.ts",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/test/unit/sourceSkeletons.test.ts",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/test/e2e/sourceFlows.e2e.test.ts",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/result.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/38-drafts.md"
                  ],
                  "next": "automated_batch: CJ 표준 API 에 정산·매출 없음 → 파트너 정산·수수료 다운로드 자동화(지급확정 여부 별도) 경로의 account/object, parser, 개인정보 제거기, 일 1회 schedule을 원천별로 고정한다.",
                  "criterion": "#97b에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-97b-live-read",
                  "title": "실계정 첫 Read",
                  "status": "blocked",
                  "detail": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회. 실 Read 완료는 CJ온스타일 — 정산 전 범위 원문이 raw lake에 착지한 실행으로 다시 증명해야 함.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "CJ온스타일 — 정산에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-97b-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: CJ온스타일 — 정산의 채널 보고서, 조회 조건·기준시각·페이지·다운로드 파일·화면 통제 합계. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "CJ온스타일 — 정산의 채널 보고서, 조회 조건·기준시각·페이지·다운로드 파일·화면 통제 합계에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-97b-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 광고비 상계가 매출에서 빠짐 — 별도 보존 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-97b-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 실패 분기 필요. 승인된 폴백: 정산 파일 메일(③ 수신)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-97b-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=일 1회. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "일 1회 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-97b-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#97b 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-h6",
              "title": "#H6 Qoo10 광고비·방문·전환",
              "status": "blocked",
              "detail": "광고 · 원천. 목표=automated_batch: QSM 광고·트래픽 리포트 다운로드(공개된 QAPI 목록에 광고·방문 API 없음); 현재 접근은 봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→일 1회 2회→증거 동결.",
              "source": {
                "row_id": "H6",
                "name": "Qoo10 광고비·방문·전환",
                "kind": "원천",
                "transport": "portal",
                "cadence": "일 1회",
                "target_method": "automated_batch: QSM 광고·트래픽 리포트 다운로드(공개된 QAPI 목록에 광고·방문 API 없음)",
                "current_state": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
                "conditions": "광고 리포트 메뉴 권한",
                "fallback": "사람(④)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-h6-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #H6 분류 기준은 있음: 업무=광고, 유형=원천. 36_ 우선 결정은 automated_batch: QSM 광고·트래픽 리포트 다운로드(공개된 QAPI 목록에 광고·방문 API 없음). 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#H6의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-h6-access",
                  "title": "읽기 전용 접근",
                  "status": "blocked",
                  "detail": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회. 2026-10-14 갱신(묶음④): 실제 로그인 0회. QSM 하위 계정·광고 리포트 API 미확인. 포털별 질문 초안은 38-drafts E(다이소 C·HGLIS D).",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/result.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/38-drafts.md"
                  ],
                  "next": "광고 리포트 메뉴 권한",
                  "criterion": "Qoo10 광고비·방문·전환 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-h6-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "14개 포털 공통 실행기와 가짜 포털 E2E 존재. 이 원천 selector·실로그인·다운로드 정의는 없음. 2026-10-14 갱신(묶음④): 원천별 흐름 골격(portal_qoo10_qsm) 추가 — URL·selector 자리표시자라 assertExecutable 이 거부(config_invalid), 게이트 닫힘 확인. 게이트 폐쇄·구조 계약만 시험(전체 흐름 E2E 는 대표 5개 원천). 다운로드는 합성 CSV로만 시험. 실 selector·다운로드 정의는 남음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/src/portals/skeletons/index.ts",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/test/unit/sourceSkeletons.test.ts",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/test/e2e/sourceFlows.e2e.test.ts",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/result.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/38-drafts.md"
                  ],
                  "next": "automated_batch: QSM 광고·트래픽 리포트 다운로드(공개된 QAPI 목록에 광고·방문 API 없음) 경로의 account/object, parser, 개인정보 제거기, 일 1회 schedule을 원천별로 고정한다.",
                  "criterion": "#H6에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-h6-live-read",
                  "title": "실계정 첫 Read",
                  "status": "blocked",
                  "detail": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회. 실 Read 완료는 Qoo10 광고비·방문·전환 전 범위 원문이 raw lake에 착지한 실행으로 다시 증명해야 함.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "Qoo10 광고비·방문·전환에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-h6-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: QSM 광고비·방문·전환 리포트; QAPI 주문 데이터와 혼합하지 않음. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "QSM 광고비·방문·전환 리포트; QAPI 주문 데이터와 혼합하지 않음에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-h6-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 플랫폼 산출 지표이나 UI 경유 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-h6-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 실패 분기 필요. 승인된 폴백: 사람(④)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-h6-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=일 1회. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "일 1회 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-h6-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#H6 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-h8-2",
              "title": "#H8-2 쿠팡 광고·라쿠텐 RPP(마켓 광고비)",
              "status": "blocked",
              "detail": "광고 · 원천. 목표=automated_batch: 공개 API 없음(쿠팡 광고는 보고서 엑셀 다운로드, 라쿠텐 RPP 는 API 확인 안 됨) → 일별 보고서 다운로드 자동화; 현재 접근은 봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→일 1회 2회→증거 동결.",
              "source": {
                "row_id": "H8-2",
                "name": "쿠팡 광고·라쿠텐 RPP(마켓 광고비)",
                "kind": "원천",
                "transport": "portal",
                "cadence": "일 1회",
                "target_method": "automated_batch: 공개 API 없음(쿠팡 광고는 보고서 엑셀 다운로드, 라쿠텐 RPP 는 API 확인 안 됨) → 일별 보고서 다운로드 자동화",
                "current_state": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
                "conditions": "광고 계정 권한 · 봇 하위 사용자 · 약관",
                "fallback": "사람 다운로드(④)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-h8-2-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #H8-2 분류 기준은 있음: 업무=광고, 유형=원천. 36_ 우선 결정은 automated_batch: 공개 API 없음(쿠팡 광고는 보고서 엑셀 다운로드, 라쿠텐 RPP 는 API 확인 안 됨) → 일별 보고서 다운로드 자동화. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#H8-2의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-h8-2-access",
                  "title": "읽기 전용 접근",
                  "status": "blocked",
                  "detail": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회. 2026-10-14 갱신(묶음④): 실제 로그인 0회. 쿠팡 광고는 약관 금지 신호 강 — 보고서 메일·API 먼저. 라쿠텐 RMS 하위 사용자 미확인. 포털별 질문 초안은 38-drafts E(다이소 C·HGLIS D).",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/result.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/38-drafts.md"
                  ],
                  "next": "광고 계정 권한 · 봇 하위 사용자 · 약관",
                  "criterion": "쿠팡 광고·라쿠텐 RPP(마켓 광고비) 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-h8-2-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "14개 포털 공통 실행기와 가짜 포털 E2E 존재. 이 원천 selector·실로그인·다운로드 정의는 없음. 2026-10-14 갱신(묶음④): 원천별 흐름 골격(portal_coupang_ads+portal_rakuten_rpp) 추가 — URL·selector 자리표시자라 assertExecutable 이 거부(config_invalid), 게이트 닫힘 확인. 게이트 폐쇄·구조 계약만 시험(전체 흐름 E2E 는 대표 5개 원천). 다운로드는 합성 CSV로만 시험. 실 selector·다운로드 정의는 남음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/src/portals/skeletons/index.ts",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/test/unit/sourceSkeletons.test.ts",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/test/e2e/sourceFlows.e2e.test.ts",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/result.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/38-drafts.md"
                  ],
                  "next": "automated_batch: 공개 API 없음(쿠팡 광고는 보고서 엑셀 다운로드, 라쿠텐 RPP 는 API 확인 안 됨) → 일별 보고서 다운로드 자동화 경로의 account/object, parser, 개인정보 제거기, 일 1회 schedule을 원천별로 고정한다.",
                  "criterion": "#H8-2에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-h8-2-live-read",
                  "title": "실계정 첫 Read",
                  "status": "blocked",
                  "detail": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회. 실 Read 완료는 쿠팡 광고·라쿠텐 RPP(마켓 광고비) 전 범위 원문이 raw lake에 착지한 실행으로 다시 증명해야 함.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "쿠팡 광고·라쿠텐 RPP(마켓 광고비)에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-h8-2-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 쿠팡 광고·라쿠텐 RPP 일별 보고서를 포털·계정별로 분리. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "쿠팡 광고·라쿠텐 RPP 일별 보고서를 포털·계정별로 분리에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-h8-2-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 플랫폼 산출 지표이나 UI 경유 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-h8-2-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 실패 분기 필요. 승인된 폴백: 사람 다운로드(④)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-h8-2-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=일 1회. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "일 1회 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-h8-2-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#H8-2 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-h9",
              "title": "#H9 다이소 협력사 포털",
              "status": "blocked",
              "detail": "채널 · 원천. 목표=automated_batch: 공개 API·협력사 시스템 자료 없음 → 봇 전용 하위 계정 + 일별 출력 다운로드 자동화(품목별 조회 반복 여부 확인); 현재 접근은 봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→매일(자동화하면 주말도 일자별로 받아 ÷3 추산 제거) · 지금 사람은 평일만 2회→증거 동결.",
              "source": {
                "row_id": "H9",
                "name": "다이소 협력사 포털",
                "kind": "원천",
                "transport": "portal",
                "cadence": "매일(자동화하면 주말도 일자별로 받아 ÷3 추산 제거) · 지금 사람은 평일만",
                "target_method": "automated_batch: 공개 API·협력사 시스템 자료 없음 → 봇 전용 하위 계정 + 일별 출력 다운로드 자동화(품목별 조회 반복 여부 확인)",
                "current_state": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
                "conditions": "로그인 URL·파일 종류 확보 · 봇 하위 계정 · 약관",
                "fallback": "담당자 다운로드 + 동기화 폴더(④)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-h9-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #H9 분류 기준은 있음: 업무=채널, 유형=원천. 36_ 우선 결정은 automated_batch: 공개 API·협력사 시스템 자료 없음 → 봇 전용 하위 계정 + 일별 출력 다운로드 자동화(품목별 조회 반복 여부 확인). 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#H9의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-h9-access",
                  "title": "읽기 전용 접근",
                  "status": "blocked",
                  "detail": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회. 2026-10-14 갱신(묶음④): 실제 로그인 0회. ID=사업자등록번호라 추가 사용자 불가 가능성·로그인 URL 현업 미확인·OTP 시드 보관소(AWS) 미생성. 포털별 질문 초안은 38-drafts E(다이소 C·HGLIS D).",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/result.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/38-drafts.md"
                  ],
                  "next": "로그인 URL·파일 종류 확보 · 봇 하위 계정 · 약관",
                  "criterion": "다이소 협력사 포털 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-h9-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "14개 포털 공통 실행기와 가짜 포털 E2E 존재. 이 원천 selector·실로그인·다운로드 정의는 없음. 2026-10-14 갱신(묶음④): 원천별 흐름 골격(portal_daiso) 추가 — URL·selector 자리표시자라 assertExecutable 이 거부(config_invalid), 게이트 닫힘 확인. 게이트 폐쇄·구조 계약만 시험(전체 흐름 E2E 는 대표 5개 원천). 다운로드는 합성 CSV로만 시험. 실 selector·다운로드 정의는 남음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/src/portals/skeletons/index.ts",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/test/unit/sourceSkeletons.test.ts",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/test/e2e/sourceFlows.e2e.test.ts",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/result.md",
                    "docs/work-log/2026-09-30_blocked-sources-unblock/38-drafts.md"
                  ],
                  "next": "automated_batch: 공개 API·협력사 시스템 자료 없음 → 봇 전용 하위 계정 + 일별 출력 다운로드 자동화(품목별 조회 반복 여부 확인) 경로의 account/object, parser, 개인정보 제거기, 매일(자동화하면 주말도 일자별로 받아 ÷3 추산 제거) · 지금 사람은 평일만 schedule을 원천별로 고정한다.",
                  "criterion": "#H9에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-h9-live-read",
                  "title": "실계정 첫 Read",
                  "status": "blocked",
                  "detail": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회. 실 Read 완료는 다이소 협력사 포털 전 범위 원문이 raw lake에 착지한 실행으로 다시 증명해야 함.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "다이소 협력사 포털에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-h9-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 다이소 일별 출력; 빠진 주말을 평균 배분하지 않고 기간 행으로 보존. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "다이소 일별 출력; 빠진 주말을 평균 배분하지 않고 기간 행으로 보존에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-h9-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 다이소가 공유하는 범위만 관측(셀아웃 공유 100% 아님). CMSLAB 추산 셀아웃은 파생 #53(하) 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-h9-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 실패 분기 필요. 승인된 폴백: 담당자 다운로드 + 동기화 폴더(④)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-h9-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=매일(자동화하면 주말도 일자별로 받아 ÷3 추산 제거) · 지금 사람은 평일만. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "매일(자동화하면 주말도 일자별로 받아 ÷3 추산 제거) · 지금 사람은 평일만 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-h9-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#H9 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            },
            {
              "id": "source-112",
              "title": "#112 SPATE",
              "status": "blocked",
              "detail": "시장정보 · 원천. 목표=automated_batch: export 다운로드 자동화(API 여부 미확인) — 접근 방식 미정, 수동 export 후보; 현재 접근은 봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→원천 발행: 주 1회; 미발행 여부 매일 확인 2회→증거 동결.",
              "source": {
                "row_id": "112",
                "name": "SPATE",
                "kind": "원천",
                "transport": "portal",
                "cadence": "원천 발행: 주 1회; 미발행 여부 매일 확인",
                "target_method": "automated_batch: export 다운로드 자동화(API 여부 미확인) — 접근 방식 미정, 수동 export 후보",
                "current_state": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
                "conditions": "접근 방식 결정(API · export · 기획팀 MI 업로드) · 봇 전용 계정 · 약관",
                "fallback": "기획팀 MI 업로드(mi_signal CSV, 11차 G3)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-112-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #112 분류 기준은 있음: 업무=시장정보, 유형=원천. 36_ 우선 결정은 automated_batch: export 다운로드 자동화(API 여부 미확인) — 접근 방식 미정, 수동 export 후보. 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#112의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-112-access",
                  "title": "읽기 전용 접근",
                  "status": "blocked",
                  "detail": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "접근 방식 결정(API · export · 기획팀 MI 업로드) · 봇 전용 계정 · 약관",
                  "criterion": "SPATE 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-112-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "14개 포털 공통 실행기와 가짜 포털 E2E 존재. 이 원천 selector·실로그인·다운로드 정의는 없음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "automated_batch: export 다운로드 자동화(API 여부 미확인) — 접근 방식 미정, 수동 export 후보 경로의 account/object, parser, 개인정보 제거기, 원천 발행: 주 1회; 미발행 여부 매일 확인 schedule을 원천별로 고정한다.",
                  "criterion": "#112에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-112-live-read",
                  "title": "실계정 첫 Read",
                  "status": "blocked",
                  "detail": "봇 전용 계정·약관·OTP·다운로드 경로 미확정. 실제 로그인 0회. 실 Read 완료는 SPATE 전 범위 원문이 raw lake에 착지한 실행으로 다시 증명해야 함.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "SPATE에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-112-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: SPATE의 시장정보 보고서, 조회 조건·기준시각·페이지·다운로드 파일·화면 통제 합계. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "SPATE의 시장정보 보고서, 조회 조건·기준시각·페이지·다운로드 파일·화면 통제 합계에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-112-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 제3자 추정 트렌드 지표 — 자사 원장 아님 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-112-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "OTP·잠금 guard·세션 만료·허용 메뉴·결정론 download·화면 합계·selector 변경 실패 분기 필요. 승인된 폴백: 기획팀 MI 업로드(mi_signal CSV, 11차 G3)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/portal/README.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-112-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=원천 발행: 주 1회; 미발행 여부 매일 확인. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "원천 발행: 주 1회; 미발행 여부 매일 확인 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-112-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#112 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            }
          ]
        },
        {
          "id": "read-mail",
          "title": "메일 수신 Read",
          "items": [
            {
              "id": "source-100",
              "title": "#100 LOFT (일본)",
              "status": "partial",
              "detail": "채널 · 원천. 목표=automated_batch: LOFT 셀아웃 메일을 수집 주소(SES 수신)로 받음 — 기존 수신자 + 수집 주소 참조. 주소 개통 전에는 원본을 Drive 업로드(2026-10-16 결정); 현재 접근은 원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                "cmslab-data-platform/10_플랫폼구현/infra/modules/platform/collectors.tf"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→원천 발행: 월 1회(합의 시 주 1회); 미발행 여부 매일 확인 2회→증거 동결.",
              "source": {
                "row_id": "100",
                "name": "LOFT (일본)",
                "kind": "원천",
                "transport": "mail",
                "cadence": "원천 발행: 월 1회(합의 시 주 1회); 미발행 여부 매일 확인",
                "target_method": "automated_batch: LOFT 셀아웃 메일을 수집 주소(SES 수신)로 받음 — 기존 수신자 + 수집 주소 참조. 주소 개통 전에는 원본을 Drive 업로드(2026-10-16 결정)",
                "current_state": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                "conditions": "정기 발송 합의",
                "fallback": "사람(④)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-100-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #100 분류 기준은 있음: 업무=채널, 유형=원천. 36_ 우선 결정은 automated_batch: LOFT 셀아웃 메일을 수집 주소(SES 수신)로 받음 — 기존 수신자 + 수집 주소 참조. 주소 개통 전에는 원본을 Drive 업로드(2026-10-16 결정). 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#100의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-100-access",
                  "title": "읽기 전용 접근",
                  "status": "pending",
                  "detail": "원천별 읽기 전용 계정·앱·키·허용 IP 또는 수신 합의가 아직 검증되지 않음.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/infra/modules/platform/collectors.tf"
                  ],
                  "next": "정기 발송 합의",
                  "criterion": "LOFT (일본) 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-100-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "partial",
                  "detail": "파일 파서·수신 인프라 틀 존재. 이 원천 발신자·파일명·스키마 계약과 실수신 연결은 남음. 2026-10-14 갱신(묶음②·L6): 수신 route 계약(파일명 YYMMDD～YYMMDD·Sheet1 7열·통제 합계 Sheet2 총계=販売数 합, 샘플 실측 일치) + 합성 시험 통과. 발신·수신 실주소(발송 합의)와 수신 점검 일정 활성화 전이라 partial 유지. route key_prefix 를 SES 규칙 2 실제 접두어(partner/)로 교정 — 이전 템플릿(partner/<원천>/)은 SES 가 만들지 않는 접두어라 수신돼도 수집 0. allow_other_recipients 옵트인 추가(발신처가 기존 수신자 + 우리 주소 Cc 로 보내는 경우).",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/infra/modules/platform/collectors.tf",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/inbound/contracts/partner_routes.template.json",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/inbound/tests/test_partner_contracts.py",
                    "docs/work-log/2026-09-30_partial-read-completion/mail-file-contracts.md",
                    "docs/work-log/2026-09-30_todo-l6-mail-dutyfree/receiving-design.md",
                    "docs/work-log/2026-09-30_todo-l6-mail-dutyfree/evidence/l6-evidence.json"
                  ],
                  "next": "automated_batch: LOFT 셀아웃 메일을 수집 주소(SES 수신)로 받음 — 기존 수신자 + 수집 주소 참조. 주소 개통 전에는 원본을 Drive 업로드(2026-10-16 결정) 경로의 account/object, parser, 개인정보 제거기, 원천 발행: 월 1회(합의 시 주 1회); 미발행 여부 매일 확인 schedule을 원천별로 고정한다.",
                  "criterion": "#100에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 발신자·수신주소·첨부 MIME·정기 발행시각·재발송 중복·누락 알림 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-100-live-read",
                  "title": "실계정 첫 Read",
                  "status": "partial",
                  "detail": "LOFT (일본) 실계정 호출·조회·다운로드 기록 없음. 미시도는 실패가 아니라 pending으로 유지. 2026-09-29~30 수령 샘플 또는 파생 시트를 파싱해 탭·행 수와 SHA-256 을 기록했다. 운영 경로(ERP·API·포털·수신)의 실 Read 가 아니므로 E4 완료로 세지 않는다.",
                  "evidence": [
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/infra/modules/platform/collectors.tf",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-09-29_source-read-t0t1t2-resume/read-evidence-sanitized.json"
                  ],
                  "next": "LOFT (일본)에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-100-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: LOFT (일본)의 정기 발송 메일·첨부, 발신자·예정일·파일명·기간·재발송 중복. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/infra/modules/platform/collectors.tf"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "LOFT (일본)의 정기 발송 메일·첨부, 발신자·예정일·파일명·기간·재발송 중복에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 발신자·수신주소·첨부 MIME·정기 발행시각·재발송 중복·누락 알림 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-100-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 유통사 산출 실적 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-100-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "partial",
                  "detail": "발신자·수신주소·첨부 MIME·정기 발행시각·재발송 중복·누락 알림 실패 분기 필요. 승인된 폴백: 사람(④)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/worker/adapters/files/README.md",
                    "cmslab-data-platform/10_플랫폼구현/infra/modules/platform/collectors.tf"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-100-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=원천 발행: 월 1회(합의 시 주 1회); 미발행 여부 매일 확인. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "원천 발행: 월 1회(합의 시 주 1회); 미발행 여부 매일 확인 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-100-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#100 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            }
          ]
        },
        {
          "id": "read-computer-use",
          "title": "설치형 computer-use Read",
          "items": [
            {
              "id": "source-49",
              "title": "#49 신세계면세점 SRM",
              "status": "partial",
              "detail": "면세 · 원천. 목표=automated_batch: 설치형 TOBESOFT XPLATFORM 협력사 클라이언트 화면 자동화(Windows): computer-use 로 메뉴 길찾기 1회 → pywinauto(UIA) 결정적 반복으로 판매·수불 조회 → 엑셀 내보내기 → 레이크 적재. 유통사 API·EDI · 정기 파일 발송은 쓰지 않는다(2026-10-15 결정 — 9/7 면세 현업: API 는 약 3억·「협상력 차원에서 안 준다」, 면세·다이소 L152·L174~176); 현재 접근은 위시켓 AWS 서울 Windows EC2 설치·실행 완료. 2026-10-16 승인된 계정 최초 로그인과 세션 만료 뒤 재로그인 성공, 국산품 수불 87행×20열 private UI-cell-copy raw·manifest와 화면 통제 합계 일치 확보. NEW(코너) 일별판매는 본점·셀퓨전씨·2026-09 화면 254건 조회 성공, 고유 251행으로 3행 부족해 accepted raw 0. 공식 엑셀 export·세션 유지·반복 Read는 남음. 비공개 산출물 회수 뒤 PoC EC2는 stopped.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "docs/work-log/2026-10-16_dutyfree-installed-route3/result.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→원천 발행: 일 1회(판매) · 월 1회(수불); 미발행 여부 매일 확인 2회→증거 동결.",
              "source": {
                "row_id": "49",
                "name": "신세계면세점 SRM",
                "kind": "원천",
                "transport": "computer-use",
                "cadence": "원천 발행: 일 1회(판매) · 월 1회(수불); 미발행 여부 매일 확인",
                "target_method": "automated_batch: 설치형 TOBESOFT XPLATFORM 협력사 클라이언트 화면 자동화(Windows): computer-use 로 메뉴 길찾기 1회 → pywinauto(UIA) 결정적 반복으로 판매·수불 조회 → 엑셀 내보내기 → 레이크 적재. 유통사 API·EDI · 정기 파일 발송은 쓰지 않는다(2026-10-15 결정 — 9/7 면세 현업: API 는 약 3억·「협상력 차원에서 안 준다」, 면세·다이소 L152·L174~176)",
                "current_state": "위시켓 AWS 서울 Windows EC2 설치·실행 완료. 2026-10-16 승인된 계정 최초 로그인과 세션 만료 뒤 재로그인 성공, 국산품 수불 87행×20열 private UI-cell-copy raw·manifest와 화면 통제 합계 일치 확보. NEW(코너) 일별판매는 본점·셀퓨전씨·2026-09 화면 254건 조회 성공, 고유 251행으로 3행 부족해 accepted raw 0. 공식 엑셀 export·세션 유지·반복 Read는 남음. 비공개 산출물 회수 뒤 PoC EC2는 stopped.",
                "conditions": "Windows x86 실행 환경(EC2 Windows 또는 Windows 11 ARM VM) · 협력사 계정 로그인 · 협력사 약관(자동화·가상 PC) · L8 PoC P1·P2 통과",
                "fallback": "Windows VM 설치형 L8 PoC(P1·P2) → pywinauto 운영 러너 → 고객 사무실 Windows 러너 → 잔여 수동 공개",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-49-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #49 분류 기준은 있음: 업무=면세, 유형=원천. 36_ 우선 결정은 automated_batch: 설치형 TOBESOFT XPLATFORM 협력사 클라이언트 화면 자동화(Windows): computer-use 로 메뉴 길찾기 1회 → pywinauto(UIA) 결정적 반복으로 판매·수불 조회 → 엑셀 내보내기 → 레이크 적재. 유통사 API·EDI · 정기 파일 발송은 쓰지 않는다(2026-10-15 결정 — 9/7 면세 현업: API 는 약 3억·「협상력 차원에서 안 준다」, 면세·다이소 L152·L174~176). 실객체·기간·권위 범위 승인은 남음. 2026-10-16 갱신(route3): 2026-10-15 사용자 결정 — 유통사 API·EDI · 정기 파일 발송 불가, 설치형 L8(Windows 화면 자동화)이 본 경로. 위시켓 AWS 서울 Windows EC2와 접근권한 시트 계정을 선택했고, 2026-10-16 두 클라이언트 설치 뒤 신세계 최초 로그인 1회와 세션 만료 뒤 재로그인 1회에 각각 성공했다. 국산품 수불 현황에서 2026-09 · 셀퓨전씨 · 본점 87건을 조회하고 UI-cell-copy로 87행×20열 fresh 1,740셀, 통제 합계 일치, private TSV·XLSX·manifest를 확보했다. 공식 엑셀 버튼 export는 파일 0. NEW(코너) 일별판매현황은 본점 · 셀퓨전씨 · 2026-09 기간으로 화면 254건을 조회했으나 collector+제한 보완이 고유 251행에 그쳐 3행 부족, accepted raw·manifest 0. 전체 source E4는 partial, E5~E9·P3 미완료.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-16_dutyfree-installed-route3/result.md",
                    "docs/work-log/2026-09-30_todo-l6-mail-dutyfree/installed-poc-plan.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#49의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-49-access",
                  "title": "읽기 전용 접근",
                  "status": "partial",
                  "detail": "위시켓 AWS 서울 Windows EC2 설치·실행 완료. 2026-10-16 승인된 계정 최초 로그인과 세션 만료 뒤 재로그인 성공, 국산품 수불 87행×20열 private UI-cell-copy raw·manifest와 화면 통제 합계 일치 확보. NEW(코너) 일별판매는 본점·셀퓨전씨·2026-09 화면 254건 조회 성공, 고유 251행으로 3행 부족해 accepted raw 0. 공식 엑셀 export·세션 유지·반복 Read는 남음. 비공개 산출물 회수 뒤 PoC EC2는 stopped.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-16_dutyfree-installed-route3/result.md"
                  ],
                  "next": "Windows x86 실행 환경(EC2 Windows 또는 Windows 11 ARM VM) · 협력사 계정 로그인 · 협력사 약관(자동화·가상 PC) · L8 PoC P1·P2 통과",
                  "criterion": "신세계면세점 SRM 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-49-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "pending",
                  "detail": "설치형 클라이언트용 VM/UIA 수집기는 아직 없음. L8 PoC 성공 뒤 운영화 판단.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-16_dutyfree-installed-route3/result.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "automated_batch: 설치형 TOBESOFT XPLATFORM 협력사 클라이언트 화면 자동화(Windows): computer-use 로 메뉴 길찾기 1회 → pywinauto(UIA) 결정적 반복으로 판매·수불 조회 → 엑셀 내보내기 → 레이크 적재. 유통사 API·EDI · 정기 파일 발송은 쓰지 않는다(2026-10-15 결정 — 9/7 면세 현업: API 는 약 3억·「협상력 차원에서 안 준다」, 면세·다이소 L152·L174~176) 경로의 account/object, parser, 개인정보 제거기, 원천 발행: 일 1회(판매) · 월 1회(수불); 미발행 여부 매일 확인 schedule을 원천별로 고정한다.",
                  "criterion": "#49에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 Windows VM 보안모듈·세션 유지 · XPLATFORM UIA 식별자 안정성 · 엑셀 내보내기 행 수와 화면 통제 합계 대조 · (약관 허용 시) HTTP 트랜잭션 관찰 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-49-live-read",
                  "title": "실계정 첫 Read",
                  "status": "partial",
                  "detail": "2026-10-16 실계정으로 국산품 수불 현황 2026-09 · 셀퓨전씨 · 본점 87건을 화면 조회하고 UI-cell-copy로 87행×20열 fresh 1,740셀, 화면 통제 합계 일치, private TSV·XLSX·manifest·SHA-256을 확보했다. 공식 엑셀 export는 파일 0이고 판매 창·기존 가공본 파서 연결이 미완료라 source E4는 partial이다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-16_dutyfree-installed-route3/result.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-16_dutyfree-installed-route3/result.md"
                  ],
                  "next": "신세계면세점 SRM에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-49-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 신세계면세 판매·정산·수불 보고서; API·EDI·파일 우선 검토, 설치형 채택 시 3개 PoC 적용. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-16_dutyfree-installed-route3/result.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "신세계면세 판매·정산·수불 보고서; API·EDI·파일 우선 검토, 설치형 채택 시 3개 PoC 적용에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 Windows VM 보안모듈·세션 유지 · XPLATFORM UIA 식별자 안정성 · 엑셀 내보내기 행 수와 화면 통제 합계 대조 · (약관 허용 시) HTTP 트랜잭션 관찰 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-49-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 셀아웃은 유통사 전산 기록이라 정확(9/7 면세·다이소 L416). 화면 자동화 경로라 화면 통제 합계 대조가 필수 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-49-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "Windows VM 보안모듈·세션 유지 · XPLATFORM UIA 식별자 안정성 · 엑셀 내보내기 행 수와 화면 통제 합계 대조 · (약관 허용 시) HTTP 트랜잭션 관찰 실패 분기 필요. 승인된 폴백: Windows VM 설치형 L8 PoC(P1·P2) → pywinauto 운영 러너 → 고객 사무실 Windows 러너 → 잔여 수동 공개",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-16_dutyfree-installed-route3/result.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-49-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=원천 발행: 일 1회(판매) · 월 1회(수불); 미발행 여부 매일 확인. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "원천 발행: 일 1회(판매) · 월 1회(수불); 미발행 여부 매일 확인 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-49-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#49 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                },
                {
                  "id": "source-49-poc-vm",
                  "title": "Windows VM 보안모듈 PoC",
                  "status": "partial",
                  "detail": "2026-10-16 위시켓 AWS 서울 Windows EC2에 공식 클라이언트를 설치하고 승인된 계정 최초 로그인과 세션 만료 뒤 재로그인에 성공했다. 국산품 수불 현황 2026-09 · 셀퓨전씨 · 본점 87건 화면 조회까지 성공했다. 원격 해제 뒤 세션 유지와 파일 내보내기는 미검증.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-16_dutyfree-installed-route3/result.md"
                  ],
                  "next": "원격 연결 해제 뒤 XPLATFORM 세션 생존과 결정적인 파일 내보내기 경로를 확인한다.",
                  "criterion": "보안모듈을 비활성화·우회하지 않고 승인된 Windows VM에서 설치·실행·인증 입력·조회·종료가 재현되고, 원격 연결을 끊은 뒤에도 프로그램이 계속 동작한다.",
                  "stage": "access"
                },
                {
                  "id": "source-49-poc-uia",
                  "title": "XPLATFORM UIA 탐색 PoC",
                  "status": "partial",
                  "detail": "신세계 로그인 창의 UIA descendants는 0이었다. interactive runner로 로그인·메뉴·조건·조회까지 실행했으나 안정적인 UIA 식별자와 재시작 3회 재현은 없다. 공식 엑셀 버튼은 파일 0이었으나 UI-cell-copy 폴백으로 수불 87행×20열 private raw·manifest와 화면 통제 합계 일치를 확보했다. NEW(코너) 일별판매는 본점·셀퓨전씨·2026-09 기간으로 화면 254건을 조회했으나 collector+제한 보완이 고유 251행에 그쳐 3행 부족, accepted raw·manifest는 0이다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-16_dutyfree-installed-route3/result.md"
                  ],
                  "next": "MSAA·win32·키보드 경로의 안정성을 고정하고 재시작 3회와 파일 1개 저장·화면 대사를 완료한다.",
                  "criterion": "기간 조건·조회·결과 표·통제 합계·내보내기를 3회 재시작에도 같은 UIA 식별자로 찾고, 코드 실행으로 엑셀 1회를 저장해 수동 다운로드와 행 수가 같으며 쓰기·확정 경로 접근 0을 증명한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-49-poc-http",
                  "title": "허용된 HTTP 트랜잭션 캡처 PoC",
                  "status": "pending",
                  "detail": "본인 세션의 조회 트랜잭션을 승인 범위에서 관찰해 결정론 Read로 재현할 수 있는지 미검증.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "협력사 약관이 허용할 때만 본인 세션의 조회 요청을 관찰한다(XPLATFORM transaction은 WinINet HTTP — 시스템 프록시로 관찰 가능). 재현 호출은 승인 뒤.",
                  "criterion": "약관상 캡처 금지 결정이 기록되거나, 접근통제를 우회하지 않고 승인된 본인 세션에서 조회 구조를 식별하며 민감 헤더·토큰 저장 0을 증명한다.",
                  "stage": "live_read"
                }
              ]
            },
            {
              "id": "source-50",
              "title": "#50 현대면세점",
              "status": "blocked",
              "detail": "면세 · 원천. 목표=automated_batch: 설치형 TOBESOFT XPLATFORM 협력사 클라이언트 화면 자동화(Windows): computer-use 로 메뉴 길찾기 1회 → pywinauto(UIA) 결정적 반복으로 판매·수불 조회 → 엑셀 내보내기 → 레이크 적재. 유통사 API·EDI · 정기 파일 발송은 쓰지 않는다(2026-10-15 결정 — 9/7 면세 현업: API 는 약 3억·「협상력 차원에서 안 준다」, 면세·다이소 L152·L174~176); 현재 접근은 위시켓 AWS 서울 Windows EC2 설치·실행 완료. 2026-10-16 실제 인증 1회가 사용자 정보 불일치·잠금 경고로 실패해 재시도 없이 중단. SSM 자격정보는 원본 요청서와 일치. 로그인·조회·내보내기·raw·manifest 0. PoC EC2는 stopped.",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "docs/work-log/2026-10-16_dutyfree-installed-route3/result.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→원천 발행: 일 1회(판매) · 월 1회(수불); 미발행 여부 매일 확인 2회→증거 동결.",
              "source": {
                "row_id": "50",
                "name": "현대면세점",
                "kind": "원천",
                "transport": "computer-use",
                "cadence": "원천 발행: 일 1회(판매) · 월 1회(수불); 미발행 여부 매일 확인",
                "target_method": "automated_batch: 설치형 TOBESOFT XPLATFORM 협력사 클라이언트 화면 자동화(Windows): computer-use 로 메뉴 길찾기 1회 → pywinauto(UIA) 결정적 반복으로 판매·수불 조회 → 엑셀 내보내기 → 레이크 적재. 유통사 API·EDI · 정기 파일 발송은 쓰지 않는다(2026-10-15 결정 — 9/7 면세 현업: API 는 약 3억·「협상력 차원에서 안 준다」, 면세·다이소 L152·L174~176)",
                "current_state": "위시켓 AWS 서울 Windows EC2 설치·실행 완료. 2026-10-16 실제 인증 1회가 사용자 정보 불일치·잠금 경고로 실패해 재시도 없이 중단. SSM 자격정보는 원본 요청서와 일치. 로그인·조회·내보내기·raw·manifest 0. PoC EC2는 stopped.",
                "conditions": "Windows x86 실행 환경(EC2 Windows 또는 Windows 11 ARM VM) · 협력사 계정 로그인 · 협력사 약관(자동화·가상 PC) · L8 PoC P1·P2 통과",
                "fallback": "Windows VM 설치형 L8 PoC(P1·P2) → pywinauto 운영 러너 → 고객 사무실 Windows 러너 → 잔여 수동 공개",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-50-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #50 분류 기준은 있음: 업무=면세, 유형=원천. 36_ 우선 결정은 automated_batch: 설치형 TOBESOFT XPLATFORM 협력사 클라이언트 화면 자동화(Windows): computer-use 로 메뉴 길찾기 1회 → pywinauto(UIA) 결정적 반복으로 판매·수불 조회 → 엑셀 내보내기 → 레이크 적재. 유통사 API·EDI · 정기 파일 발송은 쓰지 않는다(2026-10-15 결정 — 9/7 면세 현업: API 는 약 3억·「협상력 차원에서 안 준다」, 면세·다이소 L152·L174~176). 실객체·기간·권위 범위 승인은 남음. 2026-10-16 갱신(route3): 2026-10-15 사용자 결정 — 유통사 API·EDI · 정기 파일 발송 불가, 설치형 L8(Windows 화면 자동화)이 본 경로. 위시켓 AWS 서울 Windows EC2에 TPLSvc·XPLATFORM 9.2.2 클라이언트를 설치하고 로그인 화면까지 실행했다. 클라이언트 측 빈 비밀번호 검증은 인증 횟수에서 제외한다. 실제 인증 제출은 1회였고 사용자 정보 불일치·5회 실패 시 잠금 경고를 받아 재시도 없이 중단했다. SSM 자격정보는 선행 0을 보존한 원본 요청서와 일치해 요약본 전사 오류가 실패 원인이라는 근거가 없다. 로그인·조회·내보내기·raw·manifest 0, P2·P3 미수행.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-16_dutyfree-installed-route3/result.md",
                    "docs/work-log/2026-09-30_todo-l6-mail-dutyfree/installed-poc-plan.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#50의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-50-access",
                  "title": "읽기 전용 접근",
                  "status": "blocked",
                  "detail": "위시켓 AWS 서울 Windows EC2 설치·실행 완료. 2026-10-16 실제 인증 1회가 사용자 정보 불일치·잠금 경고로 실패해 재시도 없이 중단. SSM 자격정보는 원본 요청서와 일치. 로그인·조회·내보내기·raw·manifest 0. PoC EC2는 stopped.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-16_dutyfree-installed-route3/result.md"
                  ],
                  "next": "Windows x86 실행 환경(EC2 Windows 또는 Windows 11 ARM VM) · 협력사 계정 로그인 · 협력사 약관(자동화·가상 PC) · L8 PoC P1·P2 통과",
                  "criterion": "현대면세점 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-50-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "pending",
                  "detail": "설치형 클라이언트용 VM/UIA 수집기는 아직 없음. L8 PoC 성공 뒤 운영화 판단.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-16_dutyfree-installed-route3/result.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "automated_batch: 설치형 TOBESOFT XPLATFORM 협력사 클라이언트 화면 자동화(Windows): computer-use 로 메뉴 길찾기 1회 → pywinauto(UIA) 결정적 반복으로 판매·수불 조회 → 엑셀 내보내기 → 레이크 적재. 유통사 API·EDI · 정기 파일 발송은 쓰지 않는다(2026-10-15 결정 — 9/7 면세 현업: API 는 약 3억·「협상력 차원에서 안 준다」, 면세·다이소 L152·L174~176) 경로의 account/object, parser, 개인정보 제거기, 원천 발행: 일 1회(판매) · 월 1회(수불); 미발행 여부 매일 확인 schedule을 원천별로 고정한다.",
                  "criterion": "#50에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 Windows VM 보안모듈·세션 유지 · XPLATFORM UIA 식별자 안정성 · 엑셀 내보내기 행 수와 화면 통제 합계 대조 · (약관 허용 시) HTTP 트랜잭션 관찰 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-50-live-read",
                  "title": "실계정 첫 Read",
                  "status": "blocked",
                  "detail": "2026-10-16 실제 인증 제출 1회가 사용자 정보 불일치·계정 잠금 경고로 실패해 재시도 없이 중단했다. 실계정 로그인·조회·다운로드·raw·manifest 0이며 고객사의 계정 상태 확인이 필요하다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-16_dutyfree-installed-route3/result.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-16_dutyfree-installed-route3/result.md"
                  ],
                  "next": "현대면세점에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-50-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 현대면세 판매·정산·수불 보고서; API·EDI·파일 우선 검토, 설치형 채택 시 3개 PoC 적용. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-16_dutyfree-installed-route3/result.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "현대면세 판매·정산·수불 보고서; API·EDI·파일 우선 검토, 설치형 채택 시 3개 PoC 적용에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 Windows VM 보안모듈·세션 유지 · XPLATFORM UIA 식별자 안정성 · 엑셀 내보내기 행 수와 화면 통제 합계 대조 · (약관 허용 시) HTTP 트랜잭션 관찰 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-50-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 셀아웃은 유통사 전산 기록이라 정확(9/7 면세·다이소 L416). 화면 자동화 경로라 화면 통제 합계 대조가 필수 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-50-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "Windows VM 보안모듈·세션 유지 · XPLATFORM UIA 식별자 안정성 · 엑셀 내보내기 행 수와 화면 통제 합계 대조 · (약관 허용 시) HTTP 트랜잭션 관찰 실패 분기 필요. 승인된 폴백: Windows VM 설치형 L8 PoC(P1·P2) → pywinauto 운영 러너 → 고객 사무실 Windows 러너 → 잔여 수동 공개",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-16_dutyfree-installed-route3/result.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-50-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=원천 발행: 일 1회(판매) · 월 1회(수불); 미발행 여부 매일 확인. 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "원천 발행: 일 1회(판매) · 월 1회(수불); 미발행 여부 매일 확인 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-50-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#50 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                },
                {
                  "id": "source-50-poc-vm",
                  "title": "Windows VM 보안모듈 PoC",
                  "status": "blocked",
                  "detail": "2026-10-16 위시켓 AWS 서울 Windows EC2에 공식 클라이언트를 설치하고 로그인 화면까지 실행했다. 실제 인증 제출 1회에서 사용자 정보 불일치·5회 실패 시 잠금 경고를 받아 재시도 없이 중단했다. SSM 자격정보는 선행 0을 보존한 원본 요청서와 일치한다. 조회 0.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-16_dutyfree-installed-route3/result.md"
                  ],
                  "next": "협력사에서 승인된 현대 계정 상태를 확인·복구한 뒤 잠금 기준 안에서 별도 승인된 1회 인증을 수행한다.",
                  "criterion": "보안모듈을 비활성화·우회하지 않고 승인된 Windows VM에서 설치·실행·인증 입력·조회·종료가 재현되고, 원격 연결을 끊은 뒤에도 프로그램이 계속 동작한다.",
                  "stage": "access"
                },
                {
                  "id": "source-50-poc-uia",
                  "title": "XPLATFORM UIA 탐색 PoC",
                  "status": "pending",
                  "detail": "현대는 로그인 실패로 업무 화면에 진입하지 못해 UIA/MSAA·조회·내보내기 컨트롤을 조사하지 못했다.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "docs/work-log/2026-10-16_dutyfree-installed-route3/result.md"
                  ],
                  "next": "승인된 계정 로그인이 성공한 뒤 업무 화면의 기간·조회·결과 표·내보내기 컨트롤을 식별한다.",
                  "criterion": "기간 조건·조회·결과 표·통제 합계·내보내기를 3회 재시작에도 같은 UIA 식별자로 찾고, 코드 실행으로 엑셀 1회를 저장해 수동 다운로드와 행 수가 같으며 쓰기·확정 경로 접근 0을 증명한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-50-poc-http",
                  "title": "허용된 HTTP 트랜잭션 캡처 PoC",
                  "status": "pending",
                  "detail": "본인 세션의 조회 트랜잭션을 승인 범위에서 관찰해 결정론 Read로 재현할 수 있는지 미검증.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "협력사 약관이 허용할 때만 본인 세션의 조회 요청을 관찰한다(XPLATFORM transaction은 WinINet HTTP — 시스템 프록시로 관찰 가능). 재현 호출은 승인 뒤.",
                  "criterion": "약관상 캡처 금지 결정이 기록되거나, 접근통제를 우회하지 않고 승인된 본인 세션에서 조회 구조를 식별하며 민감 헤더·토큰 저장 0을 증명한다.",
                  "stage": "live_read"
                }
              ]
            }
          ]
        },
        {
          "id": "read-manual",
          "title": "잔여 수동·탈출구",
          "items": [
            {
              "id": "source-h5",
              "title": "#H5 카페24페이먼츠 건별 정산",
              "status": "blocked",
              "detail": "결제·정산 · 원천. 목표=추정치 자동 Read + 확정치 대표 운영자 월 1회 파일; 카페24 PG 정산 제한 API 는 계약 정보만 반환해 탈출구가 아님(36_ 결정 20); 현재 접근은 대표 운영자 전용 정산 메뉴. 봇 권한 부여 불가. 2026-10-16 B안: 대표 운영자 월 1회 파일 업로드(담당 회신 대기). 카페24 PG 정산 제한 API 는 PG사별 계약 정보만 반환해 탈출구가 아니다 — 신청하지 않는다(36_ 결정 20).",
              "evidence": [
                "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
              ],
              "next": "실제 Read 게이트: 접근→첫 Read→완전성·합계→복구→추정치 일 1회 + 확정치 대표 운영자 월 1회 파일(2026-10-16 결정 19 · 20 — 건별 정산 API 없음) 2회→증거 동결.",
              "source": {
                "row_id": "H5",
                "name": "카페24페이먼츠 건별 정산",
                "kind": "원천",
                "transport": "manual",
                "cadence": "추정치 일 1회 + 확정치 대표 운영자 월 1회 파일(2026-10-16 결정 19 · 20 — 건별 정산 API 없음)",
                "target_method": "추정치 자동 Read + 확정치 대표 운영자 월 1회 파일; 카페24 PG 정산 제한 API 는 계약 정보만 반환해 탈출구가 아님(36_ 결정 20)",
                "current_state": "대표 운영자 전용 정산 메뉴. 봇 권한 부여 불가. 2026-10-16 B안: 대표 운영자 월 1회 파일 업로드(담당 회신 대기). 카페24 PG 정산 제한 API 는 PG사별 계약 정보만 반환해 탈출구가 아니다 — 신청하지 않는다(36_ 결정 20).",
                "conditions": "대표 운영자 월 1회 정산 파일 업로드 담당 지정(2026-10-16 결정 19) · 카페24 PG 정산 제한 API(GET /financials/paymentgateway)는 계약 정보만 반환해 탈출구가 아님 — 신청하지 않음(2026-10-16 결정 20)",
                "fallback": "대표 운영자 월 1회 파일 업로드 → 미도착 알림 → 잔여 수동 사유 공개. 카페24 PG 정산 제한 API 는 계약 정보만 반환해 탈출구가 아님(36_ 결정 20)",
                "evidence_scope": "32_ 분류와 36_ 최신 결정, 공개 가능한 구현 README/코드만. 고객 행·토큰·원천 URL 제외."
              },
              "checks": [
                {
                  "id": "source-h5-scope",
                  "title": "범위·정본 확정",
                  "status": "partial",
                  "detail": "32_ #H5 분류 기준은 있음: 업무=결제·정산, 유형=원천. 36_ 우선 결정은 추정치 자동 Read + 확정치 대표 운영자 월 1회 파일; 카페24 PG 정산 제한 API 는 계약 정보만 반환해 탈출구가 아님(36_ 결정 20). 실객체·기간·권위 범위 승인은 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "읽을 객체·기간·필드·개인정보 여부를 load contract와 일치시킨다.",
                  "criterion": "#H5의 객체 목록, 포함/제외 기간, 권위 원천 여부가 필요한 모든 계약 목록과 명시적 매핑으로 승인된다.",
                  "stage": "scope"
                },
                {
                  "id": "source-h5-access",
                  "title": "읽기 전용 접근",
                  "status": "blocked",
                  "detail": "대표 운영자 전용 정산 메뉴. 봇 권한 부여 불가. 2026-10-16 B안: 대표 운영자 월 1회 파일 업로드(담당 회신 대기). 카페24 PG 정산 제한 API 는 PG사별 계약 정보만 반환해 탈출구가 아니다 — 신청하지 않는다(36_ 결정 20).",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "대표 운영자 월 1회 정산 파일 업로드 담당 지정(2026-10-16 결정 19) · 카페24 PG 정산 제한 API(GET /financials/paymentgateway)는 계약 정보만 반환해 탈출구가 아님 — 신청하지 않음(2026-10-16 결정 20)",
                  "criterion": "카페24페이먼츠 건별 정산 전용 비인간 계정 또는 승인된 읽기 계정으로 쓰기 권한 0, 대상 객체 Read 성공, 인증 시각과 계정 역할 증거가 남는다.",
                  "stage": "access"
                },
                {
                  "id": "source-h5-connector",
                  "title": "수집 코드·계약 매핑",
                  "status": "pending",
                  "detail": "원천별 connector 매핑과 합성 계약 시험부터 필요.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "추정치 자동 Read + 확정치 대표 운영자 월 1회 파일; 카페24 PG 정산 제한 API 는 계약 정보만 반환해 탈출구가 아님(36_ 결정 20) 경로의 account/object, parser, 개인정보 제거기, 추정치 일 1회 + 확정치 대표 운영자 월 1회 파일(2026-10-16 결정 19 · 20 — 건별 정산 API 없음) schedule을 원천별로 고정한다.",
                  "criterion": "#H5에 필요한 모든 계약이 수집기·파서·스케줄에 명시적으로 매핑되고 정산 메일 가능성·사람 반출 주기·월 1회 미도착 알림·추정치/확정치 분리 합성 계약 시험이 통과한다.",
                  "stage": "connector"
                },
                {
                  "id": "source-h5-live-read",
                  "title": "실계정 첫 Read",
                  "status": "blocked",
                  "detail": "대표 운영자 전용 정산 메뉴. 봇 권한 부여 불가. 2026-10-16 B안: 대표 운영자 월 1회 파일 업로드(담당 회신 대기). 카페24 PG 정산 제한 API 는 PG사별 계약 정보만 반환해 탈출구가 아니다 — 신청하지 않는다(36_ 결정 20). 실 Read 완료는 카페24페이먼츠 건별 정산 전 범위 원문이 raw lake에 착지한 실행으로 다시 증명해야 함.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "카페24페이먼츠 건별 정산에서 쓰기 없이 최소 1개 완결 창을 읽어 immutable raw와 manifest를 만든다.",
                  "criterion": "실계정·실원천에서 기준시각이 명시된 완결 창 1개를 읽고 시작/종료 시각, HTTP/DB/파일 결과, raw URI, SHA-256을 기록한다.",
                  "stage": "live_read"
                },
                {
                  "id": "source-h5-completeness",
                  "title": "페이지·탭·기간·파일 완전성",
                  "status": "pending",
                  "detail": "원천별 Read 범위: 카페24페이먼츠 건별 정산 확정치(대표 운영자 월 1회 파일); 주문×수수료 추정치와 혼합 금지. 아직 전체 객체의 누락 검증 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "페이지네이션·탭·숨김 탭·기간 경계·다중 계정·예정 파일을 열거하고 누락 검사를 자동화한다.",
                  "criterion": "카페24페이먼츠 건별 정산 확정치(대표 운영자 월 1회 파일); 주문×수수료 추정치와 혼합 금지에서 예상 객체 수와 실제 수가 일치하고 누락 0, 중복 0이며 정산 메일 가능성·사람 반출 주기·월 1회 미도착 알림·추정치/확정치 분리 결과가 남는다.",
                  "stage": "completeness"
                },
                {
                  "id": "source-h5-validation",
                  "title": "행 수·합계·형식 검증",
                  "status": "pending",
                  "detail": "신뢰성=중. 근거: 정산 원장 반출 파일. 대표 운영자 권한이 필요해 자동화 부적합 실 Read 결과의 행 수·통제 합계·형식 대조는 남음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/32_원천별_수집방식_분류.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "원천 화면/DB/API의 통제 합계와 raw·stg 행 수, 키 유일성, 날짜·통화·수량 형식을 대조한다.",
                  "criterion": "같은 기준시각에서 원천 통제 합계=platform 합계, 행 수 차이 0, 필수키 NULL 0, 형식 오류 0 또는 승인된 예외 목록이 남는다.",
                  "stage": "validation"
                },
                {
                  "id": "source-h5-recovery",
                  "title": "재시도·복구·폴백",
                  "status": "pending",
                  "detail": "정산 메일 가능성·사람 반출 주기·월 1회 미도착 알림·추정치/확정치 분리 실패 분기 필요. 승인된 폴백: 대표 운영자 월 1회 파일 업로드 → 미도착 알림 → 잔여 수동 사유 공개. 카페24 PG 정산 제한 API 는 계약 정보만 반환해 탈출구가 아님(36_ 결정 20)",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/30_원천별_동기화_전략.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md"
                  ],
                  "next": "429/5xx·세션 만료·잠금·네트워크 단절·부분 파일을 안전하게 재시도하고 우회 금지 조건을 시험한다.",
                  "criterion": "강제 실패 뒤 중복 없이 같은 창을 복구하고, 금지된 쓰기·캡차 우회 0, 폴백 전환 사유와 복귀 절차가 기록된다.",
                  "stage": "recovery"
                },
                {
                  "id": "source-h5-repeat",
                  "title": "예정 주기 2회 반복 Read",
                  "status": "pending",
                  "detail": "채택 주기=추정치 일 1회 + 확정치 대표 운영자 월 1회 파일(2026-10-16 결정 19 · 20 — 건별 정산 API 없음). 서로 다른 두 예정 실행의 연속 성공 증거 없음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/00_프로젝트작업실/37_수동0_공수·일정_재산정.md"
                  ],
                  "next": "같은 운영 설정으로 서로 다른 예정 시각 2회를 실행하고 변경·무변경 양쪽 상태를 확인한다.",
                  "criterion": "추정치 일 1회 + 확정치 대표 운영자 월 1회 파일(2026-10-16 결정 19 · 20 — 건별 정산 API 없음) 기준 서로 다른 예정 실행 2회가 성공하고, 각 실행의 기준시각·행 수·URI·SHA-256·지연 시간이 남는다.",
                  "stage": "repeat_read"
                },
                {
                  "id": "source-h5-proof",
                  "title": "Read 완료 증거 동결",
                  "status": "pending",
                  "detail": "실행 증거 묶음과 개인정보 비노출 검토가 아직 없음. 테스트 통과만으로 Read 완료 처리하지 않음.",
                  "evidence": [
                    "cmslab-data-platform/00_프로젝트작업실/36_자동화_목표_의사결정.md",
                    "cmslab-data-platform/10_플랫폼구현/db/seeds/README.md"
                  ],
                  "next": "증거 묶음을 비밀·고객행 없이 보관하고 담당자가 원천별 Read 게이트를 승인한다.",
                  "criterion": "#H5 증거에 범위, 계정 역할, UTC/KST 시각, 원천/적재 행 수, 통제 합계, raw URI, SHA-256, 누락 0, 두 번의 예정 실행이 있고 승인자가 서명한다.",
                  "stage": "proof"
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}
