Skip to content

feat(supply-chain): attest Python lock provenance before install - #1369

Draft
seonghobae wants to merge 26 commits into
developfrom
feat/dependency-lock-provenance-receipt
Draft

feat(supply-chain): attest Python lock provenance before install#1369
seonghobae wants to merge 26 commits into
developfrom
feat/dependency-lock-provenance-receipt

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 16, 2026

Copy link
Copy Markdown
Contributor

Issue #1229 supply-chain lane

Status: Draft. Protected base is develop@042b0c70531b229af3acbd0421a2f23098d848b3; exact head is 8892d0fdeb90ec0e5e5eee9b8dceb1ae02bbca1a. The current compare is ahead-only: 26 commits ahead, 0 behind, with merge base exactly at protected develop.

This PR now explicitly owns the combined Naruon-local Python lock evidence lane that #1370 originally introduced as a child: deterministic offline declaration/provenance plus PyPI release-hash provenance. Merged #1370 commit cd7241798e347ee4b14a2b9812dd69eb719a1b58 is already in this branch ancestry. No mutable external owner branch is consumed.

Current contract

Application CI always runs the deterministic offline Python lock validator before dependency installation. It validates exact pins, SHA-256 structure, recursive -r / --requirement includes, repository containment, generator/source binding, every declared uv pip compile source file, UTF-8/read failures, and deterministic non-secret receipts.

The live-PyPI release-hash gate remains fail-closed when supply-chain evidence can change, but it is now diff-scoped so unrelated product changes do not become dependent on public PyPI availability. Changes to requirements*.txt, either provenance validator, focused lock-provenance backend tests/doctoring, or .github/workflows/app-ci.yml require the registry gate. Missing, zero, or unusable event-base evidence defaults to required=true. Skipping the network gate because the diff is outside that scope is not a passing registry receipt and does not weaken offline hash validation or pip install --require-hashes.

Current RED → repair evidence

  • 3a3628d9de42d212c7022d9edac2b75b1e760f3b — RED: public PyPI evidence must not gate unrelated product PRs while offline lock validation remains unconditional.
  • 3f76039b8db1f339a5c3f07c5e5a716604a9e07e — causal fix: fail-safe diff classification and conditional PyPI registry gate.
  • 58fe47085fd4ecfc042b97eedb65a38364855294 — doctoring updated to the scoped network-evidence boundary.
  • f4b2cbbf4e2b134d7355d6b16f944dda9615f6c2 — scope regression kept lint-clean.
  • 32cdf3bf4923be7090052a7e03fefb44582e66a7 — RED: an earlier source in a multi-input uv pip compile could escape version agreement, and a non-UTF-8 included requirements file raised instead of producing stable evidence.
  • 5d29d5ff91362ef5311ace6301a88920c292bbf6 — causal fix: validate every declared non-output .txt / .in source and convert lock/source read failures to bounded stable reason codes.
  • 8892d0fdeb90ec0e5e5eee9b8dceb1ae02bbca1a — offline provenance doctoring reconciled with the combined registry lane and current reason-code/source-path contracts.

All live inline review threads have been re-read against the current source and resolved. Informational findings that represent deliberate fail-closed conventions were documented rather than converted into unnecessary source churn.

Exact-head evidence and merge boundary

Fresh pull-request workflows for exact head 8892d0fdeb90ec0e5e5eee9b8dceb1ae02bbca1a are currently queued:

  • Application CI 33940123589
  • Security Scan 33940123690
  • SAST Semgrep 33940123657
  • CodeQL PR 33940123620
  • Bandit Security Scan 33940123599
  • Build and Publish Docker Images 33940123764

There is no qualifying independent post-last-push APPROVED review for this exact head. Predecessor checks and reviews do not transfer.

Keep Draft. Do not merge until exact-head repository workflows are terminal GREEN, organization-required contexts are satisfied, and a qualifying independent approval is current. No self-approval, dummy requeue commit, admin bypass, force push, destructive rebase, or gate weakening.

@coderabbitai

coderabbitai Bot commented Aug 16, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

An error occurred during the review process. Please try again later.

📝 Walkthrough

Walkthrough

Added an offline Python lock provenance validator. It checks exact pins, SHA-256 hashes, generator metadata, and lock paths. It produces deterministic JSON receipts, exposes CLI results, adds contract tests, documents the contract, and publishes receipts in CI.

Changes

Python lock provenance

Layer / File(s) Summary
Lock declaration and generator validation
scripts/ci/python_lock_provenance.py
The validator checks exact requirements, SHA-256 hashes, duplicate declarations, generator metadata, source versions, output paths, and repository containment. It returns per-lock receipts.
Repository receipt and CLI flow
scripts/ci/python_lock_provenance.py
The validator discovers applicable lock files, aggregates deterministic repository receipts, and supports JSON or human-readable CLI output with pass/fail exit codes.
Validation and execution contract tests
backend/tests/test_python_lock_provenance.py
Tests cover validation failures, generator mismatches, repository determinism, path sanitization, CLI behavior, and CI ordering.
CI receipt publication and operator documentation
.github/workflows/app-ci.yml, docs/doctoring/python-lock-provenance-receipt.md
CI runs validation before backend dependency installation and publishes the JSON receipt. Documentation defines the validation boundary, receipt fields, reason codes, and evidence requirements.

Estimated code review effort: 4 (Complex) | ~45 minutes

Merge Risk: 🟠 High · up to 1b991

This PR gates dependency installation on a Python lock-provenance receipt, but the current behavior can omit included requirements from validation, reject valid lock-generation commands, read outside-repository paths, and fail to guarantee validation and receipt handling around installation. That could produce incomplete provenance evidence or expose file content in CI, so the PR should not merge until these issues are fixed.

Sequence Diagram(s)

sequenceDiagram
  participant ApplicationCI
  participant python_lock_provenance.py
  participant GITHUB_STEP_SUMMARY
  ApplicationCI->>python_lock_provenance.py: run --json
  python_lock_provenance.py-->>ApplicationCI: validation receipt and exit status
  ApplicationCI->>GITHUB_STEP_SUMMARY: append formatted JSON receipt
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
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 The title clearly and concisely describes the main change: adding Python lock provenance attestation before dependency installation.
✨ 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 feat/dependency-lock-provenance-receipt

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.

@github-actions

github-actions Bot commented Aug 16, 2026

Copy link
Copy Markdown
Contributor

PR governance metadata gate is not ready for 9ce0b87e9a5920d7e81e19e0a94e372d6eccd148:

  • 11 unresolved current review thread(s) remain.
  • Required check strix is FAILURE on the current head.

@seonghobae
seonghobae marked this pull request as ready for review August 16, 2026 06:23
coderabbitai[bot]

This comment was marked as resolved.

@seonghobae
seonghobae dismissed coderabbitai[bot]’s stale review August 16, 2026 06:47

Dismissed as predecessor-head changes-request evidence: this review was anchored to df3efe5, while the current head is 1b99119. All five published findings are resolved on the current head, including failure-receipt publication, job-scoped CI ordering tests, repository-root path containment, requirements.in parsing, and extras-aware manual pins. This dismissal is not approval; current-head independent approval and all live required gates remain mandatory, and Build/Publish is still in progress.

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

Please review the unchanged current head 1b991190d69e6a8dc028d51b64d92fca319c5f04. Prior inline findings were fixed and their predecessor review was dismissed; validate only this exact head against the live develop base.

@coderabbitai

coderabbitai Bot commented Aug 16, 2026

Copy link
Copy Markdown
Contributor
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

requested_head='1b991190d69e6a8dc028d51b64d92fca319c5f04'

git fetch origin develop --quiet
printf '%s\n' '== Revision verification =='
git rev-parse HEAD
git rev-parse "$requested_head^{commit}"
git merge-base "$requested_head" origin/develop
printf '%s\n' '== Changed files against live develop =='
git diff --name-status "$(git merge-base "$requested_head" origin/develop)" "$requested_head"
printf '%s\n' '== Diff stat =='
git diff --stat "$(git merge-base "$requested_head" origin/develop)" "$requested_head"

printf '%s\n' '== Python validator outline =='
ast-grep outline scripts/ci/python_lock_provenance.py --items all 2>/dev/null || true
printf '%s\n' '== Python test outline =='
ast-grep outline backend/tests/test_python_lock_provenance.py --items all 2>/dev/null || true
printf '%s\n' '== Workflow diff =='
git diff --no-ext-diff --unified=80 "$(git merge-base "$requested_head" origin/develop)" "$requested_head" -- .github/workflows/app-ci.yml

