Skip to content

๐Ÿ›ก๏ธ Sentinel: Permissions-Policy ๋ณด์•ˆ ํ—ค๋” ์ถ”๊ฐ€ - #987

Draft
seonghobae wants to merge 93 commits into
developfrom
feat/add-permissions-policy-header-2088908442237673682
Draft

seonghobae wants to merge 93 commits into
developfrom
feat/add-permissions-policy-header-2088908442237673682

Conversation

@seonghobae

@seonghobae seonghobae commented Sep 30, 2026 •

Copy link
Copy Markdown
Collaborator

๋ณด์•ˆ ๊ฐ•ํ™” ๋ชฉ์ ์œผ๋กœ API ์‘๋‹ต ํ—ค๋”์— Permissions-Policy๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋Šฅ(์œ„์น˜, ์นด๋ฉ”๋ผ, ๋งˆ์ดํฌ ๋“ฑ) ์ ‘๊ทผ์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.


PR created automatically by Jules for task 2088908442237673682 started by @seonghobae

Summary by CodeRabbit

  • ๋ณด์•ˆ
    • API ์‘๋‹ต์— ์œ„์น˜ ์ •๋ณด, ์นด๋ฉ”๋ผ, ๋งˆ์ดํฌ ์ ‘๊ทผ์„ ์ฐจ๋‹จํ•˜๋Š” Permissions-Policy ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ์‘๋‹ต์—๋„ ์ด ์ •์ฑ…์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

seonghobae and others added 30 commits September 7, 2026 21:06
๐Ÿšจ Severity: MEDIUM
๐Ÿ’ก Vulnerability: /parse ์—”๋“œํฌ์ธํŠธ์˜ language ๋ฐ mode Form ํ•„๋“œ์— ์ตœ๋Œ€ ๊ธธ์ด(max_length) ์ œํ•œ์ด ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
๐ŸŽฏ Impact: python-multipart๊ฐ€ ํผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•˜๋ฏ€๋กœ, ์•…์˜์ ์ธ ์‚ฌ์šฉ์ž๊ฐ€ ๋งค์šฐ ๊ธด ๋ฌธ์ž์—ด์„ ์ „์†กํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๊ณ ๊ฐˆ(OOM)์„ ํ†ตํ•œ ์„œ๋น„์Šค ๊ฑฐ๋ถ€(DoS) ๊ณต๊ฒฉ์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๐Ÿ”ง Fix: FastAPI์˜ Form ํ•„๋“œ์— max_length=50 ์ œ์•ฝ ์กฐ๊ฑด์„ ๋ช…์‹œ์ ์œผ๋กœ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
โœ… Verification: ๋น„์ •์ƒ์ ์œผ๋กœ ๊ธด ํผ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ–ˆ์„ ๋•Œ HTTP 422 ์‘๋‹ต์ด ๋ฐ˜ํ™˜๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋ฅผ ํ†ต๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค.
๐Ÿšจ Severity: MEDIUM
๐Ÿ’ก Vulnerability: /parse ์—”๋“œํฌ์ธํŠธ์˜ language ๋ฐ mode Form ํ•„๋“œ์— ์ตœ๋Œ€ ๊ธธ์ด(max_length) ์ œํ•œ์ด ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
๐ŸŽฏ Impact: python-multipart๊ฐ€ ํผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•˜๋ฏ€๋กœ, ์•…์˜์ ์ธ ์‚ฌ์šฉ์ž๊ฐ€ ๋งค์šฐ ๊ธด ๋ฌธ์ž์—ด์„ ์ „์†กํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๊ณ ๊ฐˆ(OOM)์„ ํ†ตํ•œ ์„œ๋น„์Šค ๊ฑฐ๋ถ€(DoS) ๊ณต๊ฒฉ์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๐Ÿ”ง Fix: FastAPI์˜ Form ํ•„๋“œ์— max_length=50 ์ œ์•ฝ ์กฐ๊ฑด์„ ๋ช…์‹œ์ ์œผ๋กœ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
โœ… Verification: ๋น„์ •์ƒ์ ์œผ๋กœ ๊ธด ํผ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ–ˆ์„ ๋•Œ HTTP 422 ์‘๋‹ต์ด ๋ฐ˜ํ™˜๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋ฅผ ํ†ต๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค.
๐Ÿšจ Severity: MEDIUM
๐Ÿ’ก Vulnerability: /parse ์—”๋“œํฌ์ธํŠธ์˜ language ๋ฐ mode Form ํ•„๋“œ์— ์ตœ๋Œ€ ๊ธธ์ด(max_length) ์ œํ•œ์ด ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
๐ŸŽฏ Impact: python-multipart๊ฐ€ ํผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•˜๋ฏ€๋กœ, ์•…์˜์ ์ธ ์‚ฌ์šฉ์ž๊ฐ€ ๋งค์šฐ ๊ธด ๋ฌธ์ž์—ด์„ ์ „์†กํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๊ณ ๊ฐˆ(OOM)์„ ํ†ตํ•œ ์„œ๋น„์Šค ๊ฑฐ๋ถ€(DoS) ๊ณต๊ฒฉ์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๐Ÿ”ง Fix: FastAPI์˜ Form ํ•„๋“œ์— max_length=50 ์ œ์•ฝ ์กฐ๊ฑด์„ ๋ช…์‹œ์ ์œผ๋กœ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
โœ… Verification: ๋น„์ •์ƒ์ ์œผ๋กœ ๊ธด ํผ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ–ˆ์„ ๋•Œ HTTP 422 ์‘๋‹ต์ด ๋ฐ˜ํ™˜๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋ฅผ ํ†ต๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค.
๐Ÿšจ Severity: MEDIUM
๐Ÿ’ก Vulnerability: /parse ์—”๋“œํฌ์ธํŠธ์˜ language ๋ฐ mode Form ํ•„๋“œ์— ์ตœ๋Œ€ ๊ธธ์ด(max_length) ์ œํ•œ์ด ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
๐ŸŽฏ Impact: python-multipart๊ฐ€ ํผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•˜๋ฏ€๋กœ, ์•…์˜์ ์ธ ์‚ฌ์šฉ์ž๊ฐ€ ๋งค์šฐ ๊ธด ๋ฌธ์ž์—ด์„ ์ „์†กํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๊ณ ๊ฐˆ(OOM)์„ ํ†ตํ•œ ์„œ๋น„์Šค ๊ฑฐ๋ถ€(DoS) ๊ณต๊ฒฉ์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๐Ÿ”ง Fix: FastAPI์˜ Form ํ•„๋“œ์— max_length=50 ์ œ์•ฝ ์กฐ๊ฑด์„ ๋ช…์‹œ์ ์œผ๋กœ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
โœ… Verification: ๋น„์ •์ƒ์ ์œผ๋กœ ๊ธด ํผ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ–ˆ์„ ๋•Œ HTTP 422 ์‘๋‹ต์ด ๋ฐ˜ํ™˜๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋ฅผ ํ†ต๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค.
๐Ÿšจ Severity: MEDIUM
๐Ÿ’ก Vulnerability: /parse ์—”๋“œํฌ์ธํŠธ์˜ language ๋ฐ mode Form ํ•„๋“œ์— ์ตœ๋Œ€ ๊ธธ์ด(max_length) ์ œํ•œ์ด ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
๐ŸŽฏ Impact: python-multipart๊ฐ€ ํผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•˜๋ฏ€๋กœ, ์•…์˜์ ์ธ ์‚ฌ์šฉ์ž๊ฐ€ ๋งค์šฐ ๊ธด ๋ฌธ์ž์—ด์„ ์ „์†กํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๊ณ ๊ฐˆ(OOM)์„ ํ†ตํ•œ ์„œ๋น„์Šค ๊ฑฐ๋ถ€(DoS) ๊ณต๊ฒฉ์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๐Ÿ”ง Fix: FastAPI์˜ Form ํ•„๋“œ์— max_length=50 ์ œ์•ฝ ์กฐ๊ฑด์„ ๋ช…์‹œ์ ์œผ๋กœ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
โœ… Verification: ๋น„์ •์ƒ์ ์œผ๋กœ ๊ธด ํผ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ–ˆ์„ ๋•Œ HTTP 422 ์‘๋‹ต์ด ๋ฐ˜ํ™˜๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋ฅผ ํ†ต๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค.
๐Ÿšจ Severity: MEDIUM
๐Ÿ’ก Vulnerability: /parse ์—”๋“œํฌ์ธํŠธ์˜ language ๋ฐ mode Form ํ•„๋“œ์— ์ตœ๋Œ€ ๊ธธ์ด(max_length) ์ œํ•œ์ด ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
๐ŸŽฏ Impact: python-multipart๊ฐ€ ํผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•˜๋ฏ€๋กœ, ์•…์˜์ ์ธ ์‚ฌ์šฉ์ž๊ฐ€ ๋งค์šฐ ๊ธด ๋ฌธ์ž์—ด์„ ์ „์†กํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๊ณ ๊ฐˆ(OOM)์„ ํ†ตํ•œ ์„œ๋น„์Šค ๊ฑฐ๋ถ€(DoS) ๊ณต๊ฒฉ์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๐Ÿ”ง Fix: FastAPI์˜ Form ํ•„๋“œ์— max_length=50 ์ œ์•ฝ ์กฐ๊ฑด์„ ๋ช…์‹œ์ ์œผ๋กœ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
โœ… Verification: ๋น„์ •์ƒ์ ์œผ๋กœ ๊ธด ํผ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ–ˆ์„ ๋•Œ HTTP 422 ์‘๋‹ต์ด ๋ฐ˜ํ™˜๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋ฅผ ํ†ต๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค.
๐Ÿšจ Severity: MEDIUM
๐Ÿ’ก Vulnerability: /parse ์—”๋“œํฌ์ธํŠธ์˜ language ๋ฐ mode Form ํ•„๋“œ์— ์ตœ๋Œ€ ๊ธธ์ด(max_length) ์ œํ•œ์ด ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
๐ŸŽฏ Impact: python-multipart๊ฐ€ ํผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•˜๋ฏ€๋กœ, ์•…์˜์ ์ธ ์‚ฌ์šฉ์ž๊ฐ€ ๋งค์šฐ ๊ธด ๋ฌธ์ž์—ด์„ ์ „์†กํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๊ณ ๊ฐˆ(OOM)์„ ํ†ตํ•œ ์„œ๋น„์Šค ๊ฑฐ๋ถ€(DoS) ๊ณต๊ฒฉ์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๐Ÿ”ง Fix: FastAPI์˜ Form ํ•„๋“œ์— max_length=50 ์ œ์•ฝ ์กฐ๊ฑด์„ ๋ช…์‹œ์ ์œผ๋กœ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
โœ… Verification: ๋น„์ •์ƒ์ ์œผ๋กœ ๊ธด ํผ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ–ˆ์„ ๋•Œ HTTP 422 ์‘๋‹ต์ด ๋ฐ˜ํ™˜๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋ฅผ ํ†ต๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค.
seonghobae and others added 10 commits September 26, 2026 16:20
The Sentinel replay removed the existing exact 50-character boundary test, weakened warnings-as-errors, and reopened dependency constraints without changing production. Restore the canonical verified owner tree while preserving the replay commit in ordinary history.
The repeated Sentinel replay again removed the exact 50-character boundary and weakened dependency/warnings contracts. Restore the verified owner tree without rewriting history.
Restore the exact verified owner tree without rewriting the concurrent head.
@google-labs-jules

Copy link
Copy Markdown

๐Ÿ‘‹ Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a ๐Ÿ‘€ emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

@coderabbitai

coderabbitai Bot commented Sep 30, 2026 •

Copy link
Copy Markdown

Review in Change Stack โ†’

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
  auto_review:
    drafts: true

No actionable comments were generated in the recent review. ๐ŸŽ‰

โ„น๏ธ Recent review info
โš™๏ธ Run configuration

Configuration used: Repository: ContextualWisdomLab/newsdom-api/.coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: 0a162f7b-e1a4-458d-abdf-399905fe4f6a

๐Ÿ“ฅ Commits

Reviewing files that changed from the base of the PR and between 539528f and e24a5bc.

๐Ÿ“’ Files selected for processing (11)
  • .jules/sentinel.md
  • src/newsdom_api/main.py
  • src/newsdom_api/schemas.py
  • tests/test_auth.py
  • tests/test_auth_deployment_contract.py
  • tests/test_auth_fail_closed_contract.py
  • tests/test_auth_protocol_edges.py
  • tests/test_health.py
  • tests/test_parse_endpoint.py
  • tests/test_project_metadata.py
  • tests/test_pypdf_security_floor.py

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.


๐Ÿ“ Walkthrough

Walkthrough

API ์‘๋‹ต์— geolocation, camera, microphone์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” Permissions-Policy ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‘๋‹ต ํ—ค๋” ํ…Œ์ŠคํŠธ์™€ ๋ณด์•ˆ ์ง€์นจ์„ ๊ฐฑ์‹ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์Šคํ‚ค๋งˆ ์˜ˆ์‹œ์™€ ์ผ๋ถ€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ๋™์ž‘ ๋ณ€๊ฒฝ ์—†์ด ์„œ์‹์„ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

Changes

Permissions-Policy ํ—ค๋”

Layer / File(s) Summary
ํ—ค๋” ์ ์šฉ ๋ฐ ์‘๋‹ต ๊ฒ€์ฆ
.jules/sentinel.md, src/newsdom_api/main.py, tests/test_health.py, tests/test_parse_endpoint.py
API ์‘๋‹ต์— Permissions-Policy: geolocation=(), camera=(), microphone=()๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. /health ์‘๋‹ต๊ณผ ์ฒ˜๋ฆฌ ์ค‘ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ ์‘๋‹ต์—์„œ ํ—ค๋” ๊ฐ’์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ ์ง€์นจ์—๋„ ํ•ด๋‹น ์ •์ฑ…์„ ๊ธฐ๋กํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด ์ฝ”๋“œ ์„œ์‹ ์ •๋ฆฌ

Layer / File(s) Summary
์„ ์–ธ ๋ฐ ํ˜ธ์ถœ ์„œ์‹ ์ •๋ฆฌ
src/newsdom_api/schemas.py, tests/test_auth.py, tests/test_auth_deployment_contract.py, tests/test_auth_fail_closed_contract.py, tests/test_auth_protocol_edges.py, tests/test_project_metadata.py, tests/test_pypdf_security_floor.py
์Šคํ‚ค๋งˆ ์˜ˆ์‹œ, ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์™€ ํ˜ธ์ถœ๋ถ€, ๋ฌธ์ž์—ด ๋ฐ ์‚ฌ์ „ ํ‘œํ˜„์„ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ฆ ์กฐ๊ฑด๊ณผ ํ…Œ์ŠคํŠธ ๋™์ž‘์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

Priority: โฌ‡๏ธ Low

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

Change: Feature

Merge Risk: โšช Minimal ยท up to 50a31

The Permissions-Policy reaches normal and handled-error responses, and .jules/sentinel.md is outside the projectโ€™s required markdownlint scope. No actionable merge blocker is established.

Security Architecture Review

Security architecture risk: โšช Minimal ยท up to e24a5

The change adds a fixed, restrictive response header without expanding parser access, weakening authentication, or changing application state ownership. No material security regression was identified.

Retained concerns
No architecture-level concerns identified.

Security review details

Security Blast Radius

  • inferred โ€” The changed control affects responses using the shared helper and restricts browser capabilities. It does not introduce new parser callers, credentials, tenant access, or server-side privileges.

Trust Boundaries and Controls

  • observed โ€” The new policy value is a fixed literal rather than request-derived data. The existing pre-body authorization check for POST /parse remains in place, and the PR does not change its ordering or authority.
๐Ÿšฅ Pre-merge checks | โœ… 3 | โŒ 2

โŒ Failed checks (2 warnings)

Check name Status Explanation Resolution
Description check โš ๏ธ Warning ์„ค๋ช…์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์š”์•ฝ์„ ํฌํ•จํ•˜์ง€๋งŒ, ํ…œํ”Œ๋ฆฟ์˜ Git Flow target, Verification, Notes ์„น์…˜๊ณผ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ์— ๋”ฐ๋ผ Git Flow target, Verification, Notes ์„น์…˜์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”. ์‹คํ–‰ํ•œ pytest ๋ฐ PYTHONWARNINGS=error pytest ๊ฒฐ๊ณผ๋„ ํ‘œ์‹œํ•˜์„ธ์š”.
Docstring Coverage โš ๏ธ Warning Docstring coverage is 66.67% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 15 functions across 10 files. (1 skipped:โ€ฆ Write docstrings for the functions missing them to satisfy the coverage threshold.
โœ… Passed checks (3 passed)
Check name Status Explanation
Title check โœ… Passed ์ œ๋ชฉ์€ Permissions-Policy ๋ณด์•ˆ ํ—ค๋” ์ถ”๊ฐ€๋ผ๋Š” ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ช…ํ™•ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
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.
Full details: Docstring Coverage

Explanation

Docstring coverage is 66.67% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 15 functions across 10 files. (1 skipped: 1 unsupported.)

โœจ Finishing Touches ๐Ÿ’ก 1
๐Ÿ“ Generate docstrings ๐Ÿ’ก
  • Commit to this branch
  • Create a new PR
๐Ÿงช Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autopilot ยท Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Autopilot is currently an internal CodeRabbit preview.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

โค๏ธ Share

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

coderabbitai[bot]
coderabbitai Bot previously approved these changes Sep 30, 2026
seonghobae and others added 2 commits September 30, 2026 23:04
Preserve the Permissions-Policy feature and tests while integrating the canonical dependency-security owner #822 without force-pushing.

Copy link
Copy Markdown
Collaborator Author

Exact-head failed-check RCA and non-force repair

  • Failed head: 50a314b154cc4fb25af8d215d03dd34b7d6134d1.
  • Security Scan run 36789136892, job 110137641217: Trivy reported 12 findings from the stale uv.lock (anyio, httpcore2, httpx2, pypdf, urllib3).
  • codeql run 36789136867, job 110137592486: analysis completed, but SARIF upload failed with the GitHub installation API rate limit; this is distinct from the dependency defect.
  • Canonical dependency-security owner: fix(deps): raise parser and TestClient security floorsย #822 at 23e481577af0283da512d9b2626ae27188245bdc, whose exact Security/tests/codeql/Semgrep/container/scorecards/fuzz runs are successful (its separate CodeQL PR dispatcher is skipped, not counted as passing).

Repair: created ordinary two-parent merge commit 2dc876bcba5e43b366aec1e4c4427aede1db06bc (first parent = exact feature head, second parent = #822), preserving the Permissions-Policy source, tests, schema/formatting deltas, and sentinel entry while taking the owner dependency floors/lock/tests/docs. The branch ref was advanced with force=false after an exact-head recheck.

Fresh checks on 2dc876bcba5e43b366aec1e4c4427aede1db06bc are authoritative; queued/pending/skipped jobs are not passing and no merge is claimed.

seonghobae and others added 2 commits September 30, 2026 23:15
Preserve concurrent commit 560d06d in history while restoring the exact result tree that carries PR #822 dependency floors, lock, regression contracts, gap baseline, and the Permissions-Policy feature.

Copy link
Copy Markdown
Collaborator Author

Concurrent tree-revert preservation and repair

After 2dc876bcba5e43b366aec1e4c4427aede1db06bc, a concurrent child commit 560d06d4623010f9025beea3dbbce2f0fca9a4f1 re-applied the feature tree but reverted the canonical owner changes: it removed docs/product-technical-gap-baseline.md and tests/test_httpx2_security_floor.py, downgraded the dependency floors/lock, removed the form-field bounds, and reverted the associated tests/docs. Its feature intent was already present in the parent.

The commit remains preserved in ordinary history. Follow-up 420a423f58799f717de9bc60d98d7c14d9c72d5e uses it as first parent and restores exact result tree cd272d84016c26e50f81e954a0b870106c28572c, which carries both #822 and the Permissions-Policy feature. Ref update was force=false after exact-head recheck.

Fresh checks on 420a423... are authoritative. No merge or passing claim is made while queued/running.

Copy link
Copy Markdown
Collaborator Author

Exact-head admission correction (5a8529b): this PR is not currently merge-ready. Terminal failing Checks: Security Scan (failure), codeql (failure). Ready is review admission, but this revision now has concrete repair work; converting to Draft preserves the delta while causal owner/leaf REDโ†’GREEN repair and fresh exact-head Checks proceed. No close, bypass, force update, destructive rebase, or manual rerun was used.

@seonghobae
seonghobae marked this pull request as draft September 30, 2026 23:37

Copy link
Copy Markdown
Collaborator Author

RCA / preservation update (2026-10-01): direct repairs on this generator branch were overwritten repeatedly by the same stale snapshot writer. To avoid another lossy edit, Draft successor #988 now carries the complete current #987 history plus canonical dependency-owner commit 23e481577af0283da512d9b2626ae27188245bdc, producing the previously verified owner tree cd272d84016c26e50f81e954a0b870106c28572c at exact successor head f6bcf169b22b73c3f9b2be267659d2eaf33e391d. This PR remains open and Draft; it must not be retired until #988 exact-head Checks and complete-delta equivalence are verified.

Copy link
Copy Markdown
Collaborator Author

Successor evidence refresh: #988 advanced by ordinary non-force child commit from f6bcf169... to exact 9f030e97165841f70bef8e28c1d0ded536a13fc4 (tree 14bfb03cae613b6c4151dc8f614bfa3b9fe72164) to repair new exact-head urllib3 findings. The predecessor remains open/Draft. Retirement is still prohibited until the current successor headโ€”not the historical f6bcf169... headโ€”has terminal Checks and verified complete carryover.

This branch has not been deployed

No deployments
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