confluence-mdx: reverse-sync 입력 정합성을 검증합니다#1031
Conversation
## Summary MDX 변경이 올바른 Confluence page와 dependency를 대상으로 하는지 검증하고, 검증된 link/attachment만 Storage XHTML과 publisher에 전달합니다. - page ID, confluenceUrl, repository path를 하나의 source identity로 결합합니다. - stale original과 forward converter drift를 provenance evidence로 구분합니다. - attachment catalog와 internal link resolver를 local proof에 결합합니다. - internal page link와 attachment reference를 Confluence macro로 안전하게 렌더링합니다. - publisher가 attachment와 linked page identity를 PUT 직전에 다시 확인합니다. - OpenSpec의 P0 base parity/dependency contract와 검증 결과를 갱신합니다. ## Test plan - [x] 전체 Python test 1085 passed, 2 skipped - [x] reverse-sync Python test 762 passed - [x] make test-convert 21 passed - [x] make test-reverse-sync golden 16 passed, regression fixture 통과 - [x] make test-byte-verify fast/splice 각각 21/21 passed - [x] openspec validate complete-reverse-sync --strict - [x] git diff --check 🤖 Generated with Codex Co-Authored-By: Atlas <atlas@jk.agent>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 9ea1109ef9
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| available = {attachment.filename for attachment in catalog.attachments} | ||
| missing = sorted(set(required) - available) |
There was a problem hiding this comment.
Compare attachment identity, not just filenames
When a verified change adds an attachment reference, the local proof records attachment_id, version, and a catalog hash, but this preflight reduces the current catalog to a filename set. If screen.png is deleted/reuploaded or versioned after verification but before push, the dependency check still passes and the candidate is published against an attachment that was not the one verified; the postcondition only compares Storage XHTML, so it will not catch changed binary content. Carry the required attachment identity/version through and compare them here.
Useful? React with 👍 / 👎.
| for key in ("new_element_xhtml", "new_inner_xhtml"): | ||
| if key in current: | ||
| current[key] = _resolve_generated_links( | ||
| str(current[key]), | ||
| resolver, | ||
| attachment_filenames, | ||
| ) |
There was a problem hiding this comment.
Resolve links inside inline fixup patches
When a change is emitted as a text-level patch with inline_fixups (for list/container inline boundary changes), those nested fixup dictionaries also contain new_inner_xhtml. This resolver only scans top-level patch fields, so a relative link or attachment link inside an inline fixup remains as raw <a href="..."> instead of the Confluence ac:link/attachment macro even though the dependency gate may have passed, leaving a broken or unverified link in the candidate. Resolve inline_fixups[*].new_inner_xhtml as well.
Useful? React with 👍 / 👎.
Summary
MDX 변경이 올바른 Confluence page와 dependency를 대상으로 하는지 증명한 뒤에만 Storage XHTML candidate와 push manifest를 생성합니다.
confluenceUrl,src/content/ko/**.mdxpath,pages.qm.yamlrow를 하나의 source identity로 결합합니다.page.v1.yamlprovenance를 classification-only evidence로 사용하여stale_original_mdx와forward_converter_drift를 구분합니다.ac:link/ri:pagemacro로 렌더링합니다.Safety boundary
Test plan
make test-convert: 21 passedmake test-reverse-sync: golden 16 passed, regression fixture 통과make test-byte-verify: fast/splice 각각 21/21 passedopenspec validate complete-reverse-sync --strictgit diff --checkStack
main으로 변경할 수 있습니다.🤖 Generated with Codex