Length of output: 10338


🏁 Script executed:

#!/bin/bash
set -euo pipefail

base='bc98789521d21271e84789888413c182aa111b4d'
head='1b991190d69e6a8dc028d51b64d92fca319c5f04'

printf '%s\n' '== Validator implementation =='
sed -n '1,430p' scripts/ci/python_lock_provenance.py

printf '%s\n' '== Contract tests =='
sed -n '1,440p' backend/tests/test_python_lock_provenance.py

printf '%s\n' '== Active SHA-256 requirements files and headers =='
while IFS= read -r -d '' file; do
  if rg -q -- '--hash=sha256:' "$file"; then
    printf '\n--- %s ---\n' "$file"
    sed -n '1,45p' "$file"
  fi
done < <(fd -0 -t f -e txt -e in -e requirements .)

printf '%s\n' '== Validator and documentation diff =='
git diff --no-ext-diff --unified=100 "$base" "$head" -- \
  scripts/ci/python_lock_provenance.py \
  docs/doctoring/python-lock-provenance-receipt.md

Length of output: 31565


🏁 Script executed:

#!/bin/bash
set -euo pipefail

base='bc98789521d21271e84789888413c182aa111b4d'
head='1b991190d69e6a8dc028d51b64d92fca319c5f04'
candidates="$(mktemp)"
trap 'rm -f "$candidates"' EXIT

fd -t f -e txt -e in -e requirements . > "$candidates"

printf '%s\n' '== Requirements candidates that contain hash evidence =='
while IFS= read -r file; do
  if rg -q -- '--hash=sha256:' "$file"; then
    printf '\n--- %s ---\n' "$file"
    sed -n '1,55p' "$file"
  fi
done < "$candidates"

printf '%s\n' '== Changed documentation =='
sed -n '1,180p' docs/doctoring/python-lock-provenance-receipt.md

printf '%s\n' '== Failure-contract and syntax references =='
rg -n -C 3 --glob 'scripts/ci/python_lock_provenance.py' \
  --glob 'backend/tests/test_python_lock_provenance.py' \
  --glob 'docs/doctoring/python-lock-provenance-receipt.md' \
  'disappear|unread|read_text|PermissionError|FileNotFoundError|same line|inline|continuation|fail-closed|receipt' \
  scripts backend/tests docs/doctoring

printf '%s\n' '== Full changed workflow section =='
git diff --no-ext-diff --unified=30 "$base" "$head" -- .github/workflows/app-ci.yml

Length of output: 56905


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '== Numbered parser and discovery regions =='
nl -ba scripts/ci/python_lock_provenance.py | sed -n '105,175p;325,375p'

printf '%s\n' '== Include syntax in changed contract and documentation =='
rg -n -C 3 --glob 'backend/tests/test_python_lock_provenance.py' \
  --glob 'docs/doctoring/python-lock-provenance-receipt.md' \
  -- '(?:^|[^A-Za-z])(?:-r|--requirement|--constraint|-c)(?:\s|=)' \
  backend/tests/test_python_lock_provenance.py \
  docs/doctoring/python-lock-provenance-receipt.md || true

printf '%s\n' '== Existing include declarations in active requirements files =='
rg -n -C 2 --glob 'requirements*.txt' \
  -- '^\s*(?:-r|--requirement|--constraint|-c)(?:\s|=)' . || true

Length of output: 1123


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '== Parser ignore branch =='
rg -n -C 10 --fixed-strings 'if stripped.startswith("-"):' \
  scripts/ci/python_lock_provenance.py

printf '%s\n' '== Discovery filename restriction =='
rg -n -C 8 --fixed-strings 'repository_root.rglob("requirements*.txt")' \
  scripts/ci/python_lock_provenance.py

printf '%s\n' '== Include syntax in changed contract tests and documentation =='
rg -n -C 3 \
  --glob 'backend/tests/test_python_lock_provenance.py' \
  --glob 'docs/doctoring/python-lock-provenance-receipt.md' \
  -- '(^|[^A-Za-z])(-r|--requirement|--constraint|-c)([[:space:]]|=)' \
  backend/tests/test_python_lock_provenance.py \
  docs/doctoring/python-lock-provenance-receipt.md || true

printf '%s\n' '== Existing include declarations in current requirements files =='
rg -n -C 2 --glob 'requirements*.txt' \
  -- '^[[:space:]]*(-r|--requirement|--constraint|-c)([[:space:]]|=)' . || true

Length of output: 2795


@seonghobae: I reviewed 1b991190d69e6a8dc028d51b64d92fca319c5f04 against the fetched live origin/develop merge base bc98789521d21271e84789888413c182aa111b4d.

I found one issue.

  • [P1] Validate or reject included requirements files. scripts/ci/python_lock_provenance.py ignores every non-hash option line at Lines 145-146. This includes pip -r and --requirement directives. Discovery also only includes files named requirements*.txt at Line 338. A validated lock can therefore add -r backend/generated-lock.txt; pip will install the referenced requirements, but the receipt will not parse, validate, or list that file when its name does not match the discovery pattern. This bypasses the stated coverage of active hash-locked declarations and their provenance. Resolve included files recursively with the same containment checks, or fail with a stable violation code when an include directive is present. Add regression tests for both forms.
✅ 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[bot]

This comment was marked as resolved.

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

Please review the unchanged exact head bb8e34988af133bf28b0c1b657be7f757b66b2c8. Re-evaluate all prior findings against the current implementation; predecessor-head review state is non-passing.

@coderabbitai

coderabbitai Bot commented Aug 16, 2026

Copy link
Copy Markdown
Contributor

Tip

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

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

head='bb8e34988af133bf28b0c1b657be7f757b66b2c8'

git fetch origin develop --quiet
base="$(git merge-base "$head" origin/develop)"

printf '%s\n' '== Revision verification =='
printf 'checked-out HEAD: '; git rev-parse HEAD
printf 'requested head:  '; git rev-parse "$head^{commit}"
printf 'live merge base: '; printf '%s\n' "$base"

printf '%s\n' '== Changed files against live develop =='
git diff --name-status "$base" "$head"

printf '%s\n' '== Validator outline =='
ast-grep outline scripts/ci/python_lock_provenance.py --items all 2>/dev/null || true

printf '%s\n' '== Changed validator, tests, workflow, and documentation =='
git diff --no-ext-diff --unified=90 "$base" "$head" -- \
  scripts/ci/python_lock_provenance.py \
  backend/tests/test_python_lock_provenance.py \
  .github/workflows/app-ci.yml \
  docs/doctoring/python-lock-provenance-receipt.md

printf '%s\n' '== Include parsing and lock discovery references =='
rg -n -C 12 --glob 'scripts/ci/python_lock_provenance.py' \
  --glob 'backend/tests/test_python_lock_provenance.py' \
  -- '(?:requirement|constraint|include|rglob\(|startswith\("-"\)|--hash=sha256:|-r\b|-c\b)' \
  scripts/ci/python_lock_provenance.py backend/tests/test_python_lock_provenance.py || true

printf '%s\n' '== Numbered relevant validator regions =='
nl -ba scripts/ci/python_lock_provenance.py | sed -n '1,460p'

Length of output: 114936


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '== Include test outline =='
ast-grep outline backend/tests/test_python_lock_provenance_includes.py --items all 2>/dev/null || true

printf '%s\n' '== Include regression tests =='
sed -n '1,520p' backend/tests/test_python_lock_provenance_includes.py

printf '%s\n' '== Active requirements files and include directives =='
while IFS= read -r -d '' path; do
  if rg -q -- '--hash=sha256:|^[[:space:]]*(-r|--requirement)([[:space:]=]|$)' "$path"; then
    printf '\n--- %s ---\n' "$path"
    sed -n '1,100p' "$path"
  fi
done < <(fd -0 -t f -e txt -e in -e requirements .)

printf '%s\n' '== CI pip requirements arguments =='
rg -n -C 4 --glob '*.yml' --glob '*.yaml' --glob '*.sh' --glob '*.py' \
  'pip install|--require-hashes|(^|[[:space:]])(-r|--requirement)([[:space:]=]|$)' \
  .github scripts backend connector 2>/dev/null || true

printf '%s\n' '== Focused include validator region =='
sed -n '25,180p;325,465p' scripts/ci/python_lock_provenance.py

