---
name: DSD푸팅
description: 회사가 준 DART 편집기 파일(dsd)이나 DART 공시 원문(xml)을 읽어 재무제표와 주석의 숫자가 서로 맞는지, 표가 아닌 글(오타 · 표현 · 주소 · 대표이사 변경 · 감사기간 · 공시 누락)이 바른지, 정산표 · 작년 보고서 · 함께 낸 연결(별도) 보고서와 맞는지 엑셀 수식으로 검증한다(감사인의 푸팅: 합계, 재무제표 ↔ 주석 레퍼, 계산, 전기, 정산표, 문장 속 금액, 주석 번호 참조). 주석을 읽고 뜻으로 연결과 합계 구조를 정의하는 일은 AI 가, 계산과 비교는 엔진과 엑셀이 한다. 표 안 합계 검증은 합계 칸 바로 옆에 TRUE 로 보이고, 오버뷰 시트에 합계 · 레퍼 · 전기 · 버전 네 가지가 신호등으로 나온다. 엑셀에 표지(결론 · 작성자 · 검토자)가 있어 조서로 편철한다. "dsd 푸팅", "DSD 검토", "다트 파일 푸팅", "레퍼 체크", "재무제표 주석 대사", "주석 숫자 맞는지", "회사 제시 dsd", "dsd 버전 비교", "수정본 뭐 바뀌었나", "전기 숫자 작년 공시와 맞는지", "주당이익 검산", "정산표랑 dsd 대사", "수정분개 반영됐나", "오타 검토", "문장 검토", "주소 바뀐 거 반영됐나", "대표이사 변경", "감사기간 맞는지"가 언급되면 트리거.
---

# DSD푸팅

dsd 한 파일로 돈다. 감사 폴더가 없어도 된다.

- 엔진: 이 스킬 폴더의 `scripts/`. 감사 엔진에서 dsd 푸팅에 쓰는 부분만 담았다(`scripts/audit/report/dsd_grid.py` 판독 · `dsd_links.py` 합계 구조와 검증 · `dsd_ai.py` AI 연결과 원문 대조 · `dsd_book.py` 엑셀 · `dsd_wtb.py` 정산표 · `dsd_text.py` 문장 검토 · `dsd_appropriation.py` 처분계산서 규칙 · `dsd_kicpa.py` 감리지적 유형 검사)
- 명령: `python scripts/run.py <read · links · foot · text> …`(스킬 폴더에서, 환경변수 `PYTHONIOENCODING=utf-8`). 옵션은 `python scripts/run.py foot -h`
- 판정 기준: `references/판정-근거.md`(연결의 등급, 안 맞을 때 정하는 순서), `references/판정-규칙-추가.md`(공시 보고서 35건에서 나온 규칙)
- 시험해 보기: `examples/모의자료/`(가상 회사 dsd 와 심어 둔 오류의 정답표). 아래 「시험해 보기」 절
- 결과 폴더는 dsd 가 있는 곳 옆에 둔다. 고객 자료를 저장소나 공유 폴더에 올리지 않는다.

## 감사인의 푸팅에서 이 스킬이 맡는 것

| 푸팅 항목 | 이 스킬에서 | 남는 일 |
|---|---|---|
| 합계(세로 · 가로) | 엔진이 찾고 AI 가 확인하는 합계 구조. 합계 칸 옆 TRUE | 회색 합계 칸은 눈으로 |
| 재무제표 ↔ 주석, 주석 ↔ 주석 레퍼 | AI 가 뜻으로 적은 연결 | 걸지 않은 연결의 이유를 읽는다 |
| 재무제표 사이(대차, 자본변동표 ↔ 재무상태표, 당기순이익, 현금) | 규칙 다섯과 AI 연결 | |
| 이익잉여금처분계산서(결손금처리계산서) | 처분계산서 규칙 다섯(아래 「처분계산서와 감리지적 유형」). 본표 절에 없으면 이익잉여금 주석 안 표를 찾는다 | |
| 감리지적 유형(특수관계자 자금거래 · 보증, 담보) | 엔진 검사(아래 「처분계산서와 감리지적 유형」). 보증 금액 비교는 「확인」, 공시가 빠졌을 수 있는 곳은 원문 대조의 「감리지적 유형: …」 알림 | 알림을 원문으로 읽고 공시 누락이면 문장 검토에 적는다 |
| 계산(주당이익, 자본금 = 주식수 × 액면, 유효세율) | `calcs` | |
| 감사한 숫자(정산표) | `--wtb`. 수정분개가 빠진 과목은 엔진이 판정을 적는다 | 정산표 최종판으로 다시 |
| 전기 금액 = 작년 보고서 | `--prior` | 재분류 공시 확인 |
| 연결 ↔ 별도 | `--pair`(자본금 규칙과 AI 의 「짝:」 연결) | |
| 문장 속 금액 | 「주석N-문장」 표로 모아 연결하거나 조서 대사로 넘긴다 | |
| 보고서 안에 맞춰 볼 곳이 없는 숫자(약정 한도, 담보, 보험, 특수관계자 거래) | `workpapers` 로 「조서 대사」 시트에 | 조서와 맞춘다 |
| 주석 번호 참조, 머리줄 기수와 날짜, 원문 표 수 | 엔진의 원문 대조(「검증 범위」 시트 끝) | |
| 수정본에서 바뀐 곳, 고쳐 달라고 한 곳이 고쳐졌는지 | `--prev`(「바뀐 곳」 시트와 검증 결과 비교) | |
| 표가 아닌 글: 오타 · 표현, 주소 · 대표이사 · 상호 변경, 회계감사 기간, 감사보고서일, 공시가 필요한데 빠진 내용 | 「문장 검토」(아래 절, `dsd text`) | 고칠지 정하기(O · X) |

푸팅의 첫 순서는 감사한 숫자와 맞추는 것이다. 정산표가 있으면 반드시 `--wtb` 를 붙인다. 정산표 없이 돌린 결과는 「dsd 안에서 서로 맞는다」 까지만 말한다.

## 맡는 일(엔진 · AI · 회계사)

| 일 | 누가 |
|---|---|
| dsd 를 재무제표와 주석 번호별 표로 읽기, 금액이 맞는 것을 근거로 표 안 합계 구조 찾기 | 엔진 |
| 표를 읽고 합계 구조를 확인하기. 엔진이 못 찾은 합계와 틀리게 찾은 합계를 뜻으로 정하기 | AI |
| 주석을 읽고 「이 칸은 저 칸과 같아야 한다」 를 정하기 | AI |
| 이름을 칸으로 풀기, 수식 걸기, 금액 비교 | 엔진과 엑셀 |
| 안 맞는 연결의 판정(숫자 오류 · 표시 오류 · 설명 부족, 식 고침, 확인, 걸지 않음, 엔진 판독). 근거는 회계기준 문단과 보고서의 문장. 판정을 쓴 에이전트와 다른 에이전트가 판정마다 다시 본다(독립 검증) | AI |
| 판정 결과 보기(O · X). 「확인」 으로 남은 차이는 조서나 회사 자료로 맞춰 보기 | 회계사 |
| 「조서 대사」 시트의 숫자를 조서와 맞추기, 회색 칸 보기 | 회계사 |
| 표지의 결론, 작성자 · 검토자 서명 | 회계사 |

AI 는 숫자를 만들거나 더하지 않는다. 금액이 맞는지는 연결을 다 적은 뒤에 엔진이 본다. 금액이 같은 칸을 찾아서 연결을 적지 않는다.

## 순서

1. **읽기 자료 만들기**: `python scripts/run.py links <dsd> --out <폴더>`. `dsd_읽기자료.md`(재무제표 넷과 주석 전부)와 `dsd_연결요청.json` 이 나온다. 요청 파일은 6번에서 본다. 표 아래 「엔진 합계」 줄은 엔진이 찾은 합계 구조, 「합계 구조를 찾지 못한 곳」 줄은 합계 줄이나 열에서 검증이 빠진 칸이다.
   - 주석마다 끝에 「주석N-문장」 표가 붙어 있으면 그 주석의 문단과 표 안 글자 칸에 적힌 금액(「3,640,000,000원의 한도」 「80억원」 「한도 3,000,000천원」)을 모은 표다. 원문에는 없다. 줄 이름은 문단 금액이면 금액 앞의 글, 표 안 글자 칸이면 「주석4-1 가은행 · 약정」 처럼 표 번호 · 줄 · 열이다. 금액은 문장에 적힌 단위(원 · 천원 · 백만원 · 억원)다. 엔진이 그 단위의 반올림 폭으로 견주니 허용 폭을 따로 적지 않는다. 표의 칸처럼 연결에 쓴다. 이름이 같은 줄은 `row_nth` 로 가른다.
   - 칸 숫자 뒤에 「천원」 「백만원」 「%」 가 붙어 있으면 그 칸에 단위가 붙어 있던 것이다. 엔진이 그 칸의 단위로 환산해 견준다. % 칸은 비율이라 합계 구조에 들어가지 않고 계산 검증에 쓴다. 「원」 「주」 가 붙은 칸은 표의 단위로 읽는다.
2. **읽기**: `dsd_읽기자료.md` 를 처음부터 끝까지 읽는다. 길면 250줄쯤씩 나눠 읽는다. 뒤 주석(현금흐름표 주석의 비현금거래, 금융상품, 재무위험관리)이 앞 주석의 연결을 바꾸므로 읽는 동안은 메모만 하고, 끝까지 읽은 뒤에 연결을 적는다. 읽기 자료가 길면 메모를 작업 폴더의 `메모.md` 에 적어 둔다. 읽다가 금액이 안 맞아 보이는 곳도 메모에 적는다. 연결과 구조는 읽다가 본 금액에 맞추지 말고 뜻으로 적는다. 주석마다 다음을 정한다.
   - 설명하는 과목: 제목, 첫 문장, 과목 옆 주석 번호로 정한다.
   - 표마다 성격: 구성 내역, 변동표, 만기분석, 일부만 담은 표(특수관계자 잔액, 외화분) 등.
   - 당기 표와 전기 표, 당기 열과 전기 열. 머리줄이 틀리게 적힌 경우는 표 제목(① 당기 ② 전기)을 따른다.
   - 칸의 뜻: 총액인지 순액인지, 취득원가인지 장부금액인지, 기초인지 기말인지.
   - 각주와 문장: 「연불구입」 「직접 차감」 「현금시재액 제외」 처럼 연결의 식을 바꾸는 말.
   - 표마다 합계 구조: 합계 · 소계 · 총계 줄과 열, 변동표의 기말, 재무제표 본표의 중간 합계가 무엇의 합인지(아래 「합계 구조」).
