스퀘어스
경력근거: 큐샵은 사용자가 자연어만으로 웹사이트의 UI부터 비즈니스 로직까지 구현할 수 있는 웹사이트 특화 풀스택 바이브코딩 제품을 만들고 있습니다.
※ 실제 산출물이 아닌 AI 예측 시안입니다.
스퀘어스는 '사용자가 자연어만으로 웹사이트의 UI부터 비즈니스 로직까지 구현할 수 있는 웹사이트 특화 풀스택 바이브코딩 제품'을 만들고, 큐샵AI에는 이미 바이브코딩 초기 버전이 나가 있습니다. 말로 넣은 요청이 실제 사이트 설정에 반영됐는지 대조하는 화면은 개설 사이트 15만개가 쌓인 큐샵의 설정 구조 위에서만 성립하고, 사장들이 부르는 별칭 사전도 큐샵 편집기의 설정 이름이 있어야 채워집니다. 큐샵의 사이트 렌더링 엔진과 배포 구조 전문성은 주장하지 않습니다.
공고가 '사용자가 자연어만으로 웹사이트의 UI부터 비즈니스 로직까지 구현할 수 있는' 제품을 만든다고 밝힙니다. 말로 넣은 요청이 실제 설정에 반영됐는지 대조하는 화면이 그 제품의 뒷단입니다.
주요 업무에 'AI Knowledge Base와 Context Engineering 시스템을 설계합니다'가 있습니다. 설정 이름과 별칭을 담은 사전이 그 지식베이스의 가장 작은 단위입니다.
자격요건이 'React, Next.js 기반의 프론트엔드'와 'Node.js, NestJS 기반의 백엔드 API'를 함께 요구합니다. 대조 규칙은 Node.js 와 NestJS, 판정 화면은 Next.js 로 나눠 만듭니다.
사장이 큐샵AI에 말로 넣은 요청을 설정 사전의 별칭으로 맞추고, 요청 값과 사이트 저장값을 같은 기준 단위로 바꿔 견준 뒤 판정 사유별로 요청을 나눠 보여줍니다. 판정은 설정 사전과 단위 계수표가 정한 규칙이 내립니다. 모델은 규칙이 사유를 정한 다음에야 들어와 그 결과를 사장이 읽는 한 문장으로 옮깁니다.
큐샵으로 자기 브랜드 사이트를 연 사장입니다. 코드는 모르니 큐샵AI에 말로 시켜 화면과 판매 조건을 바꾸는데, 말한 대로 됐는지는 사이트를 직접 열어 한 페이지씩 눌러 봐야 알 수 있어서 손님이 알려 준 뒤에야 어긋난 곳을 발견하는 자리에 있습니다.
사장 말투로 들어온 설정 이름과 값이 표기마다 달라도, 설정 사전의 별칭과 단위 계수표를 읽어 규칙으로 기준 단위까지 맞추면 요청마다 반영 여부와 어긋난 자리가 정해집니다.
요청 기록과 사이트 상태 기록을 올리면 요청마다 설정 사전으로 이름을 맞추고 값을 기준 단위로 바꿔, 판정 사유별로 나눈 요청 목록과 근거를 보여주는 화면입니다. 큐샵 내부 연동 없이 두 기록을 CSV 내려받기 파일로 받습니다.
사장 2명이 사이트를 직접 열어 매긴 확인 결과를 도구 판정과 나란히 놓아 일치도를 재고, 화면에서 고친 설정 사전으로 같은 기록을 한 번 더 판정합니다. 이 주차 화면과 판정 결과는 AWS 에 올려 운영합니다.
어긋난 요청마다 큐샵AI에 다시 넣을 수정 요청 문안을 뽑고, 사장이 고른 건만 내보내는 사이클을 한 바퀴 돌립니다.
사장이 요청 기록과 사이트 상태 기록을 올리면 요청마다 판정과 근거가 몇 초 안에 나옵니다.
단위 표기가 섞이고 저장값이 비어 있는 상태 기록 30종을 밀어 넣어도 목록이 끝까지 그려지고 요청마다 사유가 붙습니다.
화면에 실은 근거 값이 요청 행·상태 행의 값과 어긋나지 않습니다 100%. 어긋난 판정은 목록에 내보내지 않습니다
측정: 근거 대조 규칙, 표본: 판정 항목 40건
진짜 성능 검증은 여기서 멈춥니다. 위 수치는 작성자가 만든 더미데이터 자가채점이며, 실제 반영 판정 정확도는 스퀘어스 큐샵 운영 데이터와 실제 사장 확인이 있어야 잽니다. 이 포트폴리오는 그 측정을 바로 돌릴 수 있는 상태까지 만듭니다.
수치는 합성 데이터 자가채점이라 성능 증명이 아닙니다. 면접에서는 데모 동작과 실측 준비 상태로 솔직히 설명합니다.
정답을 작성자가 만들었으니 잘 맞는 것이 당연합니다. 저장값이 비어 있는 기록, 같은 점검 번호가 중복으로 들어온 기록, 사장 말투의 표기 흔들림, 경계 케이스를 더미에 일부러 섞어 쉬운 문제만 푸는 게 아님을 보입니다.
이 포트폴리오가 보여주는 것은 요청 값 파싱과 대조 규칙, 판정 화면 구현입니다. 큐샵의 사이트 렌더링 엔진과 배포 구조 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
요청대로라는 판정이 손님 눈에 보이는 화면이 옳다는 뜻은 아닙니다. 이 화면은 설정값이 같은지까지만 말하고 실제 렌더링 결과는 단정하지 않습니다.
실제 도입에서는 설정 이름과 값 종류가 큐샵 편집기 버전마다 다릅니다. 설정 사전과 단위 계수표를 운영 데이터로 다시 채우는 것이 도입 단계 과제입니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
사장이 큐샵AI에 말로 넣은 요청을 큐샵AI가 뽑아 적어 둔 표입니다. 설정 이름과 값이 사장 말투 그대로라 표기가 흔들리고, 편집기 버튼으로 들어온 요청은 발화 원문이 비어 있습니다
| request_id | site_id | page_path | target_setting | requested_value | requested_at | request_text_raw |
|---|---|---|---|---|---|---|
| REQ-2026-0801 | SITE-10421 | /checkout | 무료배송 기준 | 3만원 | 2026-08-24T10:12 | 결제 페이지 무료배송 기준 3만원으로 맞춰줘 |
| REQ-2026-0802 | SITE-10421 | /checkout | 무료 배송 기준 | 5만원 | 2026-08-25T09:40 | 무료 배송 기준 5만원으로 올려줘 |
| REQ-2026-0803 | SITE-10421 | /product/1042 | 반품 기간 | 14일 | 2026-08-25T11:05 | 상품 상세에서 반품 기간 14일로 바꿔줘 |
| REQ-2026-0804 | SITE-10421 | /product/1042 | 옵션 선택 | 켜기 | 2026-08-25T11:07 | 상품 상세에 옵션 선택 영역 켜줘 |
| REQ-2026-0805 | SITE-10422 | /about | 문의 버튼 | 켜기 | 2026-08-26T14:20 | 회사소개 페이지에 문의 버튼 띄워줘 |
{"type":"object","properties":{"request_id":{"type":"string"},"site_id":{"type":"string"},"page_path":{"type":"string"},"target_setting":{"type":"string"},"requested_value":{"type":"string"},"requested_at":{"type":"string"},"request_text_raw":{"type":["string","null"]}},"required":["request_id","site_id","page_path","target_setting","requested_value","requested_at","request_text_raw"]} 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: request_text_raw 가 null 인 편집기 버튼 요청(결측), 같은 설정을 '무료배송 기준'·'무료 배송 기준'·'무배 기준' 으로 부른 행(표기 흔들림), requested_value 를 '5만원'·'50,000원'·'2주'·'14일'·'0원'·'켜기' 처럼 단위와 자릿수 표기를 섞어 적은 행, 사전 별칭에 없는 사장 말투(미등록 표기). page_path 는 /checkout·/product/<숫자>·/about·/contact 처럼 큐샵 사이트에서 실제로 쓰는 경로로 적고, requested_at 은 상태 점검 시각보다 앞선 값으로 둬라. 형식 깨뜨리기 시도 3건도 별도로 만들어라.{"type":"object","properties":{"request_id":{"type":"string"},"site_id":{"type":"string"},"page_path":{"type":"string"},"target_setting":{"type":"string"},"requested_value":{"type":"string"},"requested_at":{"type":"string"},"request_text_raw":{"type":["string","null"]}},"required":["request_id","site_id","page_path","target_setting","requested_value","requested_at","request_text_raw"]}사이트를 열어 페이지마다 설정과 저장값을 훑어 담은 점검 기록입니다. 저장값이 비어 있는 줄이 있고, 같은 점검 번호가 중복으로 두 줄 들어온 기록도 그대로 둡니다
| state_no | site_id | page_path | page_name | setting_name | setting_value | checked_at |
|---|---|---|---|---|---|---|
| ST-2026-0824-01 | SITE-10421 | /checkout | 결제 | 무료배송 기준금액 | 30000 | 2026-08-24T22:00 |
| ST-2026-0825-02 | SITE-10421 | /checkout | 결제 | 무료배송 기준금액 | 5000 | 2026-08-25T10:30 |
| ST-2026-0825-03 | SITE-10421 | /product/1042 | 상품 상세 | 반품 가능 기간 | 7 | 2026-08-25T11:30 |
| ST-2026-0827-04 | SITE-10421 | /checkout | 결제 | 반품 가능 기간 | 14 | 2026-08-27T11:00 |
| ST-2026-0826-05 | SITE-10422 | /checkout | 결제 | 최소 주문금액 | 0 | 2026-08-26T15:30 |
{"type":"object","properties":{"state_no":{"type":"string"},"site_id":{"type":"string"},"page_path":{"type":"string"},"page_name":{"type":["string","null"]},"setting_name":{"type":"string"},"setting_value":{"type":["string","null"]},"checked_at":{"type":"string"}},"required":["state_no","site_id","page_path","page_name","setting_name","setting_value","checked_at"]} 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: setting_value 가 null 인 줄과 page_name 이 null 인 줄(결측), 같은 state_no 가 두 줄인 기록(중복), 같은 site_id·page_path·setting_name 에 시각이 다른 줄을 둘 이상 둬서 요청 시각 이후 최신 한 줄을 골라야 하게 만든 기록, setting_value 를 '30000'·'5000'·'14'·'켜기' 처럼 문자열로 저장한 줄. 한 사이트에 페이지를 넷 이상 두고 어떤 페이지에는 요청된 설정이 아예 없게 둬라. 형식 깨뜨리기 시도 3건도 별도로 만들어라.{"type":"object","properties":{"state_no":{"type":"string"},"site_id":{"type":"string"},"page_path":{"type":"string"},"page_name":{"type":["string","null"]},"setting_name":{"type":"string"},"setting_value":{"type":["string","null"]},"checked_at":{"type":"string"}},"required":["state_no","site_id","page_path","page_name","setting_name","setting_value","checked_at"]}큐샵 편집기가 쓰는 설정 이름과 사장들이 실제로 부르는 별칭을 이어 둔 사전입니다. 띄어쓰기만 다른 별칭도 각각 한 줄로 등록해 둡니다. 요청 행에는 이 값이 들어가지 않고 대조할 때 읽어 씁니다
| alias_no | setting_key | canonical_name | alias_raw | value_type | base_unit |
|---|---|---|---|---|---|
| AL-1001 | free_shipping_threshold | 무료배송 기준금액 | 무료배송 기준 | money | 원 |
| AL-1002 | free_shipping_threshold | 무료배송 기준금액 | 무료 배송 기준 | money | 원 |
| AL-1003 | free_shipping_threshold | 무료배송 기준금액 | 무배 기준 | money | 원 |
| AL-1004 | return_period_days | 반품 가능 기간 | 반품 기간 | duration | 일 |
| AL-1005 | return_period_days | 반품 가능 기간 | 교환·반품 기간 | duration | 일 |
{"type":"object","properties":{"alias_no":{"type":"string"},"setting_key":{"type":"string"},"canonical_name":{"type":"string"},"alias_raw":{"type":"string"},"value_type":{"type":"string","enum":["money","duration","count","toggle","text"]},"base_unit":{"type":["string","null"]}},"required":["alias_no","setting_key","canonical_name","alias_raw","value_type","base_unit"]} 쉬운 데이터만 만들지 말 것. 한 setting_key 에 별칭을 둘 이상 달고, 그중에는 띄어쓰기만 다른 별칭('무료배송 기준'과 '무료 배송 기준')과 사장들이 줄여 부르는 말('무배 기준')을 함께 넣어라. value_type 은 money·duration·count·toggle·text 를 고루 섞고, toggle·text 의 base_unit 은 null 로 둬라. canonical_name 은 큐샵 편집기 화면에 뜨는 이름으로 적고 alias_raw 와 다르게 써라. 형식 깨뜨리기 시도 3건도 별도로 만들어라.{"type":"object","properties":{"alias_no":{"type":"string"},"setting_key":{"type":"string"},"canonical_name":{"type":"string"},"alias_raw":{"type":"string"},"value_type":{"type":"string","enum":["money","duration","count","toggle","text"]},"base_unit":{"type":["string","null"]}},"required":["alias_no","setting_key","canonical_name","alias_raw","value_type","base_unit"]}값 원문에 섞여 나오는 단위 표기를 기준 단위로 바꾸는 계수표입니다. 계수표에 없는 표기는 바꾸지 않고 원문 그대로 견줍니다
| unit_raw | unit_code | value_type | base_unit | to_base_factor |
|---|---|---|---|---|
| 원 | KRW | money | 원 | 1 |
| 만원 | KRW | money | 원 | 10,000 |
| 만 원 | KRW | money | 원 | 10,000 |
| 만 | KRW | money | 원 | 10,000 |
| 천원 | KRW | money | 원 | 1,000 |
{"type":"object","properties":{"unit_raw":{"type":"string"},"unit_code":{"type":"string"},"value_type":{"type":"string","enum":["money","duration","count"]},"base_unit":{"type":"string"},"to_base_factor":{"type":"number"}},"required":["unit_raw","unit_code","value_type","base_unit","to_base_factor"]} 쉬운 데이터만 만들지 말 것. 같은 뜻을 가리키는 서로 다른 표기를 함께 넣어라('만원'과 '만 원', '개월'과 '달'). to_base_factor 는 1 이 아닌 값을 절반 가까이 두고, value_type 이 다른데 표기가 비슷한 단위도 섞어라. 사장들이 실제로 쓰지만 계수표에 일부러 넣지 않을 표기(‘일주일’·‘반달’)는 요청 쪽에만 두어 원문 그대로 견주는 경로가 생기게 하라. 형식 깨뜨리기 시도 3건도 별도로 만들어라.{"type":"object","properties":{"unit_raw":{"type":"string"},"unit_code":{"type":"string"},"value_type":{"type":"string","enum":["money","duration","count"]},"base_unit":{"type":"string"},"to_base_factor":{"type":"number"}},"required":["unit_raw","unit_code","value_type","base_unit","to_base_factor"]}| Node.js | 요청 기록과 상태 기록을 읽어 설정 사전과 맞추는 대조 러너를 맡습니다 |
| NestJS | 두 기록 파일을 받아 판정 결과를 돌려주는 `POST /verdicts` 를 맡습니다 |
| Next.js | 화면 셸과 기록 파일 업로드 라우트를 맡습니다 |
| React | 판정 사유별로 나눈 요청 목록과 근거 상세를 그립니다 |
| TypeScript | 값 파싱과 대조 규칙을 타입으로 고정하고 응답 형식을 런타임에 거릅니다 |
| AWS | 2주차부터 ECS 와 S3 로 배포해 기록 파일과 판정 결과를 운영합니다 |
| LLM | 규칙이 매긴 판정 카드를 받아 어느 페이지의 어떤 값이 얼마나 다른지 사장이 읽는 문장으로 적습니다 |
| RAG | 설정 사전이 수천 줄로 커지면 별칭 후보를 임베딩으로 먼저 좁히고 최종 매칭은 규칙이 정합니다 |
| Claude | Claude Haiku 로 요약 문장을 씁니다 |
| GPT | GPT-4o-mini 로 3주차에 어긋난 요청마다 큐샵AI에 다시 넣을 수정 요청 문안을 뽑습니다 |
| ChatGPT | 요약 문장과 수정 요청 문안 프롬프트를 ChatGPT 화면에서 먼저 다듬어 few-shot 예시를 고릅니다 |
| Gemini | Gemini Flash 를 예비 모델로 두고 같은 프롬프트로 요약 품질과 응답 시간을 견줍니다 |
✓ pass → 그대로 멈춰도 완성품입니다. 더 키우려면 2주차 사장 확인 대조로 갑니다.
✓ pass → 여기서 멈춰도 완결입니다. 더 키우려면 3주차 수정 요청 문안 사이클로 갑니다.
위 예측 UI 는 3주차까지 완주했을 때의 화면입니다. 1주차에 실제로 만드는 것은 아래 표시된 화면 하나입니다.
verdict사유 라벨 · request_id + 한 줄 요약(근거 수치 포함)화면·코드·면접에서 이 단어를 그대로 씁니다. 키는 출력 스키마의 enum 과 같습니다.
as_requested요청대로value_differs값 어긋남setting_missing설정 없음applied_to_other_page다른 페이지에 반영요청 하나의 판정 카드입니다. 판정 사유와 기준 단위로 바꾼 두 값, 그 계산에 쓰인 근거 행을 담습니다
{"type":"object","properties":{"request_id":{"type":"string"},"verdict":{"type":"string","enum":["as_requested","value_differs","setting_missing","applied_to_other_page"]},"setting_key":{"type":["string","null"]},"requested_norm":{"type":["string","null"],"description":"요청 값 원문에서 숫자와 단위 표기를 떼어 value_unit_scale.to_base_factor 를 곱한 뒤 setting_catalog.base_unit 으로 적은 값입니다. 값 종류가 toggle 이면 켜기·끄기 두 값으로, text 면 앞뒤 공백만 지운 원문으로 적습니다."},"site_norm":{"type":["string","null"],"description":"사이트 저장값을 requested_norm 과 같은 식으로 바꾼 값입니다. 저장값이 비어 있으면 null 입니다."},"found_page_path":{"type":["string","null"],"description":"요청한 페이지에는 없고 같은 사이트의 다른 페이지에서 요청 값이 확인된 경우 그 페이지 경로입니다."},"evidence":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{"type":["string","number","null"]},"agg":{"type":"string","enum":["count","sum","avg","min","max"]}},"required":["field","value"]}},"summary":{"type":"string"}},"required":["request_id","verdict","setting_key","requested_norm","site_norm","found_page_path","evidence","summary"]}[
{
"request_id": "REQ-2026-0801",
"verdict": "as_requested",
"setting_key": "free_shipping_threshold",
"requested_norm": "30000",
"site_norm": "30000",
"found_page_path": null,
"evidence": [
{
"field": "request_id",
"value": "REQ-2026-0801"
},
{
"field": "requested_value",
"value": "3만원"
},
{
"field": "to_base_factor",
"value": 10000
},
{
"field": "state_no",
"value": "ST-2026-0824-01"
},
{
"field": "setting_value",
"value": "30000"
}
],
"summary": "3만원을 30000원으로 바꾼 값이 결제 페이지 저장값 30000원과 같아 말한 대로 반영됐습니다."
},
{
"request_id": "REQ-2026-0808",
"verdict": "as_requested",
"setting_key": "return_period_days",
"requested_norm": "14",
"site_norm": "14",
"found_page_path": null,
"evidence": [
{
"field": "request_id",
"value": "REQ-2026-0808"
},
{
"field": "requested_value",
"value": "2주"
},
{
"field": "to_base_factor",
"value": 7
},
{
"field": "state_no",
"value": "ST-2026-0827-04"
},
{
"field": "setting_value",
"value": "14"
}
],
"summary": "2주를 14일로 바꾼 값이 결제 페이지 반품 가능 기간 14일과 같아 말한 대로 반영됐습니다."
},
{
"request_id": "REQ-2026-0802",
"verdict": "value_differs",
"setting_key": "free_shipping_threshold",
"requested_norm": "50000",
"site_norm": "5000",
"found_page_path": null,
"evidence": [
{
"field": "request_id",
"value": "REQ-2026-0802"
},
{
"field": "target_setting",
"value": "무료 배송 기준"
},
{
"field": "alias_no",
"value": "AL-1002"
},
{
"field": "requested_value",
"value": "5만원"
},
{
"field": "to_base_factor",
"value": 10000
},
{
"field": "state_no",
"value": "ST-2026-0825-02"
},
{
"field": "setting_value",
"value": "5000"
}
],
"summary": "띄어 쓴 '무료 배송 기준'을 사전 별칭 AL-1002 로 맞춰 무료배송 기준금액을 봤더니, 요청한 50000원과 달리 결제 페이지에는 5000원이 저장돼 있습니다."
},
{
"request_id": "REQ-2026-0807",
"verdict": "value_differs",
"setting_key": "product_per_row",
"requested_norm": "4",
"site_norm": null,
"found_page_path": null,
"evidence": [
{
"field": "request_id",
"value": "REQ-2026-0807"
},
{
"field": "requested_value",
"value": "4개"
},
{
"field": "state_no",
"value": "ST-2026-0827-07"
},
{
"field": "state_no",
"agg": "count",
"value": 2
},
{
"field": "setting_value",
"value": null
}
],
"summary": "같은 점검 번호 ST-2026-0827-07 이 두 줄이라 뒤 줄을 버리고 한 줄로 셌고, 한 줄 상품 수 저장값이 비어 있어 요청한 4개와 다릅니다."
},
{
"request_id": "REQ-2026-0804",
"verdict": "setting_missing",
"setting_key": "option_selector_visible",
"requested_norm": "켜기",
"site_norm": null,
"found_page_path": null,
"evidence": [
{
"field": "request_id",
"value": "REQ-2026-0804"
},
{
"field": "target_setting",
"value": "옵션 선택"
},
{
"field": "page_path",
"value": "/product/1042"
},
{
"field": "setting_name",
"value": "반품 가능 기간"
}
],
"summary": "옵션 선택 영역이 상품 상세 페이지에도 같은 사이트의 다른 페이지에도 없어, 요청한 설정 자체가 사이트에 생기지 않았습니다."
},
{
"request_id": "REQ-2026-0805",
"verdict": "applied_to_other_page",
"setting_key": "contact_button_visible",
"requested_norm": "켜기",
"site_norm": "켜기",
"found_page_path": "/contact",
"evidence": [
{
"field": "request_id",
"value": "REQ-2026-0805"
},
{
"field": "page_path",
"value": "/about"
},
{
"field": "state_no",
"value": "ST-2026-0826-06"
},
{
"field": "setting_name",
"value": "문의 버튼 노출"
},
{
"field": "setting_value",
"value": "켜기"
}
],
"summary": "회사소개 페이지에는 문의 버튼 노출 설정이 없고 같은 사이트의 문의 페이지에 켜기로 들어가 있어, 요청한 페이지가 아닌 곳에 반영됐습니다."
}
][자동 검증 · 매 실행] 1. verdict 가 as_requested·value_differs·setting_missing·applied_to_other_page 네 값 안에 있는지 봅니다. 2. request_id·verdict·setting_key·requested_norm·site_norm·found_page_path·evidence·summary 필드가 모든 판정 카드에 존재하는지 봅니다. 3. requested_norm 을 요청 값 원문의 숫자와 value_unit_scale.to_base_factor 의 곱으로 다시 계산해 값이 같은지 봅니다. site_norm 도 사이트 저장값으로 같은 식을 다시 계산해 봅니다. 4. 판정 카드가 선언한 JSON Schema 형식을 지키는지 봅니다. 5. agg 가 없는 evidence 의 value 가 요청 행·상태 행·사전 행에 수록된 값 그대로인지 봅니다. 여러 행에서 센 수치는 agg 에 count 를 적습니다. 6. 판정 카드마다 evidence 항목이 3개 이상인지 봅니다. 7. evidence 의 field 가 ai_build_requests·site_state·setting_catalog·value_unit_scale 의 컬럼에 실재하는지 봅니다. 8. summary 가 존댓말 한 문장으로 끝나는지 봅니다. 9. 요청 시각 이후부터 같은 site_id·page_path·설정 키의 다음 요청 시각 전까지 들어온 상태 기록 중 최신 한 줄을 견줄 저장값으로 정하고, 다음 요청이 없으면 요청 시각 이후 기록 전부에서 고릅니다. requested_norm 과 site_norm 이 다르면 verdict 는 value_differs 입니다. 요청한 페이지의 setting_name 에 그 설정이 없고 같은 site_id 의 다른 page_path 에 요청 값으로 있으면 verdict 는 applied_to_other_page 이고, 그 다른 페이지에도 없으면 setting_missing 입니다. 사이트 저장값이 비어 있는 줄과 같은 점검 번호가 중복으로 들어온 줄이 각각 samples 에 있습니다. [평가 러너 · 2주차] 사장 2명이 사이트를 직접 열어 매긴 확인 결과와 도구 판정의 일치도(Cohen's κ: 우연히 맞은 몫을 뺀 일치 정도, 0~1)를 잽니다. [수동 검증 · 사람이 봅니다] 1. 저장값이 비어 있는 설정을 어긋남으로 볼지 미설정으로 볼지는 큐샵 운영 담당이 정합니다. 2. 사전에 없는 사장 말투 표현이 새 설정인지 오탈자인지는 표본 20건을 눈으로 확인합니다.