Skip to content

refactor(reverse_sync): list 경로에 visible segment 모델을 도입합니다#991

Open
jk-kim0 wants to merge 2 commits intomainfrom
jk/list-visible-segments-phase1
Open

refactor(reverse_sync): list 경로에 visible segment 모델을 도입합니다#991
jk-kim0 wants to merge 2 commits intomainfrom
jk/list-visible-segments-phase1

Conversation

@jk-kim0
Copy link
Copy Markdown
Contributor

@jk-kim0 jk-kim0 commented Apr 10, 2026

문제 현상

reverse_sync 의 list 경로는 normalize_mdx_to_plain() 과 list 전용 whitespace helper 에 의존하고 있었습니다.
이 구조에서는 visible whitespace 정보가 패치 전략 결정 전에 손실되어 다음 문제가 발생했습니다.

  • preserved-anchor 리스트에서 trailing space 제거가 누락됨
  • marker 뒤 공백만 바뀐 preserved-anchor 리스트에서 no-op modify patch 생성
  • continuation line reflow, visible whitespace edit, structural list edit 를 서로 다른 예외 helper 로 구분해야 함

구현 내용

  • lossless list 전용 abstraction 으로 VisibleSegment, VisibleContentModel 을 추가했습니다.
  • confluence-mdx/bin/reverse_sync/visible_segments.py 에서 MDX list / XHTML list 의 visible text 와 structural fingerprint 를 직접 추출하도록 했습니다.
  • patch_builder.py 의 list 전략을 새 모델 기반으로 전환했습니다.
  • list 경로의 판단을 다음 기준으로 정리했습니다.
    • visible text change
    • structural fingerprint change
    • preserved-anchor 여부
  • preserved-anchor 리스트 text transfer 는 mapping.xhtml_plain_text 대신 실제 XHTML fragment 에서 추출한 visible text 를 기준으로 수행하도록 바꿨습니다.
  • spec / plan 문서를 함께 추가했습니다.
    • docs/superpowers/specs/2026-04-10-list-visible-segments-phase1-design.md
    • docs/superpowers/plans/2026-04-10-list-visible-segments-phase1.md

기대 효과

  • list 1차 범위에서 visible whitespace edit 를 문자 변경과 같은 수준으로 다룰 수 있습니다.
  • preserved-anchor 리스트의 trailing-space 누락과 no-op patch 생성 회귀를 막습니다.
  • 이후 paragraph / table / containing 경로로 같은 abstraction 을 순차 확장할 수 있는 기반을 마련합니다.

검증

  • pytest -q tests/test_reverse_sync_visible_segments.py tests/test_reverse_sync_patch_builder.py tests/test_reverse_sync_xhtml_patcher.py tests/test_reverse_sync_xhtml_normalizer.py
  • pytest -q tests/test_reverse_sync_patch_builder.py tests/test_reverse_sync_mapping_recorder.py tests/test_reverse_sync_sidecar.py tests/test_reverse_sync_cli.py

@vercel
Copy link
Copy Markdown

vercel bot commented Apr 10, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
querypie-docs Ready Ready Preview, Comment Apr 10, 2026 1:22pm

Request Review

- isu_001 (confluence-mdx/bin/reverse_sync/visible_segments.py:100): structural_fingerprint에 entry.marker_ws를 포함시키면 렌더 결과가 동일한 마커 뒤 공백 수정까지 구조 변경으로 분류됩니다. 현재 build_patches()는 이 값을 그대로 비교해서 clean list에 replace_fragment를 생성하므로, *  항목 -> * 항목 같은 no-op 변경에도 불필요한 reverse-sync 패치가 발생합니다. visible segment 단계에서는 보이지 않는 marker gap을 구조 차이에서 제외하거나, list 전략에서 이를 rebuild 조건으로 쓰지 않도록 분리해야 합니다.
- isu_002 (confluence-mdx/bin/reverse_sync/patch_builder.py:190): 이 PR의 list 전략 교체로 인해 _normalize_list_for_content_compare()의 production 호출부가 모두 제거되었습니다. 함수 정의(190-234줄)와 test 파일의 직접 import(test_reverse_sync_patch_builder.py 35줄, 3117줄~)만 남아 dead production code가 되었습니다. 함수 및 해당 단위 테스트를 제거하거나 extract_list_model_from_mdx 기반의 동등한 동작 테스트로 교체해야 합니다.
@jk-kim0
Copy link
Copy Markdown
Contributor Author

jk-kim0 commented Apr 10, 2026

[debate-review][sha:88eecdbe91f76265a378982946dfda6cb6f38bbc] Consensus reached after 3 rounds.

Debate Summary

  • isu_001 [accepted] structural_fingerprint에 entry.marker_ws를 포함시키면 렌더 결과가 동일한 마커 뒤 공백 수정까지 구조 변경으로 분류됩니다. 현재 build_patches()는 이 값을 그대로 비교해서 clean list에 replace_fragment를 생성하므로, * 항목 -> * 항목 같은 no-op 변경에도 불필요한 reverse-sync 패치가 발생합니다. visible segment 단계에서는 보이지 않는 marker gap을 구조 차이에서 제외하거나, list 전략에서 이를 rebuild 조건으로 쓰지 않도록 분리해야 합니다.
  • isu_002 [accepted] 이 PR의 list 전략 교체로 인해 _normalize_list_for_content_compare()의 production 호출부가 모두 제거되었습니다. 함수 정의(190-234줄)와 test 파일의 직접 import(test_reverse_sync_patch_builder.py 35줄, 3117줄~)만 남아 dead production code가 되었습니다. 함수 및 해당 단위 테스트를 제거하거나 extract_list_model_from_mdx 기반의 동등한 동작 테스트로 교체해야 합니다.
  • isu_001 [accepted] structural_fingerprint가 ordered list의 시작 번호를 루트 리스트 1개(ol_start)만 기록해서 중첩 ordered list의 start 변경을 놓칩니다. nested ordered list의 시작값도 fingerprint에 포함해야 구조 변경이 감지됩니다.

Applied Fixes

  • confluence-mdx/bin/reverse_sync/visible_segments.py:100 - (reported by codex, applied by codex) structural_fingerprint가 ordered list의 시작 번호를 루트 리스트 1개(ol_start)만 기록해서 중첩 ordered list의 start 변경을 놓칩니다. nested ordered list의 시작값도 fingerprint에 포함해야 구조 변경이 감지됩니다.
  • confluence-mdx/bin/reverse_sync/patch_builder.py:190 - (reported by cc, applied by codex) 이 PR의 list 전략 교체로 인해 _normalize_list_for_content_compare()의 production 호출부가 모두 제거되었습니다. 함수 정의(190-234줄)와 test 파일의 직접 import(test_reverse_sync_patch_builder.py 35줄, 3117줄~)만 남아 dead production code가 되었습니다. 함수 및 해당 단위 테스트를 제거하거나 extract_list_model_from_mdx 기반의 동등한 동작 테스트로 교체해야 합니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant