feat(#3712): changedPages — 편집 봉투가 눈검증 대상 페이지를 지정한다 (#3630 P3 완결) — #3710 적층 - #3716
Closed
kevin9327 wants to merge 8 commits into
Closed
feat(#3712): changedPages — 편집 봉투가 눈검증 대상 페이지를 지정한다 (#3630 P3 완결) — #3710 적층#3716kevin9327 wants to merge 8 commits into
kevin9327 wants to merge 8 commits into
Conversation
… 단일 출처)
이름 환각은 경량 에이전트의 1순위 실패 유형인데, 미지 명령/도구가 교정 단서 없이
돌아와 맹목 재시도 루프의 원료가 됐다.
- CLI: 미지 명령 exit 2 stderr 에 힌트 1줄. 후보는 capabilities 명령 목록 단일
출처(commands vec 을 capabilities_command_entries() 로 승격 — 동작 무변경)
- 레벤슈타인(의존성 0) + 임계 초과 무제안(오제안 0 원칙)
- MCP: 미지 도구 isError 를 {error:<원문>, didYouMean:[…]} 구조화 — 하위호환 유지
검증: did_you_mean_contract 3건 green, cli_json 22·server 6 무회귀, clippy 0.
실측: exprot-svg→'export-svg' 힌트, hwp_serch→didYouMean:[hwp_search] 원문 동봉.
정보 없는 오류는 맹목 재시도 루프의 원료다(edwardkim#3630 실패 유형 4). tool_error 를 {error:<원문>, nextCall:{name,arguments,why}} 로 구조화(원문 보존 = 하위호환): - 닫힌/모르는 핸들 8개 사이트 전부 → hwp_open 교정 호출 동봉 - 미지 도구 → didYouMean 최근접을 nextCall 로 병기 (edwardkim#3694 단일 출처 재사용) - nextCall.name 은 실존 도구만 — capabilities 선언 대조를 계약 테스트로 고정 검증: mcp_next_call_contract 3건 green, did_you_mean 3·server 6·session_edit 5 무회귀, clippy 0. 실측: 닫힌 핸들 fill → hwp_open nextCall 라이브 원문 동봉.
"잘 됐겠지" 저장은 에이전트 실패 유형 2의 원료다. 편집 3종+세션 save 에
저장 바이트 즉시 재파싱→IR 대조 자기검증을 내장:
- edit fill-fields/replace-text/set-cell --verify → verify:{identical,diffCount}
동봉, identical=false 면 봉투 출력 후 exit 3 (판정은 데이터·exit 와 무모순)
- 미요청 시 verify:null = 기존 소비자 하위호환
- 재파싱 실패는 identical:false+reparseError 로 보고 (저장물은 남긴다)
- 교차 포맷 저장은 strip_cross_format_noise 후 판정
- mcp-serve hwp_doc_save verify:true — 같은 헬퍼 재사용
검증: edit_verify_contract 4건 green, fill 7·replace 4·set-cell 5 무회귀,
clippy 0. 실측: 3계열 라이브 identical:true (evidence.txt).
…dwardkim#3608 실행 3층) 다단 체이닝(호출 사이 상태 유실·중간 실패의 반편집 문서)이 에이전트 실패의 뿌리다. 절차 대신 의도(계획서)를 받는 3층을 신설한다: - rhwp run <계획.json> [--json] + --plan-json 인라인 (MCP 경로) - 정적 선검증(실행 0): 필드 존재·순번, 치환 일치 건수, 셀 좌표, □ 계수 — 위반 전부를 invalid[{step,action,reason}] 로 한 번에 보고 + exit 2, 출력 파일을 아예 만들지 않는다 - 원자 실행: 전 step 인메모리 IR 적용, 사후 단언(verify=edwardkim#3702 재사용) 통과 시에만 단 한 번 저장 — 실패 시 디스크 무변경(자연 트랜잭션), 단언 실패 exit 3 - 저널 봉투: step 별 결과 + verify + assertions 에코 — 판정은 전부 데이터 - 새 편집 로직 0: 판정자·적용자가 기존 edit 3종과 동일 함수 - MCP hwp_run_plan{plan}: capabilities 단일 출처 cmdTemplate 등록(서버 무변경) 검증: run_plan_contract 6건 green, cli_json·edit 4계열·mcp_server 무회귀, clippy 0, fmt clean. 실측: 정상 저널·선검증 exit 2(출력 부재)·MCP 인라인 3계열. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
`cargo fmt --all -- --check` 가 tests/run_plan_contract.rs:65 에서 걸려 Lint 잡이 멈췄고, Build & Test 워커 전체가 그 결과를 물려받아 skipped 로 떨어졌다. 동작 변경 없음 — 체이닝 어서션 한 건의 줄바꿈만 규범형으로 맞춘다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
8 tasks
…im#3630 P3 완결) 에이전트는 편집 결과를 눈으로 못 본다. 표면이 "몇 쪽이 바뀌었나"를 지정해야 그 쪽만 hwp_doc_render_page 로 렌더하는 검증 루프가 상수 비용으로 닫힌다: - 코어 pub 질의 pages_covering_paragraphs: grep 페이지 인덱스와 같은 순회를 재사용하되 문단이 걸친 모든 쪽(분할 표 포함)을 담는다 — 누락은 거짓 통과, 상위집합은 렌더 한 번 더일 뿐. 하나라도 커버리지 밖이면 None(부분 목록 금지) - 진입 시 paginate_if_needed — 편집이 남긴 dirty 를 저장 직전 조판으로 소화 - 추적: fill=FieldLocation, replace=치환 전 grep 매치(문단 인덱스 불변), set-cell=호스트 문단, run 저널=step 합집합(set_checkbox n번째 □ 포함) - 봉투: edit 3종 --json + run 저널 changedPages:[n]|null, dry-run·무산출 null - capabilities outputFields 5곳 동기화 - 세션 도구는 edwardkim#3704(세션 재조판) 머지 후 후속 적층(이슈 명시) 검증: changed_pages_contract 5건 green, cli_json 22·run_plan 6·edit_verify 4· fill 7·replace 4·set-cell 5 무회귀, clippy 0, fmt clean. 실측 4종(evidence.txt). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
exit 3 은 convert/export-hwpx --verify 하나였다가 edit 3종 --verify(edwardkim#3702)· run 계획 단언(edwardkim#3703)으로 넓어졌는데, capabilities 자기서술은 옛 문구에 머물러 있었다. 자기서술만 읽는 에이전트는 "편집에는 3이 안 나온다"고 오판한다 — 선언이 계약을 배신하는 지점이다. - exitCodes.3 을 세 표면(convert·edit·run) 전부로 갱신 - 드리프트 가드 exit_code_dictionary_covers_every_verify_surface 추가: 0~4 전 코드에 비어 있지 않은 설명 + exit 3 설명이 convert·edit·run 을 모두 언급해야 통과 — 앞으로 exit 3 표면이 늘면 사전도 함께 늘어야 한다 검증: cli_json_contract 23건 green (신규 1 포함), clippy 0, fmt clean. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
kevin9327
force-pushed
the
pr/task-changed-pages
branch
from
August 1, 2026 11:37
82b269c to
3e49c8b
Compare
…에 등재 edwardkim#3712 가 들여온 새 공개 표면이 `pub fn (&mut self)` 뮤테이터 후보로 분류돼 classification_drift_is_blocked 가 실패했다. Lint(fmt) 가 먼저 걸려 shard 가 skipped 되는 바람에 직전 실행에서는 가려져 있었다. 이 함수는 조판 커버리지를 읽어 페이지 번호만 돌려주는 **조회**다. `&mut` 인 이유는 dirty 구역을 맞추는 paginate_if_needed 한 줄뿐이고 문서 IR 은 건드리지 않으므로, 같은 계열인 flush_deferred_pagination·repaginate_if_needed 와 같이 SessionState 로 등재한다. 검증: issue_2724_passthrough_invalidation_guard 5/5 green, fmt clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
요약 (#3712 · #3630 P3 · #3710 적층 — 내성 4종 완결)
에이전트는 편집 결과를 눈으로 못 봅니다(#3630 실패 유형 3). 어느 쪽이 바뀌었는지
표면이 지정하지 않으면 전 페이지를 렌더하거나 검증을 건너뜁니다. 이 PR로 편집
봉투가
changedPages로 눈검증 대상을 지정합니다 — 에이전트는 그 페이지만hwp_doc_render_page {page:n}로 렌더하면 되고, 검증 루프가 상수 비용으로 닫힙니다.이로써 #3630 내성 4종이 완결됩니다: P1 did-you-mean(#3698) · P2 --verify(#3705) ·
P4 nextCall(#3701) · P3 changedPages(본 PR).
동작
edit fill-fields / replace-text / set-cell --json봉투와rhwp run저널에changedPages: [n,…] | null(0 기준 글로벌 페이지).pages_covering_paragraphs(queries/changed_pages.rs):걸친 모든 쪽(분할 표 PartialTable 포함)을 담습니다 — 누락은 거짓 통과를
만들지만 상위집합은 렌더 한 번 더일 뿐입니다.
paginate_if_needed()— 편집 커맨드가 남긴 dirty 를 저장 직전 조판으로소화한 뒤 걷습니다.
null 강등. dry-run·치환 0건(무산출)도 null.
재조판 시점 규약을 그쪽과 맞춥니다([신규 계약] changedPages — 편집 봉투가 눈검증 대상 페이지를 지정한다 (#3630 P3) #3712 이슈 본문 명시).
실측 (mydocs/report/task_m100_3712/evidence.txt)
changedPages:[0]— 회사명 필드가 놓인 쪽.changedPages:[0]— 매치 문단 쪽.changedPages:null— 예측 목록으로 오인 금지.changedPages:[0]+verify identical:true.검증
changed_pages_contract5건 green: fill/replace/set-cell 비어 있지 않음 +0 기준·pageCount 범위 유효 / dry-run null / run 합집합
-D warnings0 · fmt clean처리결과문서
🤖 Generated with Claude Code
추가 커밋 — exit 3 사전 드리프트 수정 (같은 "자기서술 동기화" 범주)
capabilities의 exit 코드 사전이 실제 계약을 배신하고 있었습니다: exit 3 은convert/export-hwpx --verify하나였다가 edit 3종--verify(#3702) ·run계획 단언(#3703) 으로 3개 표면이 됐는데, 사전은 옛 문구 그대로였습니다.자기서술만 읽는 에이전트는 "편집에는 3이 안 나온다"고 오판합니다.
exitCodes.3을 세 표면 전부로 갱신exit_code_dictionary_covers_every_verify_surface추가 —0~4 전 코드에 비어 있지 않은 설명 + exit 3 설명이 convert·edit·run 을 모두
언급해야 통과. 앞으로 exit 3 표면이 늘면 사전도 함께 늘어야 합니다.
이 PR 이 이미 capabilities
outputFields5곳을 동기화하고 있어 같은 범주로 묶었습니다(exit 3 의 두 확장이 본 스택 하위 커밋 #3705·#3710 에 있어, 여기서만 정합이 맞습니다).
검증:
cli_json_contract23건 green(신규 1 포함).