Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
101 commits
Select commit Hold shift + click to select a range
9c02e28
fix(coverage): materialize trusted uv lock dependencies
seonghobae Aug 4, 2026
59beb4b
fix(security): make trusted uv download URL statically provable
seonghobae Aug 4, 2026
e57ef51
test(security): pin the trusted uv URL sink contract
seonghobae Aug 4, 2026
635bd7d
test(security): parse the trusted uv URL contract without code execution
seonghobae Aug 4, 2026
2f6300c
test(coverage): require per-dependency hashes from uv export
seonghobae Aug 4, 2026
59ad185
fix(coverage): require hashes on every uv export requirement
seonghobae Aug 4, 2026
4a7a01d
docs(doctoring): record trusted uv materialization evidence
seonghobae Aug 4, 2026
7a2528e
test(coverage): require isolated strict uv export
seonghobae Aug 4, 2026
ddd9d8e
fix(coverage): isolate and strictly validate uv export
seonghobae Aug 4, 2026
229711d
docs(doctoring): record isolated uv export boundary
seonghobae Aug 4, 2026
15c97c8
test(coverage): fail closed on tracked uv metadata read errors
seonghobae Aug 4, 2026
7e66e5a
fix(coverage): distinguish orphan uv locks from Git read failures
seonghobae Aug 4, 2026
2ef7a36
docs(doctoring): distinguish orphan metadata from read failure
seonghobae Aug 4, 2026
3ff45c4
test(security): reject uv redirects before follow
seonghobae Aug 4, 2026
41afe7b
test(coverage): enforce uv origin port and branch evidence
seonghobae Aug 4, 2026
8ffc9cc
test(coverage): measure branch coverage at the 100 percent gate
seonghobae Aug 4, 2026
da6157a
fix(security): reject trusted uv redirects before follow
seonghobae Aug 4, 2026
1739459
docs(doctoring): record no-proxy no-redirect uv transport
seonghobae Aug 4, 2026
00642c2
fix(security): enforce fixed Astral HTTPS origin port
seonghobae Aug 4, 2026
3a15594
docs(doctoring): record fixed origin port and branch coverage evidence
seonghobae Aug 4, 2026
c9560d3
test(security): require scoped urllib false-positive suppression
seonghobae Aug 5, 2026
3259787
fix(security): scope urllib false-positive suppression
seonghobae Aug 5, 2026
7616fd8
fix(security): refresh vulnerable Strix lock snapshot
seonghobae Aug 5, 2026
07c81c0
fix(ci): align periodic CodeQL action revisions
seonghobae Aug 5, 2026
8696d74
test(coverage): capture trusted uv portability gaps
seonghobae Aug 5, 2026
83ea1d9
test(coverage): share deterministic HTTP response support
seonghobae Aug 5, 2026
7865efd
test(coverage): support Python 3.10 TOML parsing
seonghobae Aug 5, 2026
54d5927
build(test): support Python 3.10 TOML parsing
seonghobae Aug 5, 2026
a6a3a96
test(coverage): isolate trusted uv opener cache state
seonghobae Aug 5, 2026
df31da1
fix(coverage): harden trusted uv portability and streaming
seonghobae Aug 5, 2026
41ba0f4
test(coverage): isolate trusted uv process caches
seonghobae Aug 5, 2026
b4ceeed
test(coverage): resolve trusted uv review findings
seonghobae Aug 5, 2026
40e19c5
test(coverage): require explicit uv workspace rejection
seonghobae Aug 5, 2026
5b52fea
fix(coverage): fail closed on uv workspaces
seonghobae Aug 5, 2026
f93a5c1
test(ci): require exact-head trusted uv quality evidence
seonghobae Aug 5, 2026
44f15bb
ci(coverage): prove trusted uv materializer quality
seonghobae Aug 5, 2026
ba59139
test(coverage): close JavaScript and Noema branch gaps
seonghobae Aug 5, 2026
20de52f
test(coverage): close review scheduler branch gaps
seonghobae Aug 5, 2026
e29be20
test(coverage): close execution and sandbox branch gaps
seonghobae Aug 5, 2026
5925c8a
test(coverage): close reporting branch gaps
seonghobae Aug 5, 2026
15c7cb3
test(coverage): remove unused scheduler test import
seonghobae Aug 5, 2026
2424f7f
ci(coverage): prove complete central branch coverage
seonghobae Aug 5, 2026
27f08e2
test(ci): lock the repository-wide coverage gate
seonghobae Aug 5, 2026
c2b987f
docs(doctoring): record complete coverage repair evidence
seonghobae Aug 5, 2026
edd9a37
fix(strix): integrate hosted NVIDIA fallback into trusted uv prerequi…
seonghobae Aug 5, 2026
77fe2f2
test(ci): require exact-head trusted uv checkout
seonghobae Aug 5, 2026
3813a96
fix(ci): bind trusted uv quality evidence to PR head
seonghobae Aug 5, 2026
9c27d43
docs(changelog): record exact-head uv quality evidence
seonghobae Aug 5, 2026
d3b6c79
docs(doctoring): record exact-head checkout boundary
seonghobae Aug 5, 2026
244efdd
ci: repair exact-head trusted uv quality regressions
seonghobae Aug 5, 2026
df74e97
test(ci): stabilize trusted uv quality contracts
github-actions[bot] Aug 5, 2026
90dd9ae
docs(evidence): record trusted uv quality regression repair
seonghobae Aug 5, 2026
f57e5a9
ci: repair exact-head trusted uv quality regressions
seonghobae Aug 5, 2026
d5ff1d4
chore(ci): remove completed PR-specific repair workflow
seonghobae Aug 5, 2026
5e57877
ci: externalize PR 743 repair patch
seonghobae Aug 5, 2026
add05d3
ci: simplify PR 743 verified repair runner
seonghobae Aug 5, 2026
7384340
ci: make PR 743 repair idempotent with concurrent head fix
seonghobae Aug 5, 2026
90e8cd8
ci: rebind PR 743 repair to concurrent hermetic head
seonghobae Aug 5, 2026
c14b87a
chore(ci): remove completed PR 743 repair workflow
seonghobae Aug 5, 2026
7f270b3
chore(ci): remove completed PR 743 repair helper
seonghobae Aug 5, 2026
2d223df
test(opencode-review): stage Git config isolation regression
seonghobae Aug 5, 2026
ba157b5
chore(ci): remove completed PR 743 repair workflow
seonghobae Aug 5, 2026
c31feb1
test(opencode-review): require PR 743 cleanup boundary
seonghobae Aug 5, 2026
0edd9d4
ci: run bounded PR 743 Git configuration repair
seonghobae Aug 5, 2026
56781fa
ci: retry bounded PR 743 Git configuration repair
seonghobae Aug 5, 2026
adbaaf7
fix(ci): bind PR 743 one-shot to reviewed parent
seonghobae Aug 5, 2026
951c242
ci: make PR 743 repair invariant to metadata-only races
seonghobae Aug 5, 2026
35e40ac
chore(ci): remove completed PR 743 Git isolation workflow
seonghobae Aug 5, 2026
3865f99
ci: apply PR 743 Git isolation repair
seonghobae Aug 5, 2026
0ff7e6b
ci: make PR 743 Git isolation repair self-cleaning
seonghobae Aug 5, 2026
8b192fb
test(ci): require conftest changes to trigger uv quality evidence
seonghobae Aug 5, 2026
e21c97e
test(ci): anchor PR 743 cleanup contracts to repository root
seonghobae Aug 5, 2026
3ca42fa
test(opencode-review): finalize Git isolation repair
seonghobae Aug 5, 2026
6533e5f
fix(ci): trigger trusted uv evidence for shared fixtures
seonghobae Aug 5, 2026
c8a53dc
ci: execute PR 743 Git isolation repair as exact-head check
seonghobae Aug 5, 2026
2f890f6
test(opencode-review): verify final Git isolation tree
seonghobae Aug 5, 2026
5fe76ee
test(noema): distinguish review threads without line numbers
seonghobae Aug 5, 2026
9b8d02a
test(uv): verify Python 3.10 fallback in production source
seonghobae Aug 5, 2026
ad3ec12
test(ci): require final PR 743 branch-writer cleanup
seonghobae Aug 5, 2026
3a4e43e
fix(ci): make PR 743 repair self-contained
seonghobae Aug 5, 2026
02ccdd1
ci: remove completed PR 743 Git isolation helper
seonghobae Aug 5, 2026
b0caf9d
fix(ci): complete bounded PR 743 review repair
seonghobae Aug 5, 2026
defba71
ci: remove completed PR 743 finalizer v2
seonghobae Aug 5, 2026
cfa2819
ci: remove completed PR 743 finalizer
seonghobae Aug 5, 2026
b2bebb1
fix(ci): make bounded PR 743 repair race-safe
seonghobae Aug 5, 2026
3e477a9
ci: apply current PR 743 review fixes
seonghobae Aug 5, 2026
26ddb7b
ci: finalize PR 743 with workflow-scoped token
seonghobae Aug 5, 2026
db4dc6c
fix(ci): use established workflow-capable repair credentials
seonghobae Aug 5, 2026
e70b088
fix(ci): complete bounded PR 743 review repairs
seonghobae Aug 5, 2026
e24dc06
chore(ci): remove completed PR 743 repair workflow
seonghobae Aug 5, 2026
4614b44
fix(ci): materialize bounded repair without restricted ref writes
seonghobae Aug 5, 2026
b7f21a8
chore(ci): remove completed PR 743 repair workflow
seonghobae Aug 5, 2026
95b6c3e
test(opencode-review): trigger PAT-scoped PR 743 finalization
seonghobae Aug 5, 2026
1f75e13
fix(ci): distinguish already-isolated Git invocation blocks
seonghobae Aug 5, 2026
133067e
chore(ci): remove completed PR 743 write workflow
seonghobae Aug 5, 2026
112d5e0
test(ci): scope Git isolation assertions to complete blocks
seonghobae Aug 5, 2026
59c5e0b
chore(ci): remove superseded PR 743 finalizer
seonghobae Aug 5, 2026
1e2deb7
test(ci): make readiness clock deterministic
seonghobae Aug 5, 2026
3c47966
test(ci): require trusted Git helper boundary marker
seonghobae Aug 5, 2026
541f718
test(noema): assert complete line-free thread rendering
seonghobae Aug 5, 2026
91f0e36
test(ci): verify complete safe-directory isolation values
seonghobae Aug 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .github/workflows/opencode-review-dispatch.yml
Original file line number Diff line number Diff line change
Expand Up @@ -873,6 +873,8 @@ jobs:
GITHUB_STEP_SUMMARY=/dev/null \
BASH_ENV=/dev/null \
UV_NO_BUILD=1 \
GIT_CONFIG_NOSYSTEM=1 \
GIT_CONFIG_GLOBAL=/dev/null \
GIT_CONFIG_COUNT=1 \
GIT_CONFIG_KEY_0=safe.directory \
GIT_CONFIG_VALUE_0=/work \
Expand Down Expand Up @@ -932,6 +934,8 @@ jobs:
GITHUB_STEP_SUMMARY=/dev/null \
BASH_ENV=/dev/null \
UV_NO_BUILD=1 \
GIT_CONFIG_NOSYSTEM=1 \
GIT_CONFIG_GLOBAL=/dev/null \
GIT_CONFIG_COUNT=1 \
GIT_CONFIG_KEY_0=safe.directory \
GIT_CONFIG_VALUE_0=/work \
Expand Down Expand Up @@ -991,6 +995,8 @@ jobs:
GITHUB_STEP_SUMMARY=/dev/null \
BASH_ENV=/dev/null \
UV_NO_BUILD=1 \
GIT_CONFIG_NOSYSTEM=1 \
GIT_CONFIG_GLOBAL=/dev/null \
GIT_CONFIG_COUNT=1 \
GIT_CONFIG_KEY_0=safe.directory \
GIT_CONFIG_VALUE_0=/work \
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/scheduled-security-scan.yml
Original file line number Diff line number Diff line change
Expand Up @@ -90,13 +90,13 @@ jobs:
with:
persist-credentials: false
- name: Initialize CodeQL
uses: github/codeql-action/init@99df26d4f13ea111d4ec1a7dddef6063f76b97e9 # v4.37.0
uses: github/codeql-action/init@d1ba80a13dd99fba24a470575428917156a28b43 # v4.37.5
with:
languages: ${{ matrix.language }}
build-mode: ${{ matrix.build-mode }}
- name: Perform CodeQL Analysis
continue-on-error: true
uses: github/codeql-action/analyze@99df26d4f13ea111d4ec1a7dddef6063f76b97e9 # v4.37.0
uses: github/codeql-action/analyze@d1ba80a13dd99fba24a470575428917156a28b43 # v4.37.5
with:
category: "/language:${{ matrix.language }}-scheduled"

