네 등급처럼 보였지만 세 축이었다 — Codemit 체크리스트 설계 심문
체크리스트 항목에 「필수·선택·숨김·출제자 판정」 네 등급을 달아 달라는 요청을 받았습니다. 질문을 세 개로 쪼개 보니 등급 하나가 아니라 서로 다른 세 축이었고, 배점·가산·숨은 항목으로 나눠 만들었습니다.

네 등급처럼 보였지만 세 축이었다
Codemit 체크리스트 설계 심문
배경 — 고정 가중치라는 숙제
Codemit은 코딩 과제와 공모전에서 제출물을 AI가 채점하는 서비스입니다. 출제자가 요구사항을 체크리스트로 적으면, AI가 제출한 소스를 보고 항목마다 충족·미충족을 매기고, 그 결과로 「완성도」를 계산해 순위를 냅니다.
지난 글에서 완성도 순위를 만들 때 남은 한계로 적어 둔 것이 가중치 고정이었습니다. 필수 항목과 선택 항목이 정해진 비율로만 들어가서, 출제자가 「이 항목은 다른 것보다 훨씬 중요하다」를 표현할 길이 없었습니다.
그러던 중 요청이 들어왔습니다. 체크리스트 항목에 등급을 네 개 달아 달라는 것이었습니다.
- 필수 — 통과하려면 꼭 충족해야 함
- 선택 — 충족하면 좋음
- 숨김 — 제출자에게 보이지 않음
- 출제자 판정 — AI가 아니라 출제자가 직접 매김
얼핏 보면 드롭다운 하나에 값 네 개를 넣으면 끝나는 일입니다.
무엇이 문제였나 — 네 값이 같은 질문에 대한 답이 아니었습니다
만들기 전에 요청을 질문으로 바꿔 심문해 봤습니다. 「숨김이면서 필수인 항목」은 있을 수 있는가? 「출제자 판정인 선택 항목」은? 답이 모두 「있을 수 있다」였습니다. 등급 하나에 넣으면 이 조합을 표현할 수 없습니다.
네 값은 사실 서로 다른 세 질문에 대한 답이었습니다.
- 통과에 필요한가? — 필수 / 선택
- 누가 매기나? — AI / 사람
- 제출자에게 보이나? — 보임 / 숨김
같은 칸에 넣으면 「숨김」을 고르는 순간 필수인지 선택인지를 잃고, 「출제자 판정」을 고르는 순간 보이는지 아닌지를 잃습니다. 그래서 등급을 하나로 받지 않고 축을 나눠 설계하기로 했습니다.
고른 방법 — 등급 셋, 그리고 따로 켜는 표시 하나
세 축을 그대로 세 칸으로 만들 수도 있었지만, 실제로 쓰일 조합을 따져 보니 더 줄일 수 있었습니다. 사람이 매기는 항목을 통과 점수(Score)에 넣으면 사람의 판단이 통과를 가르게 됩니다. 그래서 사람이 매기는 항목은 통과에 들어가지 않게 하고, 필수·선택과 나란한 세 번째 등급 가산으로 묶었습니다. 「통과에 필요한가」와 「누가 매기나」를 등급 하나가 함께 정하는 셈입니다.
최종 모양은 이렇습니다.
- 등급 — 필수 / 선택 / 가산 중 하나
- 숨은 항목 — 어느 등급에나 켤 수 있는 별도 표시
등급 넷으로는 나타낼 수 없던 「숨은 필수」·「숨은 가산」 같은 조합이 그대로 표현됩니다.
배점 — 고정 가중치를 풀기
항목마다 1~10의 정수 배점을 둡니다. 기본값은 필수 2, 선택 1, 가산 1입니다. 기존 체크리스트에는 이 기본값을 채워 넣어, 배포 전후로 순위가 바뀌지 않게 했습니다.
- 배점은 완성도에만 씁니다. 점수(Score)·통과 여부·달성률·분포·이의 신청은 그대로입니다.
- 화면에는 「n / 만점」으로 보이고, 순위는 정수 합계로 냅니다. 항목별 0~5 판정만 저장하고, 배점은 읽을 때 곱합니다. 만점은 가산을 포함한 배점 합이고, 아직 매기지 않은 가산은 0점입니다.
- 배점은 언제든 바꿀 수 있습니다. 공모전은 마감 뒤에도 주최자가 고칠 수 있고, 바꿔도 AI를 다시 부르지 않고 곧바로 다시 셉니다.
- 체크리스트가 바뀌었는지 가리는 지문(fingerprint)에는 AI가 매기는 항목의 id와 문구만 넣었습니다. 배점이나 필수·선택만 바꿨다고 AI 판정을 다시 받아야 하는 일이 없게 하려는 것입니다.
가산 — 사람이 매기는 항목
- 사람이 0~5점과 짧은 메모(선택)로 매깁니다. AI 채점 입력에서는 빠집니다.
- 공모전은 주최자가 마감 뒤에, 수업은 강사가 언제든 매깁니다. 대상은 「채점 대상이 된 제출」입니다.
- 대상 제출이 바뀌면 그 점수는 0으로 돌아가고 「가산 다시 매김 필요」가 뜹니다. 옛 제출에 매긴 점수가 새 제출에 그대로 붙는 일을 막기 위해서입니다.
숨은 항목 — 무엇을 보는지 알리지 않기
- 제출자에게는 항목 내용을 끝까지 보여 주지 않습니다. 결과가 나온 뒤에도 마찬가지입니다. 대신 「숨은 항목 2개 중 1개 충족」 같은 요약과 「숨은 항목 k」라는 이름으로 점수만 보입니다.
- 제출자가 항목마다 쓰는 자가 응답·확인 위치·채움률에서는 빠집니다. 보이지 않는 항목에 답을 요구할 수 없기 때문입니다.
- AI는 다른 항목과 똑같이 판정합니다. 주최자·강사·이의를 처리하는 운영자는 내용을 볼 수 있습니다.
- 유료 공모전에서는 숨은 항목을 선택·가산에만 켤 수 있게 했습니다(필수에 켜면 422로 거절). 수업과 무료 공모전은 숨은 필수도 허용합니다.
이름 고르기 — 이미 쓰고 있는 말과 겹치지 않게
축을 나눈 다음 오래 걸린 것은 이름이었습니다. 서비스 안에서 이미 다른 뜻으로 쓰는 말이 많았습니다.
- 숨김 — 문제를 목록에서 감추는 상태 이름으로 이미 쓰고 있었습니다.
- 비공개 — 템플릿을 남에게 보이지 않게 하는 설정 이름이었습니다.
- 히든 — 외래어라 화면의 다른 말과 결이 맞지 않았습니다.
그래서 항목 표시는 「숨은 항목」, 켜는 스위치는 「제출자에게 숨기기」로 정했습니다. 무엇을 누구에게서 숨기는지가 이름에 들어 있습니다.
사람이 매기는 등급도 후보가 여럿이었습니다. 「출제자 항목」은 수업에서 강사가 매기는 경우와 맞지 않고, 「보너스」는 가볍게 들리고, 「심사 항목」은 공모전의 심사와 섞이고, 「수동」은 무엇이 수동인지 알 수 없었습니다. 필수·선택과 나란히 놓였을 때 「충족하면 더해지는 점수」라는 뜻이 바로 읽히는 「가산」을 골랐습니다.
만든 순서
한 번에 다 만들지 않고, 각각 따로 배포해도 동작하는 네 조각으로 나눴습니다.
- 배점 — 항목별 정수 배점과 완성도 계산
- 가산 — 사람이 매기는 등급과 점수 입력 화면
- 숨은 항목 — 표시, 제출자 화면에서 내용 감추기, 유료 공모전 제한
- 약관 — 숨은 항목과 가산이 생긴 것에 맞춘 문구 정리
2026년 11월 5일에 네 조각 모두 배포했습니다.
숨은 항목은 새는 곳이 하나라도 있으면 의미가 없습니다. 그래서 시험은 제출자 토큰으로 모든 API와 공개 HTML을 훑어 숨은 항목의 문구가 어디에도 나오지 않는지 확인하는 방식으로 짰습니다. 화면 하나하나를 확인하는 대신, 「제출자가 받을 수 있는 응답 전체」에서 문구를 찾는 것입니다.
가는 길에 다른 문제도 하나 나왔습니다. 운영자 화면에서 긴 제목 뒤에 붙인 배지가 말줄임에 같이 잘려 보이지 않았습니다. 이 일은 따로 팁으로 정리했습니다.
결과
- 출제자는 항목마다 배점을 정해 「이 항목이 더 중요하다」를 표현할 수 있게 됐습니다. 기존 체크리스트는 기본 배점으로 채워 순위가 그대로입니다.
- 사람이 판단해야 하는 항목은 가산으로 두고, AI 채점 입력과 통과 판정에 섞이지 않게 했습니다.
- 숨은 항목으로 「무엇을 보는지 알면 그것만 맞추는」 제출을 줄일 수 있게 됐습니다. 제출자는 숨은 항목이 몇 개이고 몇 개를 충족했는지만 압니다.
- 배점을 바꿔도 AI를 다시 부르지 않습니다. 비용 없이 언제든 다시 셀 수 있습니다.
배운 것
- 요청이 「값 목록」으로 들어오면, 값끼리 조합할 수 있는지부터 물어봅니다. 조합이 된다면 한 칸이 아니라 여러 축입니다.
- 축을 찾은 뒤에는 실제로 쓰일 조합만 남겨 다시 줄입니다. 세 축을 그대로 세 칸으로 만들었다면 「사람이 매기는 필수 항목」처럼 운영하기 어려운 조합까지 열렸을 것입니다.
- 점수는 원점수만 저장하고 읽을 때 계산합니다. 배점을 바꾸는 일이 저장된 판정을 건드리지 않게 됩니다.
- 이름은 서비스 안에서 이미 쓰는 말과 겹치지 않는지 먼저 봅니다. 같은 말이 두 뜻을 가지면 화면과 문의 응대 모두에서 비용이 듭니다.
- 「보이지 않아야 하는 것」의 시험은 화면 단위가 아니라 그 사람이 받을 수 있는 응답 전체를 대상으로 짭니다.
남은 한계
- 가산 점수를 다시 매기면 이전 값을 덮어씁니다. 누가 언제 몇 점에서 몇 점으로 바꿨는지 이력은 남지 않습니다.
- 배점은 정수 1~10이라 아주 세밀한 비중 차이는 표현하지 못합니다.
- 숨은 항목은 제출자가 결과를 받은 뒤에도 내용을 모릅니다. 왜 그 점수인지 궁금한 제출자는 이의 신청으로만 물을 수 있습니다.
- 마감 뒤 배점을 바꾸면 완성도 순위가 달라질 수 있습니다. 언제든 고칠 수 있게 연 것은 의도이고, 그 판단은 주최자의 몫으로 남습니다.

