Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
9251f5b to
4fcfec0
Compare
|
최신 head 기준으로 PR 886과 PR 902를 다시 비교했습니다. 비교 기준:
검증:
현재 두 PR은 예전보다 많이 수렴했습니다. 둘 다 남는 실질적 차이는 다음입니다.
정리하면, 지금 차이는 “902가 더 완성됐다”라기보다 “902가 더 넓게 replace_fragment를 적용한다”에 가깝습니다. 제 의견:
즉, 적용 범위를 공격적으로 넓히는 것이 목적이 아니라면, 현재는 PR 886 쪽이 더 좋은 최종안이라고 봅니다. |
PR 886 vs 902 비교 분석 (2026-03-15 기준)
공통 사항 (차이 없음)
실질적 차이1.
|
| PR 886 | PR 902 | |
|---|---|---|
| 적용 타입 | paragraph만 |
heading/code_block/hr 이외 모든 블록 |
| anchor 검출 | "<ac:" or "<ri:" (전체) |
<ac:image, <ac:link, <ri:attachment (3종만) |
PR 902는 sidecar가 없을 때 blockquote 등 Phase 2 바깥 블록까지 replace_fragment 대상으로 허용합니다.
PR 886은 명시적으로 paragraph로 제한합니다.
2. _can_replace_table_fragment — table anchor 보호
PR 886: 전용 함수로 anchor 포함 여부 추가 확인
def _can_replace_table_fragment(change, mapping, roundtrip_sidecar):
if roundtrip_sidecar is None or mapping is None:
return False
if _contains_preserved_anchor_markup(mapping.xhtml_text): # <ac: / <ri: 포함 시 차단
return False
...PR 902: roundtrip_sidecar is not None 확인만, anchor 체크 없음
if roundtrip_sidecar is not None and mapping is not None:
patches.append(_build_replace_fragment_patch(...)) # <ac:link 포함 테이블도 교체<ac:link> 등이 포함된 테이블을 실수로 overwrite할 가능성이 있습니다.
3. paired indices 테이블 처리
PR 886: _is_clean_block OR _can_replace_table_fragment — 테이블 타입 변경도 replace_fragment로 처리
PR 902: _is_clean_block만 — paired 블록에서 테이블 변경을 누락
4. 코드 구조
| 항목 | PR 886 | PR 902 |
|---|---|---|
| sidecar 인덱스 구성 | dict comprehension | for 루프 |
_CLEAN_BLOCK_TYPES |
module-level frozenset | inline tuple |
| table 로직 캡슐화 | _can_replace_table_fragment 전용 함수 |
build_patches 내 inline |
결론
PR 886 채택 권고
기능 범위는 거의 같지만, PR 886이 세 가지 실질적 안전장치를 더 갖춥니다:
_can_replace_table_fragment의 anchor 체크 —<ac:link>포함 테이블 overwrite 방지- sidecar-absent fallback의
paragraph제한 — Phase 2 스코프를 코드 구조로 강제 _contains_preserved_anchor_markup의 광범위 검출 (<ac:) — 미지의 Confluence 마크업 유형 보수적 처리
PR 902는 이 세 곳 모두 PR 886보다 범위가 넓거나 보호가 약합니다. Edge case에서 PR 886이 더 안전합니다.
- 기준 커밋을 e40877a (main 최신)로 업데이트합니다 - 반영된 선행 PR에 #886, #902, #888을 추가합니다 - 섹션 2.2에 Phase 2, Phase 3 완료 내용을 추가합니다 - Phase 2: replace_fragment patch action, clean block whole-fragment replacement - Phase 3: reconstructors.py 신규, anchor metadata 추출, offset 매핑 - rehydrator: splice fast path, page-title heading 제거, identity fallback 강화 - 섹션 4 미해결 문제에서 해결된 항목을 정리하고 남은 문제(container, mapping 계층)를 명확히 합니다 - Phase 2, Phase 3 상태를 "완료, main 반영됨"으로 갱신합니다 - 섹션 10 판단을 현재 상태(Phase 0~3 완료, Phase 4~5 미완료)로 업데이트합니다 - cleanup-scope 문서 갱신일 및 기준 커밋을 업데이트합니다 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
## Summary - 기준 커밋을 `e40877af` (main 최신 — #888 이후)으로 업데이트합니다 - 반영된 선행 PR에 #886, #902, #888을 추가합니다 - 섹션 2.2에 Phase 2, Phase 3 완료 내용을 추가합니다 - Phase 2 (#886, #902): `replace_fragment` patch action, clean block whole-fragment replacement - Phase 3 (#902, #888): `reconstructors.py` 신규, anchor metadata 추출, offset 매핑, DOM 재삽입 - rehydrator (#888): splice fast path, page-title heading 제거, identity fallback 강화 - 섹션 4 미해결 문제에서 해결된 항목을 정리하고 남은 문제(Phase 4 container, mapping 계층)를 명확히 합니다 - Phase 2, Phase 3 상태를 "완료, `main` 반영됨"으로 갱신합니다 - 섹션 10 판단을 현재 상태(Phase 0~3 완료, Phase 4~5 미완료)로 업데이트합니다 - cleanup-scope 문서 갱신일 및 기준 커밋을 업데이트합니다 ## Testing - not run (documentation-only change) Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Description
최신
main기준으로 PR 브랜치를 다시 정리한 뒤, reverse-sync 재구성 설계의 Phase 2를 구현합니다.xhtml_patcher.py에replace_fragmentpatch action을 추가합니다patch_builder.py가 clean block은 fragment replacement를 기본 경로로 사용하도록 변경합니다RoundtripSidecar.reconstruction.anchors를 우선 사용하고, sidecar가 없을 때만 제한적인 heuristic으로 fallback합니다reverse_sync_cli.pyverify 경로에서build_sidecar()를 호출해 실제 patch planning에 roundtrip sidecar metadata를 전달합니다Added/updated tests?
test_reverse_sync_patch_builder.py,test_reverse_sync_xhtml_patcher.py,test_reverse_sync_cli.py갱신test_reverse_sync_reconstruction_goldens.py추가pytest -q tests/test_reverse_sync_*.py(522 passed)Additional notes
main위에서 다시 구성했습니다emit_block()기반 fragment 생성과 보수적인 fallback 범위를 유지하는 쪽으로 정리했습니다