Skip to content

fix(security): remediate PDF/image/build dependency CVEs - #467

Merged
seonghobae merged 19 commits into
developfrom
claude/contextualwisdomlab-audit-governance-qyxe67
Aug 4, 2026
Merged

fix(security): remediate PDF/image/build dependency CVEs#467
seonghobae merged 19 commits into
developfrom
claude/contextualwisdomlab-audit-governance-qyxe67

Conversation

@seonghobae

@seonghobae seonghobae commented Jul 30, 2026

Copy link
Copy Markdown
Collaborator

Summary

Supply-chain remediation across the NewsDOM runtime, build, and documentation dependency graph. This PR clears the repository’s active pip-audit and trivy-fs findings and records patched lower bounds so a later lock regeneration cannot resolve back into the vulnerable ranges.

Patched dependency set

Package Was Now Security scope
Pillow 12.2.0 12.3.0 image-decoder advisories on the PDF/image ingestion path
pypdf 6.13.3 6.14.2 CVE-2026-59935/59936/59937/59938
Click 8.3.2 8.4.2 PYSEC-2026-2132
setuptools 81.0.0 83.0.0 CVE-2026-59890
pymdown-extensions 10.21.3 11.0.1 CVE-2026-61632
mkdocs-material 9.6.23 9.7.7 permits the patched pymdown-extensions 11.x line

Regression-resistant floors

  • runtime metadata now requires Pillow>=12.3,<13.0 and pypdf>=6.14.2,<7.0;
  • build-system metadata now requires setuptools>=83;
  • a metadata regression test pins all three floors;
  • MkDocs core remains on mkdocs>=1.6,<2.0, while the theme is limited to mkdocs-material>=9.7,<9.8;
  • CHANGELOG.md, CONTRIBUTING.md, and metadata tests describe the security rationale and reversible docs-toolchain boundary.

Verification

Locally reconstructed exact-branch source after the floor changes:

  • PYTHONPATH=src:. python3 -m pytest -q tests/test_project_metadata.py15 passed;
  • PYTHONPATH=src:. python3 -m pytest -q431 passed.

The current GitHub HEAD must still pass the repository CI, 100% statement/branch coverage, quality gate, CodeQL, Semgrep, dependency review, container validation, ClusterFuzzLite, Scorecard, the repaired central OpenCode coverage path, and independent approval before merge.

Scope

Changed files are limited to dependency policy, the generated lock, documentation, and metadata regression coverage. No application source or API contract changes.

Supersession

This PR now contains the useful direct-floor protection from stacked PR #517; #517 is superseded and should not merge independently.

Git Flow target

