Skip to content

fix(strix): enforce orchestrator/free and remove heuristic gate decisions - #1668

Draft
seonghobae wants to merge 18 commits into
mainfrom
fix/strix-free-only-model-normalization-20260902
Draft

fix(strix): enforce orchestrator/free and remove heuristic gate decisions#1668
seonghobae wants to merge 18 commits into
mainfrom
fix/strix-free-only-model-normalization-20260902

Conversation

@seonghobae

@seonghobae seonghobae commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Root cause

Protected central Strix provisions ContextualWisdomLab/contextual-orchestrator, requests exactly orchestrator/free, forces private-target ZDR, supplies all five bootstrap credential variables, and disables external fallback models. Three reusable Strix surfaces nevertheless remained authoritative below that boundary: (1) generic model normalization still accepted concrete provider/model identifiers; (2) the required workflow allocated repository-authored same-model retries/backoff, including an outer retry loop, even though contextual-orchestrator owns provider failover; and (3) the gate converted Strix severity labels to a hand-selected MEDIUM merge threshold.

None of those routing/test-time-compute/admission rules has an identified statistical/psychometric model, authoritative standard, or executable experimental calibration. Under the no-heuristics contract, the safe replacement is not a different count/weight/cutoff: reject direct-provider routes, delegate provider failover to the gateway, and fail closed when one governed execution does not produce authoritative evidence or when a current vulnerability artifact exists.

This is separate from the corrected credential boundary: OPENAI_API_KEY may remain supplied, registered, and globally discoverable. OpenAI-derived models must be excluded at contextual-orchestrator's orchestrator/free candidate boundary rather than by deleting the bootstrap secret.

Test-first repair

  • RED commit 2083a72dccaa1d96ea423a51af537240fde8a210 requires model normalization to admit only orchestrator/free / contextual-orchestrator/orchestrator/free and reject direct OpenAI, OpenRouter, NVIDIA NIM, GitHub Models, Vertex/Gemini, and unqualified model identifiers.
  • Production commit 10c1ddf822f1e6336b73a9093a56680fea8f4f54 moves that reusable model boundary to fail closed before provider credentials or endpoints can become Strix execution authority.
  • RED commit 618bf6516c792004d84074c00844793ee48c59a1 forbids repository-authored Strix retry/test-time-compute allocation in both the central workflow and reusable gate.
  • RED commit 9dd508276ca5803cc71a261fb151921863dd59eb forbids a hand-selected severity admission threshold and requires a successful Strix execution with any current vulnerability artifact to fail closed.
  • Source-fix commit e31d7d21b93b4838b8c0f8e9bb1c2ecac04518f0 carries an exact-text guarded repair workflow that first proves those two new contracts RED, removes same-model retry/backoff/outer retry allocation, makes the reusable gate execute orchestrator/free once, removes the workflow MEDIUM cutoff, fails closed on any current vulnerability artifact, verifies focused contracts, records causal evidence, and self-removes.

ADR-0028 (renumbered from 0021 on 2026-09-05; main already had a different ADR-0028) and the doctoring record preserve the corrected OpenAI credential/candidate separation and ZDR boundary. Canonical product-gap/changelog reconciliation remains one-shot and exact-head gated.

Merge discipline

Keep Draft until all one-shot workflows have self-removed and fresh exact-head tests/security/review gates are terminal. Pending/queued evidence is non-passing. Do not bypass, self-approve, force-push, destructively rebase, or weaken required checks. Historical direct-provider/fallback/severity helper code that becomes unreachable after the active-path repair remains cleanup debt until removed with exact-head regression evidence.

@coderabbitai

coderabbitai Bot commented Sep 2, 2026

Copy link
Copy Markdown

Warning

Review limit reached

Next included review available in 54 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Team

Run ID: 6377a344-a125-4371-8827-39aa31d45404

📥 Commits

Reviewing files that changed from the base of the PR and between 7f4c5e3 and 82b19c4.

