지니파이
경력근거: 그룹 챌린지 형태로 AI 활용 실습을 꼭 하게 만들어 주는 Rona 플랫폼 MVP 출시
※ 실제 산출물이 아닌 AI 예측 시안입니다.
지니파이가 만든 지피터스는 스터디 23개 기수에 약 9,000명이 참여해 약 1만 개의 AI 활용 사례를 쌓은 곳이라, 실습을 해 놓고도 정리하지 못해 인증 글로 올라오지 않는 사례가 이 회사에서는 곧바로 자산 손실이 됩니다. 로나가 웹이 아니라 데스크톱 앱인 이유도 실습 흔적이 사람의 컴퓨터 안에 파일로 남기 때문이고, 브라우저 안에서는 그 폴더에 손이 닿지 않아 참가자에게 다시 찾아 올리라고 부탁하는 수밖에 없습니다. 이 포트폴리오는 그룹 챌린지 형태로 실습을 꼭 하게 만든다는 로나의 방향을 인증 직전 구간으로 좁혀, 참가자 컴퓨터에서 근거를 모아 초안까지 세우는 축소판으로 만들었습니다. 이 포트폴리오는 로컬 파일을 읽어 다루는 데스크톱 앱을 리액트·타입스크립트와 파이썬으로 만들어 맥과 윈도우로 내보내는 풀스택 기술을 보여주며, 성인 학습 설계나 스터디 운영 노하우 같은 교육 도메인 전문성은 주장하지 않습니다. 어떤 인증이 좋은 인증인지의 기준은 지피터스의 스터디장들이 정하는 것이고, 이 앱은 그 기준을 요건 데이터로 받아 쓰는 자리까지만 맡습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
주요 업무에 맥·윈도우 배포와 E2E 테스트가 들어 있고 우대사항에 일렉트론이나 타우리로 앱을 배포한 경험이 적혀 있어, 웹 화면이 아니라 사용자 컴퓨터에서 도는 앱을 만들고 두 운영체제로 내보내는 일이 이 자리의 축이라고 보았습니다.
리액트·타입스크립트 클라이언트와 파이썬 백엔드를 함께 맡고 AWS·PostgreSQL 운영까지 우대로 걸려 있어, 화면부터 적재까지 한 사람이 잇는 구조를 그대로 포트폴리오의 층으로 옮겼습니다.
사용자 대화와 데이터로 제품 방향을 결정하고 피드백 기반 개선 루프를 만드는 일이 첫 업무로 적혀 있어, 사용자가 초안을 어떻게 고쳤는지가 다시 규칙으로 돌아오는 되먹임 구조를 3주차에 두었습니다.
챌린지 참가자의 컴퓨터에서 이번 주 기간에 생긴 대화 내보내기 파일과 스크린샷과 작업 파일과 링크 메모를 골라 읽고, 그 주 챌린지의 인증 요건 정의와 대조해 요건마다 근거가 되는 항목을 붙여 인증 글 초안을 만들어 주는 맥·윈도우 데스크톱 앱을 만드는 1주 포트폴리오입니다. 어떤 도구를 썼는지 이름이 드러나는지, 해 보기 전과 후가 함께 있는지, 결과물 링크나 첨부 이미지가 있는지, 마감 시각 안에 만들어진 기록인지는 파일 메타데이터와 요건 정의로 판정되는 규칙이라 앱이 스스로 정하고, 근거를 찾지 못한 요건은 무엇이 빠졌는지 사유와 함께 남습니다. 참가자는 붙은 근거를 빼거나 더하고 초안 문장을 고쳐 쓰며, 필수 요건이 모두 채워지기 전에는 내보내기 단추가 열리지 않습니다. 초안 문장에 들어간 도구 이름과 파일 이름과 시각은 원본 기록과 글자 그대로 같은지 다시 검사해, 앱이 지어낸 문장이 인증 글로 나가지 못하게 막습니다.
이번 주에도 클로드와 챗지피티를 붙들고 실습은 했는데, 대화 기록은 내보내기 폴더에 스크린샷은 바탕화면에 결과 파일은 프로젝트 폴더에 흩어져 있어 그걸 다시 찾아 정리할 엄두가 안 나 인증 글을 못 올리고 한 주를 넘기던 스터디 참가자입니다. 글을 대신 써 주기보다 내가 무엇을 했는지 모아 앞에 놓아 주고 어느 요건이 비었는지만 짚어 주면 나머지는 직접 쓰고 싶은 사람입니다.
실습 흔적이 파일로 남아 있고 그 주의 인증 요건이 데이터로 정의돼 있으면 어떤 항목이 어느 요건의 근거인지는 규칙으로 갈리므로, 참가자가 인증 글에 쓰는 시간이 기억을 되짚어 자료를 찾는 시간이 아니라 이미 붙은 근거를 고르고 문장을 다듬는 시간으로 바뀐다는 가정입니다.
폴더를 지정하면 이번 주 기간의 대화 내보내기와 스크린샷과 작업 파일을 골라 읽고, 요건마다 근거 항목이 붙은 인증 글 초안이 뜨며, 비어 있는 필수 요건이 사유와 함께 남고, 그 요건을 채워야 마크다운 내보내기가 열리는 일렉트론 데스크톱 앱이 맥과 윈도우 설치 파일까지 나온 완결품입니다. 1주차에서 스크린샷은 그림 내용을 읽지 않고 파일 이름과 생성 시각과 크기 같은 메타데이터만 근거로 쓰며, 제출은 로컬 목업 서버가 받는 것으로 두고 커뮤니티 연동은 사내 API 가정으로 미뤄 둡니다. 만드는 덩어리는 로컬 수집과 요건 판정 규칙과 앱 화면 셋이고 평일 5일에 혼자 끝나는 범위입니다.
앱이 내보낸 인증 글과 요건 판정을 파이썬 백엔드가 받아 PostgreSQL 에 쌓고 AWS 로 배포해, 스터디장이 기수와 주차별로 누가 어느 요건에서 막혀 있는지 보고 아직 인증하지 못한 참가자 목록과 보낼 문안 초안까지 뽑는 화면입니다. 문안은 목록과 초안 텍스트로 끝나고 발송은 하지 않습니다.
참가자가 붙은 근거를 빼거나 문장을 고친 자리를 앞뒤 차이로 모아 어느 요건의 근거 매칭이 자주 틀리는지 보여 주고, 그 결과로 매칭 규칙을 손본 뒤 Playwright E2E 테스트와 GitHub Actions 자동 빌드로 맥과 윈도우 설치 파일을 매주 내보내는 릴리스 흐름까지 붙인 상태입니다.
실습 흔적이 섞인 폴더를 지정하면 요건별 근거가 붙은 초안이 뜨고, 비어 있던 요건을 채우자 내보내기가 열려 인증 글 마크다운이 나오는 흐름을 맥과 윈도우 양쪽에서 처음부터 끝까지 시연합니다.
시각 정보가 없는 스크린샷과 도구 이름이 흔들리는 대화 파일과 마감 이후 파일과 등록되지 않은 챌린지 항목을 심어 둔 폴더에서, 그 네 유형이 모두 사유와 함께 남고 근거로 잘못 붙지 않는 것을 보입니다. 다만 정답과 데이터를 작성자가 만든 합성 기준이라 성능 검증이 아니라 데모 조건 동작입니다.
빈 파일과 경로에 한글과 공백이 섞인 파일과 같은 내용이 두 번 들어온 항목과 확장자가 어긋난 파일이 포함된 30종을 넣어도 앱이 죽지 않고 항목 단위로 수집 제외 사유를 남기는 것을 보입니다.
초안 문장에 담긴 도구 이름과 파일 이름과 시각이 원본 항목과 글자 그대로 일치하지 않으면 편집기에 올라오지 않고 되돌아가는 것을 일부러 어긋낸 입력으로 보입니다.
위 결과는 더미데이터 자가채점이며, 참가자가 인증 글을 쓰는 시간이 실제로 줄어드는지는 지니파이의 실제 참가자 폴더와 실제 챌린지 운영이 있어야 측정 가능합니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다.
결과는 합성 데이터 자가채점이라 성능 증명이 아닙니다. 면접에서는 데모가 도는 상태와 실검증 준비 상태로 솔직히 설명합니다.
정답을 작성자가 만들었으니 잘 맞는 것이 당연합니다. 시각이 비어 있는 스크린샷과 도구 표기가 흔들리는 대화 파일과 마감을 넘긴 파일과 등록되지 않은 챌린지 항목을 더미에 일부러 섞어 두었습니다.
1주차는 스크린샷의 그림 내용을 읽지 않고 파일 이름과 생성 시각 같은 메타데이터만 근거로 쓰므로, 이미지 안에 실습 내용이 들어 있는 인증은 근거가 약하게 잡힙니다. 그림 판독은 3주차 이후 과제로 따로 두었고, 실제 참가자 폴더에서는 화면 캡처 비중이 훨씬 커서 이 경계가 먼저 드러납니다.
이 포트폴리오는 로컬 파일을 다루는 데스크톱 앱을 만들어 두 운영체제로 내보내는 풀스택 기술을 보여주며 성인 학습 설계나 스터디 운영 도메인 전문성은 주장하지 않습니다. 무엇을 인증으로 인정할지의 기준은 지피터스의 스터디장이 정하는 몫이고, 이 앱은 그 기준을 데이터로 받아 판정하는 자리까지만 맡습니다.
사용자 폴더를 읽는 앱이라 실제 도입에서는 어떤 경로까지 훑을지와 읽은 내용을 어디까지 서버로 보낼지가 먼저 정리돼야 합니다. 더미로는 이 문제가 드러나지 않으므로 수집 대상 경로를 사용자가 직접 고르게 하고 서버로는 판정 결과와 참가자가 확인한 초안만 보내는 선을 미리 그어 두었습니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
데스크톱 앱이 참가자 컴퓨터를 훑어 골라 온 실습 흔적 항목을 흉내 낸 더미입니다. 어떤 항목이 어느 인증 요건의 근거가 되는지 판정하는 입력입니다.
| item_id | member_id | kind | path_raw | captured_at_raw | tool_name_raw | tool_id | title_raw | text_excerpt | byte_size | linked_challenge_id |
|---|---|---|---|---|---|---|---|---|---|---|
| IT-1001 | MB-101 | chat_export | /Users/mina/Downloads/claude-export-20… | 2026-05-18 21:40 | Claude | claude | 회의록 요약 자동화 만들기 | 회의록 파일을 넣으면 결정사항만 뽑는 프롬프트를 세 번 고쳐 완성했습니다 | 184,320 | CH-23-W3 |
| IT-1002 | MB-101 | screenshot | /Users/mina/Desktop/스크린샷 2026-05-18 오후… | 2026-05-18 21:52 | — | — | — | — | 421,887 | CH-23-W3 |
| IT-1003 | MB-101 | work_file | /Users/mina/projects/meeting-summary/o… | 2026-05-18 22:10 | — | — | output_after.md | 결정사항 3건, 담당자 2명, 기한 1건 | 1,204 | CH-23-W3 |
| IT-1004 | MB-101 | work_file | /Users/mina/projects/meeting-summary/o… | 2026-05-17 19:02 | — | — | output_before.md | 회의 전문 그대로 붙여 넣은 상태입니다 | 8,890 | CH-23-W3 |
| IT-1005 | MB-102 | chat_export | C:\\Users\\준호\\Documents\\챗지피티 대화 내보내기… | — | 챗지피티 | — | 블로그 초안 만들기 | 제목 후보 열 개를 받아 세 개로 줄였습니다 | 22,014 | CH-23-W3 |
아래 JSON Schema에 맞는 참가자 컴퓨터의 실습 흔적 항목을 30건 더 만들어 주세요. {"type":"object","properties":{"item_id":{"type":"string"},"member_id":{"type":"string"},"kind":{"type":"string","enum":["chat_export","screenshot","work_file","link_note"]},"path_raw":{"type":"string"},"captured_at_raw":{"type":["string","null"]},"tool_name_raw":{"type":["string","null"]},"tool_id":{"type":["string","null"]},"title_raw":{"type":["string","null"]},"text_excerpt":{"type":["string","null"]},"byte_size":{"type":["integer","null"]},"linked_challenge_id":{"type":["string","null"]}},"required":["item_id","member_id","kind","path_raw"]} 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라. 첫째 captured_at_raw 가 null 이거나 한글 오전·오후 표기이거나 연도 구분자가 다른 행, 둘째 tool_name_raw 가 챗지피티와 ChatGPT 와 클로드와 Claude 처럼 같은 도구의 다른 표기이고 tool_id 가 null 로 남은 행, 셋째 linked_challenge_id 가 null 이거나 요건 정의에 없는 챌린지를 가리키는 행, 넷째 byte_size 가 0 이거나 null 인 빈 파일 행, 다섯째 path_raw 에 한글과 공백과 괄호와 윈도우 역슬래시가 섞인 행, 여섯째 서로 다른 참가자가 같은 파일 이름과 같은 크기를 가진 행. 마감 시각을 넘겨 만들어진 항목도 여러 개 두어야 요건 판정에서 걸리는 것이 화면에 드러납니다. 형식을 깨뜨리는 시도는 3건까지 별도로 만들어 주세요.{"type":"object","properties":{"item_id":{"type":"string"},"member_id":{"type":"string"},"kind":{"type":"string","enum":["chat_export","screenshot","work_file","link_note"]},"path_raw":{"type":"string"},"captured_at_raw":{"type":["string","null"]},"tool_name_raw":{"type":["string","null"]},"tool_id":{"type":["string","null"]},"title_raw":{"type":["string","null"]},"text_excerpt":{"type":["string","null"]},"byte_size":{"type":["integer","null"]},"linked_challenge_id":{"type":["string","null"]}},"required":["item_id","member_id","kind","path_raw"]}기수와 주차마다 무엇을 갖춰야 인증으로 인정하는지 적어 둔 요건 정의 더미입니다. 수집된 항목을 근거로 붙일지 판정하는 기준입니다.
| challenge_id | cohort | week_no | req_id | req_title | req_kind | required | param | due_at_raw |
|---|---|---|---|---|---|---|---|---|
| CH-23-W3 | 23기 | 3 | RQ-1 | 이번 주에 쓴 AI 도구 이름이 드러나야 합니다 | tool_named | true | claude,chatgpt,gemini,cursor | 2026-05-20 23:59 |
| CH-23-W3 | 23기 | 3 | RQ-2 | 해 보기 전과 후를 함께 보여야 합니다 | before_after | true | before,after | 2026-05-20 23:59 |
| CH-23-W3 | 23기 | 3 | RQ-3 | 결과물 링크나 파일이 하나는 있어야 합니다 | artifact_link | true | — | 2026-05-20 23:59 |
| CH-23-W3 | 23기 | 3 | RQ-4 | 화면 캡처를 한 장 이상 붙입니다 | image_attached | false | 1 | 2026-05-20 23:59 |
| CH-23-W3 | 23기 | 3 | RQ-5 | 마감 시각 안에 만들어진 기록이어야 합니다 | deadline | true | — | 2026-05-20 23:59 |
아래 JSON Schema에 맞는 챌린지 인증 요건 정의 행을 30건 더 만들어 주세요. {"type":"object","properties":{"challenge_id":{"type":"string"},"cohort":{"type":"string"},"week_no":{"type":["integer","null"]},"req_id":{"type":"string"},"req_title":{"type":"string"},"req_kind":{"type":"string","enum":["tool_named","before_after","artifact_link","image_attached","min_length","deadline"]},"required":{"type":"boolean"},"param":{"type":["string","null"]},"due_at_raw":{"type":["string","null"]}},"required":["challenge_id","cohort","req_id","req_title","req_kind","required"]} 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라. 첫째 req_kind 가 min_length 나 image_attached 인데 param 이 null 이라 기준값이 빠진 행, 둘째 같은 challenge_id 안에서 req_title 이 똑같은 행, 셋째 week_no 나 due_at_raw 가 null 이거나 연도가 빠진 날짜 표기인 행, 넷째 required 가 false 인 요건만으로 이루어진 챌린지, 다섯째 param 의 도구 목록에 활동 항목에서는 한 번도 나오지 않는 도구만 적힌 행. 요건 정의와 수집 항목이 서로 어긋나는 행이 있어야 판정 사유가 화면에 드러납니다. 형식을 깨뜨리는 시도는 3건까지 별도로 만들어 주세요.{"type":"object","properties":{"challenge_id":{"type":"string"},"cohort":{"type":"string"},"week_no":{"type":["integer","null"]},"req_id":{"type":"string"},"req_title":{"type":"string"},"req_kind":{"type":"string","enum":["tool_named","before_after","artifact_link","image_attached","min_length","deadline"]},"required":{"type":"boolean"},"param":{"type":["string","null"]},"due_at_raw":{"type":["string","null"]}},"required":["challenge_id","cohort","req_id","req_title","req_kind","required"]}| TypeScript | 로컬에서 읽은 항목과 요건 판정 결과와 화면 상태를 같은 타입으로 묶고, 앱 안으로 들어오는 파일 메타데이터를 런타임에 검사해 형식이 어긋난 항목이 초안까지 흘러가지 않게 막습니다. |
| React | 폴더 지정과 수집된 항목 목록과 요건별 근거 붙이기와 초안 편집기가 한 화면에서 맞물리는 인증 작성 화면을 만들고, 근거를 빼거나 더할 때마다 요건 충족 여부와 내보내기 단추 상태를 다시 계산합니다. |
| Electron | 브라우저가 닿지 못하는 사용자 폴더를 읽는 데스크톱 앱 껍데기를 만들고, 파일 접근은 메인 프로세스에만 두어 화면 쪽 코드가 임의 경로를 열지 못하게 경계를 나눕니다. 맥과 윈도우 설치 파일도 여기서 나옵니다. |
| Python | 요건 정의와 수집 항목을 대조해 요건별 근거를 고르는 판정 규칙과, 기수 단위 인증 현황을 집계하는 백엔드를 만듭니다. |
| PostgreSQL | 내보낸 인증 글과 요건 판정과 참가자가 고친 이력을 저장하고, 어느 요건에서 참가자들이 자주 막히는지를 쿼리로 직접 집계합니다. |
| AWS | 2주차부터 파이썬 백엔드와 PostgreSQL 을 AWS 로 배포해 스터디장 화면을 실제 주소로 띄우고, 앱이 보내는 인증 결과를 그 서버가 받습니다. |
| GitHub Actions | 맥과 윈도우 설치 파일 빌드와 E2E 테스트 실행을 CI 로 묶어, 손으로 빌드하지 않고도 매주 릴리스가 나오게 합니다. |
| Playwright | 폴더 지정부터 근거 붙이기와 내보내기까지의 흐름을 E2E 테스트로 고정해, 요건 규칙을 고칠 때 내보내기 단추가 잘못 열리는 회귀를 잡습니다. |
| LLM API (Claude) | 붙은 근거 항목만 재료로 인증 글 초안 문장을 만들고, 요건 충족 여부 판정에는 쓰지 않습니다. |
✓ pass → 그대로 멈춰도 완결입니다. 더 키우려면 2주차에서 내보낸 인증 결과를 서버에 모아 기수 현황 화면을 만듭니다.
✓ pass → 여기까지도 완결입니다. 더 키우려면 3주차에서 고친 자리를 모아 규칙을 손보고 자동 빌드와 E2E 테스트로 릴리스를 묶습니다.
참가자 한 명의 이번 주 인증 글 초안입니다. 요건마다 규칙이 고른 근거와 사유를 담고, 그 위에 초안 문장과 내보내기 가능 여부를 얹습니다.
{"type":"object","properties":{"draft_id":{"type":"string"},"challenge_id":{"type":"string"},"member_id":{"type":"string"},"requirement_status":{"type":"array","items":{"type":"object","properties":{"req_id":{"type":"string"},"met":{"type":"boolean"},"evidence_item_ids":{"type":"array","items":{"type":"string"}},"reason_code":{"type":"string"}}}},"draft_markdown":{"type":["string","null"]},"cited_item_ids":{"type":"array","items":{"type":"string"}},"blocking_req_ids":{"type":"array","items":{"type":"string"}},"exportable":{"type":"boolean"},"hedge":{"type":["string","null"]}},"required":["draft_id","challenge_id","member_id","requirement_status","cited_item_ids","blocking_req_ids","exportable"]}[
{
"draft_id": "DR-2001",
"challenge_id": "CH-23-W3",
"member_id": "MB-101",
"requirement_status": [
{
"req_id": "RQ-1",
"met": true,
"evidence_item_ids": [
"IT-1001"
],
"reason_code": "tool_matched:claude"
},
{
"req_id": "RQ-2",
"met": true,
"evidence_item_ids": [
"IT-1004",
"IT-1003"
],
"reason_code": "before_after_pair_found"
},
{
"req_id": "RQ-3",
"met": true,
"evidence_item_ids": [
"IT-1003"
],
"reason_code": "artifact_file_found"
},
{
"req_id": "RQ-4",
"met": true,
"evidence_item_ids": [
"IT-1002"
],
"reason_code": "image_count:1"
},
{
"req_id": "RQ-5",
"met": true,
"evidence_item_ids": [
"IT-1001"
],
"reason_code": "within_due_at"
}
],
"draft_markdown": "## 이번 주 실습: 회의록 요약 자동화\\n- 쓴 도구: Claude\\n- 하기 전: output_before.md 는 회의 전문을 그대로 붙여 놓은 상태였습니다.\\n- 하고 나서: output_after.md 에 결정사항 3건과 담당자 2명과 기한 1건만 남았습니다.\\n- 첨부: 2026-05-18 21:52 화면 캡처 1장",
"cited_item_ids": [
"IT-1001",
"IT-1002",
"IT-1003",
"IT-1004"
],
"blocking_req_ids": [],
"exportable": true,
"hedge": "초안 문장은 붙은 항목의 제목과 발췌만 놓고 쓴 것이라 실습에서 실제로 무엇이 어려웠는지는 담고 있지 않습니다."
},
{
"draft_id": "DR-2002",
"challenge_id": "CH-23-W3",
"member_id": "MB-102",
"requirement_status": [
{
"req_id": "RQ-1",
"met": true,
"evidence_item_ids": [
"IT-1005"
],
"reason_code": "tool_alias_matched:챗지피티"
},
{
"req_id": "RQ-2",
"met": false,
"evidence_item_ids": [],
"reason_code": "no_before_after_pair"
},
{
"req_id": "RQ-3",
"met": true,
"evidence_item_ids": [
"IT-1006"
],
"reason_code": "artifact_link_found"
},
{
"req_id": "RQ-4",
"met": false,
"evidence_item_ids": [],
"reason_code": "no_image_item"
},
{
"req_id": "RQ-5",
"met": false,
"evidence_item_ids": [],
"reason_code": "captured_at_missing"
}
],
"draft_markdown": null,
"cited_item_ids": [
"IT-1005",
"IT-1006"
],
"blocking_req_ids": [
"RQ-2",
"RQ-5"
],
"exportable": false,
"hedge": "대화 파일에 만든 시각이 없어 마감 안 기록인지 확인되지 않았습니다. 참가자가 직접 시각을 적어 넣어야 판정이 다시 돕니다."
},
{
"draft_id": "DR-2003",
"challenge_id": "CH-23-W3",
"member_id": "MB-103",
"requirement_status": [
{
"req_id": "RQ-1",
"met": true,
"evidence_item_ids": [
"IT-1008"
],
"reason_code": "tool_alias_matched:클로드"
},
{
"req_id": "RQ-2",
"met": false,
"evidence_item_ids": [],
"reason_code": "no_before_after_pair"
},
{
"req_id": "RQ-3",
"met": false,
"evidence_item_ids": [],
"reason_code": "no_artifact_item"
},
{
"req_id": "RQ-4",
"met": false,
"evidence_item_ids": [],
"reason_code": "image_empty_file:IT-1007"
},
{
"req_id": "RQ-5",
"met": false,
"evidence_item_ids": [
"IT-1008"
],
"reason_code": "after_due_at:2026-05-21 08:30"
}
],
"draft_markdown": null,
"cited_item_ids": [
"IT-1008"
],
"blocking_req_ids": [
"RQ-2",
"RQ-3",
"RQ-5"
],
"exportable": false,
"hedge": null
},
{
"draft_id": "DR-2004",
"challenge_id": "CH-23-W3",
"member_id": "MB-104",
"requirement_status": [
{
"req_id": "RQ-1",
"met": true,
"evidence_item_ids": [
"IT-1010"
],
"reason_code": "tool_matched:chatgpt"
},
{
"req_id": "RQ-2",
"met": false,
"evidence_item_ids": [],
"reason_code": "no_before_after_pair"
},
{
"req_id": "RQ-3",
"met": false,
"evidence_item_ids": [],
"reason_code": "unknown_challenge_id:CH-9999"
},
{
"req_id": "RQ-4",
"met": false,
"evidence_item_ids": [],
"reason_code": "no_image_item"
},
{
"req_id": "RQ-5",
"met": true,
"evidence_item_ids": [
"IT-1010"
],
"reason_code": "within_due_at"
}
],
"draft_markdown": null,
"cited_item_ids": [
"IT-1010"
],
"blocking_req_ids": [
"RQ-2",
"RQ-3"
],
"exportable": false,
"hedge": "결과물 파일이 등록되지 않은 챌린지를 가리켜 근거로 세지 않았습니다. 참가자가 챌린지를 다시 지정하면 판정이 바뀝니다."
}
][자동 검증] 1. 초안 JSON 이 위 스키마를 통과하는지 확인합니다. requirement_status 의 req_id 가 그 챌린지의 요건 정의에 없으면 그 행을 버립니다. 2. met 값을 활동 항목과 요건 정의로 다시 계산해 같은 값이 나오는지 대조합니다. 규칙이 정하는 값이라 재계산 결과가 다르면 그 자체가 결함입니다. 3. exportable 이 true 이면 required 가 true 인 요건이 모두 met 이어야 하고 blocking_req_ids 가 비어 있어야 합니다. 필수 요건이 빈 채로 내보내기가 열리는 일을 막기 위해서입니다. 4. met 이 true 인 요건은 evidence_item_ids 가 비어 있지 않아야 하고, 그 항목이 실제로 수집된 항목이어야 합니다. 5. draft_markdown 에 등장하는 도구 이름과 파일 이름과 시각이 cited_item_ids 의 원본 값과 글자 그대로 일치해야 합니다. 하나라도 어긋나면 초안을 버리고 다시 생성합니다. 6. draft_markdown 이 null 이 아니면 exportable 판정과 무관하게 blocking_req_ids 의 요건 내용을 인증된 사실처럼 쓰지 않았는지 문자열 대조로 확인합니다. [수동 검증] 1. 초안 20건을 참가자 시선으로 읽어 하지 않은 실습을 한 것처럼 읽히는 문장이 없는지 확인합니다. 2. 근거가 붙지 않은 요건 20건을 열어 사람이 보기에도 정말 근거가 없는지, 아니면 규칙이 놓친 항목이 있는지 확인합니다.