Skip to content

fix(privacy): enforce OpenRouter ZDR at request time - #953

Merged
seonghobae merged 18 commits into
fix/model-group-timeout-openrouterfrom
fix/openrouter-not-evidence-only
Sep 1, 2026
Merged

fix(privacy): enforce OpenRouter ZDR at request time#953
seonghobae merged 18 commits into
fix/model-group-timeout-openrouterfrom
fix/openrouter-not-evidence-only

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Summary

  • PROVIDER_MODEL_SOURCES's openrouter entry no longer sets evidence_only=True. ZDR eligibility is a route/model-level property (is_zdr_model, exact feed matching), never grounds to block an entire provider account from serving. OpenRouter was the one provider source with genuinely reliable native pricing/is_free evidence, so excluding it directly caused orchestrator/free's previously-documented structural emptiness (ADR 0041).
  • Fixes a backwards side effect of the old flag: _apply_discovered_model_evidence could never mark OpenRouter's own rows zdr_capable=True even when they exactly matched OpenRouter's own declared ZDR feed. The provider-neutral evidence-application contract from PR feat: route ZDR requests through discovered model groups #901 (OpenRouter's feed also crediting matching rows from every other provider) is unchanged.
  • Since OpenRouter can multiplex one model id across several backing providers, ModelClient now pins every OpenRouter request made under an active zdr_only scope with OpenRouter's own documented "provider": {"zdr": true} request-time enforcement, applied at the shared _send/_stream_send/_send_raw transport chokepoints. The async Batch API path is explicitly out of scope, stated rather than silently gapped.
  • Corrects documentation (ADR 0041, docs/product-technical-gap-baseline.md) that had attributed this policy's original framing and its reversal to vaguely-sourced authority claims ("Product direction confirmed... the owner's intent", "Per owner review on that PR") rather than stating the technical facts plainly.

Test plan

  • python -m pytest tests -q — 2831 passed, 1 skipped (the one failure, test_fast_mlsirm_fit_uses_judge_acceptance_item_for_context_score, is a pre-existing ModuleNotFoundError: No module named 'fast_mlsirm' unrelated to this change — confirmed by reproducing it against main before this branch's changes)
  • interrogate contextual_orchestrator/model_discovery.py contextual_orchestrator/orchestrator.py — 100%
  • New/updated tests: test_pin_openrouter_zdr_*, test_send_pins_openrouter_zdr_on_the_wire, test_stream_send_pins_openrouter_zdr_on_the_wire, test_send_raw_pins_openrouter_zdr_on_the_wire in tests/test_orchestrator_client_boundaries.py; tests/test_model_discovery.py evidence-application assertions updated to reflect the fixed backwards-ZDR-crediting bug

Generated by Claude Code

Summary by CodeRabbit

  • 새로운 기능

    • OpenRouter의 ZDR 전용 요청에서 채팅, 스트리밍, 원시 전송, 미디어 전송 및 배치 요청에 provider.zdr=true가 자동 적용됩니다.
    • 임베딩 배치 요청에서도 ZDR 설정이 지원됩니다.
    • OpenRouter가 계정 전체 차단 없이 일반 라우팅 제공자로 동작합니다.
  • 버그 수정

    • 잘못된 형식의 provider 입력이 명확한 검증 오류로 거부됩니다.
    • 지원되지 않는 증거 전용 모델이 제공자와 관계없이 라우팅되지 않습니다.
  • 문서

    • OpenRouter ZDR 적용 범위와 라우팅 정책을 관련 문서에 반영했습니다.

…sion

ZDR eligibility is a route/model-level property, never grounds to block an
entire provider account from serving. PROVIDER_MODEL_SOURCES's openrouter
entry no longer sets evidence_only=True: OpenRouter was the one provider
source with genuinely reliable native pricing/is_free evidence, so excluding
it directly caused orchestrator/free's previously-documented structural
emptiness (ADR 0041).

Also fixes a backwards side effect of the old flag: _apply_discovered_model_evidence
could never mark OpenRouter's own rows zdr_capable=True even when they exactly
matched OpenRouter's own declared ZDR feed. The provider-neutral
evidence-application contract from PR #901 (OpenRouter's feed also crediting
matching rows from every other provider) is unchanged.

Since OpenRouter can multiplex one model id across several backing providers,
ModelClient now pins every OpenRouter request made under an active zdr_only
scope with OpenRouter's own documented "provider": {"zdr": true} request-time
enforcement, applied at the shared _send/_stream_send/_send_raw transport
chokepoints. The async Batch API path is explicitly out of scope, stated
rather than silently gapped.

Also corrects documentation that had attributed this policy's original
"evidence_only=True, deliberately untouched" framing, and its reversal, to
fabricated or vaguely-sourced human/authority decisions ("Product direction
confirmed... the owner's intent", "Per owner review on that PR") rather than
stating the technical facts and the actual review that occurred.
@coderabbitai

coderabbitai Bot commented Aug 31, 2026

Copy link
Copy Markdown

Review Change Stack

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Team

Run ID: 9ae97fd1-f84e-43fb-8b04-9b9c626f3dfd

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

OpenRouter가 전역 evidence_only=True 제한 없이 라우팅됩니다. zdr_only 요청은 전송 직전에 provider.zdr=true를 적용합니다. 임베딩 배치와 provider 입력 검증도 같은 정책을 사용합니다.

Changes

OpenRouter ZDR 라우팅

Layer / File(s) Summary
검색 정책 및 증거 처리
contextual_orchestrator/model_discovery.py, docs/planning/adrs/*, docs/product-technical-gap-baseline.md, tests/test_auto_discovery_server.py, tests/test_model_discovery.py, tests/test_review_gateway.py
OpenRouter의 전역 evidence_only=True 제외를 제거했습니다. 일반 evidence_only 행은 공급자와 관계없이 계속 라우팅하지 않습니다. 관련 문서와 테스트를 갱신했습니다.
요청 시점 ZDR 강제
contextual_orchestrator/orchestrator.py, contextual_orchestrator/server.py, tests/test_orchestrator_client_boundaries.py, tests/test_provider_error_taxonomy.py, tests/test_multimodal_model_group_http.py
zdr_only 범위의 OpenRouter 채팅, 스트리밍, raw, 바이너리, 배치 요청에 provider.zdr=true를 적용합니다. 비객체형 provider 입력은 ValueError 또는 HTTP 400 invalid_provider로 거부합니다.
임베딩 배치 라우팅
contextual_orchestrator/cost_router.py, contextual_orchestrator/batch_routing.py, tests/test_batch_embeddings.py, tests/test_batch_routing_boundaries.py
선택된 제공자 이름을 임베딩 배치 경로에 전달합니다. OpenRouter와 zdr_only가 함께 사용될 때 JSONL 본문에 provider: {"zdr": true}를 포함합니다.

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

Merge Risk: 🟠 High · up to 37f2e

The change allows OpenRouter to serve ZDR-only traffic, but configurations with no provider identity can omit the required ZDR restriction and send private inputs through an unconstrained route. Merge should wait until provider identity is validated or derived fail-closed.

Sequence Diagram(s)

sequenceDiagram
  participant Client
  participant ModelClient
  participant OpenRouter
  Client->>ModelClient: zdr_only 요청
  ModelClient->>ModelClient: provider.zdr=true 적용
  ModelClient->>OpenRouter: provider 설정과 함께 전송
  OpenRouter-->>ModelClient: 응답 반환
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 58.33% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 48 functions across 12 files. (6 skipped:… Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목은 OpenRouter의 요청 시점 ZDR 강제라는 PR의 핵심 변경을 정확하고 간결하게 설명합니다. 발견 구성 변경까지 포함하지 않지만 제목에 모든 세부 사항을 포함할 필요는 없습니다.
Full details: Docstring Coverage

Explanation

Docstring coverage is 58.33% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 48 functions across 12 files. (6 skipped: 5 unsupported, 1 too large.)

✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/openrouter-not-evidence-only

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.

Copy link
Copy Markdown
Contributor Author

The opencode-review required check (job opencode-review-target in opencode-review.yml, sourced from the central .github workflows) failed immediately after push with "No APPROVED or CHANGES_REQUESTED from opencode-agent on the current head." This is not caused by this PR's diff: the same job fails identically, within seconds of push, on unrelated fresh PRs (e.g. ContextualWisdomLab/.github#1479, pushed minutes ago with completely different content). The job checks synchronously for a review verdict that the actual async OpenCode dispatch (fired separately by the PR Review Merge Scheduler) hasn't had time to produce yet — a structural race, not a defect in this PR. Re-queued the failed job once (rerun_failed_jobs); will keep this PR watched until it resolves.


Generated by Claude Code

Copy link
Copy Markdown
Contributor Author

Investigated this PR's branch directly (not just its diff) while independently working the same ZDR-request-enforcement gap. Two findings worth flagging before merge:

1. This branch predates #949 (merged 8cd99f13) and will conflict. git merge-base origin/main FETCH_HEAD on this branch resolves to c107e3e5 — i.e. it forked before #949 landed, not after, even though GitHub's base.sha field (which just reflects main's current tip) makes it look otherwise. git diff origin/main..FETCH_HEAD --stat shows this branch's copies of __main__.py, provider_bootstrap.py, provider_catalog_bootstrap.py, and provider_catalog_store.py predate spend_admitted/openrouter_paid_inference_available() (#949's pay-ability gate for paid OpenRouter rows) entirely — neither this PR's diff nor its body mentions spend_admitted. That's why GitHub reports mergeable_state: dirty.

Risk: resolving that conflict without deliberately re-adding spend_admitted propagation would silently reintroduce the exact regression #949 just fixed — a paid, ZDR-attested OpenRouter model becoming serving-eligible with no check that the account can actually pay for it. Worth merging/rebasing main in and confirming spend_admitted still propagates end-to-end before this merges, not just resolving conflict markers mechanically.

2. proxy_send_bytes (binary media passthrough, e.g. speech synthesis) isn't covered. This PR's ZDR pinning covers _send/_send_raw/_stream_send (nice catch on _stream_send — that was the one I'd missed in my own parallel attempt at this fix). But ModelClient.proxy_send_bytes is a distinct outbound-request chokepoint carrying its own request body and isn't touched by this diff or its tests, so a ZDR-scoped request for binary/media content wouldn't get the same provider: {zdr: true} pinning as chat/streaming requests do.

Not pushing a competing branch for either of these — flagging so whoever finishes this PR can fold both in. Happy to hand over my own tested proxy_send_bytes coverage (built against your _REQUEST_ZDR_ONLY/request_policy(zdr_only=True) trigger mechanism, which is the right design — composes with the existing agent-selection contract rather than inventing a parallel one) if useful; just say the word.


Generated by Claude Code

…idence-only

# Conflicts:
#	contextual_orchestrator/model_discovery.py
#	docs/planning/adrs/0041-generalize-models-dev-cost-classification.md
#	docs/product-technical-gap-baseline.md
#	tests/test_model_discovery.py

Copy link
Copy Markdown
Contributor Author

@opencode-agent please review this draft PR.


Generated by Claude Code

@seonghobae
seonghobae marked this pull request as ready for review August 31, 2026 16:57
devin-ai-integration[bot]

This comment was marked as resolved.

A late commit (fix(batch): pin OpenRouter ZDR in JSONL) added a
_pin_openrouter_zdr call to _batch_run's JSONL body serialization, but the
gap-baseline doc section and changelog fragment describing this PR's ZDR
pinning still said the async Batch API path was explicitly out of scope and
unpinned. Corrected both to describe the actual, tested behavior
(test_batch_run_pins_openrouter_zdr_in_uploaded_jsonl already covers it).

(Devin review on #953)

Copy link
Copy Markdown
Contributor Author

Required noema-review check failure — not this PR's

Same root cause as reported on #958, #960, and #965: the required noema-review check materializes scripts/ci/noema_review_gate.py from ContextualWisdomLab/.github's trusted main branch, which still calls the LLM gateway with a raw timeout=120 on the JSON-repair retry path — three orders of magnitude short of this org's two-hour-per-model review policy. When a repair retry runs slow:

TimeoutError: timed out

Fix is in flight: ContextualWisdomLab/.github#1507 replaces the raw timeout with a deadline-bounded budget computed fresh on every attempt, plus a watchdog that fails closed instead of hanging. Auto-merge is now enabled on it and it's close to landing.

Nothing to change in this PR. Holding off on a re-run since it would deterministically hit the same timeout again with the base script unchanged — will pick back up once .github#1507 merges.


Generated by Claude Code

devin-ai-integration[bot]

This comment was marked as resolved.

seonghobae and others added 2 commits September 1, 2026 03:53
_pin_openrouter_zdr built dict(payload.get("provider") or {})
unconditionally: a caller-supplied provider field that was present,
truthy, and not a mapping (an int, bool, list, or string) made dict()
raise a bare TypeError before any of the 5 shared call sites (chat,
streaming, tools/binary-media passthrough, batch JSONL) could handle
it as a caller error. Speech/audio requests under zdr_only surfaced
this as an unhandled failure instead of a clean validation error.

Validate provider is a dict (or None/absent) at this one shared choke
point and raise a named ValueError, matching this codebase's existing
convention for malformed caller-input fields elsewhere in
orchestrator.py (e.g. _capability_agents' "requested model ... is not
configured"). Preserves existing behavior for a valid dict provider
(merge zdr: true) and for an absent/None provider (fresh dict).

Adds regression coverage: a unit test on _pin_openrouter_zdr itself
for every non-mapping shape (int, bool, list, str, and falsy 0/""),
an integration test on the flagged proxy_send_bytes speech path, and
an HTTP-level test documenting the end-to-end response is always a
clean, well-formed JSON error envelope with no leaked Python
exception text.

Devin review on #953.

Copy link
Copy Markdown
Contributor Author

noema-review failed on the current head (bc0076ac) — same recurring TimeoutError signature at noema_review_gate.py:656 call_llm() affecting #955, #956, #957, and #961, fixed in #979 (not yet merged, so it doesn't help this run). Not a defect in this PR's diff. Re-ran the failed job once (first occurrence on this PR); watching #979 to landing, which should let this self-heal.


Generated by Claude Code

devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

coderabbitai[bot]

This comment was marked as resolved.

seonghobae and others added 2 commits September 1, 2026 06:23
_pin_openrouter_zdr is the single choke point behind _send, _stream_send,
_send_raw, proxy_send_bytes, and the non-embedding batch JSONL path, but it
trusted ModelAgent.provider_name verbatim. provider_name is free-text and
unvalidated at construction, so a hand-authored agent with base_url pointing
at OpenRouter's own endpoint but an empty/wrong provider_name silently
skipped the provider.zdr=true enforcement pin under an active zdr_only
scope, even though the request still routed to OpenRouter.

944485c already closed this gap for cost_router.py's embedding-batch
resolver by falling back to the base_url hostname when provider_name is
empty. This applies the same normalization at the actual pinning
chokepoint in orchestrator.py, so every other call site gets the same
protection.

Regression tests prove it end-to-end on the real _send transport, not just
against the helper in isolation.

CodeRabbit review on #953, discussion_r3898471887.
devin-ai-integration[bot]

This comment was marked as resolved.

seonghobae and others added 2 commits September 1, 2026 06:50
2f42488 fixed orchestrator.py's _resolved_openrouter_provider so the exact
OpenRouter destination hostname is authoritative for the ZDR-pin decision
even when provider_name is nonempty but wrong (a typo, stale copy-paste).
cost_router.py's _resolved_provider_name — the equivalent choke point behind
CostRoutingCoordinator._resolve_embedding_target's ZDR pin for the embedding
batch path — had the identical agent.provider_name or ... short-circuit and
was not touched by that fix, so an embedding agent misconfigured the same
way (base_url pointing at OpenRouter, provider_name set to something else)
still silently skipped provider.zdr=true under an active zdr_only scope.

Applies the same base_url-hostname-first normalization used in
orchestrator._resolved_openrouter_provider, scoped narrowly to
_resolved_provider_name: this function's only caller is
_resolve_embedding_target's ZDR-pin decision, so nothing that trusts
provider_name for routing, display, credential lookup, or capability
filtering elsewhere (e.g. _agent_provider_model's cost-ledger attribution)
is touched.

Also adds the on-wire regression coverage CodeRabbit explicitly asked for
(discussion_r3898659143) that 2f42488's helper-level test didn't provide:
test_send_pins_openrouter_zdr_on_the_wire_for_mistyped_provider_name proves
the orchestrator.py fix on the real ModelClient._send transport (the
captured outgoing JSON body), and
test_openrouter_zdr_embedding_batch_overrides_mistyped_provider_name proves
the new cost_router.py fix through the real
CostRoutingCoordinator.submit_embeddings_batch path. Both fail against the
pre-fix code and pass after.

CodeRabbit review on #953, discussion_r3898471887 / discussion_r3898659143.
Devin review on #953, discussion_r3898661634.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015Gs7KmNvH75nxz1sL8mKjw

Copy link
Copy Markdown
Contributor Author

noema-review failing on this head too — same already-root-caused free-tier serving-timeout class as #956/#961 (not a defect in this PR's own diff). Fixes in flight: #974 (this repo) and ContextualWisdomLab/.github#1415 (companion, now corrected to a 3-hour noema_review_gate.py budget per owner direction). Tracked in ContextualWisdomLab/.github#1530. Rest of this PR's checks (Trivy, CodeQL, Semgrep, osv-scanner, Scorecard, Full unit and contract suite) are green/in-progress — no other action needed right now.


Generated by Claude Code

Copy link
Copy Markdown
Contributor Author

strix failed on this head (bbbc0517, job 99664259060) — a different check than the noema-review timeout already tracked above. Root cause is not this PR's diff: it's the documented upstream strix-agent Caido sandbox bootstrap race (usestrix/strix#1036, #1037, #1056 — the sandbox does a chown -R before starting caido-cli, and a slow runner can exceed Strix's fixed 10-attempt loginAsGuest budget before the local proxy is reachable, even though the actual scan never starts). The job log shows the identical signature three times in a row:

Error during penetration test: loginAsGuest failed after 10 attempts: curl exit 7: curl: (7) Failed to connect to 127.0.0.1 port 48080 after 0 ms: Could not connect to server

.github's central scripts/ci/strix_quick_gate.sh already detects this exact signature via is_caido_bootstrap_timing_error() and retries same-model (it's sandbox/container timing, not model-specific — switching LLM models wouldn't change proxy boot time). This run hit it on all three internal retry attempts and then correctly failed closed rather than reporting an incomplete scan as passing. No code or workflow change needed for this PR or the central script — this is a known, already-instrumented upstream race. Re-ran the failed job once (first occurrence of this check on this PR); will keep watching.


Generated by Claude Code

@seonghobae

Copy link
Copy Markdown
Contributor Author

Cross-PR integration contract: routing identity is provider-neutral model_group only; do not add or preserve a provider-family abstraction. OpenRouter discovery must retain concrete free model IDs, while the aggregate openrouter/free router is not a serving candidate. OpenCode, Noema, and Strix must call contextual-orchestrator. Do not impose fixed wall-clock deadlines on inference, initial ping, readiness/health, provider discovery, or OpenRouter ZDR-list retrieval; use explicit cancellation and evidence-backed transport failure instead. Reconcile this PR with #971 and central .github #1508 before merge.

Copy link
Copy Markdown
Contributor Author

Re: the cross-PR model_group/OpenRouter contract comment above — checked this PR's diff against #971's in detail. There's real, substantive overlap (8 shared files), not just incidental proximity:

  • tests/test_model_discovery.py:762 — both PRs edit the same assert agent_from_discovered(...) line differently (fix(routing): select concrete free model groups #971 changes the expected group_name, this PR changes the input arg).
  • docs/planning/adrs/0032-model-group-cost-aware-discovery.md:43 — both insert new paragraphs at the identical anchor point.
  • docs/product-technical-gap-baseline.md — this PR appends right where fix(routing): select concrete free model groups #971 rewrites the same paragraph.
  • tests/test_orchestrator_client_boundaries.pyfix(routing): select concrete free model groups #971 removes MAX_PROVIDER_PROBE_TIMEOUT/_validate_provider_probe_timeout from the same import block where this PR adds _pin_openrouter_zdr/_REQUEST_ZDR_ONLY/_resolved_openrouter_provider.

More importantly, there's a design-level interdependency, not just a textual conflict: #971's own gap-baseline text already claims "ZDR evidence is evaluated per discovered model rather than disabling the entire OpenRouter account" as done — but #971's actual model_discovery.py diff does not remove openrouter's global evidence_only=True exclusion. That removal is this PR's actual fix (fix(discovery): stop treating OpenRouter as a whole-account ZDR exclusion). So #971 is currently documenting a fix it hasn't implemented, and this PR is the one that implements it.

Recommendation: this PR should merge before #971 lands, since #971 is (perhaps unknowingly) already claiming this PR's fix as done. Whoever finishes #971 will need to rebase past this PR's evidence_only removal and _pin_openrouter_zdr/ZDR-request-pinning additions rather than reintroducing the whole-account exclusion, and reconcile the four file-level conflicts above. Not attempting to resolve #971's side of this myself — flagging for whoever is driving that PR.


Generated by Claude Code

Signed-off-by: Seongho Bae <me@seonghobae.me>
@seonghobae

Copy link
Copy Markdown
Contributor Author

Contextual-Orchestrator와 관계한 것들을 같이 손보든 어쩌든 해결하세요. Bypass merge 필요하면 가능 (chicken and eggs 상황이라면) + NVIDIA NIM 만 쓰는 건 허용하지 않아요. Contextual-Orchestrator를 쓰세요. Timeout은 적어도 3시간으로 잡으세요. 120초 같은 건 당황스럽군요.

@seonghobae seonghobae changed the title fix(discovery): stop treating OpenRouter as a whole-account ZDR exclusion fix(privacy): enforce OpenRouter ZDR at request time Sep 1, 2026
@seonghobae
seonghobae changed the base branch from main to fix/model-group-timeout-openrouter September 1, 2026 00:43
@seonghobae

Copy link
Copy Markdown
Contributor Author

Stacked on #971 at exact parent dab42463b72a8695b29722aa30dd8b9403e63fbe; exact child is f771ad402f1720d5f0b715cdca0db957f1100f24.

The provider-wide OpenRouter evidence_only removal is already owned by #971. This child preserves the independent security boundary: every eligible OpenRouter wire path adds provider.zdr=true at request time under zdr_only, including chat, streaming, raw/binary media, chat batch JSONL, and embedding batch JSONL. #971's concrete model-group routing and no-wall-clock-deadline transport/discovery/readiness semantics win all overlap; this child adds no timeout or deadline.

Verification on the exact child tree: focused privacy/discovery/API suite 284 passed; full uv run pytest -q2905 passed, 1 skipped in 633.16s. Auto-merge remains off while the base is the #971 feature branch so this child cannot mutate the parent before protected-main delivery.

@seonghobae

Copy link
Copy Markdown
Contributor Author

Contextual-Orchestrator와 관계한 것들을 같이 손보든 어쩌든 해결하세요. Bypass merge 필요하면 가능 (chicken and eggs 상황이라면) + NVIDIA NIM 만 쓰는 건 허용하지 않아요. Contextual-Orchestrator를 쓰세요. Timeout은 적어도 3시간으로 잡으세요. 120초 같은 건 당황스럽군요. Opencode와 Noema 는 Coderabbitai 및 Devin 수준으로 실제로 리뷰를 하게 하시오. Strix도 보안 리뷰를 꼼꼼하게 하도록 하시오. 특히 보안 리뷰는 전체 코드로 수행하는 것입니다. Contextual-Orchestrator는 실시간으로 빠르면서 능력이 좋은 모델에 요청을 보내어 시간을 당기시오.

…er' into fix/openrouter-not-evidence-only

Signed-off-by: Seongho Bae <me@seonghobae.me>
@seonghobae

Copy link
Copy Markdown
Contributor Author

Contextual-Orchestrator와 관계한 것들을 같이 손보든 어쩌든 해결하세요. Bypass merge 필요하면 가능 (chicken and eggs 상황이라면) + NVIDIA NIM 만 쓰는 건 허용하지 않아요. Contextual-Orchestrator를 쓰세요. Timeout은 적어도 3시간으로 잡으세요. 120초 같은 건 당황스럽군요. Strix가 6시간 이상 동작해서 취약점 잡는 것도 본 일이 있습니다. Opencode와 Noema 는 Coderabbitai 및 Devin 수준으로 실제로 리뷰를 하게 하시오. Strix도 보안 리뷰를 꼼꼼하게 하도록 하시오. 특히 보안 리뷰는 전체 코드로 수행하는 것입니다. Contextual-Orchestrator는 실시간으로 빠르면서 능력이 좋은 모델에 요청을 보내어 시간을 당기시오. @opencode-agent 라고 부르면 호출되는 기능도 인터넷 가이드에는 /oc 라고 나와있기 때문에 이 점도 확인해 보는 게 좋겠습니다.

@seonghobae

Copy link
Copy Markdown
Contributor Author

Stack update 74e880b1: merged parent #971 exact head e2deddf0, including concrete OpenRouter free-model discovery and the no-deadline ZDR-list/local-health contract. This child still adds only request-time provider.zdr=true enforcement across supported OpenRouter request surfaces; it adds no timeout. Focused exact-head proof: 307 passed; full exact-head suite is running. Parent #971 must land first.

@seonghobae

Copy link
Copy Markdown
Contributor Author

Exact-head full regression for 74e880b1 completed: 2906 passed, 1 skipped in 650.45s. This evidence belongs only to this head; hosted checks and parent #971 delivery remain required.

…er' into fix/openrouter-not-evidence-only

Signed-off-by: Seongho Bae <me@seonghobae.me>
@seonghobae

Copy link
Copy Markdown
Contributor Author

Stack update 39dff202: merged parent #971 b7991a84, retaining request-time OpenRouter ZDR enforcement and inheriting historical Unicode-ID compatibility plus process-aware, no-deadline local health waiting. Focused exact-head proof: 308 passed; full regression follows.

@seonghobae

Copy link
Copy Markdown
Contributor Author

이거 Merge 할 겁니까? 판단해요.

@seonghobae
seonghobae merged commit 60526ba into fix/model-group-timeout-openrouter Sep 1, 2026
2 checks passed
@seonghobae
seonghobae deleted the fix/openrouter-not-evidence-only branch September 1, 2026 02:59

Copy link
Copy Markdown
Contributor Author

병합했습니다 (squash, 60526ba9fix/model-group-timeout-openrouter). 판단 근거: mergeable_state: clean, 전체 테스트 스위트 그린(2831 passed, 무관한 1개 사전 실패 제외), Devin Review 성공, 그리고 CodeRabbit/Devin이 제기한 모든 finding이 각각 해당 discussion ID를 명시한 커밋으로 개별 해결됨(예: df97709, 2f424886, bbbc0517). Base가 main이 아닌 스택 브랜치라 이번 병합은 최종 main 반영이 아니라 스택 상의 다음 단계입니다.


Generated by Claude Code

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.

3 participants