## 한 줄 요약
+1주차에 만든 vocabulary-test-maker를 입력 검수, 시험지 생성, 독립 검증의 세 작은 Skill로 나누고, 상위 Umbrella가 실행 순서와 실패 반환을 맡도록 연결했다. 공개용 가상 단어 10개로 실제 실행한 결과 정상 입력은 PASS, 오류 입력은 partial과 Human Gate HOLD로 구분됐다.
## 왜 1주차 Skill을 다시 보게 됐나
+1주차에는 단어 목록 하나를 넣어 학생용 시험지와 정답지를 만드는 데 성공했다. 하지만 하나의 Skill 안에 다음 일이 모두 들어 있었다.
- 입력 형식과 중복 확인
- 문제 순서와 시험지 형식 결정
- 학생용 시험지와 정답지 생성
- 문항 수·정답·답 노출 검증
- 실제 배포 전 교사 승인
처음에는 한 번에 처리돼 편했지만, 오류가 생겼을 때 어디를 고쳐야 하는지가 흐렸다. 입력이 잘못된 문제와 정답지 순서가 어긋난 문제는 실패 원인도, 확인 방법도, 수리 방법도 달랐다.
## 원본과 작업 사본을 먼저 분리했다
기존 Skill은 learner-owned 원본으로 보존하고, 2주차 작업은 별도 working copy에서 진행했다. 후보 파일을 만들기 전 자동 백업을 수행하고 파일별 SHA-256을 대조했다. 백업 payload를 새 경로에 복사해 다시 해시를 비교하는 복원 리허설도 PASS였다.
작업 중 변경 전 백업 영수증은 총 10개가 남았고 모두 PASS다. 배포받은 수업 자료나 기존 1주차 원본은 수정하지 않았다.
## 전체 절차를 빠짐없이 펼쳐 본 결과
요청을 받는 순간부터 실제 외부 배포 전까지 절차를 18개로 펼쳐 분류했다. 그 결과 작은 Skill로 분리할 경계는 세 곳이었다.
1. `vocabulary-list-validator`
word | meaning 목록을 읽고 유효 항목, 형 식 오류, 중복을 구분한다.
2. `vocabulary-test-composer`
검수된 pair와 제목·배점·seed를 받아 학생지와 정답지를 같은 순서로 만든다.
3. `vocabulary-test-verifier`
생성기와 독립적으로 문항 수, 순서, 입력 뜻, 학생용 답 노출, 재현성을 판정한다.
제 판단으로 실제 인쇄·배포 승인은 아직 별도 Skill로 만들지 않았다. 현재는 단어시험에만 쓰고 있고 외부 행동도 없으므로, 상위 Umbrella 안의 교사 Human Gate로 유지하는 편이 더 단순했다.
## 나누지 않고 남긴 것
모든 작은 동작을 Skill로 만들지는 않았다.
- 제목·배점·문항 수 결정: 전체 요청을 조정하므로 Umbrella 내부
- pair를 섞는 동작: 독립 판단이 없는 Composer의 지원 코드
- 파일 쓰기와 SHA-256 계산: 각 Skill의 지원 코드
- 중복을 유지할지 판단: 교사가 결정하므로 Human Gate
- 실제 인쇄·발송·게시: 이번 Skill Tree 밖의 별도 작업
이렇게 나누니 “작은 함수”와 “독립적인 책임을 가진 Skill”이 같은 것은 아니라는 점이 보였다.
## 만든 Interface
각 후보에 공통으로 다음 경계를 적었다.
name / role / use_when / input / steps / output / verifier / failure_return가장 중요한 연결은 파일 이름보다 출력 계약이었다.
Validator → validation-report.json
Composer → test.md + composition-receipt.json
Verifier → proof.json
Umbrella → 다음 Skill 선택 또는 실패 책임으로 반환## Umbrella Tree: 어디에 속하 는가
vocabulary-test-maker-umbrella
├─ vocabulary-list-validator
├─ vocabulary-test-composer
├─ vocabulary-test-verifier
└─ Human Gate: 교사 배포 승인
└─ 실제 print/send/publish는 Tree 밖 별도 작업## Circuit: 무엇이 전달되고 어디로 돌아가는가
omitted 91 diff line(s) across 1 additional file(s)/section(s)