Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
12 changes: 4 additions & 8 deletions .github/workflows/opencode-review-dispatch.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4058,8 +4058,8 @@ jobs:
"apiKey": "{env:OPENAI_API_KEY}"
},
"models": {
"gpt-5.6-luna": {
"name": "OpenAI GPT-5.6 Luna (direct)",
"gpt-5.4": {
"name": "OpenAI GPT-5.4 (direct)",
"tool_call": true,
"reasoning": true,
"options": {
Expand Down Expand Up @@ -4471,17 +4471,13 @@ jobs:
# or used for product/model improvement, so private repositories
# include neither NIM nor anonymous free candidates and start at the
# existing keyed fallback list: OpenCode Zen GPT-5.6 Terra, DeepSeek
# V3, the direct GPT-5.6 Luna slot, and pinned PAID
# V3, the direct GPT-5.4 slot, and pinned PAID
# OpenRouter coder models (free-tier candidates hit the shared
# free-models-per-day cap and hung for the full candidate timeout,
# so the OpenRouter slots use cheap paid models billed against the
# org's OpenRouter credits), then the full-size GPT-4.1 long-context
# endpoint and provider-specific GPT/o3 fallbacks.
# The direct-OpenAI slot runs GPT-5.6 Luna: the newest family's
# cost-efficient tier, cheaper than the legacy gpt-5 it replaced
# ($1/$6 vs $1.25/$10 per 1M tokens) so the org OpenAI budget
# stretches further between top-ups.
OPENCODE_MODEL_CANDIDATES: "${{ needs.validate-pr-metadata.outputs.is_private == 'false' && 'nvidia-nim/nvidia/llama-3.3-nemotron-super-49b-v1.5 nvidia-nim/nvidia/llama-3.1-nemotron-ultra-253b-v1 nvidia-nim/nvidia/nemotron-3-super-120b-a12b nvidia-nim/nvidia/nemotron-3-ultra-550b-a55b nvidia-nim/meta/llama-3.3-70b-instruct nvidia-nim/deepseek-ai/deepseek-v4-pro nvidia-nim/mistralai/codestral-22b-instruct-v0.1 opencode-free/nemotron-3-ultra-free opencode-free/deepseek-v4-flash-free opencode-free/north-mini-code-free opencode-free/laguna-s-2.1-free opencode-free/ling-3.0-flash-free opencode-free/big-pickle opencode-free/mimo-v2.5-free opencode-free/hy3-free opencode-free/minimax-m3-free opencode-free/glm-5-free opencode-free/kimi-k2.5-free opencode-free/qwen3.6-plus-free ' || '' }}opencode/gpt-5.6-terra github-models/deepseek/deepseek-v3-0324 openai/gpt-5.6-luna openrouter/deepseek/deepseek-v3.2 openrouter/qwen/qwen3-coder github-models/openai/gpt-4.1 github-models/openai/gpt-5 github-models/openai/gpt-5-chat github-models/openai/o3 github-models/deepseek/deepseek-r1-0528 github-models/deepseek/deepseek-r1"
OPENCODE_MODEL_CANDIDATES: "${{ needs.validate-pr-metadata.outputs.is_private == 'false' && 'nvidia-nim/nvidia/llama-3.3-nemotron-super-49b-v1.5 nvidia-nim/nvidia/llama-3.1-nemotron-ultra-253b-v1 nvidia-nim/nvidia/nemotron-3-super-120b-a12b nvidia-nim/nvidia/nemotron-3-ultra-550b-a55b nvidia-nim/meta/llama-3.3-70b-instruct nvidia-nim/deepseek-ai/deepseek-v4-pro nvidia-nim/mistralai/codestral-22b-instruct-v0.1 opencode-free/nemotron-3-ultra-free opencode-free/deepseek-v4-flash-free opencode-free/north-mini-code-free opencode-free/laguna-s-2.1-free opencode-free/ling-3.0-flash-free opencode-free/big-pickle opencode-free/mimo-v2.5-free opencode-free/hy3-free opencode-free/minimax-m3-free opencode-free/glm-5-free opencode-free/kimi-k2.5-free opencode-free/qwen3.6-plus-free ' || '' }}opencode/gpt-5.6-terra github-models/deepseek/deepseek-v3-0324 openai/gpt-5.4 openrouter/deepseek/deepseek-v3.2 openrouter/qwen/qwen3-coder github-models/openai/gpt-4.1 github-models/openai/gpt-5 github-models/openai/gpt-5-chat github-models/openai/o3 github-models/deepseek/deepseek-r1-0528 github-models/deepseek/deepseek-r1"
# One attempt per model, then fall through to the next model. Retrying
# the SAME model 5x let a rate-limited/hung leader consume the whole
# step, so the pool never reached a healthy fallback model.
Expand Down
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,12 @@ Semantic Versioning where the repository publishes a release.

### Fixed

- Reconciled the Strix required-workflow smoke contract and the privileged
OpenCode model pool with the current `gpt-5.4` direct-OpenAI fallback after
`gpt-5.6-luna` was retired. This prevents every consumer repository's
required Strix check from failing on a stale central assertion or selecting a
nonexistent direct model.

- Publish only the sanitized cumulative Strix report tree, avoiding a later
copy of relative scanner output that could reintroduce known internal warning
text into uploaded security evidence.
Expand Down
12 changes: 12 additions & 0 deletions docs/adr/0002-product-technical-gap-baseline.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,15 @@
- Ownership: .github owns control-plane evidence; naruon and product repositories own product behavior and consumer smoke.
- Figma File ID: N/A. This repository has no customer UI. A UI-owning repository must replace N/A with its real Figma File ID before a UI PR is accepted and must provide Storybook and design-token evidence.
- Consequence: The document is an operational snapshot, not a merge authorization or substitute for protected GitHub review. Hourly agents must re-collect exact head SHAs, reviews, threads, and required Checks before merge. Papers/standards live in `docs/doctoring/product-technical-gap-baseline.md` and must remain consistent with this ADR.

## Amendment: central Strix fallback contract (2026-08-25)

The current `main` workflow (`a724582`) intentionally replaced the unavailable
direct-OpenAI `gpt-5.6-luna` fallback with `gpt-5.4`, but the required-workflow
smoke script still asserted the retired model. The privileged OpenCode model
pool also retained the retired candidate while its contract tests had already
moved to `gpt-5.4`. This mismatch failed consumer Strix checks, including
ContextualWisdomLab/disksage#247, before any target-repository security
analysis ran. The workflow, smoke contract, model-pool configuration, and
regression tests now share `gpt-5.4`; the change does not weaken provider
failure or vulnerability fail-closed behavior.
9 changes: 9 additions & 0 deletions docs/doctoring/strix-nvidia-nim-not-found-fallback.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,15 @@ 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.

## Current fallback contract (2026-08-25)

The direct-OpenAI fallback is `gpt-5.4`. The retired `gpt-5.6-luna` identifier
must not appear in the executable workflow, required smoke contract, or model
pool. A central workflow update without its smoke and model-pool assertions is
invalid because every consumer repository would fail before its own scan. The
contract is verified by `scripts/ci/strix_required_workflow_smoke.sh` and the
focused `test_strix_quick_gate.sh` case; provider failures remain non-passing.

## References

Fielding, R., Nottingham, M., & Reschke, J. (2022). *HTTP semantics* (RFC
Expand Down
12 changes: 12 additions & 0 deletions docs/product-technical-gap-baseline.md
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,18 @@ flowchart LR
- Open count is 98. No additional `.github` PR merged this pass.


## 2026-08-25 central Strix fallback contract recheck

- `main` at `a724582a0768129d481385070bf8f05b2620dd2c` changed the direct-OpenAI
fallback to `gpt-5.4`, but the required-workflow smoke script still required
the retired `gpt-5.6-luna` string. The privileged OpenCode model pool also
retained the retired candidate while its contract tests expected `gpt-5.4`.
- This exact mismatch caused consumer Strix checks to fail before scanning the
target repository; it was observed on ContextualWisdomLab/disksage#247 at
exact head `a9c868a6e9c8d68a9c6ea6de381e188740b8f5db`. The focused repair keeps
provider errors and vulnerability findings fail-closed and only aligns the
executable model and its assertions.

## 5. 실행 루프와 고객의 다음 행동

각 hourly pass는 아래 순서를 유지한다.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -956,7 +956,7 @@ extract_strix_failed_check_block "$EVIDENCE_FILE" "$strix_evidence_file"

emit_known_missing_string_finding \
"$EVIDENCE_FILE" \
"steps.target_visibility.outputs.is_private == 'false' && 'nvidia_nim/nvidia/nemotron-3-ultra-550b-a55b' || 'gpt-5.6-luna'" \
"steps.target_visibility.outputs.is_private == 'false' && 'nvidia_nim/nvidia/nemotron-3-ultra-550b-a55b' || 'gpt-5.4'" \
"Strix public scans must default to NVIDIA NIM while private scans retain the contracted provider" \
".github/workflows/strix.yml" \
"scripts/ci/test_strix_quick_gate.sh"
Expand Down
8 changes: 4 additions & 4 deletions tests/test_opencode_agent_contract.py
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ def test_opencode_model_pool_sets_high_effort_for_capable_candidates():
["opencode-free", "qwen3.6-plus-free"],
["opencode", "gpt-5.6-terra"],
["github-models", "deepseek/deepseek-v3-0324"],
["openai", "gpt-5.6-luna"],
["openai", "gpt-5.4"],
["openrouter", "deepseek/deepseek-v3.2"],
["openrouter", "qwen/qwen3-coder"],
["github-models", "openai/gpt-4.1"],
Expand All @@ -197,7 +197,7 @@ def test_opencode_model_pool_sets_high_effort_for_capable_candidates():
["github-models", "deepseek/deepseek-r1"],
]
assert zen_models == ["gpt-5.6-terra"]
assert direct_openai_models == ["gpt-5.6-luna"]
assert direct_openai_models == ["gpt-5.4"]
assert openrouter_models == [
"deepseek/deepseek-v3.2",
"qwen/qwen3-coder",
Expand Down Expand Up @@ -1740,7 +1740,7 @@ def test_workflow_provisions_sandbox_tool_and_reviewer_agent():
assert (
"opencode/gpt-5.6-terra "
"github-models/deepseek/deepseek-v3-0324 "
"openai/gpt-5.6-luna "
"openai/gpt-5.4 "
"openrouter/deepseek/deepseek-v3.2 "
"openrouter/qwen/qwen3-coder "
"github-models/openai/gpt-4.1 "
Expand Down Expand Up @@ -1887,7 +1887,7 @@ def test_workflow_provisions_sandbox_tool_and_reviewer_agent():
)
assert (
"github-models/deepseek/deepseek-v3-0324 "
"openai/gpt-5.6-luna "
"openai/gpt-5.4 "
"openrouter/deepseek/deepseek-v3.2 "
"openrouter/qwen/qwen3-coder "
"github-models/openai/gpt-4.1 "
Expand Down
2 changes: 1 addition & 1 deletion tests/test_pr_review_autofix_nvidia_nim_contract.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
DOCTORING_RECORD = Path("docs/doctoring/hourly-nvidia-nim-autofix.md")
CHANGELOG = Path("CHANGELOG.md")
REVIEW_DISPATCH_WORKFLOW = Path(".github/workflows/opencode-review-dispatch.yml")
REVIEW_DISPATCH_BLOB_SHA = "dd65d90e10e5040562b501ade1a40f89572f0984"
REVIEW_DISPATCH_BLOB_SHA = "ed3f7b44f9afdd6ab295426e5d0440aeca6bdfb5"
Comment thread
seonghobae marked this conversation as resolved.


def _workflow_text(path: Path) -> str:
Expand Down
2 changes: 1 addition & 1 deletion tests/test_required_workflow_queue_contract.py
Original file line number Diff line number Diff line change
Expand Up @@ -505,7 +505,7 @@ def test_nvidia_nim_defaults_preserve_existing_fallbacks_without_secret(
assert strix.returncode == 0, strix.stderr
assert {
"provider_mode=openai_direct",
"strix_model=gpt-5.6-luna",
"strix_model=gpt-5.4",
} <= set(strix_output.read_text().splitlines())
assert (
"STRIX_MODEL: ${{ steps.gate.outputs.strix_model }}"
Expand Down
4 changes: 2 additions & 2 deletions tests/test_strix_nvidia_nim_not_found_fallback.py
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ def test_workflow_uses_available_free_first_nvidia_plan(self) -> None:
workflow = STRIX_WORKFLOW.read_text(encoding="utf-8")
default_expression = (
"steps.target_visibility.outputs.is_private == 'false' && "
f"'{DEFAULT_NVIDIA_MODEL}' || 'gpt-5.6-luna'"
f"'{DEFAULT_NVIDIA_MODEL}' || 'gpt-5.4'"
)
self.assertIn(default_expression, workflow)
self.assertIn(
Expand All @@ -202,7 +202,7 @@ def test_workflow_uses_available_free_first_nvidia_plan(self) -> None:
)
self.assertIn(
"steps.gate.outputs.provider_mode == 'nvidia_nim' && "
f"'{FREE_NVIDIA_FALLBACK} openai-direct/gpt-5.6-luna'",
f"'{FREE_NVIDIA_FALLBACK} openai-direct/gpt-5.4'",
workflow,
)

Expand Down
Loading