📒 Files selected for processing (15)
  • .github/workflows/strix.yml
  • CHANGELOG.md
  • docs/adr/0028-strix-orchestrator-free-only-model-boundary.md
  • docs/doctoring/strix-orchestrator-free-model-boundary-2026-09-02.md
  • docs/product-technical-gap-baseline.md
  • scripts/ci/strix_model_utils.sh
  • scripts/ci/strix_quick_gate.sh
  • scripts/ci/test_strix_quick_gate.sh
  • tests/test_required_workflow_queue_contract.py
  • tests/test_strix_caido_bootstrap_timing_retry.py
  • tests/test_strix_model_behavior_error.py
  • tests/test_strix_no_heuristic_retry_contract.py
  • tests/test_strix_no_heuristic_severity_contract.py
  • tests/test_strix_nvidia_nim_not_found_fallback.py
  • tests/test_strix_orchestrator_free_only.py

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.

Preserve protected main #1665's GitHub-Actions sidecar pool pin while carrying the test-first reusable Strix model-normalization boundary, ADR/doctoring, and one-shot canonical evidence reconciliation forward. No force push or history rewrite.
@seonghobae seonghobae changed the title fix(strix): fail closed on direct-provider model routes fix(strix): enforce orchestrator/free and remove heuristic gate decisions Sep 2, 2026
Preserve protected-main Noema diagnostics and org-sweep rate-limit work while carrying the Strix orchestrator/free, retry-allocation, and severity-admission repair forward. The intervening main files do not overlap this PR's semantic delta. No history rewrite or gate weakening.
@seonghobae seonghobae added documentation Improvements or additions to documentation priority: high High-priority or P1 work status: draft Draft pull request type: bug Defect or incorrect behavior labels Sep 2, 2026 — with ChatGPT Codex Connector
github-actions Bot and others added 3 commits September 2, 2026 11:36
# Conflicts:
#	CHANGELOG.md
#	docs/product-technical-gap-baseline.md
main had moved substantially since this branch's RED-before-repair
commits and its one-shot source_fix_strix_no_heuristic_retry_severity.py
driver were authored: run_current_target_scan had grown a full
cross-model fallback loop (FALLBACK_MODELS_RAW, per-candidate retry,
PR_FINDINGS_DECISION-gated blocking, a severity_rank/
STRIX_MAX_SEVERITY_RANK threshold check) the driver's simple_scan
template didn't anticipate matching text for, so running it failed
loudly rather than corrupting anything.

Reconciled by hand instead of patching the driver's brittle string
matches: confirmed the fallback-model system was already present at
this branch's own base commit (not a later regression -- gutting it
entirely was always the intended scope), then applied the equivalent
repair directly -- strix_quick_gate.sh's run_current_target_scan now
issues one governed request via run_strix_once and fails closed on
anything else, with no repository-authored retry, model fallback, or
severity-threshold admission; strix.yml drops the outer 3-attempt
backoff loop and the STRIX_LLM_MAX_RETRIES/STRIX_TRANSIENT_RETRY_*/
STRIX_FAIL_ON_MIN_SEVERITY env vars; test_required_workflow_queue_
contract.py's stale assertion is fixed to match.

Fixed the resulting ripple in six tests across four files that
exercised the removed is_transient_same_model_retry_error/
github_models_rate_limit_should_skip_same_model_retry/
run_strix_with_transient_retry orchestration directly: three
(Caido bootstrap timing, ModelBehaviorError, NVIDIA NIM 404) were
narrowed to assert only that each signal classifier still feeds
has_detected_infrastructure_error, since same-model retry and
cross-model fallback no longer exist to wire into; two
multi-attempt-specific assertions in the exempted-finding regression
were removed as testing behavior that no longer exists, keeping the
still-valid single-attempt/never-retries coverage; one now-stale
comment reference to a removed function was corrected.

Removed source_fix_strix_no_heuristic_retry_severity.py and its
companion workflow per the driver's own documented one-shot lifecycle
("deletes it after RED-before-repair and focused GREEN verification
succeed") now that the repair it existed to apply is complete.
Recorded the reconciliation in this doctoring entry's addendum.

Full local triad: 2815 passed (22 pre-existing failures unrelated to
this PR -- the same main-side admission-controller-burst/cron-cadence
gap tracked and fixed in .github#1871, unaffected by this diff);
coverage and docstring gaps match that same pre-existing baseline
exactly, with zero new gaps from this change.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@seonghobae

Copy link
Copy Markdown
Contributor Author

Completed the no-heuristics retry/severity repair (commit 15027c19)

main had moved substantially since this branch's RED-before-repair commits and its one-shot source_fix_strix_no_heuristic_retry_severity.py driver were authored — run_current_target_scan had grown a full cross-model fallback loop the driver's simple_scan template didn't anticipate matching text for, so running it failed loudly (by design) rather than corrupting anything.

Reconciled by hand instead of patching the driver's brittle string matches: confirmed the fallback-model system was already present at this branch's own base commit (not a later regression — gutting it entirely was always the intended scope), applied the equivalent repair directly to strix_quick_gate.sh/strix.yml, fixed the resulting ripple in 6 tests across 4 files that exercised the removed retry/fallback orchestration directly, and removed the driver + its companion workflow per their own documented one-shot lifecycle. Full details in the doctoring doc's new addendum.

Full local triad: 2837 passed (0 failures — main's own admission-controller-burst/cron-cadence gap this branch was also hitting has since been fixed upstream); coverage and docstring gaps match the same pre-existing main-side baseline with zero new gaps from this diff.

Separate, pre-existing gap found while verifying (NOT introduced by this fix, NOT yet addressed)

scripts/ci/test_strix_quick_gate.sh (the 13,124-line bash self-test agent-review-runtime-quality-ci.yml actually runs) currently reports 949 failures on this branch. Verified this is unrelated to today's retry/severity work, not a regression from it:

  • Diffed the exact failure set before (cbbab945, this branch's head before today's commit) vs after (15027c19) — identical set of 949 failures, byte-for-byte the same scenario/assertion descriptions.
  • The failures are all ERROR: Strix model must be orchestrator/free through contextual-orchestrator; direct provider/model routes are forbidden: '<direct-provider-model>' — i.e. this test file's ~900+ fixture scenarios still exercise direct OpenAI/Vertex/GitHub-Models routing and multi-model fallback chains that the earlier orchestrator/free-only commits on this branch (2083a72d/10c1ddf8) already reject at the normalization boundary. This PR's diff never touches test_strix_quick_gate.sh.
  • Confirmed main's own strix_quick_gate.sh has zero occurrences of the orchestrator/free restriction string at all — the migration hasn't landed there yet, so this is branch-specific debt, not something already broken on main.

This needs a dedicated rewrite of test_strix_quick_gate.sh's fixtures (retarget scenarios to orchestrator/free-style models, or drop/restructure the ones that only make sense for a direct-provider-fallback architecture that no longer exists) before this PR's required agent-review-runtime-quality check can pass. Flagging separately rather than attempting it in this pass — out of scope for the retry/severity fix and large enough to warrant its own review.

🤖 Generated with Claude Code

@seonghobae

Copy link
Copy Markdown
Contributor Author

Superseded by #1880. This draft correctly identified repository-side full-scan retries as queue amplification, but it also changed the shared model normalizer to reject every provider-specific model. The full test_strix_quick_gate.sh suite then failed across PR-head materialization, unsafe-path rejection, manifest vulnerability enforcement, credential validation, Vertex, GitHub Models, and direct-OpenAI/manual contracts because those cases exited before exercising their protected behavior. Current main already restricts the actual required Strix workflow input to contextual-orchestrator/orchestrator/free. #1880 removes only the outer retry/backoff/sleep layer, keeps the shared gate contracts intact, and passes actionlint, 64 focused tests, 109 Strix tests plus 21 subtests, and the full shell self-test.

@seonghobae seonghobae closed this Sep 5, 2026
…uest routing

The bash self-test still described the pre-migration architecture and reported
949 failures on this branch's head. Drive it to zero without letting the rewrite
bless behaviour the migration did not intend to remove.

Retargeted, not deleted, wherever the subject survives:
- 119 invocations moved to the gateway contract (orchestrator/free, the pinned
  loopback base, and the single-attempt model/api-base sequences).
- 16 provider-routing scenarios now assert the policy boundary itself: a direct
  provider route exits 2 with "direct provider/model routes are forbidden".
  These cover the new boundary, which nothing else tested.
- preserve-existing-api-base and the untrusted-api-base case had their expected
  outcome inverted, because the gate got stricter: it now pins the loopback
  rather than keeping a caller-supplied base, and refuses an api-base file
  outside the trusted root rather than ignoring it.
- Six new fail-closed scenarios replace the deleted fallback cluster's signal
  coverage (rate limit, resource-exhausted, quota, token limit, timeout), plus a
  negative control so the provider-unavailable and generic-failure branches
  cannot silently collapse into one.

Deleted only where the mechanism is gone: 86 multi-attempt scenarios, 11
severity-threshold and fallback-config scenarios, the GitHub Models HTTP 410
cluster (unreachable behind is_github_models_api_compatible_model), and five
assert_model_requires_vertex_auth calls whose helper normalises internally and
can no longer return 0.

Also restores three pull-request-scope calls in run_current_target_scan.
15027c1 rewrote that function by hand right after a merge from main introduced
evaluate_pull_request_findings, and dropped all of its call sites along with
fail_unmapped_threshold_report and should_fail_pull_request_infra_zero_findings.
None of those belong to the "repository-authored retry, model fallback, or
severity-threshold admission" this change set out to remove; without them the
gate fails a pull request on findings confined to files it never modified, and a
zero-findings result produced while the provider was failing reads as a clean
scan. load_pull_request_head_sha is left alone: it is orphaned on main too.

Verified against an unmodified clone of this same branch head: the self-test goes
949 -> 0, and the rest of the suite is unchanged at 22 failed / 2815 passed,
coverage 99%, interrogate 98.3%. Those pre-existing failures are branch staleness
(34 commits behind main, missing #1883's coverage and docstring repair) and are
not touched here.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@seonghobae

Copy link
Copy Markdown
Contributor Author

자가 테스트를 새 아키텍처에 맞춰 재작성했습니다. 949 → 0, 커밋 17c5fb87.

무엇을 지웠고 무엇을 재조준했는지, 그리고 테스트가 아닌 프로덕션 코드를 한 곳 건드린 사실을 함께 남깁니다.

재조준 (주제가 살아 있는 것)

대상 건수 새 계약
게이트웨이 계약으로 이동 119 orchestrator/free + 고정 loopback base + 단일 시도 시퀀스
직접 공급자 경로 → 경계 거부 16 exit 2 + direct provider/model routes are forbidden
기대 결과가 뒤집힌 것 2 아래 참조
fail-closed 대체 시나리오 신설 6 아래 참조

경계 거부 16건은 삭제하지 않고 남긴 이유가 있습니다. github_models/... 같은 경로가 이제 거부된다는 것 자체가 이 PR의 정책이고, 그걸 검증하는 테스트가 하나도 없었습니다. 원래 모델 문자열을 그대로 살려 두면 새 경계에 대한 커버리지가 생깁니다.

기대 결과가 뒤집힌 2건은 게이트가 더 엄격해진 경우입니다.

  • preserve-existing-api-base — 호출자가 준 LLM_API_BASE를 보존하면 조직 리뷰 트래픽이 제3자 엔드포인트로 갑니다. 이제 loopback을 고정하는 게 맞고, 그 고정을 검증합니다.
  • 신뢰 루트 밖 api-base 파일 — 조용히 무시하던 것이 이제 명시적으로 거부됩니다. 거부와 "strix 미호출"을 함께 봅니다.

신설 6건은 삭제한 fallback 클러스터가 덮던 신호 분류(rate limit / resource-exhausted / quota / 413 / timeout)를 단일 요청 계약으로 되살린 것입니다. 음성 대조군을 하나 같이 넣었습니다 — 양성만 있으면 게이트가 모든 실패에 STRIX_PROVIDER_UNAVAILABLE을 붙여도 통과하므로, 두 분기가 조용히 합쳐지는 걸 막습니다.

삭제 (기전 자체가 사라진 것)

  • 다중 시도 86건 — fallback 체인, 동일 모델 재시도
  • severity 임계값·fallback 설정 11건
  • GitHub Models HTTP 410 클러스터 7건 + 드라이버 — 게이트의 410 분류 코드는 남아 있지만 호출부가 is_github_models_api_compatible_model 가드 뒤에 있고 orchestrator/freeopenai/orchestrator/free도 그 패턴에 매칭되지 않습니다. 도달 불가
  • assert_model_requires_vertex_auth 5건 — 헬퍼가 내부에서 normalize_model을 호출하므로 free-only에서 절대 0을 반환할 수 없고, 게이트 호출부도 0곳

삭제 판단은 프로덕션 파일의 고아 함수 전수 조사로 했습니다(주석 언급은 참조에서 제외 — 이걸 안 빼면 has_only_below_threshold_vulnerabilities가 "호출됨"으로 잘못 잡힙니다). 고아 10개 중 6개가 이 PR이 명시한 제거 대상에 속했고, 그 6개에 의존하는 시나리오만 지웠습니다.

프로덕션 코드 수정 — 검토 부탁드립니다

scripts/ci/strix_quick_gate.shrun_current_target_scan에 호출 세 개를 되살렸습니다.

evaluate_pull_request_findings                main :2933 :4352 :4433
fail_unmapped_threshold_report                main :4367 :4448
should_fail_pull_request_infra_zero_findings  main :4470

이력: 이 브랜치는 evaluate_pull_request_findings가 없던 base에서 출발했고, 4e401d6d 머지로 main의 그 함수와 호출부가 들어왔으며, 15027c19머지가 방금 바꿔놓은 바로 그 함수를 손으로 다시 쓰면서 호출부가 함께 사라졌습니다.

되살린 이유: 커밋 메시지가 명시한 제거 대상은 "repository-authored retry, model fallback, or severity-threshold admission" 셋인데, PR 스코프 판정은 그중 어디에도 속하지 않습니다. 이게 없으면 PR이 건드리지도 않은 파일의 finding으로 PR이 실패하고(allow_baseline 상실), 공급자가 고장난 채 나온 findings 0건이 깨끗한 스캔으로 읽힙니다.

되돌리는 법: git checkout <this-commit>~1 -- scripts/ci/strix_quick_gate.sh 한 줄입니다. 의도된 제거였다면 되돌리시고, 그 경우 위 55개 시나리오의 기대값을 현재 동작에 맞추는 별도 작업이 필요합니다.

load_pull_request_head_sha복원하지 않았습니다 — main에서도 고아라 이 브랜치가 떨어뜨린 게 아닙니다.

mainblock_manifest_unverified 대신 이 브랜치가 실제로 대입하는 block_manifest_finding을 썼습니다. main 코드를 그대로 옮겼으면 매니페스트 차단이 조용히 통과했을 겁니다.

검증

손대지 않은 같은 브랜치 head 클론을 별도로 만들어 기준선을 재고 비교했습니다.

                     기준선(15027c19)      이 커밋
자가 테스트           949 failures         PASS (0)
pytest               22 failed/2815 passed  22 failed/2815 passed
coverage             99%                   99%
interrogate          98.3%                 98.3%

제 변경이 새로 만든 실패는 0건이고 두 백분율 모두 그대로입니다. 남은 22건과 99%/98.3%는 브랜치가 main보다 34커밋 뒤처져 생긴 staleness입니다 — 99%/98.3%는 오늘 main#1883 이전에 보이던 값과 정확히 일치하고, 실패 테스트도 test_hourly_review_repair_callers / test_noema_orchestrator_workflow_contract / test_strix_rerun_job_selection으로 이 작업 표면과 무관합니다. main을 머지하면 해소되는 항목이라 여기서는 손대지 않았습니다.

관찰 (수정하지 않음)

is_github_models_unavailable_model_error의 HTTP 410 분류 로직은 남아 있지만 is_github_models_api_compatible_model 가드 때문에 free-only 라우팅에서는 호출될 수 없습니다. 프로덕션 정리라 이 PR 범위 밖으로 두고 기록만 합니다.

main already carries docs/adr/0021-hourly-review-repair-single-file-consolidation.md,
which arrived on this branch through a merge from main. Two ADRs cannot share a
number, and 0021..0027 are all taken on main, so this one becomes 0028.

Only the ADR's own file and title move. The other ADR-0021 mentions on this branch
(ARCHITECTURE.md, CHANGELOG.md, docs/doctoring/scheduler-target-list-drift-20260902.md)
all refer to the hourly-review-repair consolidation and stay as they are.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@seonghobae seonghobae reopened this Sep 5, 2026
@seonghobae

Copy link
Copy Markdown
Contributor Author

재오픈합니다. "Superseded by #1880" 폐쇄는 승계 검증을 통과하지 못합니다. 근거를 붙입니다.

#1880은 이 PR의 15개 파일 중 2개만 들고 갔습니다

#1668 (15 files)                                    #1880 (2 files, merged 09-05T02:09)
  .github/workflows/strix.yml           +5/-51        .github/workflows/strix.yml           +5/-52   ✓
  tests/test_strix_backend_unavailable… +2/-24        tests/test_strix_backend_unavailable… +6/-24   ✓
  scripts/ci/strix_quick_gate.sh        +15/-292      —
  scripts/ci/strix_model_utils.sh       +9/-33        —
  docs/adr/00xx-strix-orchestrator-free… +40          —
  tests/test_strix_orchestrator_free_only.py +56      —
  tests/test_strix_no_heuristic_retry_contract.py     —
  tests/test_strix_no_heuristic_severity_contract.py  —
  + 7 more                                            —

#1880이 승계한 것은 strix.yml의 바깥 재시도 루프 제거뿐입니다. 이 PR의 핵심 — orchestrator/free 전용 모델 경계, 게이트 스크립트의 fallback/retry/severity 휴리스틱 제거, 그 계약 테스트 셋, ADR — 는 어디에도 반영되지 않았습니다.

다른 경로로도 들어오지 않았습니다

git log origin/main -S'direct provider/model routes are forbidden' -- scripts/   →  (없음)
tests/test_strix_orchestrator_free_only.py on main                                →  ABSENT
scripts/ci/strix_model_utils.sh on main, boundary string                          →  0 occurrences

폐쇄 시점부터 지금까지 main의 어떤 커밋도 이 경계를 들여오지 않았습니다. 델타가 실재하고 미반영입니다.

이 저장소의 AGENTS.md "Supersession and constant-change review"가 정확히 이 형태를 다룹니다 — narrowing a PR isn't verified until you diff the union of successors against the original's full scope. 여기서 union은 2/15입니다.

브랜치에 지금 있는 것

15027c19  (폐쇄 시점 head)
17c5fb87  test(strix): 자가 테스트 949 → 0 재작성 — 이 PR 위 코멘트 참조
305e934a  docs(adr): ADR 0021 → 0028 재번호

ADR 재번호가 필요했던 이유: main에 이미 0021-hourly-review-repair-single-file-consolidation.md가 있고 이 브랜치에도 머지로 들어와 있어서 두 ADR-0021이 공존했습니다. 0021~0027이 전부 사용 중이라 0028로 옮겼고, 브랜치의 다른 ADR-0021 언급 세 곳은 전부 hourly ADR을 가리키는 것이라 그대로 뒀습니다.

병합 전 필요한 것

  • main보다 34커밋 뒤처져 있습니다. 현재 22건의 pytest 실패와 coverage 99% / interrogate 98.3%는 이 브랜치의 변경이 아니라 #1883 미수신 때문이며(손대지 않은 같은 head 클론으로 기준선 대조 완료 — 제 변경의 순효과 0), main 머지로 해소됩니다.
  • strix_quick_gate.shrun_current_target_scan에 PR 스코프 판정 호출 셋을 복원했습니다(17c5fb87). 커밋이 명시한 제거 대상(retry/fallback/severity)에 속하지 않는 것이 재작성에 딸려 사라진 것이라 되살렸고, 의도된 제거였다면 git checkout 17c5fb87~1 -- scripts/ci/strix_quick_gate.sh 한 줄로 되돌릴 수 있습니다.

재오픈은 폐쇄를 되돌리는 것이지 병합 판단이 아닙니다. 리뷰 파이프라인이 지금 멈춰 있어서(#1927 · #1929 · #1931) 체크는 당분간 안 붙습니다.

One conflict in tests/test_strix_backend_unavailable_after_exempted_finding.py:
both sides added a workflow-contract method at the same spot. main's (#1880)
is a superset of this branch's -- it also asserts the retry knobs are absent
and shares the no-wall-clock-deadline tail -- so main's method is kept and
the branch's duplicate header dropped. No production code touched by hand.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@seonghobae

Copy link
Copy Markdown
Contributor Author

Merged main (7f4c5e3e) into this branch — 82b19c41. CI on this PR is now readable.

The branch was 38 commits behind. One conflict, in tests/test_strix_backend_unavailable_after_exempted_finding.py: both sides added a workflow-contract method at the same spot. main's (#1880, test_workflow_uses_one_gateway_owned_attempt_without_wall_clock_budget) is a superset of this branch's test_workflow_imposes_no_wall_clock_inference_deadline — it also asserts the retry knobs are absent and shares the four no-wall-clock-deadline assertions — so main's method was kept and the branch's duplicate header dropped. No production code was touched by hand. main's three added lines in scripts/ci/test_strix_quick_gate.sh (#1877/#1889/#1892/#1895) all survive the merge; #1668's strix.yml hunks (:928-988) do not touch the concurrency: block that #1938 owns. ADR 0028 is still free on main (0020–0027 taken).

Verification on 82b19c41 with GITHUB_ACTIONS=true: scripts/ci/test_strix_quick_gate.sh → rc 0, test_strix_quick_gate: PASS; coverage run -m pytest tests → 2898 passed / 1 skipped; coverage report --fail-under=100 → 100%; interrogate → 100%. Net delta vs main: 15 files, +1309 / −3995.

Note for whoever reads the checks: the scheduler guard #1937 is on main, so this head's queued checks will no longer be cancelled by a pre-review branch update.

@seonghobae
seonghobae marked this pull request as ready for review September 5, 2026 16:18
@seonghobae

Copy link
Copy Markdown
Contributor Author

Marked ready for review. This PR was a draft, and the pipeline never issues a formal APPROVE on a draft (opencode_review_receipt_gate.py, noema_review_gate.py, pr_auto_rebase.py and CodeRabbit all skip drafts — see the triage note in #1913), so it could not have merged in that state regardless of its checks. The head 82b19c41 had no accumulated checks yet, so the ready_for_review re-fan-out costs nothing. I did not open this PR, but the work on it was assigned to me explicitly (reopen, self-test rewrite, main merge), which is why I am acting as its owner here.

@seonghobae

Copy link
Copy Markdown
Contributor Author

Reverted to draft. The PR body carries an explicit hold that I missed before flipping it: "Keep Draft until all one-shot workflows have self-removed and fresh exact-head tests/security/review gates are terminal. Pending/queued evidence is non-passing." An owner-stated hold stands regardless of whether its condition is currently reachable, so the earlier ready-for-review flip was mine to undo (gh pr ready --undo, head 82b19c41 unchanged).

One finding is left here as an owner decision, not acted on: the second half of that condition cannot be met while the PR is a draft — opencode_review_receipt_gate.py refuses a bot APPROVE on a draft, noema_review_gate.py skips drafts, pr_auto_rebase.py disqualifies drafts, and CodeRabbit does not review drafts (see #1913). "Fresh exact-head review gates terminal" therefore only happens after the flip, not before it. The first half (one-shot workflows self-removed) is a content criterion and is checkable on this head. If you want this PR to proceed, flip it yourself; I will not flip it again.

@seonghobae

Copy link
Copy Markdown
Contributor Author

Checked the first half of the draft hold on the current head 82b19c41: the only workflow file this branch changes relative to main is .github/workflows/strix.yml (hunks at :928-988, not the concurrency: block). The exact-text guarded repair workflow from e31d7d21 has self-removed; no one-shot workflow remains on the branch. So "all one-shot workflows have self-removed" is satisfied; the remaining half (fresh exact-head review gates terminal) is the part that only starts after a flip, as noted above. Also corrected the PR body's ADR-0021 references to ADR-0028 (the ADR was renumbered on this branch because main already carried a different 0021); body edits do not trigger workflows.

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

Labels

documentation Improvements or additions to documentation priority: high High-priority or P1 work status: draft Draft pull request type: bug Defect or incorrect behavior

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant