시험지 한 장을 컴퓨터가 읽을 수 있는 형태로 적어두는 양식이다.
한글 파일로 만든 시험지는 그 한글 파일 안에서만 산다. 다른 도구로 넘길 수 없고, 3년 뒤 같은 지문을 다시 쓰려 해도 찾을 방법이 없다. 양식이 없으면 데이터가 아니라 그냥 종이다.
$ ./tools/seis-validate examples/minimal.seis.json
✓ PASS examples/minimal.seis.json
items 2 passages 1 markers 1 sources 2
문항을 열심히 만들어도 한 번 쓰고 버려진다. 다음 시험을 만들 때는 처음부터 다시 만든다. 만들어진 문항이 찾을 수 있고 재조합할 수 있는 형태로 남지 않기 때문이다.
SEIS는 세 가지로 그걸 해결한다.
| 어떻게 | |
|---|---|
| 지문 재사용 | 지문을 문항과 분리해 한 번만 저장한다. 같은 지문에 새 문항만 붙일 수 있다 |
| 위치 보존 | 빈칸·밑줄을 좌표로 적는다. 지문 원문에 [BLANK] 같은 걸 박아 넣지 않는다 |
| 출처 추적 | 문항과 정답이 각각 어디서 왔는지 따로 기록한다 |
schema/ seis-v1.schema.json ← 코어. 과목·언어 무관
spec/ GUIDE.md ← 규격 설명
tools/ seis-validate ← 참조 검증기 (의존성 0)
profiles/ ko-highschool-english/ ← 유형 어휘. 과목별로 갈린다
examples/
코어에는 영어에만 해당하는 게 하나도 없다. 지문·문항·선지·정답·마커는 국어도 수학도 같다. 과목마다 다른 건 유형 어휘뿐이라 프로파일로 분리했다.
덕분에 새 과목을 추가해도 코어는 바뀌지 않고, 기존 도구는 그대로 돈다.
개념 분류·약점 계산·학생 진단은 SEIS가 정하지 않는다. 개념 체계는 가르치는 사람마다 다르고, 시험지를 정리하고 싶을 뿐인 사람에게 그걸 강제하면 아무도 쓰지 않는다.
대신 확장 슬롯이 열려 있다.
"extensions": {
"haeminway.diagnosis": {
"concept_weights": { "vocabulary": 0.2, "syntax": 0.2, "inference": 0.6 }
}
}읽는 쪽은 모르는 확장을 무시해야 한다. 확장이 없다고 실패하면 안 된다.
이 규격의 특이한 필드 하나. 시험지는 원문을 일부러 훼손한다 — 어휘 문제를 붙이려면 단어 하나를 틀린 것으로 바꾸고, 순서 문제를 붙이려면 문단을 섞는다.
그 지문을 그대로 재사용하면 틀린 단어가 정답 지문으로 실린다. 문서 자체가 "나는 변형본이다"라고 말해주지 않기 때문이다.
"integrity": {
"is_original": false,
"restoration_kind": "vocabulary_correction",
"restored_ref": "SRC_..."
}선택 필드다. 없으면 "모름"이고 기존 문서는 그대로 유효하다. restored_ref는
가리키기만 한다 — 복원된 원문 텍스트는 이 규격이 절대 담지 않는다.
SEIS의 가치는 지문 텍스트가 아니라 구조에 있다. 그래서 이 저장소는 어떤 기출 지문도 배포하지 않는다.
시험문제는 저작물이고, 특히 수능 영어 지문은 대부분 해외 저작물에서 발췌된 것이라 출제 기관의 허락과 별개로 원저작자의 권리가 살아있다.
examples/의 영어 지문은 이 저장소를 위해 새로 쓴 것이다. 실제 기출은 각자
자기 파일을 자기 컴퓨터에서 넣으면 된다 — 원문이 이동하지 않으므로 위험이 애초에
발생하지 않는다.
의존성이 없다. Python 3.9+ 만 있으면 된다.
./tools/seis-validate examples/minimal.seis.json
./tools/seis-validate examples/modified-passage.seis.json # integrity 사용 예
./tools/seis-validate my-exam.json --json # 기계용 출력검증기는 JSON Schema가 못 잡는 것을 본다. 불변량 12개가 schema.json의
x-seis-invariants에 선언돼 있다.
passage.text[start:end]가 마커label과 정확히 일치하는가passage_ids·owner_item·source_id가 실제 존재하는 것을 가리키는가- 정답 라벨이 선지에 실제로 있는가
- 문항 안에 공유 지문을 복사해 넣지 않았는가
구조가 맞는지는 스키마가 보고, 말이 되는지는 검증기가 본다.
검증기는 "맞다"는 것만 알려 주고 손에 쥘 종이를 주지 않는다. SEIS 를 쓰는 일이 인쇄 능력을 잃는 일이 되지 않도록, 조판 참조 구현을 따로 둔다.
Haeminway1/seis-templates — 같은
JSON 하나에서 시험지·연습문제·숙제·교재·클리닉지가 나온다. 의존성 없고, 브라우저에서
Ctrl+P 하면 A4 인쇄물이 된다.
./bin/seis-build exam.seis.json --kind exam --theme academy-navy -o out/마커 조판(빈칸·밑줄·삽입 자리), A4 면 나누기, 정답표·해설면이 들어 있다.
profiles/ko-highschool-english/ 의 유형 계약과 오독 메커니즘을 학생·강사가 읽을 수
있는 글로 푼 것이 영어 문제 유형 사전 이다.
유형마다 무엇을 묻는지, 오답이 어떻게 만들어지는지, 어떤 순서로 푸는지를 한 페이지씩
적었다. 오독 메커니즘 8종은 오답 유형 8종
에서 직접 쓴 지문 하나로 보여 준다. 기준은 이 저장소의 프로파일과 같다.
spec/GUIDE.md |
규격 전체 설명 |
schema/seis-v1.schema.json |
유일한 권위. 불변량 12개 포함 |
profiles/ko-highschool-english/v1/ |
한국 고등 영어 유형 어휘 |
CONTRIBUTING.md |
유형 추가·스펙 변경 절차 |
AGENTS.md |
자동화 도구·에이전트용 사용 지침 |
가져다 쓰고 고쳐 쓰라는 쪽이다. 표준은 퍼져야 표준이다.
seis/v1 — 실사용 중인 형태를 명세로 옮긴 것이다. 여기 있는 규격과 검증기는
실제 시험지 데이터에 매일 돌고 있다.