Skip to content

fix(ci): harden hourly GitHub API gate - #74

Open
seonghobae wants to merge 12 commits into
mainfrom
fix/hourly-github-api-egress-gate
Open

fix(ci): harden hourly GitHub API gate#74
seonghobae wants to merge 12 commits into
mainfrom
fix/hourly-github-api-egress-gate

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

Incident

Protected-main Hourly product development reproduced a fail-closed Harden Runner egress defect: the GitHub API inventory call was blocked, but the gate converted that infrastructure failure into a warning plus exit 0, so the workflow reported success while all development/reverification/publication work was skipped.

A same-class protected-main ThreadWeave failure proved a second runtime boundary: newline-literal Harden Runner allowed-endpoints can reach the installed agent as a malformed endpoint map with the GitHub API port collapsed to 0. Endpoint membership alone is therefore insufficient; the serialized scalar must remain runtime-safe.

Further exact-source RCA found three latent operational gaps that previous green checks did not cover: the 45-minute outer job could not accommodate three sequential 35-minute model fallbacks; the post-model packaging step rematerialized the raw NVIDIA secret even though the model only receives a loopback placeholder; and default-main check evidence treated neutral/skipped conclusions as healthy.

Repair

  • keep all three GitHub-API phases on egress-policy: block;
  • retain only the exact reviewed endpoint sets, including the evidenced cafe.github.com:443 alias alongside api.github.com:443;
  • serialize every Harden Runner endpoint set with folded >- so the action receives one space-delimited scalar without losing ports;
  • run open-PR, exact-default-main, protected workflow/check evidence, and dry-run decisions before any NVIDIA credential requirement;
  • make GitHub API transport failures and malformed response shapes visibly fail rather than report false green;
  • preserve safe exit 0 only for explicitly missing/unhealthy protected-main evidence;
  • require exact success for default-main check evidence rather than accepting neutral or skipped;
  • keep NVIDIA_NIM_API_KEY materialization exclusively in the conditional loopback broker step and remove raw-secret materialization from credential-free packaging;
  • give the three sequential 35-minute model candidates a realistic 180-minute outer job budget, with an explicit regression proving candidate budget plus setup/packaging reserve fits;
  • preserve the loopback NIM broker, pristine retry workspaces, immutable OpenCode/action pins, publication boundary, and existing review-agent credential chains.

Test-first and verification evidence

RED commit 3a274ab95bc98690689466d31dbd54e2717bde9a introduced the original incident contracts. RED commit da5c8a5722e7e75de3fb82b486a0c1e087c2fb02 added the runtime delimiter regression. RED commit d6eea5e47a8d7ac0f6f0f3fce3991c6fd1ed096d added explicit contracts for success-only default-main check evidence, end-to-end fallback schedulability, and single-step NVIDIA secret materialization before the production repair.

The production repair landed in 35975b79feef5bd6714013ae38bd584b4d9e18c8. CI then exposed two stale test assumptions (the old 45-minute deadline and deliberate post-model secret rematerialization); 2b572dd20c45e91853bdb9c20ba4f7b2bc6c625c aligned those tests with the stricter runtime boundary without weakening the new incident contracts.

Exact current head: 2b572dd20c45e91853bdb9c20ba4f7b2bc6c625c against protected base c8968ec1e68fab16d0ad8216fb5c8fd0b385e95f.

Exact-head hosted evidence:

  • ci run 31265082573: success; locked install, Ruff, 100% docstring gate, complete pytest/100% production statement+branch coverage, realm/template validation and compose validation passed;
  • CodeQL run 31265082570: success;
  • SAST Semgrep run 31265082568: success;
  • Security Scan run 31265082593: success;
  • exact-head CodeRabbit commit status: success, while the current incremental CodeRabbit review itself is rate-limited and is not treated as formal approval;
  • both historical actionable CodeRabbit inline threads are resolved; unresolved inline review threads: zero at the latest refetch.

The prior OpenCode REQUEST_CHANGES review is explicitly anchored to predecessor head f24d4b46e344f0f2c375c65fafcb3d9410284fa2 and its failed review-workflow coverage evidence. A fresh exact-head review is required before this PR can be classified clean.

Safety boundaries

No COPILOT_GITHUB_TOKEN, no guessed credential, no widened egress policy, no temporary write-capable/self-modifying repair workflow, no review-agent identity/key-chain change, and no branch-protection bypass.

Closure criteria

Do not merge unless the exact current head still has successful required checks, zero unresolved valid findings, and a qualifying independent non-author formal APPROVE under the automation governance policy. Merge alone is not operational closure: after protected-main merge, an actual scheduled/manual Hourly product development run must prove the GitHub API inventory gate works and either stops for the correct deterministic reason or reaches the bounded OpenCode/NVIDIA path.

@coderabbitai

coderabbitai Bot commented Aug 8, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

시간별 제품 개발 워크플로에 cafe.github.com:443 egress를 추가했습니다. GitHub 인벤토리와 저장소 증거 조회는 오류 발생 시 실패합니다. NVIDIA_NIM_API_KEY는 모델 개발 경로에서만 필수입니다. 회귀 테스트를 추가했습니다.

Changes

시간별 제품 개발 워크플로

Layer / File(s) Summary
Harden Runner egress 계약 및 검증
.github/workflows/hourly-product-development.yml, services/account_unification/tests/test_hourly_product_incident_contract.py
세 작업의 허용 목록에 cafe.github.com:443를 추가했습니다. GitHub API endpoint와 공백 구분 런타임 입력을 검증하는 테스트를 추가했습니다.
결정적 저장소 게이트와 실패 처리
.github/workflows/hourly-product-development.yml, services/account_unification/tests/test_hourly_product_incident_contract.py
PR, 기본 브랜치 HEAD, 워크플로 실행 증거 및 검사 증거의 조회·해석 오류가 exit 1로 처리되도록 변경했습니다. 결정적 게이트가 모델 자격 증명보다 먼저 실행되는지 검증합니다.
모델 경로 자격 증명 범위
.github/workflows/hourly-product-development.yml, services/account_unification/tests/test_hourly_product_development.py, services/account_unification/tests/test_hourly_product_incident_contract.py
dry run 메시지를 갱신했습니다. 모델 개발 단계에서만 NVIDIA_NIM_API_KEY를 요구하고, 누락 시 실패하도록 변경했습니다.

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

Possibly related issues

  • ContextualWisdomLab/ThreadWeave#22: 동일한 cafe.github.com:443 허용 목록과 GitHub API fail-closed 검증 목표를 다룹니다.
  • ContextualWisdomLab/keyverse#73: 동일한 워크플로의 게이트 순서, fail-closed 검사, NVIDIA 자격 증명 범위 변경을 직접 다룹니다.
  • ContextualWisdomLab/RankWeave#37: credential-first NVIDIA 검증과 결정적 게이트 순서 목표가 일치합니다.
  • ContextualWisdomLab/EgressWeave#65: 워크플로의 egress 및 검증 경계를 함께 변경하는 목표가 관련됩니다.
🚥 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 제목은 시간별 GitHub API 게이트를 강화하는 주요 변경 사항을 간결하고 정확하게 설명합니다.
✨ 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 fix/hourly-github-api-egress-gate

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

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

Review exact current head d1802174f73b5b2a3b7f8511e7816c8763d01ec0 against protected base c8968ec1e68fab16d0ad8216fb5c8fd0b385e95f. Verify the fail-closed Harden Runner endpoint sets, deterministic repository gates before NVIDIA model credentials, non-successful GitHub inventory transport failures, model-path-only NVIDIA credential requirement, and the adversarial incident contracts. Do not infer success from predecessor heads.

Copy link
Copy Markdown
Contributor Author

@opencode-agent @cwl-noema-review

Review-only request for exact current head d1802174f73b5b2a3b7f8511e7816c8763d01ec0 against protected base c8968ec1e68fab16d0ad8216fb5c8fd0b385e95f. Do not mutate the branch or merge. Independently verify that all three GitHub-API-using Harden Runner jobs remain egress-policy: block with exact reviewed endpoint sets including only the evidenced cafe.github.com:443 alias, deterministic open-PR/default-main/release-evidence/dry-run gates run before any NVIDIA credential requirement, GitHub inventory transport failures cannot false-green, NVIDIA_NIM_API_KEY is required only on the model-backed broker path, existing review-agent credential chains are unchanged, exact-head CI/CodeQL/SAST/Security Scan succeed, and no unresolved valid review finding remains. Submit a formal non-author GitHub APPROVE review only if this exact head is clean.

@coderabbitai

coderabbitai Bot commented Aug 8, 2026

Copy link
Copy Markdown
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

base='c8968ec1e68fab16d0ad8216fb5c8fd0b385e95f'
head='d1802174f73b5b2a3b7f8511e7816c8763d01ec0'

echo '== Commit identity =='
git show -s --format='BASE %H%n%P%n%s%n%ad' --date=iso-strict "$base"
git show -s --format='HEAD %H%n%P%n%s%n%ad' --date=iso-strict "$head"
echo
echo '== Base is ancestor of head =='
git merge-base --is-ancestor "$base" "$head" && echo yes
echo
echo '== Name-status diff =='
git diff --name-status "$base" "$head"
echo
echo '== Changed paths =='
git diff --name-only "$base" "$head"
echo
echo '== Outlines for changed workflow/test-like files =='
while IFS= read -r f; do
  case "$f" in
    *.yml|*.yaml|*.sh|*.bats|*.test.*|*test*|*spec*)
      echo "--- $f ---"
      if [[ "$f" == *.yml || "$f" == *.yaml ]]; then
        ast-grep outline "$f" --items all 2>/dev/null || true
      else
        rg -n '(^[[:space:]]*(describe|it|test|function)[[:space:]]|\b(NVIDIA_NIM_API_KEY|cafe\.github\.com|api\.github\.com|egress-policy|exit[[:space:]]+[0-9]+|gh[[:space:]]+api)\b)' "$f" || true
      fi
    ;;
  esac
done < <(git diff --name-only "$base" "$head")

Length of output: 2383


🏁 Script executed:

#!/bin/bash
set -euo pipefail

base='c8968ec1e68fab16d0ad8216fb5c8fd0b385e95f'
head='d1802174f73b5b2a3b7f8511e7816c8763d01ec0'
workflow='.github/workflows/hourly-product-development.yml'
development_test='services/account_unification/tests/test_hourly_product_development.py'
incident_test='services/account_unification/tests/test_hourly_product_incident_contract.py'

echo '== Workflow outline at exact head =='
ast-grep outline "$workflow" --items all 2>/dev/null || true

echo '== Python test outlines at exact head =='
ast-grep outline "$development_test" --lang python --items all 2>/dev/null || true
ast-grep outline "$incident_test" --lang python --items all 2>/dev/null || true

echo '== Exact base-to-head diff =='
git diff --no-ext-diff --unified=80 "$base" "$head" -- \
  "$workflow" "$development_test" "$incident_test"

echo '== Exact workflow at head, numbered =='
git show "$head:$workflow" | nl -ba

echo '== Incident contract test at head, numbered =='
git show "$head:$incident_test" | nl -ba

echo '== Development test at head, numbered =='
git show "$head:$development_test" | nl -ba

Length of output: 54048


🏁 Script executed:

#!/bin/bash
set -euo pipefail

head='d1802174f73b5b2a3b7f8511e7816c8763d01ec0'
workflow='.github/workflows/hourly-product-development.yml'

echo '== GitHub API calls and enclosing workflow context at exact head =='
git show "$head:$workflow" > /tmp/hourly-product-development.yml
grep -n -E -C 12 '(^[[:space:]]+gh api|[[:space:]]gh api[[:space:]]|Harden runner|Harden independent verification|Harden publication|allowed-endpoints:|cafe\.github\.com:443|NIM_UPSTREAM_API_KEY|NVIDIA_NIM_API_KEY|DRY_RUN)' \
  /tmp/hourly-product-development.yml

echo
echo '== Job / endpoint correspondence =='
python3 - <<'PY'
from pathlib import Path
import yaml

document = yaml.safe_load(Path("/tmp/hourly-product-development.yml").read_text())
for job_name, job in document["jobs"].items():
    steps = job.get("steps", [])
    gh_steps = [
        step for step in steps
        if isinstance(step, dict) and "gh api" in str(step.get("run", ""))
    ]
    if not gh_steps:
        continue
    harden = next(
        (
            step for step in steps
            if isinstance(step, dict)
            and str(step.get("uses", "")).startswith("step-security/harden-runner@")
        ),
        None,
    )
    endpoints = tuple(
        line.strip()
        for line in str(harden.get("with", {}).get("allowed-endpoints", "")).splitlines()
        if line.strip()
    ) if harden else ()
    print(f"{job_name}: gh-api-steps={len(gh_steps)}")
    print(f"  api.github.com:443={'api.github.com:443' in endpoints}")
    print(f"  cafe.github.com:443={'cafe.github.com:443' in endpoints}")
PY

echo
echo '== Workflow syntax / whitespace checks for exact diff =='
git diff --check c8968ec1e68fab16d0ad8216fb5c8fd0b385e95f "$head"

echo
echo '== Pull request and check state =='
gh pr view 74 --repo ContextualWisdomLab/keyverse \
  --json number,url,headRefOid,baseRefOid,mergeStateStatus,reviews,statusCheckRollup
echo
gh api "repos/ContextualWisdomLab/keyverse/commits/$head/check-runs?per_page=100" \
  --paginate --slurp \
  --jq '[.[].check_runs[] | {name, status, conclusion, details_url}]'

Length of output: 17144


🏁 Script executed:

#!/bin/bash
set -euo pipefail

head='d1802174f73b5b2a3b7f8511e7816c8763d01ec0'
workflow='.github/workflows/hourly-product-development.yml'
git show "$head:$workflow" > /tmp/hourly-product-development.yml

echo '== Every job containing gh api and its exact GitHub endpoints =='
awk '
  /^  [A-Za-z0-9_-]+:$/ {
    if (job != "" && has_gh) {
      printf "%s|gh_api=yes|api=%s|cafe=%s\n", job, api, cafe
    }
    job=$1; sub(/:$/, "", job)
    has_gh=0; api=0; cafe=0
  }
  /gh api/ { has_gh=1 }
  /^[[:space:]]*api\.github\.com:443[[:space:]]*$/ { api=1 }
  /^[[:space:]]*cafe\.github\.com:443[[:space:]]*$/ { cafe=1 }
  END {
    if (job != "" && has_gh) {
      printf "%s|gh_api=yes|api=%s|cafe=%s\n", job, api, cafe
    }
  }
' /tmp/hourly-product-development.yml

echo
echo '== Exact endpoint lists for GitHub API jobs =='
awk '
  /^  [A-Za-z0-9_-]+:$/ {
    job=$1; sub(/:$/, "", job)
    in_endpoints=0
  }
  /^[[:space:]]*allowed-endpoints: \|[[:space:]]*$/ {
    in_endpoints=1
    next
  }
  in_endpoints && /^[[:space:]]{12}[[:graph:]].*:443[[:space:]]*$/ {
    print job "|" $1
    next
  }
  in_endpoints && !/^[[:space:]]*$/ {
    in_endpoints=0
  }
' /tmp/hourly-product-development.yml

echo
echo '== Credential references before broker step =='
awk '
  /name: Start the loopback-only NIM credential broker/ { exit }
  /NVIDIA_NIM_API_KEY|NIM_UPSTREAM_API_KEY/ { print NR ":" $0 }
' /tmp/hourly-product-development.yml

echo
echo '== Exact-head PR metadata, review state, and checks =='
gh pr view 74 --repo ContextualWisdomLab/keyverse \
  --json number,url,headRefOid,baseRefOid,mergeStateStatus,reviews,statusCheckRollup
echo
gh api "repos/ContextualWisdomLab/keyverse/commits/$head/check-runs?per_page=100" \
  --paginate --slurp \
  --jq '[.[].check_runs[] | {name, status, conclusion, details_url}]'

Length of output: 14767


@seonghobae Reviewed exact head d1802174f73b5b2a3b7f8511e7816c8763d01ec0 against protected base c8968ec1e68fab16d0ad8216fb5c8fd0b385e95f.

I found no code-level issues in the requested scope.

Verified:

  • All jobs that use gh api have Harden Runner egress-policy: block and include both api.github.com:443 and cafe.github.com:443.
  • The incident contract requires exact endpoint lists. It rejects added endpoints and broadened wildcard or suffix variants.
  • The develop gate evaluates open PR state, default-branch SHA, workflow evidence, check evidence, and dry-run status before it enables the model path.
  • GitHub inventory transport and response-shape failures in the develop gate use exit 1. They no longer return success.
  • NVIDIA_NIM_API_KEY is only read by the conditional NIM broker step. The broker runs only after develop=true.
  • The incident-contract test is included in the successful account-unification-tests check.

The PR is not ready for merge under the stated closure criteria:

  • strix is still IN_PROGRESS.
  • No independent approval is recorded.
  • The post-merge scheduled or manual hourly-run evidence is not yet available.
⚠️ 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.

@seonghobae
seonghobae marked this pull request as ready for review August 8, 2026 10:11

@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: 2

🧹 Nitpick comments (1)
services/account_unification/tests/test_hourly_product_development.py (1)

148-151: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

자격 증명 범위를 실제로 검증하도록 테스트를 강화하세요.

Line 151은 오류 문구의 존재만 확인합니다. 이 검사는 NVIDIA_NIM_API_KEY가 결정적 게이트 전에 읽히거나 검증되는 회귀를 탐지하지 못합니다. 테스트에서 NIM 단계의 if: steps.gate.outputs.develop == 'true' 조건과 secrets.NVIDIA_NIM_API_KEY 바인딩을 함께 확인하세요. 가능하면 단순 문자열 검색 대신 해당 YAML 단계 블록을 검증하세요.

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

In `@services/account_unification/tests/test_hourly_product_development.py` around
lines 148 - 151, 테스트의 오류 문구 존재 확인을 강화해, _workflow_source()의 YAML에서 NIM 단계가 `if:
steps.gate.outputs.develop == 'true'` 조건으로 보호되는지와 `secrets.NVIDIA_NIM_API_KEY`가
해당 단계에 바인딩되는지를 함께 검증하세요. 가능하면 전체 문자열 검색 대신 해당 YAML 단계 블록을 파싱하거나 추출해 두 조건이 같은 단계에
있는지 확인하십시오.
🤖 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 @.github/workflows/hourly-product-development.yml:
- Line 58: Update all three allowed-endpoints declarations in the workflow to
use the folded, strip-chomping scalar syntax >- instead of the literal | syntax,
preserving the existing endpoint order and values.
- Around line 136-137: Update the GitHub inventory parsing flow around the
Python parser and its `if ! python3 ...` branch so unsupported response shapes
and JSON parsing errors return a distinct nonzero status, which the shell
reports with `::error::` and propagates via `exit 1`. Preserve the existing safe
skip (`exit 0`) only for missing or unhealthy evidence, and extend
`test_github_inventory_transport_failures_are_not_false_green` to verify the
malformed-response failure path.

---

Nitpick comments:
In `@services/account_unification/tests/test_hourly_product_development.py`:
- Around line 148-151: 테스트의 오류 문구 존재 확인을 강화해, _workflow_source()의 YAML에서 NIM 단계가
`if: steps.gate.outputs.develop == 'true'` 조건으로 보호되는지와
`secrets.NVIDIA_NIM_API_KEY`가 해당 단계에 바인딩되는지를 함께 검증하세요. 가능하면 전체 문자열 검색 대신 해당 YAML
단계 블록을 파싱하거나 추출해 두 조건이 같은 단계에 있는지 확인하십시오.
🪄 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: b508fc9e-ea2c-4ca4-873c-c5a9743193cd

📥 Commits

Reviewing files that changed from the base of the PR and between c8968ec and da5c8a5.

📒 Files selected for processing (3)
  • .github/workflows/hourly-product-development.yml
  • services/account_unification/tests/test_hourly_product_development.py
  • services/account_unification/tests/test_hourly_product_incident_contract.py

Comment thread .github/workflows/hourly-product-development.yml
Comment thread .github/workflows/hourly-product-development.yml

Copy link
Copy Markdown
Contributor Author

@opencode-agent @cwl-noema-review

Review-only request for exact current head f24d4b46e344f0f2c375c65fafcb3d9410284fa2 against protected base c8968ec1e68fab16d0ad8216fb5c8fd0b385e95f. Do not mutate the branch or merge. Independently verify the three fail-closed Harden Runner phases use folded, space-delimited allowed-endpoints with the exact reviewed endpoint sets including the observed cafe.github.com:443 alias; GitHub inventory transport and malformed-response failures terminate non-successfully while missing/unhealthy protected-main evidence only causes the documented safe skip; open-PR/default-main/evidence/dry-run gates precede any NVIDIA credential requirement; NVIDIA_NIM_API_KEY is bound only to the model-backed broker step; review-agent credential chains are unchanged; and exact-head CI, CodeQL, SAST Semgrep, and Security Scan are successful with no unresolved valid review threads. Submit a formal non-author GitHub APPROVE review only if this exact head satisfies repository policy.

Copy link
Copy Markdown
Contributor Author

@opencode-agent @cwl-noema-review

Review-only request for exact current head f24d4b46e344f0f2c375c65fafcb3d9410284fa2 against protected base c8968ec1e68fab16d0ad8216fb5c8fd0b385e95f. Do not mutate the branch or merge. Independently verify the fail-closed Harden Runner endpoint serialization and exact reviewed GitHub API endpoints, deterministic open-PR/default-main/evidence/dry-run gates before model credentials, fail-visible GitHub inventory transport/malformed-shape handling, model-path-only NVIDIA_NIM_API_KEY binding, exact-head CI/CodeQL/SAST/Security evidence, and zero unresolved valid findings. This request is advisory review evidence only and does not substitute for the separate counted independent human approval gate.

Copy link
Copy Markdown
Contributor Author

Fleet-incident RCA handoff for exact unchanged head f24d4b46e344f0f2c375c65fafcb3d9410284fa2 / base c8968ec1e68fab16d0ad8216fb5c8fd0b385e95f: live source disproves the current claim that the remaining blocker is only independent approval. Three same-class operational defects remain and should block merge before any approval-path classification.

  1. Raw model credential is rematerialized after model execution. Capture the bounded credential-free patch binds KEYVERSE_FORBIDDEN_SECRET: ${{ secrets.NVIDIA_NIM_API_KEY }} after the broker/model steps. The step is described as credential-free but receives the raw upstream key only to detect leakage. Immediate cause: leak detection is coupled to the raw secret. Systemic cause: the credential boundary is tested around the deterministic gate/broker but not around post-model validation. A safer proven pattern is to derive a runner-owned one-way fingerprint while the credential is already authorized, delete the raw credential with the broker, and let post-model validation receive only the fingerprint metadata; do not weaken leak detection.

  2. The advertised fallback sequence is unschedulable. develop-product-gap has timeout-minutes: 45, OPENCODE_RUN_TIMEOUT_SECONDS: "2100" (35 minutes), and three sequential candidates. Worst-case model budget is 105 minutes before setup/package time. One timeout can consume most of the outer job, so later fallbacks and independent packaging cannot reliably run. Add a test-first schedulability invariant covering candidate count × per-attempt bound + reserved setup/verification budget, then either enlarge the outer budget or reduce the bounded attempts/candidate pool. Keep the per-attempt disposable workspace reset.

  3. Default-main check evidence can false-green skipped/neutral. The check parser currently uses accepted = {"success", "neutral", "skipped"} for all latest checks without first proving which are optional. That can treat a required skipped/neutral security or policy check as healthy. Required evidence must be explicitly classified and require completed/success; optional neutral/skipped checks may be handled only after proving they are non-required.

