Skip to content

feat(eval): OpenRouter CI tier on DeepSeek V4.1 Flash - #2

Merged
manykarim merged 8 commits into
mainfrom
change/openrouter-ci-eval-tier
Nov 12, 2026
Merged

manykarim merged 8 commits into
mainfrom
change/openrouter-ci-eval-tier

Conversation

@manykarim

Copy link
Copy Markdown
Collaborator

Why

The live skill evals only run on Claude, billed to a maintainer's subscription. A spike (run 42822700497) ran the rf-core narrow tier on DeepSeek V4.1 Flash through OpenRouter: all 72 sessions completed, the skills loaded in every treatment run, the treatment arm passed 11 of 12 tasks, and the arm delta stayed visible on 8 tasks. OpenRouter charged $0.84. This PR makes that the default CI tier when the OPENROUTER_API_KEY secret is set. OpenSpec change: openspec/changes/openrouter-ci-eval-tier/.

What changes

  • Provider. An OpenRouter model id (--model deepseek/deepseek-v4.1-flash) selects the OpenRouter provider. The runner points Claude Code at OpenRouter, maps every model alias to DeepSeek, and removes Claude credentials from the session. A session that used any other model is recorded as incomplete (provider_model).
  • Model rules. OpenRouter models are allowed on the command line only; task files can't declare them. Other OpenRouter ids are rejected.
  • Cost. OpenRouter runs are priced at list prices, not with Claude Code's Claude-priced figure ($29.66 for the spike). --max-cost-usd and the reports use the estimate, and the reports label it as one.
  • Turn limits. --max-turns-factor (CI uses 1.5) scales each task's max_turns; 25 of the 72 spike sessions hit the limit at 1.0. The factor is stored with runs and baselines; reports count turn-limit stops.
  • Baselines per model. DeepSeek baselines go in plugins/<plugin>/evals/baselines/openrouter/deepseek-v4.1-flash/; Claude baselines stay where they are. A model or factor mismatch is rebaseline-needed.
  • CI. Preflight picks the provider (OpenRouter if its key is set, otherwise Claude, overridable with the new provider dispatch input). Each job gets only that provider's credentials and runs with separate OpenRouter caps. OpenRouter jobs run a one-session smoke test and report the key's real spend before and after (scripts/openrouter-ci.py).
  • Docs. docs/ci/usage.md (new "OpenRouter tier" section), docs/ci/local-testing.md, an ADR-005 amendment, a Claude check in RELEASING.md, and .env.example.

Before this gates anything

  • There are no DeepSeek baselines yet, so this PR's own eval jobs will report rebaseline-needed (exit 3). The next step is a manual dispatch on this branch (provider=openrouter, all tiers, both arms, N=6) and a reviewed PR with its candidate baselines (tasks 6.1–6.2).
  • List prices put the spike at $1.33 against $0.84 actually charged, so the estimate runs high. That only makes the caps stop a run early; it never lets one overspend. Task 3.2 (calibrate within ±25%) is still open for a decision.

Testing

  • pytest tests passes: 1430 passed, 1 skipped (gitleaks not installed locally). The new tests are in tests/eval/test_providers.py and tests/eval/test_ci_preflight.py; the preflight tests run the provider-selection script for each credential combination.
  • ruff, mypy, the docs-voice check and openspec validate --strict pass.

🤖 Generated with Claude Code

https://claude.ai/code/session_01FHEmzL3ErAhGQykKWDx2wP

PR and weekly skill evals run on deepseek/deepseek-v4.1-flash through
OpenRouter when the OPENROUTER_API_KEY secret is set, so they no longer
need a maintainer's Claude subscription. Claude runs become a manual
dispatch (provider: claude) and a step in the release checklist.

Harness:
- OpenRouter model ids select the openrouter provider; the runner sets
  the OpenRouter environment itself and strips Claude credentials. A
  session that used another model is recorded as incomplete
  (provider_model).
- OpenRouter models are run-time only; task files may not declare them.
- OpenRouter runs are priced from list prices (domain/pricing.py)
  instead of Claude Code's Claude-priced total_cost_usd.
- --max-turns-factor scales each task's max_turns; the factor is stored
  with runs and baselines, and turn-limit stops are reported.
- Baselines are kept per model (baselines/openrouter/<model name>/);
  gate and baseline update find them from the runs' model.

CI: preflight picks the provider, each job gets only that provider's
credentials, OpenRouter caps, a smoke session, and the key's real
spend before and after (scripts/openrouter-ci.py).

OpenSpec change: openrouter-ci-eval-tier.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FHEmzL3ErAhGQykKWDx2wP
@github-actions

github-actions Bot commented Nov 10, 2026 •

Copy link
Copy Markdown

Skill Evaluation: rf-desktop (narrow, treatment, N=3, deepseek/deepseek-v4.1-flash)

Model: deepseek/deepseek-v4.1-flash (provider openrouter, turn-limit factor 1.5)

OpenRouter spend

USD
Key spend during this job (includes concurrent jobs) 0.42
Harness estimate (OpenRouter list prices) 0.05
Credit remaining on the key 29.174915146

Gate

gate: PASS (1 task(s) checked)

rf-skill-eval report

Runs: 3 · pass: 1 · fail: 2 · incomplete: 0 · skipped checks: 0 · estimated cost (OpenRouter list prices): $0.05 · turn-limit stops: 1

Pass rate = runs whose gate result is pass / runs attempted. Deltas are treatment − baseline over outcome checks only.

Tasks

Task Skill Tier Arm Runs Pass rate Outcome pass Incomplete Input tok Output tok Turns Duration s Cost $ Flaky
narrow-platynui-calculator-01 rf-platynui narrow treatment 3 33% 33% 0 574770 9590 22.0 (1 at limit) 90.5 0.0260 (est.) yes
narrow-platynui-calculator-01 rf-platynui narrow baseline (stored) 6 50% 50% 0 475578 8534 20.7 (4 at limit) 76.5 0.0226 (est.) –
narrow-platynui-calculator-01 rf-platynui narrow Δ T−B -17 pp +99192 +1056 +1.3 +14.1 +0.0034

Skills

Skill Tasks Treatment outcome pass Baseline outcome pass Δ outcome pass Δ input tok Δ turns Δ cost $
rf-platynui 1 33% 50% -17 pp +99192 +1.3 +0.0034

Skipped / errored checks

None.

Incomplete runs

None.

Process checks (treatment arm, not in deltas)

  • narrow-platynui-calculator-01 loaded_rf_platynui_skill: 3/3

Adversarial tier (reported only, never gates)

None.

@github-actions

github-actions Bot commented Nov 10, 2026 •

Copy link
Copy Markdown

Skill Evaluation: rf-mobile (narrow, treatment, N=3, deepseek/deepseek-v4.1-flash)

Model: deepseek/deepseek-v4.1-flash (provider openrouter, turn-limit factor 1.5)

OpenRouter spend

USD
Key spend during this job (includes concurrent jobs) 0.28
Harness estimate (OpenRouter list prices) 0.07
Credit remaining on the key 29.261856763

Gate

gate: PASS (1 task(s) checked)

rf-skill-eval report

Runs: 3 · pass: 3 · fail: 0 · incomplete: 0 · skipped checks: 0 · estimated cost (OpenRouter list prices): $0.07

Pass rate = runs whose gate result is pass / runs attempted. Deltas are treatment − baseline over outcome checks only.

Tasks

Task Skill Tier Arm Runs Pass rate Outcome pass Incomplete Input tok Output tok Turns Duration s Cost $ Flaky
narrow-appium-login-01 rf-appium narrow treatment 3 100% 100% 0 491873 9480 24.7 99.3 0.0243 (est.) no
narrow-appium-login-01 rf-appium narrow baseline (stored) 6 100% 100% 0 282607 6601 18.3 69.0 0.0206 (est.) –
narrow-appium-login-01 rf-appium narrow Δ T−B +0 pp +209266 +2879 +6.3 +30.2 +0.0037

Skills

Skill Tasks Treatment outcome pass Baseline outcome pass Δ outcome pass Δ input tok Δ turns Δ cost $
rf-appium 1 100% 100% +0 pp +209266 +6.3 +0.0037

Skipped / errored checks