printf '%s\n' '== File inventory and diff statistics =='
git diff --stat bc98789521d21271e84789888413c182aa111b4d HEAD
git status --short

Length of output: 9411


🏁 Script executed:

#!/bin/bash
set -euo pipefail

candidates="$(mktemp)"
trap 'rm -f "$candidates"' EXIT
fd -t f -e txt -e in -e requirements . > "$candidates"

printf '%s\n' '== Requirements candidates with hash pins or include directives =='
while IFS= read -r path; do
  if rg -q -- '--hash=sha256:|^[[:space:]]*(-r|--requirement)([[:space:]=]|$)' "$path"; then
    printf '\n--- %s ---\n' "$path"
    sed -n '1,120p' "$path"
  fi
done < "$candidates"

printf '%s\n' '== All current requirements include directives =='
rg -n -C 3 --glob '*.txt' --glob '*.in' --glob '*requirements*' \
  '^[[:space:]]*(-r([[:space:]]*[^[:space:]]+)|--requirement(=|[[:space:]]+)[^[:space:]]+)' \
  . || true

printf '%s\n' '== CI requirements-file consumers =='
rg -n -C 5 --glob '*.yml' --glob '*.yaml' --glob '*.sh' \
  'python -m pip install|pip install|--require-hashes|(^|[[:space:]])(-r|--requirement)([[:space:]=]|$)' \
  .github scripts || true

printf '%s\n' '== Include parser and include tests with line numbers =='
sed -n '30,175p;330,430p' scripts/ci/python_lock_provenance.py | cat -n
sed -n '45,210p' backend/tests/test_python_lock_provenance_includes.py | cat -n

printf '%s\n' '== Changed-file whitespace errors =='
git diff --check bc98789521d21271e84789888413c182aa111b4d HEAD || true

printf '%s\n' '== Tracked changed files at requested revision =='
git diff --name-only bc98789521d21271e84789888413c182aa111b4d HEAD

Length of output: 57426


@seonghobae: I reviewed exact head bb8e34988af133bf28b0c1b657be7f757b66b2c8 against live origin/develop merge base bc98789521d21271e84789888413c182aa111b4d.

I found no new issues.

The prior P1 finding is resolved. The validator now recursively processes -r and --requirement directives. It validates containment, missing targets, cycles, and maximum depth. The include-specific tests cover both directive forms and the failure cases.

Static checks found no active include directives in the current requirements files. git diff --check reported no whitespace errors.

I did not execute repository tests in this environment.

You are interacting with an AI system.

@seonghobae
seonghobae dismissed coderabbitai[bot]’s stale review August 16, 2026 10:34

Superseded by current head bb8e349. Both include-directive findings were addressed test-first in commits 6fdb12d and 65f5a88, the linked review threads are resolved, and this CHANGES_REQUESTED review is anchored to predecessor head 1b99119. Dismissal removes stale predecessor review state only; current-head required checks and independent approval remain mandatory.

Copy link
Copy Markdown
Contributor Author

@opencode-agent @cwl-noema-review

Review only. Re-evaluate unchanged exact head bb8e34988af133bf28b0c1b657be7f757b66b2c8 against current develop@bc98789521d21271e84789888413c182aa111b4d. Predecessor-head findings and reviews are non-passing. Do not update branches, enable auto-merge, merge, or write source. Submit a formal current-head review of the bounded Python lock provenance attestation slice.

@cursor

cursor Bot commented Aug 17, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

@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 4313e2509ea085a8274dc8c750eb291752121bb1.

  • Head SHA: 4313e2509ea085a8274dc8c750eb291752121bb1

  • Workflow run: 32123693472

  • 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: app-ci.yml"]
  S1 --> I1["GitHub Actions review job"]
  I1 --> R1["Review risk: Workflow: app-ci.yml"]
  R1 --> V1["actionlint plus required checks"]
  Evidence --> S2["Backend (2 files)"]
  S2 --> I2["API and service runtime"]
  I2 --> R2["Review risk: Backend (2 files)"]
  R2 --> V2["backend tests"]
  Evidence --> S3["Docs: python-lock-provenance-receipt.md"]
  S3 --> I3["operator or user guidance"]
  I3 --> R3["Review risk: Docs: python-lock-provenance-receipt.md"]
  R3 --> V3["docs review"]
  Evidence --> S4["CI script: python_lock_provenance.py"]
  S4 --> I4["review and security gate shell path"]
  I4 --> R4["Review risk: CI script: python_lock_provenance.py"]
  R4 --> V4["bash -n plus Strix self-test"]
Loading

@opencode-agent

Copy link
Copy Markdown
Contributor

OpenCode Review Overview

  • Head SHA: 4313e2509ea085a8274dc8c750eb291752121bb1
  • Workflow run: 32123693472
  • Workflow attempt: 1
  • Gate result: REQUEST_CHANGES (approval step)

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 4313e2509ea085a8274dc8c750eb291752121bb1.

  • Head SHA: 4313e2509ea085a8274dc8c750eb291752121bb1

  • Workflow run: 32123693472

  • 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: app-ci.yml"]
  S1 --> I1["GitHub Actions review job"]
  I1 --> R1["Review risk: Workflow: app-ci.yml"]
  R1 --> V1["actionlint plus required checks"]
  Evidence --> S2["Backend (2 files)"]
  S2 --> I2["API and service runtime"]
  I2 --> R2["Review risk: Backend (2 files)"]
  R2 --> V2["backend tests"]
  Evidence --> S3["Docs: python-lock-provenance-receipt.md"]
  S3 --> I3["operator or user guidance"]
  I3 --> R3["Review risk: Docs: python-lock-provenance-receipt.md"]
  R3 --> V3["docs review"]
  Evidence --> S4["CI script: python_lock_provenance.py"]
  S4 --> I4["review and security gate shell path"]
  I4 --> R4["Review risk: CI script: python_lock_provenance.py"]
  R4 --> V4["bash -n plus Strix self-test"]
Loading

devin-ai-integration[bot]

This comment was marked as resolved.

@seonghobae

seonghobae commented Aug 20, 2026

Copy link
Copy Markdown
Contributor Author

Current-head supply-chain fix pushed at 23a548b7f0c78f2e4a8ed5700c2a69c08effb138. discover_hash_locks now skips directories and broken links named like requirements files instead of crashing; regression covers both candidates. Focused provenance suite: 21 passed; Ruff and git diff --check passed. Hosted Checks and current-head review evidence remain authoritative.

devin-ai-integration[bot]

This comment was marked as resolved.

@seonghobae

Copy link
Copy Markdown
Contributor Author

The actionable authentication finding from the prior Strix run is now fixed in the stacked auth PR #1415 at current head ada12ff2, with HMAC/OIDC regression coverage. The unrelated Dependabot/CVE output was not source-backed (synthetic identifiers and locations outside the PR surface); re-run Strix after the current auth fix and central gate update.

@seonghobae
seonghobae enabled auto-merge (squash) August 20, 2026 19:50
@opencode-agent
opencode-agent Bot disabled auto-merge August 20, 2026 21:47
@seonghobae
seonghobae enabled auto-merge (squash) August 20, 2026 23:41
@seonghobae
seonghobae force-pushed the feat/dependency-lock-provenance-receipt branch from 23a548b to f6eeb69 Compare August 21, 2026 02:09
@seonghobae
seonghobae dismissed opencode-agent[bot]’s stale review August 22, 2026 07:42

Stale review: cited a coverage-evidence/required-check failure on an earlier commit; current head has been verified (gh pr checks) to pass coverage-evidence and all other non-metadata-gate required checks, with no current-head review from this reviewer. Dismissing as superseded per AGENTS.md stale-review guidance.

@opencode-agent opencode-agent Bot added area: ci-cd CI, GitHub Actions, checks, release, or supply chain priority: medium Normal-priority or P2 work status: blocked Blocked by conflict, dependency, or required prerequisite type: feature New or expanded product capability labels Aug 22, 2026
@coderabbitai

coderabbitai Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

An error occurred during the review process. Please try again later.


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

coderabbitai Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Important

Approval pending

CodeRabbit has no unresolved comments, but it has not reviewed the latest commit.

Use the checkbox below to review the latest commit. CodeRabbit will approve the changes if it finds no blocking issues.

  • 🔍 Trigger review
🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
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 The title clearly and concisely describes the primary change: adding Python lock provenance attestation before dependency installation.

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 added a commit that referenced this pull request Aug 25, 2026
…egistry-hash verification

Reconcile feat/python-lock-registry-provenance with the advanced base
branch feat/dependency-lock-provenance-receipt (#1369 side):
- scripts/ci/python_lock_provenance.py + tests: take base evolution
  (inline source-comment pin binding, non-file lock candidate skip)
- .github/workflows/app-ci.yml: union keeping both offline provenance
  and new PyPI release hash provenance steps before dependency install
* test(supply-chain): add RED lock provenance contracts

* feat(supply-chain): implement offline Python lock provenance receipt

* ci(supply-chain): publish Python lock provenance receipt

* test(supply-chain): harden lock provenance branch coverage

* fix(supply-chain): fail closed on incomplete lock generators

* docs(supply-chain): record Python lock provenance evidence boundary

* fix(supply-chain): fail closed when lock hashes disappear

* test(supply-chain): cover provenance review regressions

* fix(supply-chain): contain lock provenance reads

* fix(ci): publish failed lock provenance receipts

* docs(supply-chain): document contained provenance reads

* test(supply-chain): specify registry hash provenance contract

* feat(supply-chain): validate locked hashes against PyPI releases

* ci(supply-chain): verify PyPI hashes before install

* docs(supply-chain): record PyPI hash provenance boundary

* test(supply-chain): cover PyPI provenance failure boundaries

* test(supply-chain): reject PyPI metadata origin redirects

* fix(supply-chain): keep PyPI metadata reads on trusted origin

* test(supply-chain): keep registry edge suite lint-clean

* test(supply-chain): reject vacuous PyPI provenance receipts

* fix(supply-chain): require non-vacuous registry evidence

* test(supply-chain): expose recursive requirements include bypass

* fix(supply-chain): validate recursive requirements includes

* docs(supply-chain): record recursive include boundary

* fix(ci): reject unvalidated PyPI redirects

* fix(http): reject explicit zero loopback ports (#1337)

* fix(http): reject explicit zero loopback ports

* test(security): lock OIDC hostname boundary

* test(security): preserve subdomain validation contracts

* docs(security): record local HTTP port validation boundary

* style: format local HTTP validation tests

---------

Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com>

---------

Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com>

@devin-ai-integration devin-ai-integration 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.

Devin Review found 11 new potential issues.

Open in Devin Review

Comment thread .github/workflows/app-ci.yml
Comment thread scripts/ci/python_lock_provenance.py
Comment thread scripts/ci/python_lock_provenance.py Outdated
Comment thread scripts/ci/python_lock_provenance.py Outdated
Comment thread scripts/ci/python_lock_provenance.py Outdated
Comment thread scripts/ci/python_lock_provenance.py Outdated
Comment thread scripts/ci/python_lock_provenance.py
Comment thread scripts/ci/python_lock_provenance.py
Comment thread scripts/ci/python_lock_provenance.py
Comment thread .github/workflows/app-ci.yml
@opencode-agent
opencode-agent Bot disabled auto-merge August 25, 2026 00:51

@devin-ai-integration devin-ai-integration 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.

Devin Review found 1 new potential issue.

Open in Devin Review

Comment thread scripts/ci/python_lock_provenance.py Outdated
@seonghobae
seonghobae marked this pull request as draft September 5, 2026 01:13
@seonghobae

Copy link
Copy Markdown
Contributor Author

Non-force restack evidence for exact head 40a2845fcf2799c873a94c9a9320cbc4e38e8c14: current develop@042b0c70531b229af3acbd0421a2f23098d848b3 merged without conflict. The effective delta remains the combined 11-file offline/PyPI provenance lane. Merged #1370 commit cd7241798e347ee4b14a2b9812dd69eb719a1b58 is a verified ancestor, correcting the stale body claim. Clean verification: 51 passed; Ruff, actionlint, diff check passed; both real repository receipts covered 5 locks and returned passed with zero violations. Fresh hosted checks/review are required; Draft preserved.

@seonghobae seonghobae added the enhancement New feature or request label Sep 7, 2026 — with ChatGPT Codex Connector
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: ci-cd CI, GitHub Actions, checks, release, or supply chain enhancement New feature or request priority: medium Normal-priority or P2 work status: blocked Blocked by conflict, dependency, or required prerequisite type: feature New or expanded product capability

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant