# 프로젝트 체크리스트

[index.html](index.html)은 기존 프로젝트 기록과 원천별 실제 Read 준비도를 함께 보여주는 독립 실행형 문서다. 별도 외부 스크립트가 필요 없다.

## 범위

- 기준 main: PR #30 병합 `b863cc37708140e27455113a4415a7fc36e6a504`(80개 보존본). 증거 링크 기준 커밋과 최신 증거 기준일은 `progress-updates.json` 의 `meta.evidence_commit` · `meta.as_of` 다(화면 우상단 「기준 main」 · 「증거 기준」, GitLab 근거 링크의 blob 커밋).
- 기존 11개 영역·80개 항목은 `checklist-base.json`에 보존한다.
- 확장 구조: 영역 → 작업 묶음 → 원천/확인 항목 → 단계별 완료 기준, 최대 4단계.
- `architecture-readiness.json`은 기존 아키텍처가 실제 Read 목표를 지원하는지 확인한다. 기존 그림은 수정하거나 새로 생성하지 않는다.
- `source-readiness.json`은 120개 원천 각각의 범위, 접근, connector, 실 Read, 완전성, 검증, 복구, 반복 Read, 증거 동결을 추적한다.

## 120의 뜻

120은 고유 웹사이트 120개가 아니다. 분류표 120행(2026-10-11 #103~#113 범위 편입 11행 포함)이고 미분류는 0이다 — 2026-10-16 화해 · 계열사는 #2 ERP 판매출고, 제휴몰은 #2 + #98 카카오쇼핑으로 식별했고 중국법인은 범위에서 뺐다(36_ 결정 19). 그 전까지는 124(=120+4), 2026-10-10 까지는 115(=109+6)였다 — 「글로벌 B2B」(U4)는 #108 글로벌 거래처별 매출 현황(대조)과 ERP 출하리스트(정본)로 식별됐고, 「일본 자사몰」(U6)은 범위에서 뺐다(고객: 카탈로그만, 주문 없음). 사이트, ERP, API, 파일, Google Sheets, Drive, 메일, 포털, 설치형 프로그램이 섞여 있다. Google 계열도 물리 문서 수가 아닌 분류 행 기준으로 Sheets 42행(2026-10-02 #23 +1 · 2026-10-11 #108~#111 +4), Drive 공유폴더 1행 · Drive 파일 6행(경영지원실 5 · 엠브레인 1) · Drive 업로드 9행(2026-10-16 메일 수신에서 전환 7행 — 36_ 결정 17, 사방넷 API 대신 전환 2행 #22 · #39a-2 — 36_ 결정 20)이며 별도 문서감시 4행이 있다. 메일 수신은 LOFT 1행만 남는다.

## 실제 Read 완료

원천 1개는 필수 9단계와 전송 방식별 추가 단계가 모두 `done`일 때만 실제 Read 완료로 집계한다. 상단 수치는 `READ_COMPLETE(루트 서명·Read 범위 한정)`이며 운영 스케줄·게시 승인이 아니다. 코드나 설계가 존재해도 고객 원천을 읽은 실행 근거가 없으면 완료가 아니다. 부모 상태는 요약이며 상단 상태 집계는 최하위 확인 항목만 센다.

완료 기준은 Read 범위에 한정한다. 후속 쓰기, 반출, 정산 업로드, 업무 승인은 별도 목표다. 상태 수치는 프로젝트 진척률이나 운영 가동률이 아니다.

9단계는 E1 범위 → scope, E2 접근 → access, E3 수집기 → connector, E4 첫 실 Read → live_read, E5 완전성 → completeness, E6 수치·형식 → validation, E7 복구 → recovery, E8 반복 → repeat_read, E9 증거 → proof로 1:1 대응한다. 원천을 done으로 바꾸는 유일한 입력은 `read-complete-register.json`에 등록된 루트 E9 서명이다. 생성기(`read_complete_register.py`)는 서명 파일 SHA-256, 서명이 인용한 원천별 manifest SHA-256, manifest의 E1–E8 판정, 서명 시점의 publish_hold·미게시·스케줄 비활성·배포/게시 미승인을 다시 검증하고 하나라도 다르면 실패한다. #8은 원 수용 기록과 이를 대체한 r2 바인딩 기록을 함께 검증한다. 검증은 `assert`가 아닌 `RuntimeError`라 `python -O`에서도 꺼지지 않는다. 서명된 원천만 9단계 모두 done이 되며 근거로 서명과 manifest를 링크한다. 서명을 등록한 뒤에는 ① `data-request/sync_read_complete.py` 로 데이터 요청 행 상태를 맞추고 ② `progress-updates.json` 의 `as_of`·`evidence_commit` 을 서명일 · 그 시점 main 으로 올린 다음 다시 빌드한다 — 2026-10-12 서명(30 → 36) 때 둘 다 빠져 화면 기준일이 10/11 에 머물고 #63·#88 요청 행이 blocked 로 남았다. 서명된 원천의 E1–E9 9단계는 모두 `stage_criteria`로 Lane B 루트 정의의 제목·완료 기준을 표시하고 `criterion_basis: root_signature`를 가진다(E8 = 승인된 서로 다른 2회 발생, 스케줄 실행 아님). 등록부의 `notes`·`common_note`는 업무 의미 미확정 같은 한계를 화면에 남기고, `excluded`는 상태를 바꾸지 않은 채 제외 사유만 표시한다.

## 입력과 생성

- `checklist-base.json`: 기존 80개 항목. 최초 보존본.
- `architecture-readiness.json`: 아키텍처 Read 계약 확장.
- `read-complete-register.json`: 루트 서명 READ_COMPLETE 등록부. 서명·manifest 경로와 SHA-256.
- `read_complete_register.py`: 등록부 검증과 원천 항목 반영.
- `source-readiness.json`: 120개 원천 확장. `generate_source_readiness.py`가 32_ CSV와 위 등록부로 생성.
- `progress-updates.json`: 날짜별 진척 덧씌우기(2026-09-30 웨이브 2). 위 입력은 고치지 않고 ① 기존 항목 상태 상향(`from` 이 현재 상태와 같을 때만 적용, `previous_status`·`updated` 기록) ② 기존 영역에 작업 묶음 추가 ③ 증거 기준 커밋(`meta.commit`)·기준일 갱신만 한다. 원천(`source`) 항목과 13번 영역은 대상이 아니다 — READ_COMPLETE 는 루트 E9 서명만 바꾼다. 코드·로컬 확인은 `partial`(본문 「구현(로컬 확인)」)이고 운영 적용·실제 Read 완료가 아니면 `done` 으로 올리지 않는다.
- `checklist-data.json`: 위 입력을 검증·병합한 생성물.
- `template.html`: 문서 화면 원본. 원천 수 · 활성 범위 · Google 행 수는 숫자로 쓰지 않고 `meta.source_metrics`(`google_rows` 포함)에서 읽는다 — 2026-10-12 까지 머리말 115 · 106 · Sheets 37 이 하드코딩돼 낡아 있었다.
- `index.html`: 최종 생성물.

확장 두 파일 중 하나라도 없으면 정식 빌드는 실패한다.

2026-09-30 T0/T1/T2 재개 Read(`docs/work-log/2026-09-29_source-read-t0t1t2-resume/read-evidence-sanitized.json` — 값·URL·계정 없는 해시 목록)는 `generate_source_readiness.py` 의 `T012_LIVE_READ`·`T012_SAMPLE_READ` 로 반영한다. 원천 시트 자체를 읽은 #11 만 E4 done 이고, 수령 샘플·파생 시트 파싱(#35·58·72·73·95~97·99~102)은 운영 경로 Read 가 아니라 E4 를 pending→partial 로만 올린다. READ_COMPLETE 는 바뀌지 않는다.

```sh
python3 cmslab-data-platform/00_프로젝트작업실/51_프로젝트체크리스트/test_read_complete_register.py
python3 cmslab-data-platform/00_프로젝트작업실/51_프로젝트체크리스트/generate_source_readiness.py
python3 cmslab-data-platform/00_프로젝트작업실/51_프로젝트체크리스트/build_checklist.py
node cmslab-data-platform/00_프로젝트작업실/51_프로젝트체크리스트/verify_checklist.cjs
```

배포본도 같은 브라우저 검사를 실행할 수 있다.

```sh
BASE_URL=https://cmslab.aidp-shhong.org/project-checklist/ \
node cmslab-data-platform/00_프로젝트작업실/51_프로젝트체크리스트/verify_checklist.cjs
```

생성기는 기본 80개 보존, 120행 모집단(미분류 0), ID 유일성, 4단계 구조, 상태, 근거 파일 존재, 실제 Read 완료 규칙을 검사한다. 브라우저 검사는 1440·1920·390 너비, 검색, 상태 필터, 접기·펼치기, 로컬/GitHub 근거 전환, 인쇄 복원을 확인한다.

## 데이터 요청 시트 (13번 영역 머리 링크)

[data-request/index.html](data-request/index.html)은 고객 「데이터 통합 플랫폼 구축 관련 데이터 요청」 시트(팀별 탭 + 종합현황 + `_첨부` 탭)를 원본 모양대로 옮기고, 요청 행마다 체크 상태 열을 붙인 읽기 전용 페이지다. 13번 영역(`source-readiness`) 머리의 링크로 들어간다.

- `data-request/pull_sheet.py`: Mac mini 전용(cms-lab Google 자격이 거기만 있다). 공개 안전 스냅샷만 stdout 으로 낸다 — ID·PW·아이디·패스워드 열은 「있음(비공개)」/빈칸, 다른 칸의 자격 증명 의심 값·개발 PC 로컬 경로·IP 는 치환, URL 토큰 파라미터 제거, `_첨부` 탭은 헤더·행 수·날짜 범위만. 원본 시트 ID 는 스냅샷에 싣지 않는다. `--audit 파일...` 은 원본 ID/PW 값을 메모리에서만 만들어 파일에 섞였는지 개수만 출력한다.
- `data-request/sheet-snapshot.json`: 커밋되는 공개 안전 스냅샷.
- `data-request/data-request-status.json`: 행별 상태 정본(todo/doing/done/blocked · 날짜 · 근거 · 메모 · 연결 원천). 행 키 = sha1(탭, 구분, 데이터 항목, 수집 출처) — 종합현황은 (탭, 번호, 시스템·자료명). `done` 은 연결 원천이 READ_COMPLETE(루트 서명)이고 근거·날짜가 있을 때만 생성기가 받아들인다. 연결 원천은 종합현황 번호(=32_ 번호) 또는 생성기의 명시 규칙이며, 사람이 고정하려면 `sources_basis: "curated"`.
- `data-request/build_data_request.py` + `template.html` → `index.html`.

```sh
scp cmslab-data-platform/00_프로젝트작업실/51_프로젝트체크리스트/data-request/pull_sheet.py acp-mini:/tmp/
ssh acp-mini 'export PATH=$HOME/.local/bin:/opt/homebrew/bin:$PATH; cd /tmp && uv run -q --with google-auth --with requests python /tmp/pull_sheet.py' \
  > cmslab-data-platform/00_프로젝트작업실/51_프로젝트체크리스트/data-request/sheet-snapshot.json
python3 cmslab-data-platform/00_프로젝트작업실/51_프로젝트체크리스트/data-request/build_data_request.py
python3 cmslab-data-platform/00_프로젝트작업실/51_프로젝트체크리스트/generate_source_readiness.py
python3 cmslab-data-platform/00_프로젝트작업실/51_프로젝트체크리스트/build_checklist.py
```

13번 영역 머리 링크 대상은 영역 `evidence` 에도 올라 있어 배포 번들러(`tools/checklist-deploy/build.py`)가 함께 싣는다. 체크리스트는 `index.html#source-<번호>` 로 원천 항목을 바로 펼친다.

## 화면 사용

원천 번호, 이름, 전송 방식, 주기, HGLIS, 신세계, 미분류 같은 키워드로 부모와 최하위 기준을 함께 검색한다. 4단계 부모는 기본 접힘 상태다. 체크 표시는 근거 기반 읽기 전용 기록이며 화면에서 임의로 바꿀 수 없다.

기존 [플랫폼 아키텍처](../50_플랫폼아키텍처/index.html)와 [Archify 수령 배치 상태머신](../50_플랫폼아키텍처/06_수령배치_상태머신.html)을 재사용한다. 기존 아키텍처 영역의 8/8은 산출물·설계 검증 완료이며 운영 Read 완료가 아니다.