None.

Incomplete runs

None.

Process checks (treatment arm, not in deltas)

  • narrow-appium-login-01 loaded_rf_appium_skill: 3/3

Adversarial tier (reported only, never gates)

None.

@github-actions

github-actions Bot commented Nov 10, 2026 •

Copy link
Copy Markdown

Skill Evaluation: rf-web (narrow, treatment, N=3, deepseek/deepseek-v4.1-flash)

Model: deepseek/deepseek-v4.1-flash (provider openrouter, turn-limit factor 1.5)

OpenRouter spend

USD
Key spend during this job (includes concurrent jobs) 0.41
Harness estimate (OpenRouter list prices) 0.12
Credit remaining on the key 29.19823183

Gate

gate: PASS (2 task(s) checked)

rf-skill-eval report

Runs: 6 · pass: 6 · fail: 0 · incomplete: 0 · skipped checks: 0 · estimated cost (OpenRouter list prices): $0.12

Pass rate = runs whose gate result is pass / runs attempted. Deltas are treatment − baseline over outcome checks only.

Tasks

Task Skill Tier Arm Runs Pass rate Outcome pass Incomplete Input tok Output tok Turns Duration s Cost $ Flaky
narrow-browser-login-01 rf-browser narrow treatment 3 100% 100% 0 521531 6174 21.7 85.3 0.0271 (est.) no
narrow-browser-login-01 rf-browser narrow baseline (stored) 6 100% 100% 0 188544 3649 15.2 45.4 0.0141 (est.) –
narrow-browser-login-01 rf-browser narrow Δ T−B +0 pp +332987 +2525 +6.5 +40.0 +0.0130
narrow-selenium-login-01 rf-selenium narrow treatment 3 100% 100% 0 284037 4033 16.7 51.5 0.0139 (est.) no
narrow-selenium-login-01 rf-selenium narrow baseline (stored) 6 100% 100% 0 109915 2152 11.7 24.2 0.0087 (est.) –
narrow-selenium-login-01 rf-selenium narrow Δ T−B +0 pp +174122 +1881 +5.0 +27.3 +0.0052

Skills

Skill Tasks Treatment outcome pass Baseline outcome pass Δ outcome pass Δ input tok Δ turns Δ cost $
rf-browser 1 100% 100% +0 pp +332987 +6.5 +0.0130
rf-selenium 1 100% 100% +0 pp +174122 +5.0 +0.0052

Skipped / errored checks

None.

Incomplete runs

None.

Process checks (treatment arm, not in deltas)

  • narrow-browser-login-01 loaded_rf_browser_skill: 3/3
  • narrow-selenium-login-01 loaded_rf_selenium_skill: 3/3

Adversarial tier (reported only, never gates)

None.

@github-actions

github-actions Bot commented Nov 10, 2026 •

Copy link
Copy Markdown

Skill Evaluation: rf-api (narrow, treatment, N=3, deepseek/deepseek-v4.1-flash)

Model: deepseek/deepseek-v4.1-flash (provider openrouter, turn-limit factor 1.5)

OpenRouter spend

USD
Key spend during this job (includes concurrent jobs) 0.41
Harness estimate (OpenRouter list prices) 0.17
Credit remaining on the key 29.19823183

Gate

gate: PASS (2 task(s) checked)

rf-skill-eval report

Runs: 6 · pass: 6 · fail: 0 · incomplete: 0 · skipped checks: 0 · estimated cost (OpenRouter list prices): $0.17 · turn-limit stops: 3

Pass rate = runs whose gate result is pass / runs attempted. Deltas are treatment − baseline over outcome checks only.

Tasks

Task Skill Tier Arm Runs Pass rate Outcome pass Incomplete Input tok Output tok Turns Duration s Cost $ Flaky
narrow-requests-users-01 rf-requests narrow treatment 3 100% 100% 0 525384 10000 24.0 (1 at limit) 86.5 0.0302 (est.) no
narrow-requests-users-01 rf-requests narrow baseline (stored) 6 100% 100% 0 132557 2867 11.0 28.3 0.0099 (est.) –
narrow-requests-users-01 rf-requests narrow Δ T−B +0 pp +392827 +7133 +13.0 +58.1 +0.0203
narrow-restinstance-schema-01 rf-restinstance narrow treatment 3 100% 100% 0 471386 6624 18.7 (2 at limit) 63.4 0.0272 (est.) no
narrow-restinstance-schema-01 rf-restinstance narrow baseline (stored) 6 100% 100% 0 232009 3515 17.0 38.7 0.0117 (est.) –
narrow-restinstance-schema-01 rf-restinstance narrow Δ T−B +0 pp +239378 +3109 +1.7 +24.7 +0.0155

Skills

Skill Tasks Treatment outcome pass Baseline outcome pass Δ outcome pass Δ input tok Δ turns Δ cost $
rf-requests 1 100% 100% +0 pp +392827 +13.0 +0.0203
rf-restinstance 1 100% 100% +0 pp +239378 +1.7 +0.0155

Skipped / errored checks

None.

Incomplete runs

None.

Process checks (treatment arm, not in deltas)

  • narrow-requests-users-01 loaded_rf_requests_skill: 3/3
  • narrow-restinstance-schema-01 loaded_rf_restinstance_skill: 3/3

Adversarial tier (reported only, never gates)

None.

…ping

The first OpenRouter baseline run (42885585678) failed its Doctor step,
skipped the tiers, and still ran the trigger evals, because that step
was `if: always()`. Trigger evals now need a successful Doctor. The
OpenRouter auth ping waits 120 s, like the smoke step, instead of 30 s.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FHEmzL3ErAhGQykKWDx2wP
@github-actions

github-actions Bot commented Nov 10, 2026 •

Copy link
Copy Markdown

Skill Evaluation: rf-core (narrow, treatment, N=3, deepseek/deepseek-v4.1-flash)

Model: deepseek/deepseek-v4.1-flash (provider openrouter, turn-limit factor 1.5)

OpenRouter spend

USD
Key spend during this job (includes concurrent jobs) 0.86
Harness estimate (OpenRouter list prices) 0.82
Credit remaining on the key 28.731212713

Gate

gate: PASS (12 task(s) checked)

rf-skill-eval report

Runs: 36 · pass: 35 · fail: 1 · incomplete: 0 · skipped checks: 0 · estimated cost (OpenRouter list prices): $0.82 · turn-limit stops: 11

Pass rate = runs whose gate result is pass / runs attempted. Deltas are treatment − baseline over outcome checks only.

Tasks

Task Skill Tier Arm Runs Pass rate Outcome pass Incomplete Input tok Output tok Turns Duration s Cost $ Flaky
narrow-language-bdd-01 rf-language narrow treatment 3 100% 100% 0 316370 3962 19.7 38.3 0.0170 (est.) no
narrow-language-bdd-01 rf-language narrow baseline (stored) 6 100% 100% 0 134237 2629 12.3 18.5 0.0090 (est.) –
narrow-language-bdd-01 rf-language narrow Δ T−B +0 pp +182133 +1333 +7.3 +19.8 +0.0080
narrow-language-data-driven-01 rf-language narrow treatment 3 100% 100% 0 677011 10402 27.0 (2 at limit) 63.4 0.0266 (est.) no
narrow-language-data-driven-01 rf-language narrow baseline (stored) 6 83% 83% 0 206359 5541 19.2 40.3 0.0134 (est.) –
narrow-language-data-driven-01 rf-language narrow Δ T−B +17 pp +470652 +4862 +7.8 +23.1 +0.0132
narrow-language-embedded-01 rf-language narrow treatment 3 100% 100% 0 556521 7759 27.3 59.4 0.0309 (est.) no
narrow-language-embedded-01 rf-language narrow baseline (stored) 6 100% 100% 0 127580 3524 12.2 21.9 0.0130 (est.) –
narrow-language-embedded-01 rf-language narrow Δ T−B +0 pp +428940 +4235 +15.2 +37.5 +0.0179
narrow-language-env-varfiles-01 rf-language narrow treatment 3 67% 67% 0 716750 15682 22.0 (2 at limit) 117.7 0.0409 (est.) yes
narrow-language-env-varfiles-01 rf-language narrow baseline (stored) 6 100% 100% 0 274618 6895 21.7 42.2 0.0193 (est.) –
narrow-language-env-varfiles-01 rf-language narrow Δ T−B -33 pp +442132 +8787 +0.3 +75.5 +0.0216
narrow-language-suite-setup-tags-01 rf-language narrow treatment 3 100% 100% 0 514903 6005 28.3 53.7 0.0277 (est.) no
narrow-language-suite-setup-tags-01 rf-language narrow baseline (stored) 6 83% 83% 0 221498 4474 18.3 (1 at limit) 33.1 0.0146 (est.) –
narrow-language-suite-setup-tags-01 rf-language narrow Δ T−B +17 pp +293404 +1532 +10.0 +20.6 +0.0131
narrow-non-rf-control-01 plugin narrow treatment 3 100% 100% 0 28742 179 2.0 5.8 0.0073 (est.) no
narrow-non-rf-control-01 plugin narrow baseline (stored) 6 100% 100% 0 28024 195 2.0 2.7 0.0046 (est.) –
narrow-non-rf-control-01 plugin narrow Δ T−B +0 pp +718 -17 +0.0 +3.1 +0.0027
narrow-python-library-flaky-listener-01 rf-python-library narrow treatment 3 100% 100% 0 630558 12703 22.0 (3 at limit) 110.6 0.0363 (est.) no
narrow-python-library-flaky-listener-01 rf-python-library narrow baseline (stored) 6 83% 83% 0 433974 10412 20.8 (3 at limit) 76.3 0.0264 (est.) –
narrow-python-library-flaky-listener-01 rf-python-library narrow Δ T−B +17 pp +196583 +2291 +1.2 +34.3 +0.0099
narrow-python-library-inventory-scope-01 rf-python-library narrow treatment 3 100% 100% 0 444243 6634 21.7 (1 at limit) 67.6 0.0194 (est.) no
narrow-python-library-inventory-scope-01 rf-python-library narrow baseline (stored) 6 100% 100% 0 334542 9598 19.5 (3 at limit) 62.5 0.0215 (est.) –
narrow-python-library-inventory-scope-01 rf-python-library narrow Δ T−B +0 pp +109701 -2965 +2.2 +5.0 -0.0021
narrow-python-library-mode-literal-01 rf-python-library narrow treatment 3 100% 100% 0 499110 18779 22.3 (1 at limit) 155.3 0.0381 (est.) no
narrow-python-library-mode-literal-01 rf-python-library narrow baseline (stored) 6 100% 100% 0 330956 10259 19.0 (1 at limit) 74.8 0.0247 (est.) –
narrow-python-library-mode-literal-01 rf-python-library narrow Δ T−B +0 pp +168154 +8520 +3.3 +80.6 +0.0134
narrow-rf-injection-positive-01 plugin narrow treatment 3 100% 100% 0 174181 3367 15.3 22.0 0.0125 (est.) no
narrow-rf-injection-positive-01 plugin narrow baseline (stored) 6 100% 100% 0 358063 6274 18.7 (1 at limit) 47.0 0.0260 (est.) –
narrow-rf-injection-positive-01 plugin narrow Δ T−B +0 pp -183882 -2907 -3.3 -25.0 -0.0135
narrow-rf-mcp-execute-01 plugin narrow treatment 3 100% 100% 0 469985 5043 20.0 (2 at limit) 46.1 0.0179 (est.) no
narrow-rf-mcp-execute-01 plugin narrow baseline (stored) 6 100% 100% 0 151802 1465 8.5 14.1 0.0168 (est.) –
narrow-rf-mcp-execute-01 plugin narrow Δ T−B +0 pp +318183 +3579 +11.5 +32.0 +0.0011
narrow-setup-requests-01 rf-setup narrow treatment 3 100% 100% 0 200014 3609 16.0 23.1 0.0121 (est.) no
narrow-setup-requests-01 rf-setup narrow baseline (stored) 6 100% 100% 0 140285 2194 10.3 20.2 0.0097 (est.) –
narrow-setup-requests-01 rf-setup narrow Δ T−B +0 pp +59729 +1416 +5.7 +2.9 +0.0024

Skills

Skill Tasks Treatment outcome pass Baseline outcome pass Δ outcome pass Δ input tok Δ turns Δ cost $
rf-language 5 93% 93% +0 pp +363452 +8.1 +0.0148
rf-python-library 3 100% 94% +6 pp +158146 +2.2 +0.0071
rf-setup 1 100% 100% +0 pp +59729 +5.7 +0.0024

Skipped / errored checks

None.

Incomplete runs

None.

Process checks (treatment arm, not in deltas)

  • narrow-language-bdd-01 loaded_rf_language_skill: 3/3
  • narrow-language-data-driven-01 loaded_rf_language_skill: 3/3
  • narrow-language-embedded-01 loaded_rf_language_skill: 3/3
  • narrow-language-env-varfiles-01 loaded_rf_language_skill: 3/3
  • narrow-language-suite-setup-tags-01 loaded_rf_language_skill: 3/3
  • narrow-non-rf-control-01 bounded_tool_calls: 3/3
  • narrow-non-rf-control-01 no_libdoc_invocation: 3/3
  • narrow-non-rf-control-01 no_rf_mcp_calls: 3/3
  • narrow-python-library-flaky-listener-01 loaded_rf_python_library_skill: 3/3
  • narrow-python-library-inventory-scope-01 loaded_rf_python_library_skill: 3/3
  • narrow-python-library-mode-literal-01 loaded_rf_python_library_skill: 3/3
  • narrow-rf-injection-positive-01 leveraged_rf_lookup: 3/3
  • narrow-rf-mcp-execute-01 rf_mcp_before_write: 3/3
  • narrow-rf-mcp-execute-01 rf_mcp_called_at_least_twice: 3/3
  • narrow-rf-mcp-execute-01 rf_mcp_had_successful_result: 3/3
  • narrow-setup-requests-01 used_uv_add: 3/3

Adversarial tier (reported only, never gates)

None.

manykarim and others added 3 commits November 11, 2026 08:34
…imit

DeepSeek sometimes answers the one-turn "ok" probe with a tool call, so
claude stops at --max-turns 1 and exits 1 although the provider answered.
That failed the rf-web and rf-desktop Doctor steps in run 42887127109.
The ping now reads the final result event: error_max_turns counts as
verified auth, and a real failure reports the result's reason instead of
stderr, which only held the unrecognized_model notice.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FHEmzL3ErAhGQykKWDx2wP
rf-desktop's PlatynUI tasks stopped at the 1.5 turn limit in 3-5 of 6
sessions and their pass rate swung between 0.33 and 0.83 across the two
N=6 runs (42887127109, 42993062842). OPENROUTER_TURNS_FACTORS gives a
plugin its own factor (rf-desktop 2.0); each matrix leg carries it, so the
PR and full jobs and the stored baselines agree. Claude runs keep 1.0.
The new `plugins` input re-records one plugin without rerunning the rest.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FHEmzL3ErAhGQykKWDx2wP
Candidate baselines for rf-api, rf-core, rf-mobile and rf-web from the N=6
run on deepseek/deepseek-v4.1-flash (all tiers, both arms, turn-limit
factor 1.5, trigger sets on both splits), copied unchanged from the
candidate-baseline artifacts. rf-desktop follows from a run at factor 2.0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FHEmzL3ErAhGQykKWDx2wP
manykarim and others added 3 commits November 12, 2026 11:14
At 2.0 (run 43167186288) rf-desktop sessions used the extra turns and
still stopped at the limit, so the gate pass rate didn't improve. The
per-plugin override stays available; the map is now empty.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FHEmzL3ErAhGQykKWDx2wP
From run 42993062842 (N=6), unchanged. The skill arm scores below the
baseline arm here; the analysis of why is tracked separately in
fix-desktop-eval-turn-overhead.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FHEmzL3ErAhGQykKWDx2wP
…-flash

chore(eval): promote OpenRouter DeepSeek baselines from run 42993062842
@manykarim
manykarim merged commit 3756236 into main Nov 12, 2026
36 of 37 checks passed
@manykarim
manykarim deleted the change/openrouter-ci-eval-tier branch November 12, 2026 21:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant