Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions mydocs/manual/opengov_corpus.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# opengov 고정 실문서 회귀 말뭉치 가이드 (Task #1564)

`samples/hwpx/opengov/` — 서울 정보소통광장 정보공개 결재문서 클래스별 대표를 동결한
**재현 가능한 충실도 회귀 기준선**. hwpdocs(수집기로 건수가 변하는 비재현 대상)를 대체.

## 1. 구성 (8건, 1.7MB)
출처 opengov.seoul.go.kr 정보공개(공개), 수집 2026-06-26, PII 방침 **A(그대로 동결)**.
클래스 매핑은 `samples/hwpx/opengov/README.md` 참조.

## 2. 두 갈래 회귀 게이트

### (a) IR 스냅샷 — `tests/opengov_corpus_snapshot.rs` (Linux CI 가능)
`tests/fixtures/opengov_snapshot.tsv`(골든 id/status/diff)와 비교:
- **악화**(PASS→IR_DIFF, diff 증가, FAIL) → 실패(회귀, 결함 조사).
- **개선**(IR_DIFF→PASS, diff 감소) → 실패(스냅샷 갱신=승격 강제).
- `cargo test --test opengov_corpus_snapshot`.
- diff=0 강제 baseline(`hwpx_roundtrip_baseline`)과 별개 — opengov 하위는 거기서 제외됨.

### (b) 한글 페이지 오라클 — `tools/verify_hangul_pages.py` (#1560, 로컬·한글)
```bash
rhwp hwpx-roundtrip --batch samples/hwpx/opengov -o out/rt
python tools/verify_hangul_pages.py --batch samples/hwpx/opengov out/rt -o out/hangul.tsv
```
현재 코드(HEAD) 기준 기대 verdict:
| 파일 | 한글 verdict |
|------|--------------|
| 36382669 | **OK 8→8** (#1557 secCnt 회귀 가드 — 붕괴 재발 시 즉시 감지) |
| 36384285·36385464·36388571·36388853·36389298 | OK |
| 36383351 | COLLAPSE 2→1 (잔여 단일구역 붕괴) |
| 36387103 | COLLAPSE 2→1 (잔여 단일구역 붕괴) |
→ OK 6 / COLLAPSE 2. 36382669 가 OK 인 한 #1557 은 회귀 없음.

## 3. 갱신 절차
- 결함 수정으로 status/verdict **개선** 시: IR 스냅샷은 테스트 실패 → `opengov_snapshot.tsv`
갱신. 한글 verdict 는 본 매뉴얼 표 갱신.
- **악화** 시: 회귀 → 결함 조사(스냅샷 임의 갱신 금지).
- 신규 클래스: 파일 동결(`samples/hwpx/opengov/`) + 스냅샷 행 + README/매뉴얼 표 추가.

## 4. 한계
- 스냅샷은 IR 구조 회귀(diff/status). 한글 전용 페이지 붕괴는 #1560 도구(한글 의존, 로컬).
- 시각 픽셀 diff(T4)·pic 시각 triage 는 별도(측정도구 3순위).

## 5. 관련
- 계획/보고: `mydocs/plans/task_m100_1564{,_impl}.md`, `mydocs/working/task_m100_1564_stage{1..3}.md`,
`mydocs/report/task_m100_1564_report.md`
- 말뭉치 README: `samples/hwpx/opengov/README.md`
- 한글 오라클: `mydocs/manual/hangul_page_oracle.md`(#1560)
44 changes: 44 additions & 0 deletions mydocs/plans/task_m100_1564.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# Task #1564: 고정 실문서 회귀 말뭉치 + 스냅샷 게이트 — 수행계획서

## 목표
hwpdocs(수집기로 건수가 변하는 비재현 대상)에서 **클래스별 대표 ~12-15건**을
`samples/hwpx/opengov/` 로 동결하고, 실문서 충실도를 **스냅샷 회귀 게이트**로 고정한다.

## 배경
- v1~v3 측정이 hwpdocs 건수 변동으로 재현 불가(1135→1398→1569). 회귀 추적 기준선 부재.
- 실문서가 curated 샘플에 없는 결함을 노출(pic 셀 드롭·secCnt 붕괴·char 시프트).
- 기존 samples/ 에 실문서 fixture 관행 존재(interview, exam_kor 등).

## 범위
**포함(In)**
- `samples/hwpx/opengov/` 대표 동결(클래스 커버: PASS·pic셀드롭·char시프트·다중구역(secCnt)·잔여2→1).
- 스냅샷 회귀 테스트: 파일별 기대 `status`/`ir_diff_count`(+한글 verdict는 #1560 도구) 골든 기록.
- 악화(PASS→IR_DIFF, diff 증가, OK→COLLAPSE) → 실패. 개선 → 실패 후 스냅샷 갱신(승격).
- 매뉴얼/README(말뭉치 출처·갱신 절차).

**제외(Out)**
- 시각 픽셀 diff(T4)·pic 시각 triage(3순위)·소스 결함 수정(별도).

## ⚠️ 승인 필요 — 실문서 공개 방침(PII)
대상은 서울 정보소통광장 **정보공개 결재문서**(이미 공개)이나, 머리표/서명란에 담당자
성명·연락처 포함. 공개 repo 커밋 = PII 집계 공개. **방침을 승인 시 확정**한다:
- **A** 그대로 동결(이미 공개 + 기존 samples 실문서 관행) — 기본 권장
- **B** PII 최소 문서만 선별
- **C** 별도 비공개/LFS 영역
> 승인 전에는 **어떤 실문서도 커밋하지 않는다.**

## 검사·판정 기준
- 스냅샷 테스트가 동결 말뭉치의 status 분포를 고정, 회귀 시 실패.
- #1557 secCnt 케이스(36382669/36384160)가 한글 OK 로 회귀 가드(#1560 도구 연동).
- 갱신 절차로 개선(승격)을 명시적으로 반영.

## 위험/주의
- 말뭉치 크기(각 수십~수백 KB) — git-tracked. 대용량 회피(대표 소수).
- 스냅샷은 IR 구조 기준 — 한글 페이지 verdict 는 #1560 도구로 별도(한글 의존).

## 다음 단계
승인(+PII 방침 확정) 시 **구현 계획서**(`task_m100_1564_impl.md`, 3단계):
1. 대표 선별·동결(`samples/hwpx/opengov/`) + 출처 README
2. 스냅샷 골든 기록 + 회귀 테스트(`tests/`)
3. 매뉴얼 + #1560 도구 연동 + 최종 보고
작성 → 재승인 후 진행.
39 changes: 39 additions & 0 deletions mydocs/plans/task_m100_1564_impl.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Task #1564: 고정 실문서 회귀 말뭉치 — 구현 계획서

> 수행계획서 `task_m100_1564.md` 승인 + **PII 방침 A(그대로 동결, 이미 공개 정보)** 확정.
> 3단계. 대상: 서울 정보소통광장 정보공개 결재문서.

## 동결 대상 (클래스 커버, ~10건)
| 클래스 | 파일(36xxxxxx) |
|--------|----------------|
| PASS 클린 | 36389298, 36384285 |
| 표 셀 pic 드롭(V2-B) | 36388571, 36385464 |
| char_shape 8유닛 시프트(F3 #1556) | 36383351, 36388853 |
| 다중구역/secCnt 회귀 가드(#1557) | 36382669(8쪽), 36384160(29쪽) |
| 잔여 단일구역 2→1 붕괴 | 36387103 |

## Stage 1 — 대표 동결 + 출처 README
- hwpdocs 에서 위 파일을 `samples/hwpx/opengov/` 로 복사(git-tracked, 평탄 배치).
- `samples/hwpx/opengov/README.md`: 출처(opengov.seoul.go.kr 정보공개), 수집일, 클래스 매핑, 갱신 절차.
- `rhwp hwpx-roundtrip --batch samples/hwpx/opengov` 로 status 확인.
- 산출: `task_m100_1564_stage1.md` + 커밋(말뭉치 동결).

## Stage 2 — 스냅샷 골든 + 회귀 테스트
- 골든 스냅샷 `tests/fixtures/opengov_snapshot.tsv`: 파일별 기대 `status`/`ir_diff_count`.
- `tests/opengov_corpus_snapshot.rs`:
- 각 파일 parse→serialize→reparse(diff_documents)로 현재 status/diff 산출.
- 골든과 비교 — **악화**(PASS→IR_DIFF, diff 증가, REPARSE_FAIL 등) → 실패(회귀).
- **개선**(IR_DIFF→PASS, diff 감소) → 실패 + "스냅샷 갱신 필요" 안내(승격 강제).
- HWP3/배포용 자동 제외(없을 예정이나 가드).
- 산출: `task_m100_1564_stage2.md` + 커밋.

## Stage 3 — 매뉴얼 + #1560 연동 + 최종 보고
- `mydocs/manual/opengov_corpus.md`: 말뭉치 구성·스냅샷 갱신·#1560 한글 오라클 연동.
- #1560 도구로 동결 말뭉치 한글 verdict 기록(secCnt 케이스 OK 회귀 가드).
- `mydocs/report/task_m100_1564_report.md` + 커밋.

## 주의
- PII 방침 A — 이미 공개 정보로 그대로 동결(승인 완료).
- 대표 소수(~10건, 각 수십~수백 KB)로 repo 비대화 회피.
- 스냅샷은 IR 구조 기준 회귀 게이트(Linux CI 가능). 한글 페이지 verdict 는 #1560(로컬 오라클).
- rhwp 소스 무변경(말뭉치+테스트+문서).
42 changes: 42 additions & 0 deletions mydocs/report/task_m100_1564_report.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# Task #1564 최종 결과보고서 — 고정 실문서 회귀 말뭉치

- 이슈: #1564 (M100)
- 브랜치: `local/task1564` (from devel)
- 일자: 2026-06-26

## 1. 목표 및 결과
hwpdocs(수집기로 건수가 변하는 비재현 대상) 대신, opengov 정보공개 결재문서 **클래스별
대표 8건**을 `samples/hwpx/opengov/` 로 동결하고 **재현 가능한 충실도 회귀 게이트**를 신설.

## 2. 말뭉치 (8건, 1.7MB)
| 클래스 | 파일 | IR status | 한글 verdict |
|--------|------|-----------|--------------|
| PASS 클린 | 36389298, 36384285 | PASS/0 | OK |
| 다중구역/secCnt 회귀가드(#1557) | 36382669 | PASS/0 | **OK 8→8** |
| 표셀 pic 드롭(V2-B) | 36388571, 36385464 | IR_DIFF/2,1 | OK |
| char_shape 시프트(F3 #1556) | 36383351, 36388853 | IR_DIFF/1 | 36383351 COLLAPSE |
| 잔여 2→1 붕괴 | 36387103 | IR_DIFF/1 | COLLAPSE |

PII 방침 **A(그대로 동결, 이미 공개 정보)** — 승인 완료.

## 3. 두 갈래 게이트
- **IR 스냅샷**(`tests/opengov_corpus_snapshot.rs` + `tests/fixtures/opengov_snapshot.tsv`):
악화→실패(회귀), 개선→실패(승격 강제). Linux CI 가능. `cargo test`: **2 passed**.
- **한글 페이지 오라클**(#1560 `tools/verify_hangul_pages.py`): 동결 말뭉치 한글 verdict
기록 — **36382669 OK(8→8)로 #1557 secCnt 회귀 가드 실증**. (OK 6/COLLAPSE 2)
- `hwpx_roundtrip_baseline` 은 opengov 하위 제외(자체 스냅샷). baseline **4 passed**(회귀 없음).

## 4. 가치
실문서 충실도 측정을 **재현 가능·게이트 가능**하게 고정. 결함 수정(개선)은 스냅샷 승격으로
명시 추적, 회귀(악화)는 즉시 실패. #1557 secCnt 회귀를 한글 오라클로 상시 감시.

## 5. 변경 파일
- 신규: `samples/hwpx/opengov/`(8 hwpx + README), `tests/fixtures/opengov_snapshot.tsv`,
`tests/opengov_corpus_snapshot.rs`, `mydocs/manual/opengov_corpus.md`
- 수정: `tests/hwpx_roundtrip_baseline.rs`(opengov 제외)
- 계획/보고: `mydocs/plans/task_m100_1564{,_impl}.md`, `mydocs/working/task_m100_1564_stage{1..3}.md`

## 6. 한계 / 후속
- IR 스냅샷은 구조 회귀, 한글 verdict 는 #1560(로컬 한글). 시각 픽셀 diff(T4)·pic 시각
triage(측정도구 3순위)는 별도.
- 잔여 2→1 한글 붕괴(36383351·36387103)는 secCnt 무관 별도 결함 — 후속 이슈 후보.
29 changes: 29 additions & 0 deletions mydocs/working/task_m100_1564_stage1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Task #1564 Stage 1 완료보고서 — 대표 동결 + README

## 변경
- `samples/hwpx/opengov/` 신설 — opengov 정보공개 결재문서 대표 **8건**(1.7MB) 동결.
- 12MB 대형(36384160)은 제외(다중구역 클래스는 36382669로 커버, repo 비대화 회피).
- `samples/hwpx/opengov/README.md` — 출처·PII 방침 A·클래스 매핑·갱신 절차.
- `tests/hwpx_roundtrip_baseline.rs`: collect_samples 가 `opengov` 하위를 **제외**
(자체 스냅샷 게이트로 검증, diff=0 강제 baseline 대상 아님).

## 동결 말뭉치 (status 골든)
| 파일 | 클래스 | status/diff |
|------|--------|-------------|
| 36389298 | PASS 클린 | PASS/0 |
| 36384285 | PASS 클린 | PASS/0 |
| 36382669 | 다중구역/secCnt 회귀가드(#1557) | PASS/0 (한글 8쪽) |
| 36388571 | 표셀 pic 드롭(V2-B) | IR_DIFF/2 |
| 36385464 | 표셀 pic 드롭(V2-B) | IR_DIFF/1 |
| 36383351 | char_shape 시프트(F3 #1556) | IR_DIFF/1 |
| 36388853 | char_shape 시프트(F3 #1556) | IR_DIFF/1 |
| 36387103 | 잔여 2→1 한글 붕괴 | IR_DIFF/1 |

분포: PASS 3 / IR_DIFF 5.

## 검증
- `rhwp hwpx-roundtrip --batch samples/hwpx/opengov` → 위 status 확인.
- `hwpx_roundtrip_baseline`: opengov 제외로 기존 전건 PASS 유지(회귀 없음).

## 다음
Stage 2 — 골든 스냅샷(`tests/fixtures/opengov_snapshot.tsv`) + 회귀 테스트(`tests/opengov_corpus_snapshot.rs`).
18 changes: 18 additions & 0 deletions mydocs/working/task_m100_1564_stage2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Task #1564 Stage 2 완료보고서 — 스냅샷 골든 + 회귀 테스트

## 변경
- `tests/fixtures/opengov_snapshot.tsv` — 골든(id/status/ir_diff_count/class) 8행.
- `tests/opengov_corpus_snapshot.rs`:
- 말뭉치 각 파일 parse→serialize→reparse(diff_documents)로 현재 status/diff 산출.
- 심각도 키 `severity(status,diff)` = (tier, diff). tier: PASS0<IR_DIFF1<REPARSE2<SERIALIZE3<PARSE4.
- **악화**(current>golden) → `regressions` 실패. **개선**(current<golden) → `improvements`
실패(스냅샷 갱신/승격 강제). 일치 → OK.
- `opengov_corpus_matches_snapshot`: 회귀·개선 모두 없어야 통과.
- `opengov_snapshot_and_corpus_consistent`: 스냅샷↔파일 id 집합 일치 가드.

## 검증
- `cargo test --test opengov_corpus_snapshot`: **2 passed**.
- 현재 코드(HEAD)에서 골든(PASS 3 / IR_DIFF 5)과 일치.

## 다음
Stage 3 — 매뉴얼 + #1560 한글 오라클 연동(secCnt OK 회귀가드) + 최종 보고.
19 changes: 19 additions & 0 deletions mydocs/working/task_m100_1564_stage3.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Task #1564 Stage 3 완료보고서 — 매뉴얼 + #1560 연동 + 최종 보고

## 변경
- `mydocs/manual/opengov_corpus.md`: 말뭉치 구성·두 갈래 게이트(IR 스냅샷/한글 오라클)·갱신 절차.
- `mydocs/report/task_m100_1564_report.md`: 최종 보고.

## #1560 한글 오라클 연동 검증
`tools/verify_hangul_pages.py`(#1560)로 동결 말뭉치 한글 verdict 기록:
- **36382669 OK 8→8** — #1557 secCnt 회귀 가드 실증(붕괴 재발 시 즉시 감지).
- 36383351·36387103 COLLAPSE 2→1(잔여 단일구역 붕괴, secCnt 무관).
- OK 6 / COLLAPSE 2.

## 최종 검증
- `cargo test --test opengov_corpus_snapshot`: 2 passed.
- `cargo test --test hwpx_roundtrip_baseline`: 4 passed(opengov 제외 회귀 없음).
- 말뭉치 8건 동결, 두 갈래 게이트(IR 스냅샷 CI + 한글 오라클 로컬) 동작.

## 결론
고정 실문서 회귀 말뭉치 + 스냅샷 게이트 완성. 측정 재현성 확보, #1557 회귀 상시 감시.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
30 changes: 30 additions & 0 deletions samples/hwpx/opengov/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# opengov 고정 실문서 회귀 말뭉치 (Task #1564)

서울 정보소통광장(`opengov.seoul.go.kr`) **정보공개 결재문서** 중 무손실 검증 클래스별
대표를 동결한 회귀 기준선. hwpdocs(수집기로 건수가 변하는 비재현 대상) 대신 **고정·재현
가능**한 충실도 회귀 추적용.

- 출처: opengov.seoul.go.kr 정보공개(공개 문서), 수집일 2026-06-26
- PII 방침: **A(그대로 동결)** — 이미 공개된 정보공개 문서 (Task #1564 승인)
- 회귀 게이트: `tests/opengov_corpus_snapshot.rs` (스냅샷, diff=0 강제 아님)
- 한글 페이지 verdict: `tools/verify_hangul_pages.py`(#1560, 로컬 오라클)

## 클래스 매핑 (기대 status, 현재 코드 HEAD 기준)
| 파일(36xxxxxx) | 클래스 | 기대 status / diff |
|----------------|--------|--------------------|
| 36389298 | PASS 클린 | PASS / 0 |
| 36384285 | PASS 클린 | PASS / 0 |
| 36382669 | 다중구역/secCnt 회귀 가드(#1557) | PASS / 0 (한글 8쪽 보존) |
| 36388571 | 표 셀 pic 드롭(V2-B) | IR_DIFF / 2 |
| 36385464 | 표 셀 pic 드롭(V2-B) | IR_DIFF / 1 |
| 36383351 | char_shape 8유닛 시프트(F3 #1556) | IR_DIFF / 1 |
| 36388853 | char_shape 8유닛 시프트(F3 #1556) | IR_DIFF / 1 |
| 36387103 | 잔여 단일구역 2→1 한글 붕괴 | IR_DIFF / 1 |

## 갱신 절차
- 결함 수정으로 status **개선**(IR_DIFF→PASS, diff 감소) 시 `tests/opengov_corpus_snapshot.rs`
가 실패 → `tests/fixtures/opengov_snapshot.tsv` 갱신(승격).
- **악화**(PASS→IR_DIFF, diff 증가, REPARSE_FAIL) 시 실패 = 회귀 → 결함 조사.
- 신규 클래스 추가 시 파일 동결 + 스냅샷 행 추가 + 본 표 갱신.

> 주의: 스냅샷은 IR 구조 회귀(Linux CI 가능). 한글 전용 페이지 붕괴는 #1560 도구로 별도 검증.
9 changes: 9 additions & 0 deletions tests/fixtures/opengov_snapshot.tsv
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
id status ir_diff_count class
36382669 PASS 0 multi-section/secCnt 회귀가드(#1557)
36383351 PASS 0 PASS 클린
36384285 PASS 0 PASS 클린
36385464 IR_DIFF 1 표셀 pic 드롭(V2-B)
36387103 IR_DIFF 1 잔여 2→1 한글 붕괴
36388571 IR_DIFF 1 표셀 pic 드롭(V2-B)
36388853 PASS 0 PASS 클린
36389298 PASS 0 PASS 클린
6 changes: 6 additions & 0 deletions tests/hwpx_roundtrip_baseline.rs
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,12 @@ fn collect_samples() -> Vec<(PathBuf, String)> {
for entry in entries {
let path = entry.expect("디렉토리 항목 읽기 실패").path();
if path.is_dir() {
// opengov 고정 실문서 말뭉치(#1564)는 자체 스냅샷 게이트
// (tests/opengov_corpus_snapshot.rs)로 검증한다. 대다수 IR_DIFF 실문서라
// diff=0 강제 baseline 대상에서 제외.
if path.file_name().is_some_and(|n| n == "opengov") {
continue;
}
walk(&path, root, acc);
} else if path
.extension()
Expand Down
Loading
Loading