fix/*develop.

Summary by CodeRabbit

  • 보안 및 유지보수

    • 런타임, 빌드 및 문서 도구 의존성을 보안 수정 버전으로 업데이트했습니다.
    • 전체 잠금 의존성 검사에서 알려진 취약점이 0건이 되었습니다.
    • 이미지 처리, PDF 처리 및 빌드 도구의 최소 지원 버전을 상향했습니다.
  • 문서

    • 문서 빌드 환경과 MkDocs 1.x의 엄격 모드 사용 안내를 갱신했습니다.
    • 최신 문서 테마 및 확장 기능 호환성 정보를 반영했습니다.

pip-audit against the runtime lock (uv export --no-dev) flagged real
advisories in the exact PDF/image parsing path this service depends on.
Re-locked with targeted upgrades (all within the existing pyproject.toml
version ranges):

- pillow 12.2.0 -> 12.3.0 (PYSEC-2026-3451/3452/3453/3454/3493/3494/3495/3496:
  eight image-decoder advisories).
- pypdf 6.13.3 -> 6.14.2 (CVE-2026-59935/59936/59937/59938: PDF parsing).
- click 8.3.2 -> 8.4.2 (PYSEC-2026-2132).
- setuptools 81.0.0 -> 83.0.0 (CVE-2026-59890, build tool).

Verification: `uv export --frozen --no-emit-project --no-dev | pip-audit`
-> No known vulnerabilities found. Lock diff is confined to these four
packages and their hashes.

Residual (documented, not fixable in place): pymdown-extensions 10.21.3
CVE-2026-61632 requires a major bump to 11.0.0, but mkdocs-material 9.6.x
caps pymdown-extensions to <11. It is a docs-build-only dependency (mkdocs),
not on the runtime/API surface, so it does not affect the shipped image or
the `/parse` path; clearing it needs a coordinated docs-toolchain upgrade.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msz8Dni5zRaqPatNCmZJZ8
@coderabbitai

coderabbitai Bot commented Jul 30, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

보안 수정 버전으로 빌드, 런타임, 문서 도구 의존성을 갱신했습니다. 프로젝트 메타데이터 테스트와 문서 빌드 안내를 새 버전에 맞게 변경했습니다. 의존성 보안 기준과 검증 계약을 문서화했습니다.

Changes

보안 의존성 및 문서 도구체인

Layer / File(s) Summary
의존성 버전 제약 및 변경 기록
pyproject.toml, CHANGELOG.md
setuptools, Pillow, pypdf, mkdocs-material, pymdown-extensions의 버전 제약을 변경했습니다. 보안 업데이트와 검증 결과를 변경 기록에 추가했습니다.
문서 안내 및 메타데이터 검증
CONTRIBUTING.md, tests/test_project_metadata.py
문서 빌드 안내와 테스트가 새 도구체인 범위, 잠금 버전 및 CVE-2026-61632 조건을 검증하도록 변경했습니다.
의존성 보안 기준 기록
docs/doctoring/dependency-security-baseline.md
취약점 수정 버전, 잠금 파일 일관성, 병합 전 검증 조건, 잔여 PDF 처리 통제 및 참고문헌을 문서화했습니다.

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed 제목이 PDF, 이미지 및 빌드 의존성의 CVE 수정이라는 주요 변경을 정확히 설명합니다.
Description check ✅ Passed 설명은 변경 내용, 검증 결과, 범위와 Git Flow 대상을 포함하며 Notes 섹션 누락은 비핵심입니다.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/contextualwisdomlab-audit-governance-qyxe67

Comment @coderabbitai help to get the list of available commands.

…fting mkdocs-material to 9.7.x

The org Security Scan `trivy-fs` job fails on this repo (base branch and
every open PR) with:

  [MEDIUM (security-severity=5.3)] CVE-2026-61632 uv.lock - pymdown-extensions

pymdown-extensions 10.21.3 is vulnerable; the fix is 11.0.0+. It could not
be upgraded because mkdocs-material 9.6.x pins `pymdown-extensions~=10.2`
(i.e. <11). The docs toolchain deliberately held `mkdocs-material<9.7` to
avoid the 9.7 "MkDocs 2.0" warning banner (encoded in pyproject, two tests,
and CONTRIBUTING.md).

That caution-hold now blocks a real security fix and fails required CI, so
it is lifted to the minimum extent needed: bump only the theme to
`mkdocs-material>=9.7,<9.8` (which relaxes its pymdown-extensions cap to
`>=10.2`). The MkDocs *core* stays on the 1.x line (`mkdocs>=1.6,<2.0`
unchanged) — the 9.7 theme still builds on MkDocs 1.x.

Resulting lock: pymdown-extensions 10.21.3 -> 11.0.1, mkdocs-material
9.6.23 -> 9.7.7 (plus the runtime pillow/pypdf/click and setuptools bumps
from the previous commit).

Governance re-documented coherently:
- CONTRIBUTING.md: explains the theme now tracks 9.7.x for the CVE fix while
  the MkDocs core stays 1.x; the 9.7 banner is informational and non-fatal
  under --strict.
- tests/test_project_metadata.py: assertions updated to the new pin and the
  CONTRIBUTING rationale (CVE-2026-61632).

Verification:
- `uv run --frozen --extra docs mkdocs build --strict` -> builds cleanly
  (informational MkDocs 2.0 banner only, exit 0).
- `uv export --frozen --no-emit-project --all-extras | pip-audit --no-deps`
  -> No known vulnerabilities found (runtime and full sets).
- `PYTHONWARNINGS=error uv run --frozen --all-extras pytest` -> 430 passed.
- No src/ change, so the 100% branch-coverage gate is unaffected.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msz8Dni5zRaqPatNCmZJZ8
@seonghobae seonghobae changed the title fix(security): relock runtime deps to clear pillow/pypdf/click CVEs fix(security): clear pillow/pypdf/click runtime CVEs + pymdown-extensions trivy-fs finding Jul 30, 2026

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 3, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link
Copy Markdown
Collaborator Author

@claude Please independently review this security dependency remediation against the current develop contract, including the MkDocs/Pymdown compatibility change and current-head check evidence. Submit an approving pull-request review only if there are no blocking findings; otherwise leave concrete requested changes.

@seonghobae
seonghobae enabled auto-merge (squash) August 3, 2026 02:30

Copy link
Copy Markdown
Collaborator Author

@opencode-agent Please review the current head using the repository's coverage-evidence and docstring requirements, and submit an approving review only if all required evidence and security checks pass.

@seonghobae seonghobae closed this Aug 3, 2026
auto-merge was automatically disabled August 3, 2026 02:42

Pull request was closed

@seonghobae seonghobae reopened this Aug 3, 2026
@seonghobae
seonghobae enabled auto-merge (squash) August 3, 2026 03:02

Copy link
Copy Markdown
Collaborator Author

@opencode-agent Please review current head 4ba5e81d8dba98fc97ba2f6964751cc958b58c9e. Verify the runtime and docs dependency upgrades clear the declared pip-audit and trivy-fs advisories, MkDocs core remains on the supported 1.x line, strict docs build and lock consistency hold, the lock diff is scoped, CHANGELOG/governance text matches the resolved graph, and current-head 100% branch/docstring plus required security checks pass. Approve only if no blocking findings remain.

@seonghobae
seonghobae marked this pull request as draft August 3, 2026 03:28
auto-merge was automatically disabled August 3, 2026 03:28

Pull request was converted to draft

@seonghobae
seonghobae marked this pull request as ready for review August 3, 2026 03:28
@seonghobae
seonghobae enabled auto-merge (squash) August 3, 2026 03:28
@seonghobae
seonghobae marked this pull request as draft August 3, 2026 03:57
auto-merge was automatically disabled August 3, 2026 03:57

Pull request was converted to draft

@seonghobae
seonghobae marked this pull request as ready for review August 3, 2026 03:58
@seonghobae
seonghobae enabled auto-merge (squash) August 3, 2026 03:58

Copy link
Copy Markdown
Collaborator Author

@opencode-agent @cwl-noema-review All exact-head repository checks for 4ba5e81d8dba98fc97ba2f6964751cc958b58c9e are now complete and successful, and there are no unresolved review threads. Please perform independent current-head review of the scoped dependency remediation and submit an approving PR review only if no blocking finding remains; otherwise submit concrete requested changes.

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 3, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@seonghobae
seonghobae enabled auto-merge (squash) August 4, 2026 10:57
@seonghobae seonghobae changed the title fix(security): clear pillow/pypdf/click runtime CVEs + pymdown-extensions trivy-fs finding fix(security): remediate PDF/image/build dependency CVEs Aug 4, 2026
@seonghobae
seonghobae dismissed opencode-agent[bot]’s stale review August 4, 2026 11:03

Obsolete review on superseded head 4ba5e81. The current head 565bdd8 incorporates the strict direct dependency floors and lock remediation and must receive fresh exact-head coverage/review evidence.

Copy link
Copy Markdown
Collaborator Author

@opencode-agent Please review exact current head 961e1bf2ce3bd56bda1ad20d5814ddb2fda931e4 after its current-head checks complete. Verify the dependency-only scope, synchronized direct floors and uv.lock, removal of temporary workflows/markers, complete test/coverage/docstring evidence, and the new APA 7th doctoring record. Submit APPROVE only if no blocking finding remains.

Copy link
Copy Markdown
Collaborator Author

@cwl-noema-review Please independently review exact current head 961e1bf2ce3bd56bda1ad20d5814ddb2fda931e4 after required checks complete. Confirm the CVE remediation, direct lower-bound guards, lock consistency, documentation claims, no runtime/API changes, no remaining one-shot workflow, and fail-closed merge requirements. Submit APPROVE only when no actionable finding remains.

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

Please review exact current head 961e1bf2ce3bd56bda1ad20d5814ddb2fda931e4. Review all six final changed files, including generated uv.lock consistency and docs/doctoring/dependency-security-baseline.md; confirm the temporary workflow and refresh marker are absent, the change remains dependency/documentation-only, and any finding is actionable on this head.

@coderabbitai

coderabbitai Bot commented Aug 4, 2026

Copy link
Copy Markdown

Rate Limit Exceeded

@seonghobae have exceeded the limit for the number of chat messages per hour. Please wait 9 minutes and 30 seconds before sending another message.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@CHANGELOG.md`:
- Line 26: CHANGELOG의 pymdown-extensions 설명에서 mkdocs-material 9.7.x가 `>=10.2`
하한을 완화했다는 부정확한 표현을 수정하세요. `mkdocs-material` 9.6.x의 제약이 `>=10.2,<11`이며 9.7.x에서
제거되는 것은 `<11` 상한이라는 점이 드러나도록 해당 문장을 갱신하고, 나머지 취약점 및 버전 정보는 유지하세요.

In `@tests/test_project_metadata.py`:
- Around line 84-92: Update the pypdf version-floor assertion in
test_security_dependency_floors_exclude_known_vulnerable_ranges to require the
lower bound (6, 14, 2), matching the dependency constraints in pyproject.toml
and uv.lock; leave the other dependency checks unchanged.
- Around line 125-130: Update the docs optional dependency declaration in
pyproject.toml to explicitly include pymdown-extensions>=11, then extend
test_docs_theme_range_tracks_pymdownx_cve_fix to assert that direct constraint
and verify uv.lock resolves pymdown-extensions to version 11 or newer.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 05542c51-f410-4b28-94b2-a6c0e31acb4a

📥 Commits

Reviewing files that changed from the base of the PR and between 04491c0 and 574ea6d.

⛔ Files ignored due to path filters (1)
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (4)
  • CHANGELOG.md
  • CONTRIBUTING.md
  • pyproject.toml
  • tests/test_project_metadata.py

Comment thread CHANGELOG.md Outdated
Comment thread tests/test_project_metadata.py
Comment thread tests/test_project_metadata.py

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
docs/doctoring/dependency-security-baseline.md (1)

98-133: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

참고문헌 항목의 발행 정보가 대부분 정확합니다.

NIST SSDF 1.1과 초안 상태인 1.2 개정판에 대한 구분, CVE-2026-59935 및 CVE-2026-59890에 대한 NVD/OSV 참조, Pillow 12.3.0과 pypdf 6.14.2의 PyPI 참조는 모두 검증된 내용과 일치합니다. 다만 이 문서가 앞으로도 유지될 참고 자료이므로, mkdocs-material 항목이 이번 업그레이드 이후 신규 기능 릴리스를 중단하고 후속 유지보수 위주로 전환한다는 공지 사항을 남기면 추후 버전 상한선 조정 시 참고할 수 있습니다.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/doctoring/dependency-security-baseline.md` around lines 98 - 133, Update
the references section around the Python Packaging Authority entries to add a
citation or note documenting mkdocs-material’s transition from new feature
releases to maintenance-focused support after this upgrade. Preserve the
existing verified references and include enough publication or retrieval
information for the note to guide future version upper-bound adjustments.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@docs/doctoring/dependency-security-baseline.md`:
- Around line 98-133: Update the references section around the Python Packaging
Authority entries to add a citation or note documenting mkdocs-material’s
transition from new feature releases to maintenance-focused support after this
upgrade. Preserve the existing verified references and include enough
publication or retrieval information for the note to guide future version
upper-bound adjustments.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 8e0e7296-33b4-4a79-a8e8-fb18ee509f87

📥 Commits

Reviewing files that changed from the base of the PR and between 574ea6d and 8f6ed1c.

⛔ Files ignored due to path filters (1)
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (4)
  • CHANGELOG.md
  • docs/doctoring/dependency-security-baseline.md
  • pyproject.toml
  • tests/test_project_metadata.py
🚧 Files skipped from review as they are similar to previous changes (3)
  • CHANGELOG.md
  • tests/test_project_metadata.py
  • pyproject.toml

Copy link
Copy Markdown
Collaborator Author

@opencode-agent @cwl-noema-review Please independently review exact current head 58d8544ffa3ec105bc9e08e594b53fd46c67a778 after exact-head checks complete. Verify the six-file supply-chain remediation, direct runtime/build/docs security floors, lock integrity, corrected MkDocs/pymdown constraint rationale, 431-test and strict-docs evidence, 100% coverage/docstrings, and unchanged API behavior. Submit APPROVE only if no blocking finding remains.

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 4, 2026

Copy link
Copy Markdown
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo='ContextualWisdomLab/newsdom-api'
pr='467'
sha='58d8544ffa3ec105bc9e08e594b53fd46c67a778'

echo '== Requested commit and PR head =='
git rev-parse HEAD
git show -s --format='commit=%H%nparents=%P%nsubject=%s' "$sha"
gh api "repos/$repo/pulls/$pr" --jq \
  '{number, state, head_sha: .head.sha, base_sha: .base.sha, changed_files, mergeable_state}'

echo '== Changed files in requested commit =='
git diff-tree --no-commit-id --name-status -r "$sha"

echo '== Diff from first parent =='
git diff --no-ext-diff "${sha}^" "$sha" -- \
  pyproject.toml uv.lock CONTRIBUTING.md CHANGELOG.md \
  tests/test_project_metadata.py docs/doctoring/dependency-security-baseline.md

echo '== Dependency declarations and regression assertions =='
rg -n -C 3 -i \
  'pillow|pypdf|click|setuptools|pymdown-extensions|mkdocs-material|mkdocs.*<\s*2|cve-|pip-audit|trivy' \
  pyproject.toml CONTRIBUTING.md CHANGELOG.md \
  tests/test_project_metadata.py docs/doctoring/dependency-security-baseline.md

echo '== Resolved selected packages =='
python3 - <<'PY'
import tomllib
from pathlib import Path
lock = tomllib.loads(Path("uv.lock").read_text())
wanted = {
    "click", "mkdocs", "mkdocs-material", "pillow", "pypdf",
    "pymdown-extensions", "setuptools",
}
for package in lock.get("package", []):
    if package.get("name") in wanted:
        print(f'{package["name"]}=={package.get("version")} source={package.get("source")}')
        for dependency in package.get("dependencies", []):
            if isinstance(dependency, dict) and dependency.get("name") in wanted:
                print(f'  dependency={dependency["name"]}')
PY

echo '== Temporary artifact and refresh-marker search =='
rg -n -i \
  'refresh marker|refresh-marker|one-shot|temporary workflow|dependency.*refresh' \
  .github pyproject.toml uv.lock CONTRIBUTING.md CHANGELOG.md \
  tests docs/doctoring 2>/dev/null || true
fd -a -t f .github | sort

echo '== Exact-head check runs =='
gh api "repos/$repo/commits/$sha/check-runs?per_page=100" --paginate --jq \
  '.check_runs[] | [.name, .status, .conclusion, .details_url] | `@tsv`' | sort

echo '== Exact-head legacy statuses =='
gh api "repos/$repo/commits/$sha/status" --jq \
  '.statuses[]? | [.context, .state, .target_url] | `@tsv`' | sort

Length of output: 16173


🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo='ContextualWisdomLab/newsdom-api'
pr='467'
sha='58d8544ffa3ec105bc9e08e594b53fd46c67a778'
base='04491c0e9ac38b9f793029683cebfb8210ccfadd'

echo '== Full PR file list and aggregate diff stat =='
git diff --name-status "$base" "$sha"
git diff --stat "$base" "$sha"

echo '== Full PR diff for the six declared files =='
git diff --no-ext-diff "$base" "$sha" -- \
  pyproject.toml uv.lock CONTRIBUTING.md CHANGELOG.md \
  tests/test_project_metadata.py docs/doctoring/dependency-security-baseline.md

echo '== Locked package stanzas =='
for package in click mkdocs mkdocs-material pillow pypdf pymdown-extensions setuptools; do
  echo "--- $package ---"
  awk -v package="$package" '
    /^\[\[package\]\]/ {
      if (printing) exit
      printing=0
    }
    $0 == "name = \"" package "\"" { printing=1 }
    printing { print }
  ' uv.lock
done

echo '== Head-tree checks for removed temporary artifact =='
if git cat-file -e "${sha}:.github/review-refresh.txt" 2>/dev/null; then
  echo 'ERROR: .github/review-refresh.txt exists at the requested head'
else
  echo 'OK: .github/review-refresh.txt is absent at the requested head'
fi
git ls-tree -r --name-only "$sha" .github | sort
git grep -n -i -E \
  'review-refresh|refresh marker|refresh-marker|one-shot workflow|temporary workflow' \
  "$sha" -- .github pyproject.toml uv.lock CONTRIBUTING.md CHANGELOG.md tests docs \
  || true

echo '== Exact-head check runs =='
gh api "repos/$repo/commits/$sha/check-runs?per_page=100" --paginate --jq \
  '.check_runs[] | [.name, .status, .conclusion, .details_url] | `@tsv`' | sort

echo '== Exact-head legacy statuses =='
gh api "repos/$repo/commits/$sha/status" --jq \
  '.statuses[]? | [.context, .state, .target_url] | `@tsv`' | sort

echo '== PR review decision and mergeability fields =='
gh api "repos/$repo/pulls/$pr/reviews?per_page=100" --paginate --jq \
  '.[] | [.user.login, .state, .commit_id, .submitted_at] | `@tsv`' | tail -n 30
gh api "repos/$repo/pulls/$pr" --jq \
  '{mergeable, mergeable_state, rebaseable, draft, head_sha: .head.sha, base_sha: .base.sha}'

Length of output: 84286


@seonghobae Review of 58d8544ffa3ec105bc9e08e594b53fd46c67a778 found no actionable code or lockfile finding.

The PR changes only the six declared dependency, lock, test, and documentation files. It does not change application source or API behavior.

The direct constraints and lock entries agree:

  • Pillow>=12.3,<13.012.3.0
  • pypdf>=6.14.2,<7.06.14.2
  • setuptools>=8383.0.0
  • mkdocs>=1.6,<2.01.6.1
  • mkdocs-material>=9.7,<9.89.7.7
  • pymdown-extensions>=11,<1211.0.1
  • Click → 8.4.2

The metadata tests guard the direct security floors, the docs dependency boundary, and the patched pypdf lock version. The MkDocs 1.x boundary remains intact. The head tree does not contain .github/review-refresh.txt or a temporary workflow.

I cannot confirm the requested exact-head test, strict-docs, coverage, docstring, and security evidence yet. The relevant checks are still queued, including pytest, quality-gate, trivy-fs, osv-scan, CodeQL, Semgrep, dependency review, image, scorecard, and fuzz. GitHub reports the PR as blocked.

No change is required from the reviewed diff. Complete the queued checks before treating the verification contract as satisfied.

✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@seonghobae
seonghobae merged commit 5cde2ae into develop Aug 4, 2026
36 checks passed
@seonghobae
seonghobae deleted the claude/contextualwisdomlab-audit-governance-qyxe67 branch August 4, 2026 12:46

@opencode-agent opencode-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

OpenCode cannot approve yet because required coverage evidence did not pass.

Review outcome

1. HIGH .github/workflows/opencode-review.yml:1 - Coverage evidence did not prove required test/docstring evidence

  • Problem: The required coverage-evidence job result was failure, so OpenCode cannot establish approval sufficiency for this head.

  • Root cause: Automated approval is only valid when the same-head coverage-evidence job proves supported repository test suites passed and configured docstring gates passed or were advisory, or reports not applicable because no supported source files or package manifests exist. Missing, failed, skipped, unavailable, or unsupported-tooling test evidence is a blocker.

  • Fix: Install or configure the repository test/docstring evidence tooling when source files or package manifests exist, rerun the current-head coverage-evidence job, and approve only after it reports success with required evidence or explicit no-source not-applicable evidence.

  • Regression test: Keep the approval branch checking needs.coverage-evidence.result == success before posting APPROVE, and publish REQUEST_CHANGES when coverage-evidence blocker states such as cancelled, skipped, failed, unsupported-tooling, or below-100 evidence are present.

  • Result: REQUEST_CHANGES

  • Reason: coverage-evidence result was failure, so required test/docstring evidence was not proven for current head 58d8544ffa3ec105bc9e08e594b53fd46c67a778.

  • Head SHA: 58d8544ffa3ec105bc9e08e594b53fd46c67a778

  • Workflow run: 30908707737

  • Workflow attempt: 1

Coverage evidence

Coverage Decision

  • Result: FAIL
  • Test evidence: not proven passing
  • Docstring evidence: not proven passing when configured
  • Failure count: 1

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Changed file (4 files)"]
  S1 --> I1["repository behavior"]
  I1 --> R1["Review risk: Changed file (4 files)"]
  R1 --> V1["required checks"]
  Evidence --> S2["Docs: dependency-security-baseline.md"]
  S2 --> I2["operator or user guidance"]
  I2 --> R2["Review risk: Docs: dependency-security-baseline.md"]
  R2 --> V2["docs review"]
  Evidence --> S3["Test: test_project_metadata.py"]
  S3 --> I3["regression suite"]
  I3 --> R3["Review risk: Test: test_project_metadata.py"]
  R3 --> V3["targeted test run"]
Loading

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.

2 participants