Detection/control failure across all three: exact-head CI/security status is green because current workflow contracts cover endpoint serialization, transport/malformed evidence, and gate ordering, but not post-model secret authority, end-to-end runtime schedulability, or required-vs-optional check conclusions.

Please repair these test-first under the existing Keyverse owner lease, one causal layer at a time; rerun focused/full exact-head CI, CodeQL, SAST, Security, review threads, and formal reviews after the final head. Do not merge or request another same-head review while these internal gates remain unclean.

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

  • Head SHA: f24d4b46e344f0f2c375c65fafcb3d9410284fa2

  • Workflow run: 31264416890

  • 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: hourly-product-development.yml"]
  S1 --> I1["GitHub Actions review job"]
  I1 --> R1["Review risk: Workflow: hourly-product-development.yml"]
  R1 --> V1["actionlint plus required checks"]
  Evidence --> S2["Test (2 files)"]
  S2 --> I2["regression suite"]
  I2 --> R2["Review risk: Test (2 files)"]
  R2 --> V2["targeted test run"]
Loading

@opencode-agent

opencode-agent Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

OpenCode Review Overview

  • Head SHA: 2b572dd20c45e91853bdb9c20ba4f7b2bc6c625c
  • Workflow run: 31266938607
  • 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 2b572dd20c45e91853bdb9c20ba4f7b2bc6c625c.

  • Head SHA: 2b572dd20c45e91853bdb9c20ba4f7b2bc6c625c

  • Workflow run: 31266938607

  • 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: hourly-product-development.yml"]
  S1 --> I1["GitHub Actions review job"]
  I1 --> R1["Review risk: Workflow: hourly-product-development.yml"]
  R1 --> V1["actionlint plus required checks"]
  Evidence --> S2["Test (2 files)"]
  S2 --> I2["regression suite"]
  I2 --> R2["Review risk: Test (2 files)"]
  R2 --> V2["targeted test run"]
Loading

Copy link
Copy Markdown
Contributor Author

@opencode-agent @cwl-noema-review

Review-only request for exact current head 2b572dd20c45e91853bdb9c20ba4f7b2bc6c625c against protected base c8968ec1e68fab16d0ad8216fb5c8fd0b385e95f. Do not mutate the branch or merge. Re-evaluate the predecessor-head REQUEST_CHANGES rather than carrying it forward mechanically. Verify the three fail-closed Harden Runner jobs keep folded, space-delimited exact endpoint sets; GitHub inventory transport/malformed-shape failures cannot false-green; default-main check evidence accepts only success; deterministic open-PR/default-main/evidence/dry-run gates precede model credentials; raw NVIDIA_NIM_API_KEY is materialized only by the conditional loopback broker and never by credential-free packaging or the model child; the sequential three-model fallback budget fits the 180-minute outer job with reserve; retry workspaces remain pristine; and exact-head CI 31265082573, CodeQL 31265082570, SAST 31265082568, and Security Scan 31265082593 are successful with zero unresolved valid review threads. Submit a formal non-author GitHub review for this exact head. Do not treat advisory status/check evidence as approval.

@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 2b572dd20c45e91853bdb9c20ba4f7b2bc6c625c.

  • Head SHA: 2b572dd20c45e91853bdb9c20ba4f7b2bc6c625c

  • Workflow run: 31266938607

  • 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: hourly-product-development.yml"]
  S1 --> I1["GitHub Actions review job"]
  I1 --> R1["Review risk: Workflow: hourly-product-development.yml"]
  R1 --> V1["actionlint plus required checks"]
  Evidence --> S2["Test (2 files)"]
  S2 --> I2["regression suite"]
  I2 --> R2["Review risk: Test (2 files)"]
  R2 --> V2["targeted test run"]
Loading

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant