## 한 줄 요약
2주차 기본과제에서 분리한 단어시험지 Skill Tree에 Eval·Proof·Code Gate·Human Gate를 붙였다. 정답 한 줄을 의도적으로 변조하자 독립 Verifier가 FAIL과 수리 책임을 정확히 반환했고, 그 한 줄만 복구한 뒤 같은 입력으로 재검증해 PASS를 받았다. 마지막에는 네 Skill을 현재 Hermes profile에 설치하고 한 번 실행용 Umbrella까지 추가해 다음 주 수업 준비에 바로 사용할 수 있게 했다.
## 기본과제 뒤에 남은 질문
기본과제에서는 다음 흐름이 실제로 작동했다.
Validator → Composer → Verifier → Human Gate하지만 정상 입력에서 PASS가 나온 것만으로는 검증 장치가 실제 오류를 잡는지 알 수 없었다. 그래서 이번 확장과제의 질문을 이렇게 정했다.
> 학생용 답 비노출과 시험지·정답지 1:1 대응이 깨졌을 때, Verifier가 완료를 차단하고 가장 작은 수리 지점을 알려줄 수 있는가?
## 내가 선택한 다섯 가지 판단
추천안을 그대로 자동 적용하지 않고 각 판단 지점에서 선택지를 확인한 뒤 다음과 같이 정했다.
+
### 1. Eval 기준
+
+- Goal: 학생용 답 비노출과 시험지·정답지 1:1 대응 보장
+- Baseline: 1주차 단일 Skill 내부 확인 방식
+- Pass: 학생 영역에 입력 뜻이 없고, 번호·단어·뜻이 생성 영수증과 전부 정확히 일치
+- Fail: 정답 노출 또는 번호·단어·뜻 불일치가 하나라도 있음
+- Judge: 생성기와 분리된 vocabulary-test-verifier의 구조화 판정
재현성도 중요한 조건이지만, 단어시험에서 더 치명적인 위험은 학생용 답 노출과 정답지 불일치라고 판단해 이것을 대표 성공 조건으로 선택했다.
### 2. Proof Artifact
+다음 네 종류를 한 묶음으로 남기기로 했다.
+
+시험지
++ composition receipt
++ proof.json
++ SHA-256 manifest+결과 파일만 남기면 기대한 순서를 알 수 없고, proof.json만 남기면 실제 시험지를 다시 볼 수 없다. 그래서 결과·기대값·판정·해시를 함께 보존했다.
### 3. 승인 지점
Code Gate가 PASS한 뒤에도 실제 인쇄·학생 배포·외부 게시 직전에 교사 승인을 받도록 했다. 로컬 파일 생성은 다시 할 수 있지만, 학생에게 나간 시험지는 회수하기 어렵기 때문이다.
### 4. 금지사항
+- 입력에 없는 뜻을 추측하지 않기
+- 학생 개인정보를 넣지 않기
+- 보호된 배포 원본을 수정하지 않기
+- 교사 승인 없이 인쇄·배포·외부 게시하지 않기
### 5. 실패 뒤 최소 수리
전체 Pipeline을 다시 만드는 대신 변조된 정답 한 줄만 Composer 산출물에서 복구하고 동일한 fixture로 재검증하기로 했다.
## 수정 전에 자동 백업부터 했다
+Eval 계약, 실패 fixture, 수리, Proof 묶음, active profile 설치 직전에 각각 백업을 수행했다. 파일별 SHA-256 manifest와 source-backup readback을 확인했고, payload를 별도 경로에 복사해 복원 리허설도 PASS였다.
최종 기록 기준으로 learner working copy 백업 영수증은 18개, active profile 백업 영수증은 2개다. 기존 1주차 vocabulary-test-maker는 덮어쓰지 않았고 그대로 보존했다.
## 먼저 정상 결과를 기준선으로 고정했다
공개 가능한 가상 단어 10개와 seed 23을 사용했다.
+Validator: status=pass valid=10 issues=0
+Composer: status=pass selected=10 seed=23
+Verifier: verdict=PASS checks=5 repair_target=None정상 시험지의 문항 순서는 다음과 같았다.
omitted 187 diff line(s) across 1 additional file(s)/section(s)