Skip to content

docs(security): establish coordinated vulnerability disclosure - #72

Open
seonghobae wants to merge 22 commits into
mainfrom
docs/coordinated-vulnerability-disclosure
Open

docs(security): establish coordinated vulnerability disclosure#72
seonghobae wants to merge 22 commits into
mainfrom
docs/coordinated-vulnerability-disclosure

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Summary

Establishes Noema's coordinated vulnerability disclosure policy and evidence-preserving handling lifecycle, and adds a test-first, read-only operational probe plus operator runbook for GitHub private vulnerability reporting without claiming the administrator control is enabled or exercised.

Exact source

  • Base: protected main at 9adb784902cae19a150146a8fadd6a0491f67814.
  • Current exact head: 7bb27c518fb94e4ac5abd9f8f26479f964db6995.
  • Direct main PR; no stack predecessor.
  • GitHub currently reports the content graph mergeable. Mergeability is not merge authority.

Implemented boundary

  • root SECURITY.md defines the pre-release support boundary, private-reporting-first intake, content-free public fallback, bounded scope/safe harbor, non-contractual response objectives, CVSS v4.0 plus exploitation-aware prioritization, coordinated disclosure, and no invented bounty/support commitment;
  • docs/security/vulnerability-handling.md defines role separation, case states, private intake, exact source/release/deployment identity, bounded reproduction, incident escalation, test-first remediation, independent review, advisory/CVE/release separation, recovery, lessons learned, retention maxima, scoped legal hold, access roles, and deletion/redaction evidence;
  • docs/doctoring/vulnerability-disclosure.md records the standards/research rationale with APA 7 references and distinguishes Noema-specific retention decisions from external standards requirements;
  • test/security-policy-contract.test.ts makes the fallback lifecycle, retention controls, doctoring, and ## Unreleased changelog contract executable;
  • scripts/lib/private-vulnerability-reporting-audit.mjs deterministically accepts only an explicit GitHub enabled: true status and fails closed on disabled or malformed evidence;
  • scripts/private-vulnerability-reporting-audit.mjs performs only a bounded GET to GitHub's private-vulnerability-reporting status endpoint, refuses cross-organization repository identifiers, applies a 20-second timeout and 16 KiB streamed response ceiling, emits machine-readable artifacts/security/private-vulnerability-reporting-audit.json, and returns failure unless the status is explicitly enabled;
  • test/private-vulnerability-reporting-audit.test.ts pins endpoint, method, version header, output/fail-closed semantics, evidence limitations, and the operator-runbook contract;
  • test/private-vulnerability-reporting-adapter.test.ts proves the adapter streams instead of using an unbounded complete-body buffering path and rejects both oversized declared and oversized streamed responses;
  • docs/security/private-vulnerability-reporting-audit.md gives the exact collection command, evidence path, fail-closed interpretation, retention boundary, content-free fallback behavior, and the live operational acceptance checklist owned by security: enable and evidence private vulnerability reporting #73.

The adapter's first implementation bounded bytes only after response.text() had already buffered the complete remote body. That violated the intended untrusted-input boundary. A RED streamed-adapter contract was added at 698db41561f310390d515e45e3304cc4a6f75408; the subsequent implementation introduced incremental byte counting and early cancellation. A later RED runbook contract was satisfied by the dedicated operational-evidence runbook at the current head.

Current exact-head evidence

For unchanged exact head 7bb27c518fb94e4ac5abd9f8f26479f964db6995:

  • application ci run 31332529454: terminal failure only at the inherited repository-wide npm audit --audit-level=high boundary for protected-main nanoid <3.3.17 / GHSA-2v37-7h3g-55p8. Before that boundary, typecheck succeeded and 64 test files / 657 tests passed, including all private-reporting evaluator, streamed-adapter, and runbook-contract tests, with configured owned statement/branch/function/line coverage all 100%. The workflow checked GitHub's synthetic integration commit 538e7d4621f57556c26a40d1a88da8dd4a702fca, so those results are integration evidence rather than immutable-head checkout proof;
  • reviewer-ci run 31332529436: terminal success;
  • central Security Scan run 31332529441: terminal success;
  • exact-head CodeRabbit commit status: success, retained only as commit-status evidence;
  • all currently visible inline CodeRabbit threads are resolved/outdated;
  • the only formal submitted review remains historical CodeRabbit COMMENTED evidence; there is no qualifying independent non-author APPROVED review.

The inherited dependency root fix remains isolated in #75/#76. Duplicating its lockfile remediation here or weakening npm audit is rejected.

Operational gap intentionally remains open

The repository now detects and documents how to evidence the GitHub private-vulnerability-reporting setting without write authority, but repository code does not prove that the live setting is enabled, that the external reporter UI is visible, that multiple authorized maintainers/security owners receive and can access reports, that notifications route correctly, or that a benign end-to-end private-report exercise has succeeded. Canonical issue #73 owns those administrator/operational acceptance items and remains open.

A passing setting probe is not notification-routing, staffing, case-handling, review, release, deployment, or acquisition evidence by itself.

Authority and safety boundaries

  • no vulnerability details, credentials, personal data, or exploit payloads belong in public issues, PR bodies, CI/model logs, or public artifacts;
  • no invented security email, PGP key, bounty, contractual SLA, supported production release, or 24/7 staffing claim;
  • no GitHub App, reviewer, branch-protection, merge, release, deployment, or broader repository permission is added;
  • no self-modifying/repair workflow, branch-patching contents:write, protection bypass, audit waiver, or synthetic approval;
  • checks, commit statuses, scanner evidence, model judgements, reviews, operational-setting evidence, and release acceptance remain separate evidence classes.

Merge boundary

Do not merge until the unchanged exact head satisfies the actual required CI/security/coverage/provenance gates, all valid current findings remain addressed, enforceable main governance under #27 is present, and qualifying independent approval is satisfied where required. #76 must first remove the inherited dependency-audit failure under its own gates. No version bump or release is warranted for this unintegrated policy/control slice.

Related: #73, #27, #29, #40, #75, #76, #77, #78

@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@seonghobae, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 28 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 5bbdef36-2d36-4714-9363-9097d063b79d

📥 Commits

Reviewing files that changed from the base of the PR and between e5db307 and 7ac6185.

📒 Files selected for processing (9)
  • SECURITY.md
  • docs/doctoring/vulnerability-disclosure.md
  • docs/security/private-vulnerability-reporting-audit.md
  • docs/security/vulnerability-handling.md
  • scripts/lib/private-vulnerability-reporting-audit.mjs
  • scripts/private-vulnerability-reporting-audit.mjs
  • test/private-vulnerability-reporting-adapter.test.ts
  • test/private-vulnerability-reporting-audit.test.ts
  • test/security-policy-contract.test.ts
📝 Walkthrough

Walkthrough

공개 보안 정책과 취약점 공개 지침을 추가했습니다. 접수부터 검증, 수정, 릴리스, 공개, 복구, 증거 보존까지의 처리 lifecycle을 정의했습니다. 관련 문서의 필수 내용을 검증하는 Vitest 계약 테스트를 추가했습니다.

Changes

취약점 공개 및 처리

Layer / File(s) Summary
보안 신고 정책 계약
SECURITY.md, CHANGELOG.md
지원 버전, 비공개 신고, 범위, safe harbor, 금지 행위, 대응 목표, CVSS v4.0 평가, 조정된 공개 절차를 정의하고 변경 로그에 기록했습니다.
조정된 공개 지침
docs/doctoring/vulnerability-disclosure.md
ISO/IEC 29147·30111, NIST SP 800-61 Rev. 3, GitHub 신고 채널, CVSS 4.0 기준을 기록했습니다. 증거 보존, 독립 승인, 공개와 릴리스의 분리, APA 7th 참고문헌을 추가했습니다.
취약점 처리 lifecycle
docs/security/vulnerability-handling.md, test/security-policy-contract.test.ts
접수, 검증, 사고 대응, 격리, 수정, 릴리스, 공개, 복구, 종료 상태와 담당자·시각·증거 기록 요건을 정의했습니다. 계약 테스트는 관련 문서의 필수 내용과 근거 문구를 검증합니다.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Reporter
  participant GitHubPrivateReport
  participant MaintainerLifecycle
  participant ReleaseEvidence
  Reporter->>GitHubPrivateReport: 비공개 취약점 신고와 재현 증거 제출
  GitHubPrivateReport->>MaintainerLifecycle: 신고 접수 및 case identifier 생성
  MaintainerLifecycle->>ReleaseEvidence: 검증, 수정, 테스트, 승인 증거 기록
  ReleaseEvidence-->>MaintainerLifecycle: 릴리스·배포·복구 검증 결과 반환
  MaintainerLifecycle-->>Reporter: 상태 업데이트와 조정된 공개 일정 전달