3. **연결 적기**: `연결.json` 을 쓴다(형식은 아래). 주석마다 재무제표나 다른 주석과 같아야 하는 칸을 하나씩 찾는다. `references/연결-유형.md` 의 주석 유형별 연결을 대조해 빠뜨린 것이 없는지 본다. 연결마다 등급(`grade`)을 함께 적는다. 곱셈 · 나눗셈은 `calcs`, 보고서 안에 맞춰 볼 곳이 없는 숫자는 `workpapers`, 걸지 않기로 한 것은 `skipped` 에 이유와 함께 적는다. 합계 구조는 `sums` 와 `no_sums` 에 적는다. 연결이 수백 건이면 파이썬 스크립트로 json 을 만든다.
4. **넣기**: `python scripts/run.py links <dsd> --apply <연결.json> --out <폴더>`.
   - 이름이 칸으로 풀리지 않으면 아무것도 넣지 않고 고칠 곳을 알려 준다. 이름을 읽기 자료의 글자대로 고쳐 다시 넣는다.
   - 「칸에 숫자가 없습니다」 가 나오면 글자 칸이다(「해당없음」, 「변동금리」). 그 연결은 `skipped` 로 옮긴다. 「346,820천원」 「27.19%」 처럼 단위가 붙은 칸은 이제 숫자로 읽는다.
   - 「엔진 합계 구조에서 안 맞는 칸」 이 나오면 그 표를 다시 읽는다. 엔진이 구조를 잘못 잡았으면 `sums` 로 다시 적거나 `no_sums` 로 뺀다. 구조가 맞으면 그대로 둔다. 합계가 내역의 합과 다른 것은 숫자 오류다.
   - 「규칙이나 합계 구조와 같아 뺀 것」 은 엔진 규칙 다섯이나 `sums` 와 같은 관계를 `links` 에도 적은 것이다. 한 번만 센다.
   - `연결.json` 은 AI 가 정한 연결과 합계 구조의 전체 목록이다. 다시 넣으면 앞서 넣은 것은 지워지고 이 목록으로 바뀐다.
   - 「합계 안 맞음 … 걸린 칸이 전부 안 맞습니다」 가 나오면 구조를 잘못 읽었을 수 있다. 그 표를 다시 읽는다. 일부 칸만 안 맞거나, 걸린 칸이 하나뿐이고 표에 다르게 읽을 줄이 없으면 그대로 둔다.
5. **다시 보기**: 안 맞는 연결이 나오면 그 주석을 다시 읽는다.
   - 이해가 틀렸으면 연결을 고친다. 고치는 근거는 주석의 제목이나 문장에 있어야 한다.
   - 이해가 맞으면 `references/판정-근거.md` 4절의 순서로 판정한다. 항등식이면 예외 근거(재분류 공시, 매각예정, 중단영업, 연결범위 변동)를 먼저 찾고, 없으면 FALSE 로 두고 원인 칸을 찾는다. 조건부면 조정 항목을 찾아 식에 넣고, 못 찾으면 `when` 을 적는다. 「회계사 확인」 으로 넘기지 않는다.
   - 금액을 맞추려고 연결을 바꾸거나 지우지 않는다. 넣기 결과에 나오는 「같은 주석에서 그 금액과 같은 칸」 은 총액과 순액을 바꿔 건 경우를 찾을 때 참고한다. 그 칸의 뜻이 맞을 때만 고친다.
6. **놓친 것 보기**: 넣으면 엔진이 `dsd_연결요청.json` 을 다시 쓴다. 세 가지를 본다.
   - `unlinked`: 주석을 가리키는데 아직 연결이 없는 과목. `skipped` 에 이유를 적어도 이 목록에서 빠지지 않는다. 남은 과목은 이유와 함께 보고에 적는다.
   - `unchecked_totals`: 합계 줄이나 열에서 합계 검증이 빠진 칸이 있는 곳(`cells` 가 빠진 칸의 열 · 줄 이름). 그 줄의 한 칸만 검증되고 다른 칸이 빠져도 나온다. 표를 읽고 `sums` 에 적거나, 합계가 아니면 `no_sums` 에 적는다. 줄의 일부 칸만 합계가 아니면 `no_sums` 에 `only` 로 그 열을 적는다. 0곳이 될 때까지 한다. 0곳이어도 표를 다 읽어야 한다.
   - `amount_evidence`: 금액이 같은데 연결이 없는 칸 짝. 뜻으로도 같아야 하는 것만 더한다. 금액이 같다는 것만으로는 걸지 않는다.
   - 숫자가 있는데 보고서 안에서 맞춰 볼 곳이 없는 표나 줄(약정 한도, 담보 제공 자산, 보험 부보금액, 특수관계자 거래 내역, 문장 속 금액)은 `workpapers` 에 무엇과 맞출지 적는다(아래 형식). 엑셀에서 하늘색 칸과 「조서 대사」 시트로 나와 회색(눈으로 볼 칸)과 갈린다.
7. **엑셀 만들기**: `python scripts/run.py foot <dsd> [--wtb <정산표>] [--prior <작년 보고서>] [--prev <기존 판>] [--pair <함께 낸 다른 보고서>] --out <폴더>`. `DSD푸팅_<dsd 이름>.xlsx` 와 `dsd_판정자료.md` 가 나온다. FALSE 나 풀지 못한 연결이 있으면 종료 코드 1 이다. 확인, 단수 차이, 전기 대사에서 작년 줄을 찾지 못한 것만 있으면 0 이다. 화면에 「원문 대조」 가 나오면 9번 보고에 적는다.
8. **판정과 독립 검증**: 판정자료(`dsd_판정자료.md`)의 FALSE · 확인마다 아래 「판정」 절대로 판정을 적고 다시 넣는다. 그다음 판정을 쓴 에이전트와 **다른 에이전트**에게 `references/판정-검증.md` 를 주고 검증을 맡긴다. 검증 결과(`판정검증.json`)를 넣고 7번을 다시 돌린다. 화면 첫 줄에 「독립 검증 n/m(바꿈 k)」 가 나온다. 검증을 거치지 않은 판정은 엑셀 「볼 것」 의 검증 열에 「검증 전」 으로 남는다.
9. **보고**: 아래 「보고」 대로. 파일은 엑셀만 보낸다. 엑셀에는 엔진이 계산한 값이 함께 저장돼 미리보기에서도 TRUE · FALSE 가 보인다(엑셀로 열면 다시 계산한다).

정산표가 있으면 7번 명령에 `--wtb <정산표.xlsx>` 를 붙인다. 재무상태표와 손익계산서의 과목을 정산표의 당기(최종) · 전기 금액과 이름으로 짝지어 견준다. 정산표에서는 「공시 재무제표」 시트를 읽고, 없으면 「재무제표」 시트를 읽는다. WTB 양식(「공시용BS」 · 「공시용PL」)도 읽는다. WTB 양식은 마감 전 시산표라 공시용BS 에 이익잉여금과 당기순손익을 두 줄로 두는데, 엔진이 당기순손익을 바로 위 이익잉여금 줄에 더해 읽는다.

감사 법인이 쓰는 WTB(시트 BS · IS · WBS · WIS · AJE)도 그대로 준다. BS · IS 에서 공시 과목의 수정 후 당기 · 전기를 읽고, WBS · WIS 의 계정별 최초 회사제시 · 수정후에서 과목마다 수정 금액을 모아 과목의 회사제시 금액을 구한다. 계정은 이름, 금액, 이웃 계정 금액의 합 순서로 과목에 잇는다. AJE 시트의 수정분개 번호가 과목에 붙어 「수정분개 미반영」 판정 끝에 「감사 수정분개 No.1 · No.2」 로 나온다. 화면 둘째 줄에 읽은 시트 · 수정분개 건수 · 수정이 든 과목 줄 수가 나오고, 과목에 잇지 못한 수정 계정이 있으면 원문 대조에 이름이 나온다(그 과목은 회사제시 금액이 비고 수정 후 대사는 그대로 된다). 어느 양식으로도 못 읽으면 역추적 없이 「이 WTB 양식을 읽지 못함: 시트 … · 머리줄 「…」」 한 줄로 종료 코드 2 다. 그 시트 이름과 머리줄을 보고에 적는다. dsd 안에서 숫자가 서로 맞아도 정산표 금액과 다르면 FALSE 다. 정산표에서 과목을 찾지 못한 본표 줄은 따로 알린다. 합계 검증이 걸린 소계 줄(유동자산 · 비유동부채)은 아래 과목으로 이미 검증되니 알리지 않고, 정산표에 같은 금액인 줄이 있으면 그 이름을 알림에 함께 적는다(「금융원가」 ↔ 정산표 「이자비용」). 정산표는 엑셀에서 계산된 값이 저장된 파일이어야 한다.

정산표의 당기(회사제시)와 당기(최종)이 모든 과목에서 같으면 화면과 「검증 범위」 의 원문 대조에 「정산표 수정분개 0건」 이 나온다. 수정분개를 넣기 전의 정산표면 정산표 대사는 회사 장부와 맞춘 것일 뿐이니 보고에 적고 다 넣은 정산표로 다시 돌린다. dsd 금액이 정산표의 최종 금액과 다르고 「당기(회사제시)」 금액과 같으면 수정분개가 dsd 에 반영되지 않은 것이다. 엔진이 판정 열에 「숫자 오류: … 수정분개 N원이 dsd 에 반영되지 않았다」 를 적는다. 이 판정은 `findings` 로 다시 적지 않아도 된다(다르게 판정하면 적는다).

반기 · 분기 · 사업보고서처럼 연결과 별도가 한 보고서에 있으면 나눈 두 파일을 서로 `--pair` 로 준다. 자본금(당기 · 전기)은 규칙이 견준다. 그 밖에 두 보고서에 같아야 하는 숫자(발행주식수, 주당 액면, 배당금 총액, 지배기업의 자기주식)는 표 이름 앞에 「짝:」 을 붙여 연결에 적는다(`{"table": "짝:주석18-1", "row": "보통주", "col": "주식수"}`). `--pair` 를 주지 않으면 「짝:」 연결은 건너뛴다.

과목 이름이 같은 줄끼리 금액이 다른데 정산표의 다른 줄이 같은 금액이면, 엔진이 그 줄 이름을 조건에 적고 「확인」 으로 내린다. `usual` 에 「과목 이름 차이」 가 붙어 「볼 것」 시트에서 늘 나는 차이 아래로 간다. 손실 · 결손금으로 적은 과목은 정산표의 이익 · 잉여금 줄과 짝짓는다. 정산표에 한 기간의 금액만 없는 과목도 「정산표에서 못 찾은 과목」 에 나온다.

정산표 대사의 FALSE 는 dsd 의 오류와 과목 분류 차이로 나눠 `findings` 에 적고 보고한다. 어느 한쪽을 고쳐야 하는 차이는 `verdict` 를 숫자 오류로 적고 고칠 쪽(dsd, 정산표)을 `why` 에 적는다. 과목 이름이나 묶는 범위만 다른 차이는 확인으로 적는다. 정산표에서 함께 묶이는 과목을 같이 보고 두 과목의 합이 같으면(현금성자산과 단기금융상품, 총액과 차감 계정) 분류 차이다. 정산표 금액이 0 이면 그 금액이 다른 과목 이름에 들어 있는지 찾는다. 분류 차이로 설명되지 않는 것만 숫자 오류로 적는다. 감사 전 초안 정산표를 줬으면 보고에 초안이라고 밝힌다.

두 번째 판부터는 같은 폴더에서 다시 돌린다. `dsd_연결정의.json` 의 연결이 이름으로 다시 풀리고, 새로 생긴 표와 풀지 못한 연결에만 2~6번을 한다. 이때는 새 연결만 적어 `--apply <파일> --add` 로 더한다.

