대한민국 국회의 법률안 · 국회의원 · 회의록을 국회 웹사이트에서 수집해 로컬 SQLite에 적재하고, 그 위에서 클로드가 SQL로 탐색하는 congress 스킬을 만드는 프로젝트다.
동작 중. 스킬은 .claude/skills/congress에 있고, 하루 1회 self-hosted 러너에서 수집이 돈다. 구현 계획과 원천 정찰 기록은 docs/plan/260808에 있다.
WebSearch는 모집단을 보여주지 못한다. 특정 날짜·플랫폼으로 거를 수 없고 같은 질의에도 결과가 매번 다르다. 그래서 "이 의원이 22대에 발의한 법안 전부", "이 법안에 반대표를 던진 의원 명단"처럼 완결성이 답의 일부인 질문에 원리적으로 답할 수 없다. 하나가 빠져도 빠졌다는 사실조차 알 수 없다.
국회 OpenAPI도 쓰지 않는다 — 상당수가 작동하지 않고, 작동하는 것도 웹사이트 값과 어긋난다. 웹사이트는 사람이 많이 쓰므로 틀리면 곧 드러나고 고쳐진다.
목적은 조회 자동화가 아니라 클로드가 국회를 실제로 아는 상태를 만드는 것이고, DB는 그 판단의 재료다.
| 도메인 | 범위 | 적재 실적 |
|---|---|---|
| 의안 | 22대 전체 의안의 목록. 그중 법률안만 상세·표결·발의자·심사단계 | 20,619건 · 심사단계 44,523 · 발의자 267,759 · 표결 367,984 · 대안관계 4,160 · 공포법률 1,469 |
| 의원 | 22대 국회의원 + 임기 중 떠난 의원. 인적사항·소속위원회·정당 | 323명 |
| 회의록 | 상임위·예결위·특위·국정감사·국정조사 (소위 포함). 회의 + 화자 + 발언 | 2,047건 / 열거 2,056 · 발언 1,386,794 |
의안번호에 구멍이 0이다. 번호가 연속이라 이건 누락이 없다는 산술적 증명이다. 회의록 9건은 원천이 쓸 만한 문서를 주지 않아 재시도 상한에 걸렸고, 실패 원장에 남아 있다.
법률안의 결말 분포는 계류 14,197 · 대안반영폐기 3,834 · 공포 1,428 · 본회의불부의 317 · 철회 161 · 수정안반영폐기 39 · 재의부결 26이다. 71%가 아직 안 끝났다.
심사단계가 51,776에서 줄어든 것은 데이터를 잃은 것이 아니다. 담을 사실이 없던 단계 셋(관련위·정부이송·공포)을 빼고 그 내용을 제 자리로 옮겼다. 발의자는 원천이 14명씩 페이징하는 것을 v1이 몰라서 215,818에 머물러 있었다.
담지 않는 것 — 본회의 회의록, 법안 조문 원문(HWP/PDF), 22대 이전 대수, 현행 법령·판례(법제처 소관), 국회 예정 일정, 국민동의청원. 각각의 이유는 01-목적과-범위.md에 있다.
| 항목 | 결정 |
|---|---|
| 언어 / 런타임 | Python 3.11+ · uv run (PEP 723 인라인 메타데이터) |
| 데이터 저장소 | SQLite (.claude/skills/congress/CONGRESS.db, git 제외) |
| 수집 | httpx로 직접 HTTP. 브라우저 자동화는 정찰 전용 |
| 원본 데이터 출처 | likms.assembly.go.kr (의안) · record.assembly.go.kr (회의록) · www.assembly.go.kr (의원) |
| 배포 | 없음. 클로드 스킬로 로컬에서 쓴다 |
| 정기 수집 | GitHub Actions cron + self-hosted 러너, 하루 1회 |
웹 API 서버를 만들지 않는다. 저장소 이름이 Congress-API이지만 산출물은 HTTP 서비스가 아니라 클로드가 로드하는 스킬이다.
uv만 있으면 된다. 의존성은 스크립트마다 PEP 723으로 선언돼 있어 uv run이 알아서 받는다.
uv run .claude/skills/congress/Scripts/collect.py # 수집 — 따라잡기
uv run .claude/skills/congress/Scripts/collect.py --audit-only # 상태만 (락을 안 잡는다)
sqlite3 .claude/skills/congress/CONGRESS.db .schema # 여기서부터 읽어라DB는 저장소에 없다(재구축 가능한 거대 바이너리다). 처음 받으면 의안 상세 2만 건이 가장 길다 — 동시 6으로 약 1.5시간이고, 중간에 죽어도 다음 실행이 이어받는다.
문제가 생겼을 때 어느 쪽이 깨졌는지 가르는 도구가 둘이다.
uv run .claude/skills/congress/Scripts/db.py selftest --db /tmp/t.db # 우리 코드가 회귀했나
uv run .claude/skills/congress/Scripts/verify.py # 국회 사이트가 바뀌었나미정. 수집물은 국회 웹사이트의 공개 자료이고 이 저장소에 포함되지 않는다.