Expand Down Expand Up @@ -131,7 +131,7 @@ jobs:
- name: Upload Trivy SARIF to code scanning
if: always() && hashFiles('trivy-results.sarif') != ''
continue-on-error: true
uses: github/codeql-action/upload-sarif@f205ea1c3313d32999d8d6a48b4f6530d4437b38 # v4.37.4
uses: github/codeql-action/upload-sarif@d1ba80a13dd99fba24a470575428917156a28b43 # v4.37.5
with:
sarif_file: trivy-results.sarif
category: trivy-fs-scheduled
12 changes: 6 additions & 6 deletions .github/workflows/strix.yml
Original file line number Diff line number Diff line change
Expand Up @@ -443,7 +443,7 @@ jobs:
- name: Gate Strix secrets
id: gate
env:
STRIX_MODEL: ${{ github.event.client_payload.strix_llm || (steps.target_visibility.outputs.is_private == 'false' && 'nvidia_nim/nvidia/nemotron-3-ultra-550b-a55b' || 'gpt-5.6-luna') }}
STRIX_MODEL: ${{ github.event.client_payload.strix_llm || (steps.target_visibility.outputs.is_private == 'false' && 'nvidia_nim/nvidia/nemotron-3-super-120b-a12b' || 'gpt-5.6-luna') }}
STRIX_MODEL_REQUESTED: ${{ github.event.client_payload.strix_llm || '' }}
STRIX_OPENAI_API_KEY: ${{ secrets.STRIX_OPENAI_API_KEY || secrets.OPENAI_API_KEY }}
STRIX_OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
Expand All @@ -453,7 +453,7 @@ jobs:
TARGET_REPOSITORY_PRIVATE: ${{ steps.target_visibility.outputs.is_private }}
run: |
strix_model="$(printf '%s' "$STRIX_MODEL" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')"
if [ -z "$STRIX_MODEL_REQUESTED" ] && [ "$strix_model" = "nvidia_nim/nvidia/nemotron-3-ultra-550b-a55b" ] && [ -z "${STRIX_NVIDIA_NIM_API_KEY:-}" ]; then
if [ -z "$STRIX_MODEL_REQUESTED" ] && [ "$strix_model" = "nvidia_nim/nvidia/nemotron-3-super-120b-a12b" ] && [ -z "${STRIX_NVIDIA_NIM_API_KEY:-}" ]; then
strix_model="gpt-5.6-luna"
fi
echo "strix_model=$strix_model" >> "$GITHUB_OUTPUT"
Expand Down Expand Up @@ -497,7 +497,7 @@ jobs:
exit 1
fi
;;
nvidia_nim/nvidia/nemotron-3-ultra-550b-a55b)
nvidia_nim/nvidia/nemotron-3-super-120b-a12b)
if [ "$TARGET_REPOSITORY_PRIVATE" != "false" ]; then
echo '::error::NVIDIA NIM hosted trial scans are limited to public repositories.'
exit 1
Expand Down Expand Up @@ -763,7 +763,7 @@ jobs:
openrouter/free | openrouter/openrouter/free)
printf '%s' 'openrouter/free' > "$strix_llm_file"
;;
nvidia_nim/nvidia/nemotron-3-ultra-550b-a55b)
nvidia_nim/nvidia/nemotron-3-super-120b-a12b)
printf '%s' "$strix_model" > "$strix_llm_file"
;;
vertex_ai/gemini-3.1-pro-preview-customtools | vertex_ai/gemini-2.5-flash)
Expand Down Expand Up @@ -807,7 +807,7 @@ jobs:
STRIX_LLM_MAX_RETRIES: 1
STRIX_TRANSIENT_RETRY_PER_MODEL: 2
STRIX_TRANSIENT_RETRY_BACKOFF_SECONDS: 60
STRIX_FALLBACK_MODELS: ${{ steps.gate.outputs.provider_mode == 'github_models' && 'github_models/openai/o3 github_models/openai/gpt-5-chat' || steps.gate.outputs.provider_mode == 'openai_direct' && 'github_models/openai/o3 github_models/openai/gpt-5-chat' || steps.gate.outputs.provider_mode == 'openrouter' && 'github_models/openai/o3 github_models/openai/gpt-5-chat' || steps.gate.outputs.provider_mode == 'nvidia_nim' && 'github_models/openai/o3 github_models/openai/gpt-5-chat' || '' }}
STRIX_FALLBACK_MODELS: ${{ steps.gate.outputs.provider_mode == 'github_models' && 'github_models/openai/o3 github_models/openai/gpt-5-chat' || steps.gate.outputs.provider_mode == 'openai_direct' && 'github_models/openai/o3 github_models/openai/gpt-5-chat' || steps.gate.outputs.provider_mode == 'openrouter' && 'github_models/openai/o3 github_models/openai/gpt-5-chat' || steps.gate.outputs.provider_mode == 'nvidia_nim' && 'nvidia_nim/nvidia/llama-3.3-nemotron-super-49b-v1.5 github_models/openai/o3 github_models/openai/gpt-5-chat' || '' }}
STRIX_GITHUB_MODELS_API_BASE_FILE: ${{ env.STRIX_GITHUB_MODELS_API_BASE_FILE }}
STRIX_GITHUB_MODELS_KEY_FILE: ${{ env.STRIX_GITHUB_MODELS_KEY_FILE }}
STRIX_FAIL_ON_PROVIDER_SIGNAL: "1"
Expand Down Expand Up @@ -861,7 +861,7 @@ jobs:
fi

