Skip to content

fix(security): establish canonical npm, PDF.js, Nanoid, and Undici baseline - #783

Open
seonghobae wants to merge 64 commits into
developfrom
fix/high-security-dependency-baseline
Open

fix(security): establish canonical npm, PDF.js, Nanoid, and Undici baseline#783
seonghobae wants to merge 64 commits into
developfrom
fix/high-security-dependency-baseline

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator

Problem

Protected develop carries three high-severity JavaScript dependency findings and does not make the lockfile generator an enforceable repository contract:

  • repository dependency/security tooling requires moving [email protected] to the current 6.2.108 floor; this is intentionally not attributed to the older CVE-2024-4367 / GHSA-wgrm-67xf-hhpq, which affected pdfjs-dist <=4.1.392 and was fixed in 4.2.67;
  • transitive [email protected], fixed in 3.3.18;
  • [email protected], fixed at this repository boundary in 7.29.0; and
  • dependency updates produced by inconsistent npm serialization paths, including unrelated removal of peer: true from @esbuild/* locations.

Atomic baseline

This PR targets protected develop directly and combines the npm-generator provenance slice from #782 with the coordinated PDF.js/Nanoid/Undici remediation. It is the intended atomic supply-chain baseline rather than a child stacked on #782.

The implementation:

  • declares and enforces [email protected] as the approved package-lock generator;
  • verifies Node 22.22.3 and npm 10.9.8 before dependency consumption;
  • validates the committed lock only through frozen npm ci --ignore-scripts --no-audit --no-fund in the lock gate, then rejects manifest/lock working-tree drift;
  • mechanically prohibits npm install, npm update, and npx mutable-resolution commands from that lock-validation job;
  • requires SRI evidence for every public npm-registry artifact recorded in the root lock;
  • pins pdfjs-dist exactly to 6.2.108 and Undici exactly to 7.29.0 through the root override;
  • carries transitive [email protected] in the complete npm-generated lock artifact;
  • preserves unrelated @esbuild/* peer metadata and regression-gates every root platform record against silent peer: true loss;
  • constrains the PDF loader to copied in-memory bytes and a same-origin bundled worker;
  • explicitly disables XFA rendering and worker-side helper-resource fetching at the score-PDF boundary;
  • adds manifest, registry/SRI, frozen-lock, loader-boundary, generator-metadata, and npm-toolchain regression contracts; and
  • updates CHANGELOG and APA 7 doctoring with the bounded provenance/validation claim, rollback, trust boundaries, and corrected advisory attribution.

Provenance boundary

Historical workflow run 31161313485 produced the complete npm 10.9.8 lock artifact imported into this branch, with lock SHA-256 31dd2661eca864e3da46f86629a2535dc181d01449bd3a50fa3cdbd6c58e7971 and zero high-severity npm audit findings at that stage. Historical generation evidence does not substitute for current-head merge evidence.

CI makes the narrower claim supported by frozen-install semantics: the committed manifest/lock pair is consumable by the approved toolchain without mutation, public-registry artifacts carry integrity evidence, and known generator-sensitive @esbuild/* peer metadata remains present. CI intentionally does not re-resolve mutable manifest ranges to claim future byte-for-byte reproduction.

Strix finding triage and bounded hardening

Predecessor exact head 6f81f52c193c1e327d078eba7a2ea3bdbfbc87c2 failed Strix run 31871388084, job 95043996826. The artifact was inspected before editing. Its only reported finding asserted XXE in [email protected] through loadScorePdf, but the supplied PoC returned only the four-byte %PDF header and explicitly required construction of a real PDF with embedded XML; it did not demonstrate entity expansion, local-file disclosure, network access, or parser output containing an external entity.

Pinned PDF.js source was verified rather than treating the scanner claim as authoritative. Current exact head dae5d3c8d055381d57c0971d8e40456711499476 keeps the bounded defense-in-depth contract without suppressing any finding: loadScorePdf explicitly passes enableXfa: false and useWorkerFetch: false; the unit test locks those options together with byte copying and the data-only API boundary; and docs/doctoring/high-security-pdf-http-baseline.md records the scanner-evidence limitation, upstream XML-parser boundary, explicit parser options, residual parser risk, rollback/evidence requirements, and APA 7 references.

The doctoring also corrects a pre-existing citation defect: CVE-2024-4367 / GHSA-wgrm-67xf-hhpq is recorded with its actual affected/fixed range and is no longer misrepresented as evidence that [email protected] was vulnerable. The 6.2.108 floor is justified by the repository's current security-tooling contract and exact-head validation, not by that older advisory.

Exact-current-head repository evidence

Current exact head: dae5d3c8d055381d57c0971d8e40456711499476.
Protected base: develop@acdbea6344fe1231c39535b575f4de35e4c607c9.

Every visible repository-owned exact-head workflow is terminal-success:

  • ci;
  • build-baseline;
  • release;
  • security-audit;
  • aggregate Security Scan;
  • sbom;
  • SAST Semgrep;
  • bandit; and
  • secret-scan-gate.

Current inline review inspection has zero unresolved actionable threads. The two CodeRabbit findings on credential persistence and the inaccurate changelog coverage claim are resolved in current code; temporary-repair Scorecard threads are resolved/outdated. No repository-owned queued, in-progress, failed, skipped-required, predecessor-head, or protected-base result is being counted as current success.

Central prerequisite and review gate

Central prerequisite ContextualWisdomLab/.github#1008 is now closed unmerged and is historical only. Its current-main replacement is ContextualWisdomLab/.github#1020, which explicitly supersedes #1008 and targets protected central main@c47afc2dc68488292c1db7c9d6f82dcd5360f181. At the latest refresh, #1020's actual exact head is 2f92b585407dd3fa8c38043750015e97f6b73518; its fresh required workflow cycle is queued, so none of that evidence is counted as success and the fix is not yet inherited by protected central main.

The latest OpenCode review on this exact BandScope head remains CHANGES_REQUESTED because the historical central coverage-evidence path failed before BandScope coverage evidence could be established. Do not rerun or re-mention reviewer agents merely to reproduce the same dependency failure. After #1020 reaches protected central main, regenerate central coverage/review exactly once for the then-current #783 head.

There is also no qualifying independent non-author approval for this exact BandScope head. Automated repository checks and author/self evidence do not satisfy that gate.

Exact-head merge gate

Keep unmerged until:

  • all repository-owned exact-head CI/build/release/security/SBOM/SAST gates are terminal-success;
  • all actionable current-head inline review threads are resolved;
  • .github#1020 reaches protected central main and this exact/then-current BandScope head receives terminal-success central coverage/review evidence;
  • exact-current-head 100% owned statement/branch coverage and docstring evidence required by the central review gate is terminal-success;
  • a qualifying independent non-author last-push approval exists; and
  • branch protection permits merge without bypass.

After protected merge, close any still-open #782, #751, and #765 entries only when their supersession is proven against the merged tree.

Queued, in-progress, failed, skipped-required, action-required, predecessor-head, protected-base, self/author, wrapper-only, repeated unchanged infrastructure, or administrative-bypass evidence is not success.

@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 3a4b3fa7-f5bc-4def-9498-67846590a3f0

📥 Commits

Reviewing files that changed from the base of the PR and between 164e6f2 and 07c1dd2.

📒 Files selected for processing (1)
  • services/analysis-engine/tests/test_npm_toolchain_contract.py
🚧 Files skipped from review as they are similar to previous changes (1)
  • services/analysis-engine/tests/test_npm_toolchain_contract.py

📝 Walkthrough

Walkthrough

npm 10.9.8을 manifest와 CI에 고정하고 frozen lockfile 검증을 추가했습니다. PDF.js 6.2.108과 Undici 7.29.0을 고정했습니다. PDF 입력을 복사된 메모리 바이트와 동일 출처 워커로 제한하고 관련 테스트와 운영 문서를 추가했습니다.

Changes

공급망 및 PDF 보안 기준

Layer / File(s) Summary
npm 도구체인 계약과 CI 검증
package.json, .github/workflows/ci.yml, services/analysis-engine/tests/test_npm_toolchain_contract.py, docs/doctoring/npm-lockfile-generator-provenance.md
npm 10.9.8과 Node 제약을 manifest에 기록했습니다. CI에서 npm 버전, frozen npm ci, 작업 트리 변경, lockfile v3 및 SRI를 검증합니다. verifyrust-checklock-validation 완료 후 실행합니다.
PDF 및 HTTP 의존성 보안 기준
package.json, apps/desktop/package.json, services/analysis-engine/tests/test_high_security_dependency_baseline.py
pdfjs-dist 6.2.108과 undici 7.29.0을 고정했습니다. manifest와 lockfile의 버전, registry URL, integrity, 라이선스, Node 엔진 조건 및 @esbuild/* peer metadata를 검증합니다.
PDF 데이터 및 워커 경계
apps/desktop/src/features/score/pdfjs.ts, apps/desktop/src/features/score/pdfjs.test.ts, docs/doctoring/high-security-pdf-http-baseline.md
PDF.js 초기화에서 제거된 isEvalSupported 옵션을 사용하지 않음을 기록했습니다. 로컬 워커 자산과 복사된 PDF 바이트를 사용하는 동작을 테스트하고 보안 경계를 문서화했습니다.
정책 및 릴리스 기록
CHANGELOG.md, docs/doctoring/*.md
lockfile 생성기 provenance, frozen 검증, PDF 처리 제한, 증거 보존 및 롤백 절차를 문서화했습니다. Unreleased 항목과 UI 테스트 기록을 갱신했습니다.

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

Merge Risk: 🟡 Moderate · up to 07c1d

The PR is not merge-ready because the required exact-head coverage evidence was not published after a failed validation path, and the required independent approval gate is still outstanding. Merge should wait for a successful rerun covering the current head and qualifying approval.

Sequence Diagram(s)

sequenceDiagram
  participant CI
  participant npm
  participant Lockfile
  participant Verify
  participant RustCheck
  CI->>npm: npm 10.9.8 확인
  CI->>npm: frozen npm ci 실행
  npm->>Lockfile: package-lock.json 소비
  CI->>Lockfile: manifest 및 lockfile diff 검증
  Verify->>CI: lock-validation 선행
  RustCheck->>CI: lock-validation 선행
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Title check ⚠️ Warning 제목은 npm, PDF.js, Undici 보안 기준선 변경을 요약하지만, 변경 사항에 없는 Nanoid를 포함합니다. 제목에서 Nanoid를 제거하고 실제 변경 범위인 npm, PDF.js, Undici 보안 기준선만 명시하세요.
✅ Passed checks (4 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
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.
✨ 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 fix/high-security-dependency-baseline

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.

@seonghobae
seonghobae changed the base branch from fix/npm-lock-toolchain-provenance to develop August 7, 2026 08:11
Comment thread .github/workflows/ci.yml Fixed

Copy link
Copy Markdown
Collaborator Author

@opencode-agent address

Finalize the generated security lock on exact current head e2c0c2dfee35c19d1e9156ad0a7d9324fdefd1fb; stop without writing if the live head differs.

CI run 31161313485, job 92812058810, successfully generated and uploaded artifact npm-lock-reproduction-e2c0c2dfee35c19d1e9156ad0a7d9324fdefd1fb (artifact ID 8987188177, archive digest sha256:703f8effec0b517a6c56bf40922e43ac3a35418e052adde912685d6074842cf0) before intentionally failing on lock drift. Download that exact artifact through the GitHub Actions API, verify the archive digest, extract exactly one regular package-lock.json, and verify the extracted lock SHA-256 is 31dd2661eca864e3da46f86629a2535dc181d01449bd3a50fa3cdbd6c58e7971.

Before committing, fail closed unless the generated lock proves all of the following:

  • lockfileVersion 3 and one root npm workspace lock only;
  • root devDependencies.undici is exactly 7.29.0;
  • node_modules/undici is exactly 7.29.0 with public npm registry tarball and SHA-512 SRI sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==;
  • desktop dependency pdfjs-dist is exactly 6.2.108 and the npm-generated location apps/desktop/node_modules/pdfjs-dist has public registry tarball plus SHA-512 SRI sha512-YxFb+SQcodN2rnX9Tn3dHYlqfb7NjlzzfONPpJd+AKoKtUjEdevTfbC07d5TcczzOK6261auRkP/M8OBHs9vFQ==;
  • every existing node_modules/@esbuild/* location retains peer: true; and
  • no manifest, source, workflow, test, or documentation file is modified by this lock-import commit.

Replace the branch lock byte-for-byte with the verified artifact and commit normally. Do not regenerate it locally, hand-edit it, create another branch/PR/workflow/helper, or include the ZIP. The next exact-head CI must reproduce a zero diff before any build/security success is accepted.

Copy link
Copy Markdown
Collaborator Author

/oc Refetch the live pull request and abort without writing unless it is still PR #783 on branch fix/high-security-dependency-baseline, its current head is dd93f962d367e3a5b56ee171708bf4877a054541, and its base branch is fix/npm-lock-toolchain-provenance. The prerequisite base moved to exact head f7adc803b6db795eb78aa154ff033d12688b88fb after a lint-only contract repair. Merge that latest base into this existing branch with a normal merge commit; do not rebase or force-push. Then regenerate the complete root lock on the new exact head using only Node 22.22.3 and npm 10.9.8 with npm install --package-lock-only --ignore-scripts --no-audit --no-fund, and commit the exact generated package-lock.json unchanged. Prior exact-head run 31168248160, job 92833945077, is authoritative RED evidence: lock reproduction failed after uploading artifact ID 8989872876, name npm-lock-reproduction-dd93f962d367e3a5b56ee171708bf4877a054541, digest 07dad922109f956a9339e2edc55da390922c1c4d0af868ee7eb52fe2163716e9; its diff proves the checked-in lock omitted the exact root Undici 7.29.0 record and still represented PDF.js 6.1.200 instead of the manifest-required 6.2.108 location. Treat that artifact only as diagnostic evidence because the base has since moved; regenerate and prove byte-stable output twice on the new exact head. Preserve every unrelated @esbuild/* peer: true location flag and reject all unrelated lock churn. Keep exact [email protected], exact [email protected], verified registry/SRI records, local PDF worker use, copied in-memory bytes, and isEvalSupported: false. Run focused dependency and PDF boundary tests first, then lock reproduction twice, npm audit --workspaces --audit-level=high, desktop lint/typecheck/measured tests/build, Python/Ruff/docstrings/coverage, Rust numeric/Tauri gates, package/release, SBOM, Security Scan, SAST, and git diff --check. Do not create another branch, PR, one-shot/self-modifying workflow, patch artifact, or encoded patch. Keep Draft until the new exact head is fully green, current-head review threads are zero, and a qualifying independent non-author approval exists.

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

Please review only exact current head 6f81f52c193c1e327d078eba7a2ea3bdbfbc87c2. The new delta since the last CodeRabbit-reviewed head is the npm-generator metadata regression contract plus aligned doctoring/CHANGELOG. Treat predecessor-head findings and checks as historical. Do not infer merge readiness from the still-open central coverage/review prerequisite.

@coderabbitai

coderabbitai Bot commented Aug 15, 2026

Copy link
Copy Markdown
Contributor

@seonghobae I will review pull request #783 at exact head 6f81f52c193c1e327d078eba7a2ea3bdbfbc87c2.

I will limit the review to the new npm-generator metadata regression contract, doctoring, and CHANGELOG changes. I will treat predecessor evidence as historical. I will not infer merge readiness while the central coverage/review prerequisite remains open.

⚠️ 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.

@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 6f81f52c193c1e327d078eba7a2ea3bdbfbc87c2.

  • Head SHA: 6f81f52c193c1e327d078eba7a2ea3bdbfbc87c2

  • Workflow run: 31872821129

  • Workflow attempt: 1

Coverage evidence

Coverage evidence job did not run or did not publish coverage evidence.

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Workflow: ci.yml"]
  S1 --> I1["GitHub Actions review job"]
  I1 --> R1["Review risk: Workflow: ci.yml"]
  R1 --> V1["actionlint plus required checks"]
  Evidence --> S2["Changed file (6 files)"]
  S2 --> I2["repository behavior"]
  I2 --> R2["Review risk: Changed file (6 files)"]
  R2 --> V2["required checks"]
  Evidence --> S3["Docs (2 files)"]
  S3 --> I3["operator or user guidance"]
  I3 --> R3["Review risk: Docs (2 files)"]
  R3 --> V3["docs review"]
  Evidence --> S4["Test (2 files)"]
  S4 --> I4["regression suite"]
  I4 --> R4["Review risk: Test (2 files)"]
  R4 --> V4["targeted test run"]
Loading

@opencode-agent

Copy link
Copy Markdown
Contributor

Queued @cwl-noema-review for PR #783 at head 6f81f52c193c1e327d078eba7a2ea3bdbfbc87c2. Central exact-name Actions artifacts are the durable dispatch ledger; existing review workflows remain authoritative for the final verdict and failure evidence.

@opencode-agent

Copy link
Copy Markdown
Contributor

Queued @cwl-noema-review for PR #783 at head 6f81f52c193c1e327d078eba7a2ea3bdbfbc87c2. Central exact-name Actions artifacts are the durable dispatch ledger; existing review workflows remain authoritative for the final verdict and failure evidence.

@opencode-agent

Copy link
Copy Markdown
Contributor

Queued @cwl-noema-review for PR #783 at head 6f81f52c193c1e327d078eba7a2ea3bdbfbc87c2. Central exact-name Actions artifacts are the durable dispatch ledger; existing review workflows remain authoritative for the final verdict and failure evidence.

@opencode-agent

Copy link
Copy Markdown
Contributor

Queued @cwl-noema-review for PR #783 at head 6f81f52c193c1e327d078eba7a2ea3bdbfbc87c2. Central exact-name Actions artifacts are the durable dispatch ledger; existing review workflows remain authoritative for the final verdict and failure evidence.

@opencode-agent

Copy link
Copy Markdown
Contributor

Queued @cwl-noema-review for PR #783 at head 6f81f52c193c1e327d078eba7a2ea3bdbfbc87c2. Central exact-name Actions artifacts are the durable dispatch ledger; existing review workflows remain authoritative for the final verdict and failure evidence.

@seonghobae
seonghobae enabled auto-merge (squash) August 15, 2026 09:50
@opencode-agent
opencode-agent Bot disabled auto-merge August 15, 2026 09:51
@seonghobae seonghobae changed the title fix(security): establish canonical npm, PDF.js, and Undici baseline fix(security): establish canonical npm, PDF.js, Nanoid, and Undici baseline Aug 15, 2026
@opencode-agent

Copy link
Copy Markdown
Contributor

Queued @cwl-noema-review for PR #783 at head dae5d3c8d055381d57c0971d8e40456711499476. Central exact-name Actions artifacts are the durable dispatch ledger; existing review workflows remain authoritative for the final verdict and failure evidence.

@opencode-agent

Copy link
Copy Markdown
Contributor

Queued @cwl-noema-review for PR #783 at head dae5d3c8d055381d57c0971d8e40456711499476. Central exact-name Actions artifacts are the durable dispatch ledger; existing review workflows remain authoritative for the final verdict and failure evidence.

@opencode-agent

Copy link
Copy Markdown
Contributor

Queued @cwl-noema-review for PR #783 at head dae5d3c8d055381d57c0971d8e40456711499476. Central exact-name Actions artifacts are the durable dispatch ledger; existing review workflows remain authoritative for the final verdict and failure evidence.

@opencode-agent

Copy link
Copy Markdown
Contributor

Queued @cwl-noema-review for PR #783 at head dae5d3c8d055381d57c0971d8e40456711499476. Central exact-name Actions artifacts are the durable dispatch ledger; existing review workflows remain authoritative for the final verdict and failure evidence.

@opencode-agent

Copy link
Copy Markdown
Contributor

Queued @cwl-noema-review for PR #783 at head dae5d3c8d055381d57c0971d8e40456711499476. Central exact-name Actions artifacts are the durable dispatch ledger; existing review workflows remain authoritative for the final verdict and failure evidence.

@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 dae5d3c8d055381d57c0971d8e40456711499476.

  • Head SHA: dae5d3c8d055381d57c0971d8e40456711499476

  • Workflow run: 31908253510

  • Workflow attempt: 1

Coverage evidence

Coverage evidence job did not run or did not publish coverage evidence.

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Workflow: ci.yml"]
  S1 --> I1["GitHub Actions review job"]
  I1 --> R1["Review risk: Workflow: ci.yml"]
  R1 --> V1["actionlint plus required checks"]
  Evidence --> S2["Changed file (6 files)"]
  S2 --> I2["repository behavior"]
  I2 --> R2["Review risk: Changed file (6 files)"]
  R2 --> V2["required checks"]
  Evidence --> S3["Docs (2 files)"]
  S3 --> I3["operator or user guidance"]
  I3 --> R3["Review risk: Docs (2 files)"]
  R3 --> V3["docs review"]
  Evidence --> S4["Test (2 files)"]
  S4 --> I4["regression suite"]
  I4 --> R4["Review risk: Test (2 files)"]
  R4 --> V4["targeted test run"]
Loading

@seonghobae
seonghobae enabled auto-merge (squash) August 16, 2026 09:31
@opencode-agent
opencode-agent Bot disabled auto-merge August 16, 2026 10:38
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