Loading
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
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.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목은 coordinated vulnerability disclosure 정책 수립이라는 변경의 핵심을 정확하고 간결하게 설명합니다.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch docs/coordinated-vulnerability-disclosure

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.

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

Please perform a substantive read-only review of exact current head d43b09386e5fd10aaf72882c9d34e3a9b6b3cc64. Treat the earlier draft-skip signal as non-evidence. Focus on the buyer-visible coordinated vulnerability disclosure boundary: SECURITY.md, the vulnerability-handling lifecycle, pre-release support wording, private-reporting-first intake without invented operational guarantees, good-faith safe harbor, coordinated disclosure, exact source/release/deployment evidence separation, CVSS v4.0 and exploitation-aware prioritization, incident escalation, advisory/CVE coordination, evidence retention, and consistency with CHANGELOG.md and APA 7th doctoring. Verify that repository text does not falsely claim private vulnerability reporting is enabled, monitored, exercised, or backed by a bounty/SLA/24x7 operation. Please flag only actionable findings on this exact head; this request is not merge approval.

@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

expected='d43b09386e5fd10aaf72882c9d34e3a9b6b3cc64'
actual="$(git rev-parse HEAD)"
printf 'HEAD=%s\nEXPECTED=%s\n' "$actual" "$expected"
if [ "$actual" != "$expected" ]; then
  printf 'ERROR: checked-out revision does not match the requested exact head\n' >&2
  exit 2
fi

printf '\n== Commit ==\n'
git show -s --format='%H%n%P%n%s' HEAD

printf '\n== Changed files versus parent ==\n'
git diff-tree --no-commit-id --name-status -r HEAD

printf '\n== Candidate policy/lifecycle files ==\n'
fd -HI -t f '^(SECURITY\.md|CHANGELOG\.md|.*[Ss]ecur.*\.(md|test\.(ts|js))|.*[Vv]ulnerab.*\.(md|test\.(ts|js)))$' . \
  -E .git -E node_modules -E dist -E build | sort

printf '\n== Diff stat ==\n'
git diff --stat HEAD^ HEAD

Length of output: 1567


🏁 Script executed:

#!/bin/bash
set -euo pipefail

base='9adb784902cae19a150146a8fadd6a0491f67814'
head='d43b09386e5fd10aaf72882c9d34e3a9b6b3cc64'
git cat-file -e "${base}^{commit}"
git cat-file -e "${head}^{commit}"

printf '%s\n' '== Files changed in the complete PR range =='
git diff --name-status "$base" "$head"

printf '%s\n' '== Complete PR diff =='
git diff --find-renames --find-copies --unified=40 "$base" "$head" -- \
  SECURITY.md \
  CHANGELOG.md \
  docs/doctoring/vulnerability-disclosure.md \
  docs/security/vulnerability-handling.md \
  docs/security-validation-checklist.md \
  test/security-policy-contract.test.ts \
  test/security-checklist.test.ts \
  test/security-validation-evidence.test.ts

printf '%s\n' '== Numbered relevant file contents at exact head =='
for f in \
  SECURITY.md \
  CHANGELOG.md \
  docs/doctoring/vulnerability-disclosure.md \
  docs/security/vulnerability-handling.md \
  docs/security-validation-checklist.md \
  test/security-policy-contract.test.ts \
  test/security-checklist.test.ts \
  test/security-validation-evidence.test.ts
do
  if [ -f "$f" ]; then
    printf '\n----- %s -----\n' "$f"
    cat -n "$f"
  fi
done

Length of output: 123710


🤖 web_search executed:

Verify from primary sources: (1) ISO/IEC 29147:2018 is the current published vulnerability disclosure standard and ISO/IEC AWI 29147 Edition 3 is under development; (2) ISO/IEC 30111:2019 is the current published vulnerability handling standard and ISO/IEC WD 30111.2 Edition 3 is under development; (3) NIST SP 800-61 Rev. 3 publication date and relationship to Rev. 2; (4) GitHub documentation on SECURITY.md and private vulnerability reporting availability; (5) FIRST CVSS v4.0 metric groups; (6) CISA KEV catalog purpose.

Length of output: 11929


🏁 Script executed:

#!/bin/bash
set -euo pipefail

head='d43b09386e5fd10aaf72882c9d34e3a9b6b3cc64'
test "$(git rev-parse HEAD)" = "$head"

printf '%s\n' '== Policy-related claims at exact head =='
rg -n -i -C 2 \
  '(private (vulnerability )?report|report a vulnerability|security (email|contact)|bug bounty|compensation|contractual SLA|24.?7|production.ready|supported version|security support|release readiness|deployment readiness|coordinated disclosure|CVE|CVSS|known exploited|safe harbor)' \
  --glob '*.md' --glob '*.ts' --glob '*.js' --glob '*.mjs' \
  -g '!node_modules/**' -g '!dist/**' -g '!build/**' .

printf '%s\n' '== Markdown links in new policy documents =='
python3 - <<'PY'
import re
from pathlib import Path
files = [
    Path("SECURITY.md"),
    Path("docs/security/vulnerability-handling.md"),
    Path("docs/doctoring/vulnerability-disclosure.md"),
]
for path in files:
    print(f"\n{path}:")
    text = path.read_text(encoding="utf-8")
    for line, value in enumerate(text.splitlines(), 1):
        for url in re.findall(r'https?://[^\s)>]+', value):
            print(f"{line}: {url}")
        for target in re.findall(r'\[[^\]]+\]\((?!https?://)([^)#]+)', value):
            resolved = (path.parent / target).resolve()
            print(f"{line}: internal {target} -> {'OK' if resolved.exists() else 'MISSING'}")
PY

printf '%s\n' '== Changed-file whitespace and conflict markers =='
git diff --check 9adb784902cae19a150146a8fadd6a0491f67814 "$head"
rg -n '^(<<<<<<<|=======|>>>>>>>)' SECURITY.md docs/security/vulnerability-handling.md \
  docs/doctoring/vulnerability-disclosure.md CHANGELOG.md test/security-policy-contract.test.ts || true

Length of output: 30999


@seonghobae I completed a read-only review of exact head d43b09386e5fd10aaf72882c9d34e3a9b6b3cc64.

Finding — medium priority: The regression contract does not protect the no-operational-guarantee boundary.

test/security-policy-contract.test.ts checks for Report a vulnerability and other positive policy anchors. It does not require the qualification in SECURITY.md Line 19: “when that control is available.” It also does not require the explicit limitation in docs/doctoring/vulnerability-disclosure.md Line 95 that private vulnerability reporting is not proven enabled, monitored, or exercised.

A future edit could state that private reporting is available or monitored, while this test still passes. Add assertions for these negative boundaries. This change will preserve the central buyer-visible constraint that repository text cannot prove live administrative or operational controls.

I found no other actionable issue in the requested scope. The current policy text correctly keeps private reporting conditional, provides a content-free public fallback, limits support to pre-release investigation and remediation, separates source/release/deployment evidence, uses CVSS v4.0 with exploitation-aware prioritization, and avoids bounty, SLA, and 24/7 claims.

⚠️ Action not completed

Review rate limited.

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
Contributor Author

@coderabbitai review

Please perform a substantive read-only review of exact current head e5db307d54675914640f03e5b92695bc57664d39. Bind the review to this exact head and refuse stale-head evidence. The predecessor review on d43b09386e5fd10aaf72882c9d34e3a9b6b3cc64 found a valid medium-priority gap in the regression contract for the no-operational-guarantee boundary; this head claims to address it. Verify that test/security-policy-contract.test.ts now pins the conditional private-reporting wording and the explicit non-claim that private vulnerability reporting is enabled, monitored/staffed, or exercised. Also review SECURITY.md, docs/security/vulnerability-handling.md, docs/doctoring/vulnerability-disclosure.md, and CHANGELOG.md for pre-release support wording, content-free public fallback, safe harbor, CVSS v4.0/exploitation-aware prioritization, source/release/deployment evidence separation, advisory/CVE coordination, evidence retention, and avoidance of invented bounty/SLA/24x7/production-readiness claims. Flag only actionable current-head findings. This request is review evidence only, not approval or merge authority.

@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

base='9adb784902cae19a150146a8fadd6a0491f67814'
head='e5db307d54675914640f03e5b92695bc57664d39'

actual="$(git rev-parse HEAD)"
printf 'HEAD=%s\nREQUESTED_HEAD=%s\n' "$actual" "$head"
if [ "$actual" != "$head" ]; then
  printf 'ERROR: checked-out revision does not match the requested exact head\n' >&2
  exit 2
fi

git cat-file -e "${base}^{commit}"
git cat-file -e "${head}^{commit}"

printf '\n== Exact commit ==\n'
git show -s --format='commit=%H%nparents=%P%nsubject=%s' "$head"

printf '\n== Files changed across the PR range ==\n'
git diff --name-status "$base" "$head"

printf '\n== Relevant file outlines ==\n'
for f in SECURITY.md CHANGELOG.md docs/security/vulnerability-handling.md docs/doctoring/vulnerability-disclosure.md test/security-policy-contract.test.ts; do
  if [ -f "$f" ]; then
    printf '\n--- %s ---\n' "$f"
    if [[ "$f" == *.ts ]]; then
      ast-grep outline "$f" --items all || true
    else
      rg -n '^#{1,6} ' "$f" || true
    fi
  else
    printf 'MISSING: %s\n' "$f"
  fi
done

printf '\n== PR diff for review scope ==\n'
git diff --find-renames --unified=20 "$base" "$head" -- \
  SECURITY.md \
  CHANGELOG.md \
  docs/security/vulnerability-handling.md \
  docs/doctoring/vulnerability-disclosure.md \
  test/security-policy-contract.test.ts

printf '\n== Numbered exact-head content for review scope ==\n'
for f in SECURITY.md CHANGELOG.md docs/security/vulnerability-handling.md docs/doctoring/vulnerability-disclosure.md test/security-policy-contract.test.ts; do
  if [ -f "$f" ]; then
    printf '\n--- %s ---\n' "$f"
    cat -n "$f"
  fi
done

printf '\n== Targeted policy-claim search ==\n'
rg -n -i -C 2 \
  '(report a vulnerability|private vulnerability reporting|when that control is available|enabled|monitored|staffed|exercised|bug bounty|bounty|compensation|SLA|24.?7|production.ready|supported release|pre.release|content.free|safe harbor|CVSS|known exploited|KEV|incident escalation|CVE|advisory|source identity|release identity|deployment identity|retention)' \
  SECURITY.md CHANGELOG.md docs/security/vulnerability-handling.md \
  docs/doctoring/vulnerability-disclosure.md test/security-policy-contract.test.ts

printf '\n== Whitespace and conflict-marker checks ==\n'
git diff --check "$base" "$head"
rg -n '^(<<<<<<<|=======|>>>>>>>)' \
  SECURITY.md CHANGELOG.md docs/security/vulnerability-handling.md \
  docs/doctoring/vulnerability-disclosure.md test/security-policy-contract.test.ts || true

Length of output: 146414


@seonghobae I completed a read-only review of exact head e5db307d54675914640f03e5b92695bc57664d39.

I found no actionable findings in the requested scope.

The predecessor regression-contract finding is addressed. test/security-policy-contract.test.ts now pins:

  • the conditional private-reporting wording: “when that control is available”;
  • the explicit non-claim that private vulnerability reporting is enabled;
  • the explicit non-claim that notification subscriptions are staffed; and
  • the explicit non-claim that a private-advisory response objective has been met.

The reviewed documents are consistent on the requested boundaries:

  • SECURITY.md limits support to pre-release investigation and remediation.
  • The public fallback requests only private contact. It prohibits public vulnerability details.
  • The safe-harbor text excludes destructive activity and unauthorized third-party testing.
  • CVSS v4.0 remains a technical-severity input. Exploitation evidence, including CISA KEV status, remains a separate prioritization factor.
  • The lifecycle separates exact source, immutable release, and deployment identities.
  • The lifecycle defines incident escalation, test-first remediation, independent review, advisory/CVE coordination, recovery, and bounded evidence retention.
  • The doctoring separates published ISO standards from draft work items and includes APA 7th references.
  • The policy does not claim a security email, bounty, contractual SLA, 24x7 operation, production readiness, enabled private reporting, staffed notifications, or an exercised response objective.
  • CHANGELOG.md describes the same limitations.

git diff --check reported no whitespace errors. The conflict-marker check found no markers.

This is review evidence only. It is not approval or merge authority.


✏️ Learnings added
Learnt from: seonghobae
URL: https://github.com/ContextualWisdomLab/noema/pull/72

Timestamp: 2026-08-07T17:07:19.300Z
Learning: For the Noema coordinated vulnerability disclosure policy, `SECURITY.md` and `docs/doctoring/vulnerability-disclosure.md` must not claim that GitHub private vulnerability reporting is enabled, notification subscriptions are staffed, or private-advisory response objectives have been exercised without separate live administrative and operational evidence. `test/security-policy-contract.test.ts` pins these non-claim boundaries.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.

⚠️ Action not completed

Review rate limited.

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
Contributor Author

@coderabbitai review

Please perform a substantive read-only review of exact current head e5db307d54675914640f03e5b92695bc57664d39 and refuse stale-head evidence. Focus on the buyer-visible coordinated vulnerability disclosure contract, the explicit distinction between repository policy and actually enabled/monitored GitHub private vulnerability reporting, safe-harbor/prohibited-activity wording, CVSS v4.0 and exploitation-aware prioritization, exact source/release/deployment evidence preservation, incident-escalation and advisory/CVE lifecycle, APA 7th primary-source doctoring, CHANGELOG alignment, and regression coverage. Flag only actionable current-head findings. This request is review evidence only and is not approval, merge, release, or deployment authority.

@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

base='9adb784902cae19a150146a8fadd6a0491f67814'
head='e5db307d54675914640f03e5b92695bc57664d39'

actual="$(git rev-parse HEAD)"
printf 'HEAD=%s\nREQUESTED_HEAD=%s\n' "$actual" "$head"
if [ "$actual" != "$head" ]; then
  printf 'ERROR: checked-out revision does not match the requested exact head\n' >&2
  exit 2
fi

git cat-file -e "${base}^{commit}"
git cat-file -e "${head}^{commit}"

printf '\n== Exact commit ==\n'
git show -s --format='commit=%H%nparents=%P%nsubject=%s' "$head"

printf '\n== PR-range changed files ==\n'
git diff --name-status "$base" "$head"

printf '\n== Scoped document structure ==\n'
for f in \
  SECURITY.md \
  CHANGELOG.md \
  docs/security/vulnerability-handling.md \
  docs/doctoring/vulnerability-disclosure.md \
  test/security-policy-contract.test.ts
do
  printf '\n--- %s ---\n' "$f"
  test -f "$f" || { printf 'MISSING\n'; continue; }
  if [[ "$f" == *.ts ]]; then
    ast-grep outline "$f" --items all
  else
    rg -n '^#{1,6} ' "$f" || true
  fi
done

printf '\n== Complete scoped diff ==\n'
git diff --find-renames --unified=30 "$base" "$head" -- \
  SECURITY.md \
  CHANGELOG.md \
  docs/security/vulnerability-handling.md \
  docs/doctoring/vulnerability-disclosure.md \
  test/security-policy-contract.test.ts

printf '\n== Exact-head scoped contents ==\n'
for f in \
  SECURITY.md \
  CHANGELOG.md \
  docs/security/vulnerability-handling.md \
  docs/doctoring/vulnerability-disclosure.md \
  test/security-policy-contract.test.ts
do
  printf '\n--- %s ---\n' "$f"
  cat -n "$f"
done

printf '\n== Claims and regression anchors ==\n'
rg -n -i -C 3 \
  '(report a vulnerability|when that control is available|private vulnerability reporting|enabled|monitored|staffed|exercised|notification subscription|response objective|security email|bounty|compensation|SLA|24.?7|production.ready|pre.release|safe harbor|prohibited|destructive|third.party|CVSS|KEV|known exploited|source identity|release identity|deployment identity|incident escalation|CVE|advisory|retention|APA|ISO/IEC|NIST)' \
  SECURITY.md CHANGELOG.md docs/security/vulnerability-handling.md \
  docs/doctoring/vulnerability-disclosure.md test/security-policy-contract.test.ts

printf '\n== Link targets and diff hygiene ==\n'
python3 - <<'PY'
import re
from pathlib import Path
for name in [
    "SECURITY.md",
    "docs/security/vulnerability-handling.md",
    "docs/doctoring/vulnerability-disclosure.md",
]:
    p = Path(name)
    print(f"\n{name}")
    for n, line in enumerate(p.read_text(encoding="utf-8").splitlines(), 1):
        for target in re.findall(r'\[[^\]]+\]\((?!https?://|#)([^)#]+)', line):
            print(f"{n}: {target}: {'OK' if (p.parent / target).exists() else 'MISSING'}")
PY
git diff --check "$base" "$head"
rg -n '^(<<<<<<<|=======|>>>>>>>)' \
  SECURITY.md CHANGELOG.md docs/security/vulnerability-handling.md \
  docs/doctoring/vulnerability-disclosure.md test/security-policy-contract.test.ts || true

Length of output: 172329


Use primary sources only. Verify these statements for a documentation review:
1. ISO/IEC 29147:2018 is the currently published vulnerability-disclosure standard, while ISO/IEC AWI 29147 Edition 3 is under development.
2. ISO/IEC 30111:2019 is the currently published vulnerability-handling standard, while ISO/IEC WD 30111.2 Edition 3 is a working draft under development.
3. NIST SP 800-61 Rev. 3 was finalized in April 2025 and supersedes Revision 2.
4. GitHub private vulnerability reporting must be enabled by a repository administrator and is independent of the existence of SECURITY.md.
5. FIRST CVSS v4.0 has Base, Threat, Environmental, and Supplemental metric groups.
6. The CISA Known Exploited Vulnerabilities Catalog identifies vulnerabilities known to be exploited in the wild.

You are interacting with an AI system.

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

Please perform a substantive review of the exact current head e5db307d54675914640f03e5b92695bc57664d39. Treat predecessor-head analysis and status-only evidence as stale/non-approval evidence; review the current disclosure-policy wording, regression contract, standards/doctoring, and operational limitations. Do not approve or merge on the basis of queued, failed, stale-head, or status-only checks.

@coderabbitai

coderabbitai Bot commented Aug 8, 2026

Copy link
Copy Markdown
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

base='9adb784902cae19a150146a8fadd6a0491f67814'
head='e5db307d54675914640f03e5b92695bc57664d39'
actual="$(git rev-parse HEAD)"

printf 'HEAD=%s\nREQUESTED_HEAD=%s\n' "$actual" "$head"
if [ "$actual" != "$head" ]; then
  printf 'ERROR: checked-out revision does not match requested exact head\n' >&2
  exit 2
fi
git cat-file -e "${base}^{commit}"
git cat-file -e "${head}^{commit}"

printf '\n== Exact commit ==\n'
git show -s --format='commit=%H%nparents=%P%nsubject=%s' "$head"

printf '\n== PR-range changed files ==\n'
git diff --name-status "$base" "$head"

printf '\n== Document structure and test outline ==\n'
for f in \
  SECURITY.md \
  CHANGELOG.md \
  docs/security/vulnerability-handling.md \
  docs/doctoring/vulnerability-disclosure.md \
  test/security-policy-contract.test.ts
do
  printf '\n--- %s ---\n' "$f"
  test -f "$f" || { printf 'MISSING\n'; continue; }
  if [[ "$f" == *.ts ]]; then
    ast-grep outline "$f" --items all
  else
    rg -n '^#{1,6} ' "$f" || true
  fi
done

printf '\n== Exact-head review-scope contents ==\n'
for f in \
  SECURITY.md \
  CHANGELOG.md \
  docs/security/vulnerability-handling.md \
  docs/doctoring/vulnerability-disclosure.md \
  test/security-policy-contract.test.ts
do
  printf '\n--- %s ---\n' "$f"
  cat -n "$f"
done

printf '\n== Claims and regression anchors ==\n'
rg -n -i -C 3 \
  '(report a vulnerability|when that control is available|private vulnerability reporting|enabled|monitored|staffed|exercised|notification subscription|response objective|security email|bounty|compensation|SLA|24.?7|production.ready|pre.release|safe harbor|prohibited|destructive|third.party|CVSS|KEV|known exploited|source identity|release identity|deployment identity|incident escalation|CVE|advisory|retention|APA|ISO/IEC|NIST)' \
  SECURITY.md CHANGELOG.md docs/security/vulnerability-handling.md \
  docs/doctoring/vulnerability-disclosure.md test/security-policy-contract.test.ts

printf '\n== Internal documentation links ==\n'
python3 - <<'PY'
import re
from pathlib import Path

for filename in (
    "SECURITY.md",
    "docs/security/vulnerability-handling.md",
    "docs/doctoring/vulnerability-disclosure.md",
):
    path = Path(filename)
    print(f"\n{filename}")
    for line_number, line in enumerate(path.read_text(encoding="utf-8").splitlines(), 1):
        for target in re.findall(r'\[[^\]]+\]\((?!https?://|#)([^)#]+)', line):
            print(f"{line_number}: {target}: {'OK' if (path.parent / target).exists() else 'MISSING'}")
PY

printf '\n== Diff hygiene ==\n'
git diff --check "$base" "$head"
rg -n '^(<<<<<<<|=======|>>>>>>>)' \
  SECURITY.md CHANGELOG.md docs/security/vulnerability-handling.md \
  docs/doctoring/vulnerability-disclosure.md test/security-policy-contract.test.ts || true

Length of output: 118394


🤖 web_search executed:

`Use primary sources only. Verify the following claims for a documentation review:

  1. ISO/IEC 29147:2018 is the currently published vulnerability-disclosure standard, and ISO/IEC AWI 29147 Edition 3 is under development.
  2. ISO/IEC 30111:2019 is the currently published vulnerability-handling standard, and ISO/IEC WD 30111.2 Edition 3 is an under-development working draft.
  3. NIST SP 800-61 Rev. 3 was finalized in April 2025 and supersedes Revision 2.
  4. GitHub private vulnerability reporting must be enabled by a repository administrator and is independent of the presence of SECURITY.md.
  5. FIRST CVSS v4.0 defines Base, Threat, Environmental, and Supplemental metric groups.
  6. The CISA Known Exploited Vulnerabilities Catalog identifies vulnerabilities known to be exploited in the wild.`

Length of output: 12197


🤖 web_search executed:

site:first.org/cvss/v4.0 FIRST CVSS v4.0 specification Base Threat Environmental Supplemental metric groups

Length of output: 17412


@seonghobae I completed a substantive, read-only review of exact head e5db307d54675914640f03e5b92695bc57664d39.

I found no actionable findings in the requested scope.

The regression contract now protects the operational boundary. test/security-policy-contract.test.ts requires:

  • the conditional phrase “when that control is available”;
  • the statement that private vulnerability reporting is not proven enabled;
  • the statement that notification subscriptions are not proven staffed; and
  • the statement that a private-advisory response objective is not proven met.

The reviewed documents are consistent:

  • SECURITY.md limits security support to pre-release investigation and remediation.
  • The private-reporting path is conditional.
  • The fallback asks only for private contact. It prohibits public vulnerability details.
  • The safe-harbor scope excludes destructive activity, third-party testing, and premature public disclosure.
  • The policy states that response objectives are not contractual SLAs.
  • CVSS v4.0 is a technical-severity input. Known exploitation and CISA KEV status are separate prioritization inputs.
  • The lifecycle preserves and distinguishes source, release, deployment, and configuration identities.
  • The lifecycle defines incident escalation, test-first remediation, independent review, advisory/CVE coordination, recovery, and bounded evidence retention.
  • The doctoring distinguishes published ISO standards from under-development work items.
  • Primary sources support the ISO, NIST, GitHub, FIRST CVSS, and CISA statements.
  • CHANGELOG.md records the policy boundary without claiming enabled private reporting, a monitored security email, a bounty, an SLA, or production readiness.

The scoped inspection found no broken internal links, conflict markers, or whitespace errors. I did not execute tests.

This review is current-head evidence only. It is not approval, merge authority, release authority, or deployment authority. It does not treat queued, failed, stale-head, or status-only evidence as success.

✅ 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.

@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 `@docs/security/vulnerability-handling.md`:
- Line 147: Expand the evidence-retention guidance around “Retain only the data
necessary” to define bounded maximum retention periods for each evidence class,
the owner responsible for expiry review, role-based access, legal-hold
exceptions, and secure deletion or redaction evidence. Add contract tests that
lock these lifecycle requirements and explicitly cover reporter contact data,
PII, and secrets.
- Around line 43-48: 문서 절차에 SECURITY.md의 공개 fallback lifecycle을 추가하세요. Private
security contact requested 이슈의 담당자 지정, private channel 안내, 취약점 세부정보를 공개 이슈에 요청하지
않는 원칙, private case로 전환하는 단계를 명시하고, 6단계의 “public service objective”를
SECURITY.md의 published service objective와 동일한 용어로 변경하세요.

In `@test/security-policy-contract.test.ts`:
- Around line 89-90: Update the changelog assertion in the security policy
contract test to extract only the section beginning at the “## Unreleased”
heading and ending before the next “##” heading, then check that section for
“coordinated vulnerability disclosure”. Make the test fail when the “##
Unreleased” heading is absent.
🪄 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: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: dcd0e23b-b32d-482c-8b63-278c1171e3e7

📥 Commits

Reviewing files that changed from the base of the PR and between 9adb784 and e5db307.

📒 Files selected for processing (5)
  • CHANGELOG.md
  • SECURITY.md
  • docs/doctoring/vulnerability-disclosure.md
  • docs/security/vulnerability-handling.md
  • test/security-policy-contract.test.ts

Comment thread docs/security/vulnerability-handling.md Outdated
Comment thread docs/security/vulnerability-handling.md Outdated
Comment thread test/security-policy-contract.test.ts Outdated
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