# Recognized signals that the LLM backend was unavailable / starved.
backend_unavailable_signal='RateLimitError|Too many requests\. For more on scraping GitHub|exceeded your current quota|insufficient_quota|billing details|"status"[[:space:]]*:[[:space:]]*"RESOURCE_EXHAUSTED"|tokens_limit_reached|Request body too large|Max size:[[:space:]]*[0-9]+[[:space:]]+tokens|Error code:[[:space:]]*413|LLM CONNECTION FAILED|Could not establish connection to the language model|LLM warm-up failed|Configured model and fallback models were unavailable|Configured Vertex model and fallback models were unavailable|emitted provider infrastructure or failure-signal output|before provider infrastructure failure'
backend_unavailable_signal='RateLimitError|Too many requests\. For more on scraping GitHub|exceeded your current quota|insufficient_quota|billing details|"status"[[:space:]]*:[[:space:]]*"RESOURCE_EXHAUSTED"|tokens_limit_reached|Request body too large|Max size:[[:space:]]*[0-9]+[[:space:]]+tokens|Error code:[[:space:]]*413|LLM CONNECTION FAILED|Could not establish connection to the language model|LLM warm-up failed|Configured model and fallback models were unavailable|Configured Vertex model and fallback models were unavailable|emitted provider infrastructure or failure-signal output|before provider infrastructure failure|litellm(\.exceptions)?\.NotFoundError[^[:cntrl:]]*Nvidia_nimException[^[:cntrl:]]*Error code:[[:space:]]*404'
# Any evidence that a vulnerability was actually reported. Its presence
# forces a hard failure so real findings are NEVER downgraded. Keep the
# severity branch anchored away from identifiers so environment lines
Expand Down
165 changes: 165 additions & 0 deletions .github/workflows/trusted-uv-materializer-quality-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
name: Trusted uv Materializer Quality CI

on:
pull_request:
branches: [main]
paths:
- ".github/workflows/trusted-uv-materializer-quality-ci.yml"
- "scripts/ci/materialize_base_python_requirements.py"
- "tests/conftest.py"
- "tests/test_materialize*.py"
- "tests/test_trusted_uv*.py"
- "tests/test_uv*.py"
- "tests/test_repository_branch_coverage_*.py"
- "requirements-opencode-review-ci-hashes.txt"
- "pyproject.toml"
push:
branches: [main]
paths:
- ".github/workflows/trusted-uv-materializer-quality-ci.yml"
- "scripts/ci/materialize_base_python_requirements.py"
- "tests/conftest.py"
- "tests/test_materialize*.py"
- "tests/test_trusted_uv*.py"
- "tests/test_uv*.py"
- "tests/test_repository_branch_coverage_*.py"
- "requirements-opencode-review-ci-hashes.txt"
- "pyproject.toml"
Comment thread
coderabbitai[bot] marked this conversation as resolved.

concurrency:
group: trusted-uv-materializer-quality-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

permissions:
contents: read

env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true

jobs:
minimum-python-contract:
name: Python 3.10 compatibility contract
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Harden runner
uses: step-security/harden-runner@bf7454d06d71f1098171f2acdf0cd4708d7b5920 # v2.20.0
with:
egress-policy: audit

- name: Checkout
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
ref: ${{ github.event.pull_request.head.sha }}

- name: Set up minimum supported Python
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: "3.10"

- name: Compile production on Python 3.10
run: python -m compileall -q scripts/ci/materialize_base_python_requirements.py

- name: Exercise the conditional tomli import
run: |
python - <<'PY'
import sys
import tempfile
from pathlib import Path

stub_root = Path(tempfile.mkdtemp(prefix="trusted-uv-tomli-stub-"))
(stub_root / "tomli.py").write_text(
"STUB_MARKER = True\n"
"class TOMLDecodeError(ValueError):\n"
" pass\n"
"def loads(_value):\n"
" return {}\n",
encoding="utf-8",
)
sys.path.insert(0, str(stub_root))
from scripts.ci import materialize_base_python_requirements as materializer

assert materializer.tomllib.STUB_MARKER is True
PY

full-quality-gate:
name: Python 3.14 full quality gate
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- name: Harden runner
uses: step-security/harden-runner@bf7454d06d71f1098171f2acdf0cd4708d7b5920 # v2.20.0
with:
egress-policy: audit

- name: Checkout
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
ref: ${{ github.event.pull_request.head.sha }}

- name: Set up current stable Python
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: "3.14"
cache: pip
cache-dependency-path: requirements-opencode-review-ci-hashes.txt

- name: Install hash-locked quality tooling
run: python -m pip install --disable-pip-version-check --require-hashes -r requirements-opencode-review-ci-hashes.txt

- name: Run trusted uv tests with complete branch coverage
run: |
cat >"${RUNNER_TEMP}/trusted-uv-coveragerc" <<'EOF'
[run]
branch = True
include =
scripts/ci/materialize_base_python_requirements.py

[report]
fail_under = 100
show_missing = True
EOF
export COVERAGE_RCFILE="${RUNNER_TEMP}/trusted-uv-coveragerc"
python -m coverage erase
python -m coverage run -m pytest \
tests/test_materialize_base_python_requirements.py \
tests/test_materialize_uv_export_hash_contract.py \
tests/test_trusted_uv_download_contract.py \
tests/test_trusted_uv_portability_and_streaming.py \
tests/test_uv_export_isolation_contract.py \
tests/test_uv_redirect_and_coverage_contract.py \
tests/test_uv_redirect_boundary.py \
tests/test_uv_workspace_fail_closed.py \
tests/test_trusted_uv_materializer_quality_workflow_contract.py \
-q
python -m coverage report

- name: Run complete central test and branch coverage gate
run: |
unset COVERAGE_RCFILE
python -m coverage erase
python -m coverage run -m pytest tests -q
python -m coverage report

- name: Enforce complete production docstrings
run: python -m interrogate --fail-under 100 scripts/ci/materialize_base_python_requirements.py

- name: Compile production and quality contracts
run: |
python -m compileall -q \
scripts/ci/materialize_base_python_requirements.py \
tests/test_materialize_base_python_requirements.py \
tests/test_materialize_uv_export_hash_contract.py \
tests/test_trusted_uv_download_contract.py \
tests/test_trusted_uv_portability_and_streaming.py \
tests/test_uv_export_isolation_contract.py \
tests/test_uv_redirect_and_coverage_contract.py \
tests/test_uv_redirect_boundary.py \
tests/test_uv_workspace_fail_closed.py \
tests/test_trusted_uv_materializer_quality_workflow_contract.py \
tests/test_repository_branch_coverage_javascript_and_noema.py \
tests/test_repository_branch_coverage_review_schedulers.py \
tests/test_repository_branch_coverage_execution_sandboxes.py \
tests/test_repository_branch_coverage_reporting_edges.py
16 changes: 16 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Changelog

All notable changes to the organization automation repository are documented in
this file. The format follows Keep a Changelog, and versioned releases follow
Semantic Versioning where the repository publishes a release.

## [Unreleased]

### Added

- Added exact-base `uv.lock` materialization that reconstructs standalone nested projects with a checksum-pinned official `uv` exporter, isolated frozen/offline execution, strict exact-pin and SHA-256 output validation, and complete Python 3.10/3.14 quality evidence.

### Fixed

- Bound both trusted-uv quality jobs to `github.event.pull_request.head.sha` and added a permanent two-checkout regression contract so exact-head compatibility, coverage, docstring, and compilation claims cannot silently measure GitHub's generated pull-request merge revision.
- Made Strix treat only a single LiteLLM provider-error line containing NVIDIA NIM context and model-catalog 404 evidence as cross-model fallback evidence, rejecting cross-line signal assembly and provider-like target source literals; moved the public default to Nemotron 3 Super 120B and added a second NVIDIA hosted candidate before GitHub Models without neutralizing reported vulnerabilities.
76 changes: 76 additions & 0 deletions docs/doctoring/strix-nvidia-nim-not-found-fallback.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
# Strix NVIDIA NIM model-catalog fallback: evidence and design record

## Decision

Strix treats an authenticated NVIDIA NIM model-catalog `404 Not Found` as
provider availability evidence, not as a target-application vulnerability. The
gate does not retry the same unavailable model. It proceeds to a distinct
reviewed NVIDIA hosted model and only then to the existing GitHub Models
candidates.

Public-repository scans now default to
`nvidia/nemotron-3-super-120b-a12b`. The first fallback is
`nvidia/llama-3.3-nemotron-super-49b-v1.5`. Private repositories retain the
contracted provider because NVIDIA hosted trial inputs are restricted to public
repositories by the central workflow.

## Trust boundary

The NVIDIA classifier accepts only a single bounded log line that contains all
three signals: a LiteLLM `NotFoundError`, NVIDIA NIM provider context, and
model-catalog not-found evidence. It does not assemble provider and `404`
signals from different lines. A bare application `404`, route miss, database
lookup miss, provider-like source literal, or other target-controlled output is
not enough to enter model fallback.

This same-line rule matters because scanner stdout can include text derived from
the repository under review. Requiring the trusted LiteLLM exception marker and
all provider-availability evidence on one line prevents repository content from
combining with an unrelated application `404` to spoof infrastructure fallback.
Provider-side failure also remains a fail-closed incomplete scan until a distinct
fallback produces complete evidence.

The outer workflow may classify exhausted provider infrastructure as neutral only
when the run log contains no vulnerability signal. Any reported severity or
non-zero vulnerability count remains blocking. Scanner reports and attempt logs
remain available as artifacts.

## Verification contract

Regression evidence proves that:

1. the exact LiteLLM `Nvidia_nimException` 404 observed in required CI is
recognized;
2. an ordinary application 404 is not recognized;
3. provider context and 404 evidence on different lines are not recognized;
4. a provider-like source literal on one line without LiteLLM `NotFoundError`
context is not recognized;
5. model-catalog 404s enter cross-model fallback but never same-model retry;
6. the primary and first fallback are current NVIDIA hosted models;
7. GitHub Models remain later cross-provider fallbacks;
8. vulnerability signals prevent neutral infrastructure classification; and
9. the required-workflow smoke contract pins these properties.

## Limitations

Hosted model catalogs may change independently of this repository. A model-card
page or supported self-hosted NIM container does not guarantee indefinite hosted
trial availability. The ordered model plan must therefore be reviewed against
current NVIDIA documentation whenever a provider returns a catalog 404. This
change does not treat arbitrary provider errors as success and does not weaken
Strix severity, changed-file attribution, or independent approval requirements.

## References

Fielding, R., Nottingham, M., & Reschke, J. (2022). *HTTP semantics* (RFC
9110). Internet Engineering Task Force. https://doi.org/10.17487/RFC9110

NVIDIA Corporation. (2025). *Llama-3.3-Nemotron-Super-49B-v1.5* [Model card].
NVIDIA NIM. https://build.nvidia.com/nvidia/llama-3_3-nemotron-super-49b-v1_5/modelcard

NVIDIA Corporation. (2026a). *NVIDIA-Nemotron-3-Super-120B-A12B* [Model
card]. NVIDIA NIM.
https://build.nvidia.com/nvidia/nemotron-3-super-120b-a12b/modelcard

NVIDIA Corporation. (2026b). *Configuration reference*. NVIDIA AI-Q Blueprint.
https://docs.nvidia.com/aiq-blueprint/2.2.0-rc1/customization/configuration-reference.html
Loading
Loading