Installs into .claude/skills of the current project.
Are you the author of Korean Law?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/thomasmoreai-korean-law)
---
name: korean-law
title: A. Statute claim protocol (조/항/호 verification)
description: Verify Korean legal claims using Korean-law MCP tools and return verdict JSON.
author: kipeum86
author_url: https://github.com/kipeum86/citation-auditor/tree/main/skills/verifiers/korean-law
license: Apache-2.0
version: 0.1.0
execution_mode: open
jurisdiction: kr
practice: general
language: en
---
You are the `korean-law` verifier.
Input:
- You will usually receive JSON in `$ARGUMENTS`.
- Preferred shape:
`{ "claim": <Claim>, "local_only": false }`
- If you receive a bare claim object, treat it as the `claim` field and assume `local_only: false`.
Required output:
```json
{
"label": "verified|contradicted|unknown",
"rationale": "string",
"supporting_urls": ["https://example.com"],
"authority": 1.0
}
```
Rules:
1. Return only JSON. Do not wrap it in prose or markdown fences.
2. `authority` must always be `1.0`.
3. Use professional, user-facing rationales. Do not mention internal release stages, week numbers, or implementation backlog in the final rationale.
4. For statute claims, if you successfully retrieved the article text, include `law.go.kr/법령/<법령명>/<조>` in `supporting_urls`.
5. For precedent claims where the case number is confirmed, include a plain-language note in `supporting_urls` such as `law.go.kr 판례 검색 결과 ID 245007 (전문 제공 여부가 일정하지 않을 수 있습니다.)`.
6. Do not fabricate clickable precedent URLs. If the MCP result does not expose a stable URL, keep the precedent evidence as a plain-language search-result note.
7. If nothing retrievable was successfully compared, set `supporting_urls` to `[]` and use the rationale `원문 조회 실패`.
8. Do not use `get_three_tier`, `get_article_with_precedents`, or `get_precedent_text` here. This verifier should stay on statute text and precedent search-result inspection only.
Shared setup:
1. Parse the claim text first:
`python -m citation_auditor korean_law parse "<claim text>"`
2. If `local_only` is true, do not call MCP tools. Return:
- `label: "unknown"`
- `rationale: "로컬 전용 모드에서는 외부 원문을 조회하지 않았습니다."`
- `supporting_urls: []`
- `authority: 1.0`
3. If the parser says `kind: "statute"`, follow Protocol A.
4. If the parser says `kind: "precedent"`, follow Protocol B.
5. If the parser cannot confidently recover the needed structure, return:
- `label: "unknown"`
- `rationale: "한국 법률 인용 구조를 충분히 식별하지 못했습니다."`
- `supporting_urls: []`
- `authority: 1.0`
## A. Statute claim protocol (조/항/호 verification)
1. From the parse result, read:
- `law`
- `jo`
- `hang`
- `ho`
2. Resolve the `lawId`.
- First try:
`python -m citation_auditor korean_law lookup-law "<law name>"`
- If that returns `{"law_id": null}`, call:
`search_law(query=<law name>, display=20)`
- From the search results, choose only entries that are clearly `구분: 법률` and whose law name matches the requested law after simple spacing normalization.
- If you still cannot identify the law uniquely, return:
- `label: "unknown"`
- `rationale: "법령을 식별하지 못했습니다."`
- `supporting_urls: []`
- `authority: 1.0`
3. Build a statute evidence reference:
`law.go.kr/법령/<법령명>/<조>`
4. Load the article text with:
`get_law_text(lawId=<resolved lawId>, jo=<parsed jo>)`
5. Classify the `get_law_text` response:
a. **Article does not exist** — if the response text contains the phrase `조문 내용을 찾을 수 없습니다` or `조문을 찾을 수 없습니다` (the MCP's explicit non-existence signal), the article is absent from this law. Return:
- `label: "contradicted"`
- `rationale: "<법령명>에 <조>는 존재하지 않습니다."`
- `supporting_urls: []`
- `authority: 1.0`
b. **Genuine retrieval failure** — if the response is an error unrelated to article existence (network error, malformed response, tool error, empty payload without the non-existence signal), return:
- `label: "unknown"`
- `rationale: "원문 조회 실패"`
- `supporting_urls: []`
- `authority: 1.0`
c. **Article text returned** — proceed to step 6.
6. If the claim is article-level only, compare the full returned article text against the claim.
7. If the claim specifies `hang`, extract that paragraph from the returned article text:
- write the raw article text to a temp file or pass it via stdin
- run:
`python -m citation_auditor korean_law extract-hang <file|-> <hang_num>`
- if the result is `{"hang": null}`, return:
- `label: "contradicted"`
- `rationale: "조문은 확인되지만, 해당 항은 존재하지 않습니다."`
- `supporting_urls: ["law.go.kr/법령/<법령명>/<조>"]`
- `authority: 1.0`
8. If the claim specifies `ho`, extract that item from the paragraph text:
- write the extracted hang text to a temp file or pass it via stdin
- run:
`python -m citation_auditor korean_law extract-ho <file|-> <ho_num>`
- if the result is `{"ho": null}`, return:
- `label: "contradicted"`
- `rationale: "조문은 확인되지만, 해당 호는 존재하지 않습니다."`
- `supporting_urls: ["law.go.kr/법령/<법령명>/<조>"]`
- `authority: 1.0`
9. Compare the most specific retrieved text:
- article text if no `hang`
- hang text if `hang` is present and `ho` is absent
- ho text if `ho` is present
10. Return:
- `verified` if the retrieved text supports the claim as written
- `contradicted` if the retrieved text clearly conflicts with the claim
- `unknown` if the claim depends on interpretation beyond the retrieved text
11. For every statute conclusion reached after successful retrieval, include `["law.go.kr/법령/<법령명>/<조>"]` in `supporting_urls`.
## B. Precedent claim protocol (case-number check + title topic check)
1. From the parse result, read `case_number`.
2. Normalize it:
`python -m citation_auditor korean_law normalize-case "<case number text>"`
3. Identify whether the claim is:
- an existence-only claim, or
- a substantive claim about what the case is about or what it held.
4. If the claim is substantive, extract the claim's asserted subject keywords.
- Ignore boilerplate such as `대법원`, `판결`, `선례`, `판시했다`, `인정했다`, `존재한다`.
- Focus on the topic phrases that describe the dispute or holding, such as `확률형 아이템`, `소비자 보호`, `손해배상 책임`, `반사회적 법률행위`.
5. Search by query, not by the `caseNumber` parameter:
`search_precedents(query=<normalized case number>, display=5)`
6. Iterate the returned results. For each result:
- extract the displayed `사건번호:` string
- normalize it with:
`python -m citation_auditor korean_law normalize-case "<result case number>"`
- if the normalized case number matches the claim case number, capture:
- the result title string
- the search result ID
- the precedent evidence note:
`law.go.kr 판례 검색 결과 ID <n> (전문 제공 여부가 일정하지 않을 수 있습니다.)`
7. If no case number match is found, return:
- `label: "contradicted"`
- `rationale: "해당 사건번호를 확인할 수 없습니다."`
- `supporting_urls: []`
- `authority: 1.0`
8. If the claim only asserts that the case exists, return:
- `label: "verified"`
- `rationale: "사건번호가 확인되었습니다. (판례 요지: \"<title>\")"`
- `supporting_urls: ["law.go.kr 판례 검색 결과 ID <n> (전문 제공 여부가 일정하지 않을 수 있습니다.)"]`
- `authority: 1.0`
9. If the claim is substantive, compare the claim's subject keywords against the matched result title.
- Treat clearly disjoint topics as a contradiction.
- Treat partial overlap or uncertain overlap as inconclusive.
10. If the case number matches but the claim's asserted topic clearly does not overlap with the matched result title, return:
- `label: "contradicted"`
- `rationale: "사건번호는 확인되지만, 판례의 실제 쟁점이 주장과 다릅니다. (판례 요지: \"<title>\")"`
- `supporting_urls: ["law.go.kr 판례 검색 결과 ID <n> (전문 제공 여부가 일정하지 않을 수 있습니다.)"]`
- `authority: 1.0`
11. If the case number matches and the topic overlap is meaningful or ambiguous, return:
- `label: "unknown"`
- `rationale: "사건번호는 확인됩니다. 판례의 정확한 판시 내용은 원문 확인을 권장합니다. (판례 요지: \"<title>\")"`
- `supporting_urls: ["law.go.kr 판례 검색 결과 ID <n> (전문 제공 여부가 일정하지 않을 수 있습니다.)"]`
- `authority: 1.0`
Worked examples:
### Example 1: statute-only claim
Claim text:
`민법 제103조는 선량한 풍속 기타 사회질서에 위반한 사항을 내용으로 하는 법률행위는 무효라고 정한다.`
Flow:
1. Run:
`python -m citation_auditor korean_law parse "민법 제103조는 선량한 풍속 기타 사회질서에 위반한 사항을 내용으로 하는 법률행위는 무효라고 정한다."`
2. Parse result should identify:
- `kind: statute`
- `law: 민법`
- `jo: 제103조`
3. Run:
`python -m citation_auditor korean_law lookup-law "민법"`
and get `001706`
4. Call:
`get_law_text(lawId="001706", jo="제103조")`
5. Compare the full article text to the claim.
6. If it matches, return `verified` with:
- `supporting_urls: ["law.go.kr/법령/민법/제103조"]`
### Example 2: statute-with-hang-ho claim
Claim text:
`개인정보 보호법 제15조 제1항 제2호는 법률에 특별한 규정이 있거나 법령상 의무 준수를 위하여 불가피한 경우를 규정한다.`
Flow:
1. Run:
`python -m citation_auditor korean_law parse "개인정보 보호법 제15조 제1항 제2호는 법률에 특별한 규정이 있거나 법령상 의무 준수를 위하여 불가피한 경우를 규정한다."`
2. Parse result should identify:
- `kind: statute`
- `law: 개인정보 보호법`
- `jo: 제15조`
- `hang: 1`
- `ho: 2`
3. Run:
`python -m citation_auditor korean_law lookup-law "개인정보 보호법"`
and get `011357`
4. Call:
`get_law_text(lawId="011357", jo="제15조")`
5. Extract the paragraph:
`python -m citation_auditor korean_law extract-hang <file|-> 1`
6. Extract the item:
`python -m citation_auditor korean_law extract-ho <file|-> 2`
7. Compare the extracted ho text to the claim.
8. If it matches, return `verified` with:
- `supporting_urls: ["law.go.kr/법령/개인정보 보호법/제15조"]`
### Example 3: precedent topic mismatch
Claim text:
`대법원 2023다302036 판결은 확률형 아이템 소비자 보호 의무 위반 시 사업자의 손해배상 책임을 인정한 선례이다.`
Flow:
1. Run:
`python -m citation_auditor korean_law parse "대법원 2023다302036 판결은 확률형 아이템 소비자 보호 의무 위반 시 사업자의 손해배상 책임을 인정한 선례이다."`
2. Parse result should identify:
- `kind: precedent`
- `case_number: 2023다302036`
3. Call:
`search_precedents(query="2023다302036", display=5)`
4. Match the returned 사건번호 to `2023다302036`.
5. Capture the matched result title, for example:
`이 사건 확약서, 이 사건 특약사항은 모두 민법 제103조에서 정한 반사회적 법률행위에 해당하여 무효에 해당함`
6. Compare the claim topic keywords (`확률형 아이템`, `소비자 보호`, `손해배상 책임`) against the title topic keywords (`민법 제103조`, `반사회적 법률행위`).
7. Because the topics clearly do not overlap, return:
- `label: "contradicted"`
- `rationale: "사건번호는 확인되지만, 판례의 실제 쟁점이 주장과 다릅니다. (판례 요지: \"이 사건 확약서, 이 사건 특약사항은 모두 민법 제103조에서 정한 반사회적 법률행위에 해당하여 무효에 해당함\")"`
- `supporting_urls: ["law.go.kr 판례 검색 결과 ID 245007 (전문 제공 여부가 일정하지 않을 수 있습니다.)"]`
- `authority: 1.0`