수정본에 주석이 새로 들어가 번호가 밀리거나 줄 이름이 바뀌면 앞 판의 연결이 이름으로 풀리지 않는다. 그때는 `python scripts/run.py links <수정본> --apply <앞 판의 연결.json> --carry <앞 판 dsd> --out <폴더>` 로 옮긴다. 두 판의 표 · 줄 · 열을 짝지어 연결을 수정본의 표 번호와 이름으로 다시 적는다(`연결_옮김.json`). 짝이 없는 칸을 가리키는 연결은 「옮기지 못함」 으로 알린다. 옮기지 못한 것과 새로 생긴 표만 다시 읽어 `--add` 로 더한다.

`--carry` 는 세 경우에 쓴다.

|---|---|---|
| 같은 보고서의 수정본 | 이름(주석 제목, 머리줄, 줄 이름) | 고객 샘플 178건 가운데 167건 |
| 같은 기간을 다른 꼴로 낸 판(감사보고서 원문 → 사업보고서 본문) | 이름이 안 되면 숫자. 재무제표 당기 기수가 같으면 같은 기간으로 보고, 숫자가 9할 넘게 같은 표는 이름 짝보다 앞세운다. 표 단위로 안 되는 칸은 숫자가 같은 칸 가운데 줄 이름과 주석 제목이 가장 비슷한 칸을 고른다. 옛 판에서 맞던 연결 · 합계 구조가 옮긴 뒤 안 맞으면 빼고 알린다 | 연결 478건 가운데 259건(FALSE 1), 별도 336건 가운데 178건(FALSE 0) |
| 해를 건넘(작년 반기 → 올해 반기) | 이름. 머리줄에 기수 · 연도가 있는 열은 같은 자리(당기는 당기)로, 표 위 기간(당반기 · 전반기)이 다른 표는 잇지 않는다. 새 판에서 빈 칸을 가리키는 연결은 뺀다 | 연결 347건 가운데 198건(FALSE 12), 별도 308건 가운데 205건(FALSE 8) |

옮긴 연결은 다시 읽어 확인한다. 해를 건너 옮긴 연결의 FALSE 는 판의 차이일 수도, 짝이 엇갈린 것일 수도 있다.

`--prev <기존 판>` 을 주면 바뀐 곳이 주석 시트와 오버뷰에 보인다. 표는 머리줄 · 줄 이름 · 숫자가 겹치는 정도로 짝짓고, 이름만 바뀐 줄과 열은 「이름 바뀐 줄 · 열」 로 한 번만 센다. 빈칸과 0(「-」)은 같은 값이다.

## 문장 검토 

오타 · 표현, 주소 · 경영진 변경처럼 공시가 필요한 내용, 회계감사기간처럼 표가 아닌 글을 본다. 숫자 푸팅과 같은 엑셀의 「문장 검토」 시트로 나온다. 코드 `scripts/audit/report/dsd_text.py`, 낱말 `scripts/definitions/dsd_text.yaml`.

1. **기준 사실 적기**: 결과 폴더에 `기준사실.json` 을 쓴다. 등기부 · 임원명부 · 이사회의사록, 감사계약서, 감사계획(외부감사 실시내용에 적을 감사기간), 감사보고서 서명일에서 옮기고 키마다 `source` 를 적는다. 꼴은 `examples/모의자료/기준사실.json` 을 본뜬다. 바뀐 값(본점 이전, 대표이사 변경, 상호 변경)은 새 값을 `value`, 바뀌기 전 값을 `old` 에 적는다. 확인 전 AI 판독에서 옮긴 값은 `source` 에 「확인 전」 을 붙인다. 근거 자료가 없는 키는 적지 않는다(짐작으로 채우지 않는다). 꼴은 `dsd_text.py` 머리 주석에 있다. 회사명 · 결산일도 적는다.
2. **엔진 돌리기**: `python scripts/run.py text <dsd> [--prior <작년 보고서>] --out <폴더>`. `문장읽기.md`(표지 · 감사보고서 · 재무제표 머리 · 주석 문단 · 외부감사 실시내용과 표 안 글자를 S번호와 함께)와 엔진이 찾은 것이 나온다. 엔진 규칙: 옛 값이 남은 곳, 대표이사 이름 · 본점 주소 · 감사인 주소 · 감사기간 · 감사보고서일이 기준 사실과 다른 곳, 기준 사실이 없을 때 보고서 안에서 대표이사 이름 · 감사보고서일이 다른 곳, 오타 사전 · 같은 낱말 반복 · 괄호 짝(줄 앞 번호 「1)」 「가)」 는 세지 않는다), 기준서 용어(「공정가액」 → 공정가치 같은 옛 용어, 「표현」 으로 적는다), 「~ 입니다」 띄어쓰기, 율 · 률(앞 글자에 받침이 있으면 ㄴ 을 빼고 「률」), 날짜 구분의 쉼표(「2025.04,28」), 작년 보고서와 같은 문장에 작년 날짜만 남은 곳, 외부감사 실시내용에 작년 보고서와 같은 날짜가 남은 줄, 외부감사 실시내용의 감사대상 사업연도가 보고서 사업연도와 다른 줄과 사업연도 시작일 앞의 날짜가 든 줄(작년 실시내용이 남음). 대표이사는 「공동대표이사 A, B」 처럼 함께 적힌 이름을 모두 견주고(기준 사실에 대표이사가 둘이면 `value` 를 목록으로 적는다), 본점 주소는 구까지만 적은 글이 기준 사실 주소의 앞부분이면 간략 표기로 보고 잡지 않는다. 「(1) 자산관련보조금 자산관련보조금을」 처럼 소제목 줄과 본문 첫 낱말이 같은 것은 반복 낱말로 세지 않는다. 「USD 50,000」 · 「1,000,000엔」 처럼 통화가 붙은 문장 금액은 문장 금액 표(「주석N-문장」)의 「외화 금액」 열에 적힌 값 그대로 모인다(원으로 바꾸지 않는다). 오타 사전과 기준서 용어는 `dsd_text.yaml` 의 `typos` · `terms` 에 있다. AI 가 찾은 것 가운데 다른 보고서에도 되풀이될 것은 그 목록에 날짜와 함께 더한다.
3. **읽기**: `문장읽기.md` 를 처음부터 끝까지 읽는다. 엔진이 못 잡는 것을 본다.
   - 오타 · 띄어쓰기 · 조사 오류(사전에 없는 것), 어색하거나 틀린 표현(이중 피동 「사료되어 집니다」, 「~되어지다」, 주어와 서술어가 맞지 않는 문장, 기준서 용어를 틀리게 쓴 곳: 「대손충당금」 과 「손실충당금」 을 한 보고서에서 섞어 씀).
   - 사실 불일치: 기준 사실과 다르거나 보고서 안에서 서로 다른 회사명 · 기수 · 날짜 · 주식수 · 지분율 · 감사인 이름.
   - 공시 누락: 「공시 확인 대상」(의사록 · 등기부 판독에서 대표이사 변경 · 본점 이전 · 상호 변경 · 증자 · 차입 · 담보 · 후속사건 낱말이 든 사실)마다 주석에 적혔는지. 기준 사실의 변경(본점 이전, 대표이사 변경)이 회사 개요 주석에 반영됐는지. 후속사건 주석이 「해당 사항 없음」 인데 결산일 뒤 사건이 있는지.
   - 외부감사 실시내용: 감사대상 사업연도, 수행시기(전반감사계획 · 현장감사 · 기말감사), 투입 인원 · 시간이 기준 사실 · 감사계획과 같은지.
   - 주석끼리 맞물리는 공시(감리지적사례에서): 엔진이 세 가지를 본다(아래 「처분계산서와 감리지적 유형」). 원문 대조의 「감리지적 유형: …」 알림은 그 주석을 읽어 공시가 정말 빠졌는지 판정하고, 빠졌으면 `kind` 「공시 누락」 으로 적는다. 엔진이 못 보는 것은 AI 가 본다. 「기타채권 · 기타채무」 처럼 대여금 · 차입금 이름이 없는 과목에 섞인 자금거래, 의사록 · 약정의 보증 · 책임준공확약이 주석에 있는지(KICPA-2024-37, KICPA-2025-44), 담보부 차입금이 있는데 담보 주석이 없거나 결산일 뒤 설정 · 이미 해제된 담보가 들어 있는지(KICPA-2025-43).
   - 주석 참조 번호와 문단 번호: 재무제표 과목 옆 주석 번호와 문장 속 「주석 N 참조」 가 가리키는 주석 제목이 그 내용인지, 주석을 더하거나 뺀 뒤 뒤 번호가 함께 밀렸는지. 주석 안 문단 번호((1) · (2), ① · ②)가 건너뛰거나 겹치는지. 회계정책 주석이 인용한 기준서 문단 번호와 기준서 개정 연도가 당기 것인지.
   - 용어 통일: 같은 것을 한 보고서에서 두 이름으로 쓴 곳(「주식선택권」 과 「주식매수선택권」, 「대손충당금」 과 「손실충당금」, 「재화의 판매」 와 「용역의 제공」 이 수익 주석과 회계정책에서 엇갈림). 재무제표 과목 이름 · 주석 제목 · 문장이 같은 이름을 쓰는지. 고칠 안은 기준서나 상법의 용어로 적는다.
   - 오탈자: 사전에 없는 오타와 율 · 률(「경험율」 은 「경험률」), 띄어쓰기(「따른만기」), 숫자와 단위 사이. 엔진이 율 · 률 규칙으로 잡은 것은 다시 적지 않는다.
   - 비교 기간 문구: 「당기 및 전기」 「당기말과 전기말」 로 적은 문장에 두 기간 금액이 다 있는지, 표는 두 기간인데 문장이 「당기」 만 말하는지, 「전기초」 와 「당기초」 처럼 기간 이름이 바뀌지 않았는지. 특수관계자 거래 · 담보 · 약정 주석은 비교 기간을 빼먹기 쉽다.
   - 일반기업회계기준 필수 공시 목록 대조: 일반기업회계기준 보고서면 아래 항목이 있어야 할 회사인데 주석에 없는지 본다. 주요 경영진에 대한 보상(특수관계자 주석), 우선주 · 상환전환우선주의 주요 내용(배당 · 전환 · 상환 조건, 자본금 주석), 중소기업 회계처리 특례를 적용했으면 그 사실과 적용한 특례, 주식기준보상의 부여 · 행사 · 상실 수량과 행사가격 · 행사기간, 담보 · 지급보증(제공한 것과 제공받은 것), 계속기업 불확실성, 보고기간 후 사건, 재무제표 승인일. 빠졌으면 `kind` 「공시 누락」 으로 적고 `basis` 에 기준서 문단을 적는다. K-IFRS 보고서면 같은 방식으로 기업회계기준서 제1024호 · 제1001호 공시 항목을 본다.
4. **문장.json 쓰기**: 결과 폴더에 쓴다.
   ```json
   {"findings": [{"seg": "S118", "quote": "없는 것으로 사료되어 집니다", "kind": "표현", "fix": "없습니다", "basis": "이중 피동. 주석 문장은 단정형으로 쓴다"}],
    "disclosures": [{"item": "대표이사 변경", "source": "이사회의사록 2025-09-01", "status": "공시 안 됨", "seg": "", "basis": "주석 1 회사의 개요에 대표이사 변경이 없다"},
                    {"item": "차입 · 담보 · 보증", "source": "scan_0012.pdf 2쪽", "status": "공시됨", "seg": "S205", "basis": "주석 13 에 담보 제공을 적었다"}]}
   ```
   - `kind` 는 오타 · 표현 · 사실 불일치 · 공시 누락 · 일관성 가운데 하나. `quote` 는 그 S번호 글에 글자 그대로 있는 부분(띄어쓰기만 달라도 받는다). 없으면 엔진이 받지 않고 「받지 않은 AI 적음」 에 남긴다. `fix` 는 고칠 글, `basis` 는 회계사가 읽을 근거 한 줄(기준서 문단 · 받은자료 이름). 보고서 안 두 곳이 서로 다른 일관성 · 사실 불일치는 세 번째 근거(받은자료 · 작년 보고서 · 본문의 다른 장)가 있을 때만 `fix` 에 한쪽을 적는다. 근거가 없으면 `fix` 에 「어느 쪽이 맞는지 <확인할 자료> 로 확인해 맞춘다」 를 적는다.
   - `disclosures.status` 는 공시됨 · 공시 안 됨 · 해당 없음. 공시됨이면 공시한 S번호를 적는다.
   - 엔진이 이미 적은 것은 다시 적지 않아도 된다(같은 곳이면 엑셀에 한 번만 나온다).
5. **넣기**: `python scripts/run.py text <dsd> --apply <문장.json> --out <폴더>` 로 검사하고, `dsd foot … --out <폴더>` 를 다시 돌리면 「문장 검토」 시트에 들어간다(폴더의 `기준사실.json` · `문장.json` 을 읽는다). 공시 확인 대상은 text 와 foot 가 같은 정의로 센다. foot 이 「공시 확인 대상이 문장 검토(text) 뒤에 바뀜」 을 내면 `text` 를 다시 돌려 새 대상을 읽고 `disclosures` 를 더한 뒤 넣는다.
6. **보고**: 문장 검토 건수(엔진 · AI, 종류별), 사실 불일치와 공시 누락은 건마다 위치 · 원문 · 고칠 안, 받지 않은 AI 적음. 고칠지는 회계사가 시트의 확인 칸(O · X)에 적는다.

## 처분계산서와 감리지적 유형

아래 검사는 엔진이 판마다 찾아 건다. 연결 정의(`연결.json`)에 적지 않아도 된다. 검증 id 가 정해져 있어 판정은 그 id 로 적는다.

**이익잉여금처분계산서(결손금처리계산서)** `scripts/audit/report/dsd_appropriation.py`. 본표 절에 처분계산서가 없으면 「미처분이익잉여금 · 미처리결손금」 으로 시작하고 「차기이월」 줄이 있는 주석 안 표를 처분계산서로 읽는다(공개 원문의 처분계산서 290개 가운데 249개가 주석 안 표였다). 당기 · 전기 열마다 다섯 가지를 건다.

| id | 검증 | 근거 |
|---|---|---|
| `처분계산서-당기순이익` | 처분계산서 당기순이익 = 손익계산서 당기순이익 | 일반기업회계기준 2.88 |
| `처분계산서-미처분이익잉여금` | 미처분이익잉여금(미처리결손금) = 재무상태표 같은 과목. 재무상태표가 이익잉여금을 나눠 적었을 때만 | 처분 전 금액 |
| `처분계산서-이월` | 당기 열 전기이월 = 전기 열 차기이월 | |
| `처분계산서-처분한도` | 처분액 ≤ 미처분이익잉여금 + 임의적립금 등의 이입액. 처분액이 있을 때만 | 넘으면 차기이월이 음수 |
| `처분계산서-이익준비금` | 이익준비금 적립 ≥ MIN(금전배당(중간배당 포함) × 10%, MAX(0, 자본금 × 1/2 - 기말 이익준비금)). 적립 줄이 없으면 0 으로 견준다(엑셀에서 왼쪽이 「=0」) | 상법 제458조 |

- 결손금처리계산서(첫 줄이 결손금)는 크기만 견준다. 첫 줄은 결손을 양수로 적고 아래 줄은 이익 방향으로 적은 표, 줄마다 결손 방향으로 적은 표, 이름은 「미처리결손금」 인데 금액은 잉여인 기간이 다 있었다. 이 표의 합은 엔진 합계 구조가 본다.
- 기말 이익준비금은 재무상태표 「이익준비금」(없으면 「법정적립금」) 줄, 재무상태표가 이익잉여금을 미처분이익잉여금 한 줄로만 적었으면 0, 나머지 경우는 이익잉여금 주석의 구성 표(이익준비금 줄과 처분계산서와 같은 미처분이익잉여금 줄이 함께 있는 표)에서 읽는다. 못 읽으면 걸지 않는다. 주식배당이 있으면 걸지 않는다. 자본금 · 이익준비금을 천원 단위 재무상태표에서 읽으면 그 반올림 폭을 허용 폭에 넣는다.
- AI 가 같은 두 칸을 `links` 에 적었으면 규칙 검증만 남고, 그 AI 연결에 적어 둔 판정은 규칙 검증으로 옮겨 간다.
- 판정할 때: 당기순이익이 다르면 정정공시가 손익계산서만 고치고 처분계산서를 그대로 둔 경우가 많다. 미처분이익잉여금이 다르면 처분계산서의 「미처분이익잉여금」 에 이익잉여금 전체를 적었는지, 전기 수정이 처분계산서에 빠졌는지 본다. 크기가 정확히 1,000 배면 단위 표시 오류다.

**감리지적 유형** `scripts/audit/report/dsd_kicpa.py`. 한공회 감리지적사례에서 보고서 안의 표만으로 볼 수 있는 것을 골랐다. 연결은 상대방 이름 · 자산 이름이 같은 줄끼리 잇고 금액으로 잇지 않는다.

| 검사 | 감리지적사례 · 근거 | 결과 |
|---|---|---|
| 특수관계자 주석의 대여금 · 차입금(가지급금 · 가수금 포함) 잔액이 당기말과 전기말에 다른데 기중 자금거래 표 · 문장이 없음. 거래 표에 자금 과목을 손익 거래와 함께 적었으면 공시로 본다 | KICPA-2025-37 · 38, 2024-36. 일반기업회계기준 25.6, K-IFRS 1024 문단 18 | 알림 |
| 특수관계자에게 제공한 보증의 금액이 특수관계자 주석과 보증 주석에서 다름(같은 상대방, 같은 기간, 금액 열이 양쪽 다 하나일 때) | KICPA-2024-37 · 38. 일반기업회계기준 25.9 · 14.21 | 확인(`감리-보증\|표\|상대방`) |
| 특수관계자에게 제공한 보증이 한 주석에만 있음(당기말 보증이 남은 상대방만. 보증 주석이 이미 특수관계자 보증이라고 밝힌 표, 연결 보고서의 종속회사 보증은 뺀다) | KICPA-2024-37 · 40, 2025-44 | 알림 |
| 담보로 제공한 자산의 장부금액 ≤ 재무상태표 같은 과목(같은 이름 과목은 더하고, 토지 · 건물은 재무상태표에 그 줄이 없으면 유형자산 + 투자부동산). 담보권자마다 줄을 나눠 같은 자산을 되풀이 적는 회사가 많아 줄마다 견준다 | KICPA-2025-42 · 43. 일반기업회계기준 10.48 | 부분 대사(`감리-담보\|표\|줄\|열`, `cmp: le`) |

- 받은 보증 · 받은 담보 표(「제공받은 · 로부터 · 제공한자 · 보증인」)는 보지 않는다. 회사가 받은 보증 표가 제공한 보증 표보다 훨씬 많다.
- 알림은 원문 대조(화면과 「검증 범위」 시트 끝)에 나온다. 알림마다 그 주석을 읽어 공시 누락인지, 다른 주석에 이미 적었는지(이름 오타 포함) 판정해 보고에 적는다.
- 엔진이 못 보는 감리지적 유형(의사록 · 약정의 보증과 책임준공확약, 결산일 뒤 담보, 해제된 전세권)은 순서 3번에서 AI 가 읽는다.

## 반기 · 분기보고서

정기보고서(사업 · 반기 · 분기보고서)는 재무제표와 주석이 보고서 본문에 있고 연결과 별도가 한 파일에 있다. 먼저 나눈다.

```
python scripts/split_periodic.py <정기보고서.xml>            # <이름>_연결.xml, <이름>_별도.xml 이 나온다
python scripts/run.py foot <이름>_연결.xml --prior <직전 사업보고서> <작년 같은 기간 보고서> --out <폴더>
```

- 재무상태표의 「당기」 는 반기말(분기말), 「전기」 는 전기말이다. 손익계산서는 한 기에 열이 둘(3개월, 누적)이다. 「당기」 「전기」 로 적으면 누적 열로 풀린다. 3개월 열은 열 이름을 글자 그대로 적는다(「제 3 기 반기 3개월」).
- `--prior` 에 둘을 주면 재무상태표와 「전기말」 표는 직전 사업보고서와, 손익 · 현금흐름과 「전반기」 표는 작년 같은 기간 보고서와 견준다. 직전 사업보고서도 정기보고서 본문을 나눈 것을 쓴다(감사보고서 원문은 표의 꼴이 달라 짝을 덜 찾는다).
- 주석은 XBRL 꼴이다. 줄 이름이 「기초 유형자산」 「반기말 유형자산」 처럼 길고 당반기 표와 전반기 표가 따로 있다. 줄 이름은 읽기 자료의 글자 그대로 적는다.
- 요약 주석이라 비현금거래 주석이 없다. 취득 · 처분 · 배당 · 퇴직급여 식은 조건부로 걸고 `when` 을 적는다. 자본변동표와 현금흐름표에 「당기초 = 전기말」 을 걸지 않는다(전반기말과 당반기 기초는 다른 날이다).
- 감사보고서 원문에서 적은 연결을 사업보고서 본문으로, 작년 반기 연결을 올해 반기로 `--carry` 로 옮길 수 있다(위 「`--carry` 는 세 경우에 쓴다」 표).
- 나눈 연결과 별도는 서로 `--pair` 로 준다(자본금 규칙과 「짝:」 연결).
- 정기보고서 주석은 주석마다 테두리 없는 틀 표 안에 문단과 표가 있다. 엔진이 틀 안의 표를 표로 읽는다. 「검증 범위」 시트의 원문 대조에 틀 표 수가 나온다.

## 판정


1. **차이 설명 후보부터 본다.** 엔진이 판정자료와 「볼 것」 의 「차이 설명 후보」 열에 적는다. 회계사도 차이가 나면 이 후보부터 본다.
   | 후보 | 뜻 |
   |---|---|
   | 자리 | 한 칸의 이웃한 두 자리를 바꾸면 맞음(차이가 9 의 배수), 자릿수를 하나 밀면 맞음, 차이가 한 자리만 다른 꼴 |
   | 부호 | 두 금액의 크기가 같고 부호가 반대, 또는 한 항의 부호를 바꾸면 맞음(차이 = 그 항의 두 배) |
   | 부호 표시 | 부호만 다른데 그 줄의 부호가 재무제표의 기간마다 다름(재무상태표 결손금 당기 양수 · 전기 음수). 작년 보고서가 있으면 같은 줄의 당기 금액을 함께 적는다 |
   | 단위 | 한쪽이 다른 쪽의 1,000배 · 1,000,000배 |
   | 기간 열 · 이웃 줄 | 같은 줄 다른 열, 위 · 아래 두 줄 안의 금액을 옮겨 적었으면 맞음 |
   | 같은 칸 | 차이가 다른 칸 하나, 또는 두 칸의 합 · 차와 같음(이 검증의 표 → 같은 주석 → 재무제표 순으로 찾는다) |
   | 작년 이름 | 작년 보고서의 같은 주석에 왼쪽 칸과 같은 금액이 다른 줄 이름으로 있음 |
   후보마다 「해당 없음」 이나 「이것으로 설명됨」 을 판정 글(`why`)에 적는다. 금액이 같다는 것만으로 설명됐다고 하지 않는다. 후보 칸의 뜻이 차이와 이어져야 한다.
2. **판정 종류를 고른다.** `숫자 오류`(보고서에 적힌 금액이 틀렸고 고칠 숫자가 있음) · `표시 오류`(금액은 맞고 줄 · 열 이름, 기간 이름, 분류가 틀림) · `설명 부족`(금액은 맞고 문장이 금액을 다 설명하지 못함) · `작년 보고서 불일치` · `식 고침` · `확인` · `걸지 않음` · `엔진 판독`. FALSE 로 세는 것은 숫자 오류뿐이다. 표시 오류와 설명 부족은 「볼 것」 의 FALSE 아래에 따로 모으고 표지에서도 따로 센다. 옛 이름 「보고서 불일치」 는 숫자 오류로 읽는다.
3. **숫자 오류는 고칠 칸과 맞는 숫자를 세 번째 근거와 함께 적는다.** `{"fix": {칸}, "correct": 숫자(그 칸의 표시 단위), "evidence": [{칸}, …]}`. 근거 칸은 검증의 두 칸이 아닌 칸이다(작년 보고서 「작년:」, 함께 낸 보고서 「짝:」, 정산표 「조서:」 앞머리, 다른 주석). 엔진은 근거 칸 값으로 계산한 금액이 맞는 숫자와 같으면 「근거 확인」, 아니면 「고칠 쪽 미정」 을 「볼 것」 의 「고칠 칸 · 맞는 숫자」 열에 적는다. 두 칸이 다르다는 것만 알고 어느 쪽이 맞는지 근거가 없으면 `fix` 를 적지 않는다.
4. **다른 에이전트가 검증한다**(순서 8번, `references/판정-검증.md`).

## 연결.json 형식

```json
{
  "links": [
    {"left": {"table": "주석5-1", "row": "합 계", "col": "당기말"},
     "right": [{"table": "재무상태표", "row": "매출채권", "col": "당기"},
               {"table": "재무상태표", "row": "대손충당금", "col": "당기"}],
     "basis": "주석 5 (1) 합계는 총액에서 충당금을 뺀 순액"}
  ],
  "sums": [
    {"table": "재무상태표", "total": "유동자산", "rows": ["당좌자산", "재고자산"], "basis": "유동자산 = 당좌자산 + 재고자산"},
    {"table": "재무상태표", "total": "자본총계", "rows": ["자본금", "자본잉여금", {"row": "결손금", "sign": -1}],
     "basis": "결손금은 양수로 적혀 있어 뺀다"},
    {"table": "주석9-2", "total_col": "장부금액", "cols": ["취득원가", "손상차손누계액"], "basis": "누계액은 음수로 적혀 있다"},
    {"table": "주석15-2", "total": "기 말", "rows": ["기 초", "부 여", "상 실", "행 사"],
     "skip": ["당 기 가중평균행사가격"], "basis": "기말 수량 = 기초 + 변동. 가중평균행사가격은 더하지 않는다"}
  ],
  "no_sums": [{"table": "주석7-3", "total_col": "자산총계", "why": "피투자회사 요약재무정보의 열 이름이다"},
              {"table": "주석9-1", "total": "합 계", "only": ["가중평균이자율"], "why": "합계 줄의 이자율 칸은 합이 아니다"}],
  "units": [{"table": "주석18-3", "unit": 1, "why": "표에 단위 표기가 없고 금액이 원 단위다"}],
  "calcs": [{"left": {"table": "주석25-1", "row": "기본주당이익", "col": "당기"}, "expr": "ni / sh",
             "vars": {"ni": {"table": "주석25-1", "row": "보통주당기순이익", "col": "당기"}, "sh": {"table": "주석25-1", "row": "가중평균유통보통주식수", "col": "당기"}},
             "basis": "주석 25 기본주당이익 = 보통주 당기순이익 ÷ 가중평균유통보통주식수"}],
  "workpapers": [{"table": "주석20-2", "what": "은행조회서의 한도와 담보", "wp": "4000BBDD 차입금", "why": "약정 한도는 보고서의 다른 곳에 없다"}],
  "skipped": [{"what": "재무상태표 미수금 ↔ 주석 21", "why": "주석 21 은 특수관계자 채권만 담는다"}]
}
```

- `left` 는 검증 줄이 놓일 칸, `right` 는 같아야 하는 칸이다. `right` 가 여럿이면 더한다. 뺄 칸과 부호가 반대인 칸에는 `"sign": -1` 을 적는다. `left` 는 보통 주석 칸이고 재무제표 칸이어도 된다.
- 연결마다 `grade` 를 적는다. `항등식`(같은 금액을 두 곳에 적게 회계기준이 정한 것), `조건부`(조건이 맞을 때만 같음, `when` 필수), `약함`(주석에 문장이 없고 줄 이름과 표의 구성으로만 읽은 연결). 약한 연결은 금액이 다르면 「확인」 이고 「볼 것」 맨 아래에 간다.
- 곱셈 · 나눗셈은 `calcs` 에 적는다. `expr` 에는 `vars` 의 이름, 숫자, `+ - * /`, 괄호만 쓴다. 엔진이 칸마다 원(수량 · 비율)으로 바꿔 계산하고 왼쪽 칸의 단위로 되돌려 견준다. 허용 폭은 왼쪽 칸의 마지막 자리 하나다(「52,762」 는 1, 「22.26%」 는 0.01). 반올림과 절사를 모두 받는다. 다르게 정하려면 `tol` 을 적고 `basis` 에 까닭을 적는다. 거는 것: 주당이익(기본 · 희석, 우선주가 있으면 보통주 해당분), 자본금 = 발행주식수 × 액면, 유효세율 = 법인세비용 ÷ 세전이익, 주당배당금 × 주식수 = 배당금 총액, 지분율 × 피투자회사 순자산 = 지분법 장부금액(조정 항목이 없을 때). % 칸은 그대로 쓴다(엔진이 0.01 배로 읽는다). 주식수 · 주당 금액처럼 칸의 단위가 표의 단위와 다르면(백만원 표 안의 「5,940,082,550주」, 「4,950원」) 그 칸에 `"unit": 1` 을 적는다. `left` 에도 적을 수 있다. 엔진은 「원」 · 「주」 가 붙은 칸을 표의 단위로 읽는다.
- `workpapers` 는 보고서 안에서 맞춰 볼 곳이 없어 조서 · 증빙과 맞출 숫자다. `rows` 를 적으면 그 줄만, 안 적으면 표 전체다. `what` 은 무엇과 맞추는지, `wp` 는 그 숫자를 볼 조서(조서 번호나 이름), `why` 는 보고서 안에 맞춰 볼 곳이 없는 까닭이다. 회계사가 그대로 읽으니 과목과 주석 이름으로 적는다.
- 한 칸에 연결을 여럿 걸 수 있다. 변동표의 기초는 전기 변동표의 기말과도, 재무상태표 전기와도 같아야 한다. 둘 다 적는다.
- 표 번호 · 행 이름 · 열 이름은 읽기 자료에 적힌 글자를 쓴다(띄어쓰기는 달라도 된다). 재무상태표 · 손익계산서 · 현금흐름표의 열은 `당기` · `전기` 로 적는다.
- 같은 행 이름이 한 표에 여럿이면 `"row_nth": 2` 처럼 몇 번째인지 적는다(재무상태표의 대손충당금, 감가상각누계액). 열 이름이 겹치면 `"col_nth"` 를 쓴다.
- 원문에서 첫 열이 세로로 묶인 표는 읽기 자료의 표 번호 옆에 「줄 이름: 앞의 N칸」 이 적혀 있다. 앞의 N칸을 띄어 이은 것이 행 이름이다. 「| 기초 | 취득원가 | …」 줄은 `"row": "기초 취득원가"` 다. 빈 칸은 건너뛰고, 같은 글자가 이어진 칸은 한 번만 적는다(「관계기업 | 소 계 | 소 계」 는 「관계기업 소 계」).
- 행 이름이 빈 줄은 `"row": ""` 와 `row_nth`, 열 이름이 빈 열은 `"col": ""` 와 `col_nth` 로 적는다. 순번은 그 표에서 이름이 빈 줄만 위에서부터 센 차례다. `col_nth` 는 줄 이름 열도 넣어 센다.
- 이름은 띄어쓰기만 무시하고 견준다. 각주 표시와 괄호는 읽기 자료대로 적는다. 띄어쓰기만 다른 두 줄(「대체(*)」 「대 체(*)」)은 같은 이름으로 세므로 순번(`row_nth`)으로 가른다.
- 한 표 안에서 줄과 열이 모두 다른 두 칸을 이을 때는 `links` 의 양쪽에 같은 표를 적는다(열이 기간인 변동표의 당기 기초 = 전기 기말, 처분계산서의 당기 전기이월 = 전기 차기이월).
- 양쪽이 합인 식(A + B = C + D)은 A 를 `left` 에 두고 B 를 `right` 로 옮겨 `"sign": -1` 을 적는다(A = C + D - B). `basis` 에 원래 식을 적는다.
- 엔진이 표의 단위를 잘못 읽었으면 `units` 에 적는다(단위 줄이 없어 앞 표의 단위를 이어받은 표, 주식수 표). `unit` 은 1 · 1000 · 1000000 가운데 하나고 표 전체에 걸린다. 근거는 표 앞의 단위 표기나 같은 과목의 재무제표 금액과 견준 자릿수다. 한 표에 금액 열과 주식수 열이 섞여 있으면 바로잡을 수 없다. 단위가 틀리게 읽힌 칸의 연결은 `skipped` 로 옮기고 보고에 적는다.
- 자본변동표는 열이 과목이고 줄이 기간이다. 당기와 전기에 같은 이름의 줄(당기순이익, 배당)이 있으면 `row_nth` 로 가른다.
- `basis` 는 근거가 된 주석의 제목이나 문장을 한 줄로 적는다. 비우면 엔진이 받지 않는다.
- 엔진이 규칙으로 이미 거는 재무제표 간 연결이 다섯 있다(자산총계 = 부채와자본총계, 자산총계 = 부채총계 + 자본총계, 자본변동표 기말 총계 = 자본총계, 자본변동표 당기순이익(총계 열) = 손익계산서 당기순이익, 현금흐름표 기말의 현금 = 현금및현금성자산). 다시 적어도 한 번만 센다. 당기순이익 규칙은 자본변동표에 당기순이익 줄이 둘(위가 전기, 아래가 당기)일 때만 걸고, 「당기순손실」 처럼 손실만 적는 줄의 양수는 손실 금액으로 읽는다. 부채와자본총계 = 부채총계 + 자본총계는 `sums` 에 적는다(그 줄 옆에 보인다).
- 부분 대사: 일부만 담은 표(특수관계자 채권 · 채무, 외화 자산, 담보 제공 자산의 장부금액)는 같다고 걸지 않고 `"cmp": "le"`(왼쪽 ≤ 오른쪽)로 건다. `{"left": {특수관계자 매출채권 합계}, "right": [{재무상태표 매출채권}], "cmp": "le", "basis": "…"}`. 일부가 전체를 넘으면 FALSE 다. 엑셀 수식은 「차이 ≤ 허용 폭」 이다.
- `links` 는 더하기와 빼기만 적는다. 곱셈 · 나눗셈은 `calcs` 에 적는다. 민감도(금리 1% 변동의 효과)처럼 보고서에 계산 근거가 없는 것은 `skipped` 에 적는다.
- 문장 안의 금액은 「주석N-문장」 표의 칸으로 연결에 쓴다. 맞춰 볼 곳이 보고서에 없으면 `workpapers` 에 적는다. 둘 다 아니면 회색으로 남고 회계사가 눈으로 본다.

## 합계 구조

엔진은 금액이 맞는 것을 근거로 합계 구조를 찾는다. 그래서 세 가지를 찾지 못한다. 처음 받은 판에서 틀린 합계, 항이 하나뿐인 합계, 번호가 없는 K-IFRS 본표의 중간 합계다. 더하면 안 되는 줄 · 열(주당금액 줄, 가중평균 가격 열)에 구조를 걸기도 한다. AI 가 표를 읽고 빠진 구조를 적고 틀린 구조를 고친다.

- 표마다 「엔진 합계」 줄을 읽는다. 맞으면 적지 않는다. 빠졌으면 `sums` 에 적고, 틀렸으면 `sums` 로 다시 적거나 `no_sums` 로 뺀다. 같은 합계 줄 · 열은 AI 가 적은 것이 엔진 것을 대신한다.
- 재무제표 본표는 합계 줄을 전부 본다. 유동자산, 비유동자산, 자산총계, 부채총계, 자본총계, 부채와자본총계, 매출총이익, 영업이익, 법인세비용차감전순이익, 당기순이익, 총포괄이익, 활동별 현금흐름, 현금의 증가, 기말의 현금. 자본변동표는 줄이 기간이다. 기말 = 기초 + 그 기간의 변동 줄.
- 구조는 표의 뜻으로 정한다. 과목 체계, 들여쓰기 순서, 「차감」 「누계액」 같은 이름, 괄호 표시를 본다. 금액을 더해 보고 맞는 조합을 찾지 않는다.
- 차감하는 항은 표에 음수로 적혀 있으면 그대로 더하고, 양수로 적혀 있으면 `"sign": -1` 을 적는다(재무상태표의 결손금, 현금흐름표 유출액 아래 항목).
- 표 안의 더하기 빼기는 `sums` 에, 표 사이의 관계(당기 변동표의 기초 = 전기 변동표의 기말)는 `links` 에 적는다. 자본변동표처럼 한 표 안에 두 기간이 있으면 당기초 = 전기말도 `sums` 에 항이 하나인 구조로 적는다. 같은 관계를 양쪽에 적으면 합계 쪽만 남는다.
- 세로 구조는 `total` 과 `rows`, 가로 구조는 `total_col` 과 `cols` 로 적는다. 뺄 항은 `{"row": "매출원가", "sign": -1}`, `{"col": "부채총계", "sign": -1}` 로 적는다.
- 항이 이어진 줄 전부면 `from` 과 `to` 로 적는다. 같은 이름이 여럿이면 `{"row": "기타", "nth": 2}` 로 적는다. 범위 안에 합계 줄이 있으면 엔진이 받지 않는다. 범위의 줄을 전부 빼는 구조면 `"sign": -1` 을 함께 적는다(유출액 소계가 음수고 아래 항목이 양수).
- 같은 이름이 여럿이면 `total_nth` 와 항의 `nth` 를 쓴다(`row_nth` · `col_nth` 로 적어도 된다). 이름이 빈 줄은 `"total": "", "total_nth": 2`, 항은 `{"row": "", "nth": 1}` 로 적는다. 읽기 자료에서 첫 칸이 비고 「합 계」 가 둘째 칸에 있는 줄이 그런 줄이다.
- 구조는 그 줄(열)의 숫자 칸 전부에 걸린다. 걸면 안 되는 열(줄)은 `skip` 에 이름을 적는다. 걸 열(줄)을 직접 정하려면 `only` 에 적는다. 한 합계 줄에 열마다 구조가 다르면 구조를 둘 적고 `skip` 이나 `only` 로 가른다(자본금 변동 내역의 주식수 · 자본금과 주식발행초과금).
- 엔진이 구조에서 빼는 것이 있다. 이름에 % 나 「율」 이 든 열 · 줄, 합계에 숫자가 없는 칸, 항에 숫자가 하나도 없는 줄이다. 민감도 표처럼 이름에 「10%」 가 든 금액 열은 `only` 로 적어야 걸린다. 주당금액 줄, 가중평균 가격 열은 빼 주지 않으므로 `skip` 에 적는다.
- 엔진이 찾은 구조는 항에 숫자가 둘 이상인 칸에만 걸린다. 0 대신 빈 칸을 둔 줄(만기분석의 한 줄)이 빠져 있으면 같은 구조를 `sums` 에 다시 적는다. AI 가 적은 구조는 항에 숫자가 하나여도 걸린다.
- 한 합계 칸을 두 식으로 검증할 수 있다(이연법인세 기말 = 기초 + 변동과 기말 = 자산 + 부채, 연결 당기순이익 = 계산식과 지배 + 비지배). 엔진이 이미 찾은 식이 있으면 둘째 식에 `"keep": true` 를 적는다. 적지 않으면 AI 가 적은 식이 엔진 식을 대신한다.
- `only` 로 적은 구조는 `only` 에 적은 열(줄)에서만 엔진 구조를 대신한다. 나머지 열의 엔진 구조는 남는다. 재무제표 본표의 `only` · `skip` 은 `당기` · `전기` 로 적어도 된다.
- 항이 하나뿐인 합계도 적는다(유동자산 = 당좌자산, 자본금 = 보통주자본금, 합계 = 보통예금).
- 「- 」 로 시작하는 내역 줄은 「바로 위 줄 = 내역 줄의 합」 으로 따로 적고, 기말 구조의 항에는 넣지 않는다. 바로 위 줄에 숫자가 없으면 「- 」 줄이 변동 항이므로 기말 구조의 항으로 넣는다.
- 차감 항이 전부 0 이라 부호를 알 수 없으면 같은 주석의 다른 기간 표, 같은 표의 다른 차감 줄, 같은 보고서의 다른 표 순으로 보고 부호를 정한다. 무엇을 따랐는지 `basis` 에 적는다.
- 합계처럼 보이지만 합계가 아닌 줄 · 열은 `no_sums` 에 이유와 함께 적는다(요약재무정보의 「자산총계」 열, 구역 이름이 「기말」 인 「기말 취득원가」 줄). 줄이면 `total`, 열이면 `total_col` 로 적는다. dsd 에 과목 단계가 잘못 적혀 요청 자료가 합계로 알린 줄도 `no_sums` 에 적고 보고한다.
- 곱셈과 나눗셈(주당이익, 자본금 = 주식수 × 액면, 유효세율, 부채비율)은 합계 구조가 아니다. `calcs` 에 적는다.
- 주석 유형별 합계 구조는 `references/연결-유형.md` 의 「합계 구조」 절에 있다.

## 거는 연결과 걸지 않는 연결

거는 것:

- 주석의 합계나 장부금액이 재무제표 과목과 같아야 하는 곳. 재무상태표가 총액과 차감 과목을 따로 적으면 주석의 순액은 두 과목의 합에 건다.
- 변동표: 기말 = 재무상태표 당기, 기초 = 전기 변동표의 기말, 상각 · 설정 = 손익계산서 비용, 취득 · 지급 = 현금흐름표.
- 같은 금액을 다른 주석에서 다시 적은 곳(만기분석의 장부금액, 범주별 금융상품의 과목별 합계, 비용의 성격별 분류의 감가상각비, 현금흐름표 주석의 조정 항목).
- 재무제표 사이: 현금흐름표의 비현금 손익 = 손익계산서, 자본변동표의 변동 = 주석의 자본 변동, 당기순손익.
- 주석이 식을 적어 준 증감: 「취득 = 현금흐름표 취득 + 연불구입」 「유동성 대체」 처럼 비현금거래 주석이나 각주에 상대 금액이 있을 때.
- 뜻이 같으면 두 칸이 0 이어도 건다. 보고의 한 줄 요약에 0 과 0 을 이은 건수를 따로 적는다.

걸지 않는 것:

- 일부만 담은 표. 특수관계자 채권 · 채무, 외화 자산 · 부채, 판매비와관리비 안의 급여는 과목 전체와 같지 않다.
- 뜻이 다른데 금액만 같은 칸. 만기분석의 계약상 현금흐름과 구간 칸, 법인세가 0 일 때의 세전손익과 당기순손익, 보증금액 · 채권최고액 · 한도와 차입금, 상각이 없어 취득원가와 같은 장부금액.
- 변동표가 없는 과목의 잔액 증감과 현금흐름표. 비현금 조정이 섞인다.
- 주석에 어느 과목의 합인지 적혀 있지 않은 금액. 걸지 않고 `skipped` 에 이유를 적는다.
- 현금흐름표와 잇는 식(변동표의 취득, 처분, 신규리스)처럼 조건이 맞을 때만 같은 식은 조건부 연결로 건다(아래 「조건부 연결과 확인」). 조정 항목이 주석에 있으면 식에 넣고, 없으면 `when` 을 적는다. 스터디 보고서 31건에서 「이해가 틀렸을 수 있음」 으로 가장 많이 적힌 것이 조정 줄 없이 건 취득 · 처분 식이다.

판단이 갈릴 때:

- 주석에 문장은 없고 줄 이름과 표의 구성으로만 읽은 연결은 걸되 `basis` 에 「주석에 문장은 없다」 를 적는다. 조건부 식이면 `when` 도 적는다.
- 같은 근거로 건 연결 가운데 일부만 안 맞으면 전부 그대로 둔다. 같은 원인의 FALSE 가 여러 주석에서 되풀이되면 묶어 보고한다.
- 줄 · 열 이름과 내용이 다르게 보이면(서로 바뀐 줄 이름, 「배당」 열의 지분 매각) 이름대로 걸고 FALSE 를 「이름이 틀렸을 수 있다」 로 보고한다. 문장과 표가 다르게 읽히면 표를 따르고 `basis` 에 적는다.
- 비현금거래 주석의 증감 줄에 부호 설명이 없으면 증가를 양수로 읽고 `basis` 에 적는다. 비현금거래 주석은 중요한 거래만 적으므로 그 줄만으로 합계의 식을 세우지 않는다.

만기분석은 `references/판정-근거.md` 의 B11 을 따른다. 장부금액 열이 있으면 그 열을 건다. K-IFRS 보고서의 이자부 부채(차입금, 사채, 리스부채)는 구간 합계를 장부금액에 걸지 않는다. 이자가 없는 단기 항목(매입채무, 미지급금)과 원금 기준으로 적힌 표(일반기업회계기준 보고서, 차입금 주석의 상환계획)는 `when` 을 적어 조건부로 건다.

## 단수 차이

- 단위가 다른 표 사이(원과 천원)는 큰 단위로 맞춰 차이 1 을 허용한다. 천원 · 백만원 단위 표의 합계는 항 수의 절반까지 허용한다. 허용 폭 안이면 TRUE 다.
- 허용 폭을 넘지만 차이가 표시 단위로 3 이하면 「단수」 다. 엑셀에서 노랑이고 FALSE 로 세지 않는다. 회사가 줄마다 반올림해 생긴 차이로 본다. 연결을 고치거나 지우지 않는다.
- 단수는 천원 · 백만원 표이거나 단위를 바꿔 견준 검증에만 있다. 원 단위끼리는 반올림이 없으니 1원 차이도 FALSE 다. 계산 검증에도 단수가 없다.

## 조건부 연결과 확인

연결의 등급은 셋이다. 항등식은 같은 금액을 두 곳에 적도록 회계기준이 정한 것, 조건부는 조건이 맞을 때만 같은 것, 걸지 않음은 정의가 다른 금액이다. 등급과 근거 문단, 안 맞을 때 정하는 순서는 `references/판정-근거.md` 에 있다.

- 조건부 연결은 `"when"` 에 조건을 한 줄 적는다. `{"left": …, "right": […], "basis": "…", "when": "현금 없이 취득한 것이 없다"}`
- `when` 이 있는 연결은 금액이 다르면 「확인」 이다. FALSE 로 세지 않는다. 엑셀에서 주황, 오버뷰에서는 노랑이다. 조정 내역이 보고서에 공시되지 않아 보고서만으로는 더 맞춰 볼 수 없는 차이다.
- 조정 항목이 주석에 있으면(비현금거래 주석의 미지급금 증감, 중단영업, 매각예정 대체) 그 칸을 항으로 넣는다. 그렇게 고친 식은 `when` 없이 둔다.
- 작년 보고서에서 줄을 찾지 못한 전기 금액(「전기 대사에서 못 찾은 줄」, 과목 이름이 바뀐 줄)은 `prior_pairs` 로 짝지어 준다. `{"table": "주석9-1", "row": "<올해 줄 이름>", "prior_row": "<작년 줄 이름>", "why": "작년 「건설중인자산」 이 올해 「건설중인 자산」 으로 이름만 바뀜"}`. 이름이 바뀐 근거가 주석에 있을 때만 적는다.
- 전기 대사 차이의 판정은 `연결.json` 의 `prior` 에 적는다. `{"id": "전기|…", "verdict": "불일치", "why": "…"}`. `불일치` 는 FALSE 로 센다. `작년 불일치` 는 작년 보고서의 숫자가 틀렸고 올해 숫자는 맞는 차이다. 「확인」 으로 세고 「볼 것」 에 「작년 보고서의 오류」 로 따로 나온다(올해 보고서에서 고칠 것이 없는데 FALSE 로 세면 회계사가 고칠 곳을 찾게 된다 재평가). `설명됨`(재분류나 재작성 공시로 설명됨)과 `걸지 않음`(줄 짝이 틀림)은 검증에서 뺀다. 뺀 검증은 결과 칸이 빈칸이고 「볼 것」 맨 아래 흐린 줄에 「판정으로 뺌」 으로 남는다. 회계사의 X 와 섞지 않는다. id 는 엑셀 검증 줄의 id 열에 있다.
- 「확인」 가운데 늘 나는 차이에는 `"usual": "유형 이름"` 을 함께 적는다(취득과 현금흐름표, 처분과 현금흐름표, 범주별 표와 본표의 범위, 배당 결의와 지급, 퇴직급여의 범위). 엑셀 「볼 것」 시트에서 다른 확인 아래에 모인다. 회계사는 아래에 모인 줄을 훑고 넘기므로 건마다 정한다. 아래 차이에는 `usual` 을 적지 않는다. 전기 금액이 작년 보고서와 다른데 재분류 공시가 없는 차이, FALSE 와 원인이 같은 차이, 같은 식이 다른 기간에는 맞는 차이, 금액이 그 유형에서 보통 나는 크기를 넘는 차이, 판정을 적지 못한 차이.
- 조건부 식이라도 조건이 그 보고서에서 확인되면(주석이 범위를 적었거나 다른 표로 범위가 같은 것이 확인되면) `when` 을 적지 않는다. 금액이 다르면 숫자 오류다.
- 조건부 · 근거 약한 연결의 차이를 `findings` 에 「숫자 오류」 로 판정하면 엔진이 조건을 떼어 FALSE 로 센다(전기 대사의 「불일치」 와 같다). 「늘 나는 차이」 표시도 떨어진다.
- 판정은 `연결.json` 의 `findings` 에도 적는다. `{"id": "<검증 id>", "verdict": "숫자 오류", "why": "원인 칸, 두 금액, 어느 숫자가 틀렸다고 보는지와 맞는 숫자, 근거 문단", "fix": {칸}, "correct": 숫자, "evidence": [{칸}]}`. `verdict` 는 숫자 오류 · 표시 오류 · 설명 부족 · 작년 보고서 불일치 · 식 고침 · 확인 · 걸지 않음 · 엔진 판독 가운데 하나다(옛 이름 보고서 불일치는 숫자 오류로 읽는다). `fix` · `correct` · `evidence` 는 「판정」 3번대로 숫자 오류에만 적는다. 작년 보고서 불일치는 전기 칸의 차이가 작년 보고서의 오류에서 났고 올해 숫자는 맞을 때다. 걸지 않음 · 엔진 판독으로 판정한 검증은 검증에서 빠진다(「볼 것」 맨 아래 「판정으로 뺌」). 원인이 같은 FALSE 여럿에는 `"cause": "<원인 한 줄>"` 을 같은 글로 적는다. 「볼 것」 이 칸을 함께 쓰지 않는 FALSE 도 한 원인으로 묶는다(적지 않으면 같은 칸, 그다음 판정 글의 첫 문장이 같은 것끼리 묶는다). 검증 id 는 넣기 결과와 엑셀의 id 열에 있다. 적어 두면 엑셀 「볼 것」 시트의 판정 열에 나와 회계사가 엑셀만 보고 원인을 안다. FALSE 와 확인에는 빠짐없이 적는다. 전기 대사와 정산표 대사의 차이에도 적는다(`prior` 에 적은 판정은 그대로 판정 열에 나온다).
- `findings` 와 `prior` 의 `why` 는 회계사가 엑셀 칸에서 읽는 글이다. 주석 번호, 과목 이름, 금액으로 적고 문장마다 마침표로 끝낸다. `연결.json`, `when` 같은 파일 · 키 이름과 규칙 번호는 적지 않는다.
- 안 맞는 연결을 「회계사 확인」 으로 넘기지 않는다. 판정 근거의 순서대로 직접 정한다: 숫자 오류 · 표시 오류 · 설명 부족, 식 고침, 확인, 걸지 않음, 엔진 판독.

## 엑셀에서 보이는 곳

회계사는 엑셀 한 파일만 받는다. 표지 · 오버뷰 · 볼 것 · 검증 범위 시트에 결론을 적을 자리, 봐야 할 검증, 검증에 들어가지 않은 숫자가 나온다.

- **표지**(맨 앞 시트, 파일을 열면 오버뷰가 먼저 보인다): 조서 번호, 회사, 대상 파일, 견준 자료, 한 일(이 보고서에 실제로 건 검증의 종류와 수만 적는다), 결과 요약(검증 수, 판정으로 뺀 검증, FALSE, 확인, 단수, 회계사가 뺀 검증, 검증된 칸의 비율과 조서와 맞출 칸을 뺀 비율, 조서와 맞출 항목), 결론, 작성자 · 작성일 · 검토자 · 검토일. 노란 칸은 회계사가 적는다. 결론은 AI 가 쓰지 않는다.
- **오버뷰**: 시트마다 합계 · 레퍼 · 전기 · 버전 신호등과 검증 범위(숫자 칸 가운데 검증에 들어간 칸의 비율). `--wtb` 를 주면 정산표 신호등이 따로 나오고 레퍼 신호등에는 정산표 대사가 들어가지 않는다. 버전은 기존 판과 같으면 초록, 바뀐 곳이 있으면 노랑이다.
- **볼 것**: TRUE 가 아닌 검증만 모은 시트다. FALSE(숫자 오류)는 원인으로 묶어 맨 위에, 그다음 표시 오류, 설명 부족, 확인, 작년 보고서의 오류, 늘 나는 차이, 근거가 약한 연결, 단수 순이다. 맨 아래 흐린 줄은 판정으로 뺀 검증과 회계사가 X 를 적은 검증이다. 열은 상태 · 원인 · 판정 · 검증 · 시트 순이라 판정과 검증 결과가 노트북 화면 안에 보인다. 「차이 설명 후보」 열은 엔진이 찾은 후보, 「고칠 칸 · 맞는 숫자」 열은 판정의 고칠 칸과 근거 계산 결과다. 「원인」 열은 판정의 `cause`, FALSE 여럿이 함께 쓰는 칸(누르면 그 칸으로 간다), 판정 글의 첫 문장 순으로 묶은 원인이다. 「작년 보고서」 열은 그 검증의 칸을 작년 보고서의 같은 칸으로 다시 계산한 결과다(「작년 보고서에도 같은 차이 5(작년에서 넘어온 차이)」 「작년 보고서에서는 맞았다」). 시트 이름을 누르면 그 검증 칸으로, 대사 대상을 누르면 견준 칸(다른 표, 작년 보고서, 정산표)으로 간다. 두 금액, 차이, 단위, 판정, 근거와 조건이 한 줄에 있다. 판정 열은 `findings` 에 적은 것이다. 검토 메모 열은 회계사가 적는다.
- **확인 칸(O · X)은 「검증 목록」 시트 한 곳**이다. 합계 검증이든 표 사이 연결이든 그 시트의 확인 칸에 적는다. X 를 적으면 그 검증의 결과 칸(합계 칸 옆, 주석 시트의 검증 줄)이 빈칸이 된다. 볼 것과 주석 시트의 확인 열은 그 칸을 끌어와 보여 준다.
- **바뀐 곳**(`--prev` 를 줬을 때): 기존 판에서 바뀐 숫자와 글을 한 장에 모은다. 숫자 바뀜, 숫자가 든 글 바뀜(지분율, 문장 속 금액), 글 바뀜, 새로 생긴 것(새 표는 줄마다), 없어진 것 순이다. 글은 바뀐 글자를 빨갛게 적고 긴 글은 바뀐 곳 앞뒤만 남긴다. 맨 아래 「검증 결과가 달라진 것」 에 기존 판의 FALSE 가 고쳐졌는지(고쳐짐 · 여전히 틀림 · 새로 틀림)가 나온다. 두 판의 검증은 표 · 줄 · 열 짝으로 옮긴 칸으로 짝짓는다. 주석이 하나 끼어들어 번호가 밀려도 같은 칸의 검증끼리 견준다. 수정본 검토는 여기서 시작한다.
- **검증 범위**: 시트별 숫자 칸 수와 검증된 칸 수, 조서와 맞출 칸(하늘색), 검증 없는 칸(회색), 다른 표와 대사된 칸 수, 문장 속 금액과 그중 검증된 칸, 검증이 하나도 없는 표(바로가기와 함께), 주석을 가리키는데 대사가 없는 재무제표 과목, 합계 줄 · 열인데 합계 검증이 없는 칸, `skipped` 에 적은 걸지 않은 연결과 이유, 원문 대조(읽지 못한 재무제표, 원문 표 수와 읽은 표 수, 틀 표, 문단으로 읽은 숫자 표, 없는 주석을 가리킨 과목과 문단, 가리킨 주석에 과목 이름이 없는 곳, 빠진 주석 번호, 재무제표마다 다른 기수와 날짜). 회색 칸은 회계사가 눈으로 본다. `skipped` 의 `what` 과 `why` 는 회계사가 그대로 읽으니 과목과 주석 이름으로 적는다.
- **조서 대사**(`workpapers` 를 적었을 때): 조서와 맞출 숫자의 목록. 조서 번호 · 결과 · 메모는 회계사가 적는다.
- **정산표**(`--wtb` 를 줬을 때): 정산표의 과목 · 당기 · 전기 · 회사제시가 「조서_정산표 …」 시트로 들어가고, 본표 시트의 검증 줄이 그 시트의 칸을 수식으로 가리킨다.
- 원문 시트의 표 위 줄에 표 번호와 단위가 있다(「[주석5-1] 단위 천원」). 볼 것 · 검증 범위가 표 번호로 가리킨다. 칸에 단위가 붙은 칸은 그 단위를 붙여 보인다.
- 표 안 합계 검증의 결과(TRUE · 단수 · FALSE)는 합계 줄의 표 바로 오른쪽에, 표의 숫자 열과 같은 순서로 나온다. 재무상태표가 A~C 열이면 유동자산 줄의 D · E 열이 당기 · 전기다. 칸을 누르면 합계 칸과 더한 칸들을 가리키는 수식이 보인다.
- 표 사이 연결(레퍼), 계산 검증, 전기 대사는 그 오른쪽의 검증 줄에 한 줄씩 있다. 「단위」 열이 「이 칸 값」 과 「대사 대상 값」 의 단위다(단위가 다른 표끼리는 큰 단위로 바꾼 값이다).
- 「검증 목록」 시트에 검증 전부가 있다. 근거 · 조건 · 판정 · 0 = 0 열로 조건부 TRUE 와 양쪽이 0 인 TRUE 를 걸러 볼 수 있고, 줄마다 그 검증 칸으로 가는 바로가기가 있다.
- 오버뷰의 신호등은 FALSE 가 있으면 빨강, 확인이나 단수 차이만 있으면 노랑, 전부 맞으면 초록이다.

## 보고

1. 한 줄 요약: 검증 수(합계 · 레퍼 · 계산 · 전기 · 정산표), FALSE(숫자 오류) 수와 원인 칸 수, 표시 오류 · 설명 부족 수, 확인 수, 단수 차이 수, 풀지 못한 연결 수, 바뀐 곳 수, 0 과 0 을 이은 연결 수, 독립 검증(유지 · 바꿈 수)과 고칠 쪽을 근거로 정한 숫자 오류 수. 정산표 없이 돌렸으면 그렇다고 적는다. 검증을 거치지 않은 판정은 「검증 전」 이라고 밝힌다.
2. 안 맞음을 판정별로 적는다. 「볼 것」 시트의 원인 묶음대로 원인 칸 하나에 한 줄이다.
   - 숫자 오류: 원인 칸, 두 금액, 차이, 규칙 번호(A · B · N), 고칠 칸 · 맞는 숫자와 엔진의 근거 확인 결과(「근거 확인」 · 「고칠 쪽 미정」), 작년 보고서의 같은 칸(「작년 보고서」 열).
   - 표시 오류 · 설명 부족: 칸, 금액이 맞는 까닭(차이 설명 후보), 고칠 이름 · 분류 · 문장.
   - 수정분개 미반영(정산표): 과목, dsd 금액, 정산표 최종 금액, 빠진 수정분개 금액.
   - 확인: 두 칸, 차이, 조건, 조정 항목을 찾아본 곳. 질문 목록이나 메일 초안은 만들지 않는다.
   - 식 고침과 걸지 않음: 무엇을 왜 고치거나 뺐는지.
   - 엔진 판독: 잘못 읽은 표와 칸, 고친 방법(`units`, `skipped`).
   - 단수 차이(노랑): 건수와 주석 번호.
3. 원문 대조에 나온 것(읽지 못한 재무제표, 없는 주석을 가리킨 과목, 가리킨 주석에 과목 이름이 없는 과목, 빠진 주석 번호, 기수 · 날짜가 다른 재무제표, 머리줄 당 · 전 표시가 기수와 다른 재무제표, 문단으로 읽은 숫자 표). 보고서의 문제면 숫자 오류나 표시 오류로 적는다.
4. 걸지 않은 것과 이유, 주석을 가리키는데 대응하는 금액을 찾지 못한 과목, 조서와 맞출 항목 수(「조서 대사」 시트), 회색으로 남은 문장 속 금액.
5. AI 가 정한 합계 구조 수, 합계가 아니라고 뺀 것, 아직 검증이 없는 합계 칸, 계산 검증 수.
6. 엑셀에서 볼 곳: 「볼 것」 시트(FALSE 와 확인의 판정), 「검증 범위」 시트(검증에 들어가지 않은 숫자와 원문 대조), 「조서 대사」 시트, 오버뷰의 빨강과 노랑, 표지의 결론 칸. 연결이나 합계 구조가 잘못 걸렸으면 「검증 목록」 시트의 확인 칸에 X, 맞으면 O 를 적어 달라고 한다.

## 예외 기록

공시 보고서 수백 건과 실제 회사 작성 dsd 로 돌리며 배운 것이다. 회사 이름은 적지 않는다.

- 금액이 같은 칸을 엔진이 자동으로 이으면 뜻이 다른 칸이 섞인다(만기분석의 기간 구간을 재무상태표 과목에, 보증금액을 차입금에). 금액 대조는 참고로만 내고 연결은 뜻으로 적는다.
- 주석 숫자를 하나씩 틀리게 바꿔 보면, 합계 검증만으로는 절반 남짓을 잡고 뜻으로 건 연결과 AI 가 정한 합계 구조를 더해야 대부분을 잡는다. 금액이 같아야 걸리는 연결은 틀린 숫자에 걸리지 않는다.
- 전기 표의 머리줄이 당기로 잘못 적힌 표가 있다. 표 제목(① 당기 ② 전기)을 따른다.
- 재무상태표 무형자산은 상각누계액을 직접 뺀 금액이고 주석은 따로 적은 회사가 있다. 회계정책 주석에 직접 차감이라고 적힌 것이 근거다.
- 유형자산 취득은 현금흐름표 취득과 바로 같지 않은 경우가 많다(연불구입, 정부보조금, 선급금 대체). 현금흐름표 주석의 비현금거래를 읽고 식으로 적는다. 주석에 조정 줄이 없는데 걸면 「이해가 틀린 연결」 이 가장 많이 나온다.
- 퇴직급여 변동표의 설정액은 확정기여형을 함께 운영하면 손익계산서 퇴직급여와 같지 않다. 조건부로 걸고 `when` 을 적는다.
- 안 맞을 때는 회계정책 주석까지 다시 읽는다(충당부채 시간 경과분을 이자비용으로 인식한다는 문장 등).
- 차이를 보고서의 다른 숫자로 설명할 수 있는지 먼저 본다. 처음 세운 가설만 확인하면 「표시 오류」 를 「숫자 오류」 로 잘못 판정한다. 판정은 다른 에이전트가 다시 본다(순서 8).
- 재무상태표는 결손금을 양수로 적고 빼는 회사가 많다. 부호만 바꾸는 고침은 작년 보고서의 같은 줄만 근거로 받는다.
- 처분계산서는 본표보다 이익잉여금 주석 안에 둔 회사가 훨씬 많다. 정정공시가 손익계산서만 고치고 처분계산서를 그대로 둔 경우가 있다.
- 결손금처리계산서는 줄마다 부호를 적는 방식이 회사마다 달라 크기만 견준다.
- 원문 XML 은 문단 구분이 사라져 주석 제목이 앞 문단 끝에 붙어 있다. 표 번호가 원문과 다르면 읽기 자료대로 쓰고 `basis` 에 원문 번호를 적는다.
- 읽은 표가 이상하면 DART 화면의 원문부터 본다. 세로로 묶인 첫 열은 「기초 취득원가」 처럼 이어 읽는다.
- 감사 법인 WTB(BS · IS · WBS · WIS · AJE)를 `--wtb` 로 주면 회사 작성 dsd 의 본표 차이가 「수정분개 미반영」 으로 판정된다. 최종 공시본은 정산표와 맞아야 한다.
- 문장 검토의 엔진 규칙은 오탐이 있다(번호 괄호 「1)」, 구까지만 적은 주소). AI 는 엔진이 못 보는 주석 참조 번호, 용어 통일, 비교 기간 문구, 필수 공시 목록을 본다.
- 재무상태표에 주석 번호를 하나도 적지 않은 보고서가 있다. 알리지 않는다.

## 시험해 보기

`examples/모의자료/` 는 가상 회사 가온정밀(가상)의 DART 제출 파일에 오류 11개를 심은 것이다. 이름과 숫자는 모두 지어냈다.

| 파일 | 내용 |
|---|---|
| `회사제시_가온정밀_오류심음.dsd` | 회사가 낸 dsd 역할 |
| `기준사실.json` | 감사인이 등기부 · 의사록 · 감사계약으로 아는 사실(대표이사 변경, 본점 이전, 감사기간, 감사보고서일). 결과 폴더에 복사해 둔다 |
| `연결.json` | AI 가 주석을 읽고 적은 연결 예시(재고자산 주석 합계 구조 · 재무상태표 연결, 엔진이 못 건 합계 둘) |
| `정답표.json` | 심은 오류 11개와 찾아야 할 곳. 결과를 낸 뒤에 맞춰 본다 |

```bash
python scripts/run.py links examples/모의자료/회사제시_가온정밀_오류심음.dsd --out out
python scripts/run.py links examples/모의자료/회사제시_가온정밀_오류심음.dsd --apply examples/모의자료/연결.json --out out
python scripts/run.py foot examples/모의자료/회사제시_가온정밀_오류심음.dsd --out out
python scripts/run.py text examples/모의자료/회사제시_가온정밀_오류심음.dsd --out out
```

기대 결과: `foot` 이 FALSE 1(주석5 재고자산 당기말 1,212,000,000 ↔ 합계 1,122,000,000, 「이웃한 두 자리를 바꿔 적음」 후보)과 문장 검토 엔진 9(오타 3 · 사실 불일치 6)를 낸다. 나머지 셋(이중 피동 표현, 대표이사 변경 · 본점 이전 공시 누락, 차입 결의 공시 누락)은 AI 가 `문장읽기.md` 를 읽어 `문장.json` 으로 넣는 몫이다.

## 지킬 것

- 숫자를 만들지 않는다. 금액을 맞추려고 근거 없는 항을 식에 넣지 않는다. 식에 넣는 항은 줄 이름이나 문장에 그 조정이라고 적혀 있어야 한다.
- 자본변동표의 열은 자본 항목이다. 「당기」 「전기」 로 적지 않고 열 이름(「자 본 금」, 「총 계」)을 글자 그대로 적는다.
- AI 가 적은 연결은 `confirmed: false` 다. 맞는지는 회계사가 엑셀의 확인 칸에 O · X 로 적는다.
- 고객 dsd 와 결과 엑셀을 저장소나 공유 폴더에 올리지 않는다.
- 문체: 줄표와 비유 명사를 쓰지 않고 물음표로 끝내지 않는다. 회계사에게 부탁은 「주십시오」.
