Skip to content

fix(rf-desktop): fix-desktop-eval-turn-overhead (OpenSpec change) - #4

Draft
manykarim wants to merge 4 commits into
mainfrom
change/fix-desktop-eval-turn-overhead
Draft

manykarim wants to merge 4 commits into
mainfrom
change/fix-desktop-eval-turn-overhead

Conversation

@manykarim

Copy link
Copy Markdown
Collaborator

Summary

Adds the OpenSpec change fix-desktop-eval-turn-overhead. It explains why rf-desktop's skill arm scores below the baseline arm on the OpenRouter tier, and plans the fix. It also ticks the verified openrouter-ci-eval-tier tasks.

This PR holds only the planning artifacts for now. The implementation (tasks 2.3 to 11) lands on this branch next, followed by one re-baseline. It stays a draft until then.

Why

Running the 63 suites from the eval sessions against real Windows Calculator (German Windows 11, PlatynUI 0.12.0.dev330, 2026-11-12) showed:

  • The sut-platynui fixture README gives wrong locators. PlatynUI exposes the UIA AutomationId as @Id; @AutomationId matches nothing, and @Name is localised. All 63 suites failed as written. With the names translated, only 5 suites passed, all from the skill arm. The skill's own example passed both times.
  • The static gate can't see locator mistakes. And min_calls fails 7 correct skill-arm suites that wrap Pointer Click in a user keyword.
  • rf-core hooks add turns the baseline arm never pays: the formatting-drift hint, and the Stop reminder to run tests that can't run there.

Planned changes

  • @Id locators in the fixture README.
  • A platynui_locators static check.
  • keywords_resolve counting library calls through user keywords.
  • Formatting drift becomes opt-in (RF_AGENTSKILLS_FORMAT_CHECK).
  • The Stop reminder is skipped after a run.
  • The robotcode doc keyword line moves up in rf-platynui.
  • A manual Windows live check.
  • One re-baseline on both tiers.

openrouter-ci-eval-tier

  • Ticks 5.2, 5.3, 6.1 and 6.2, with the runs that verified them.
  • 3.2 stays open: list prices came out about 51% above the real OpenRouter charge on the full run ($12.58 against $8.34).

Test plan

  • openspec validate --strict passes for both changes
  • scripts/check-docs-voice.py passes
  • Implementation tasks and re-baseline (tracked in tasks.md)

🤖 Generated with Claude Code

https://claude.ai/code/session_01FHEmzL3ErAhGQykKWDx2wP

manykarim and others added 2 commits November 12, 2026 15:34
Adds the fix-desktop-eval-turn-overhead change: the sut-platynui README
gives locators that don't work on a real desktop (checked on Windows 11
with PlatynUI 0.12.0.dev330), keywords_resolve fails suites that wrap
library keywords in user keywords, and rf-core hooks add turns the
baseline arm never pays.

Ticks openrouter-ci-eval-tier tasks 5.2, 5.3, 6.1 and 6.2 with the runs
that verified them.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01FHEmzL3ErAhGQykKWDx2wP
…verhead

- sut-platynui README: @id locators (verified on Windows 11), language-independent window
- keywords_resolve: min_calls counts library calls reached through user keywords
- new custom.platynui:locators_ok check, gating on the narrow task and in the
  partial fallback (which now takes a list of checks)
- rf-core: formatting drift opt-in (RF_AGENTSKILLS_FORMAT_CHECK); Stop reminder
  skipped once the suite ran after the last write
- rf-platynui: robotcode doc keyword line in Library Import
- scripts/desktop-live-check.py and docs/ci/desktop-live-check.md

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01FHEmzL3ErAhGQykKWDx2wP
@github-actions

github-actions Bot commented Nov 12, 2026 •

Copy link
Copy Markdown

Skill Evaluation: rf-mobile (narrow, treatment, N=3, z-ai/glm-5.3-flash)

Model: z-ai/glm-5.3-flash (provider openrouter, turn-limit factor 1.5)

OpenRouter spend

USD
Key spend during this job (includes concurrent jobs) 0.04
Harness estimate (OpenRouter list prices) 0.02
Credit remaining on the key 18.488265116

Gate

gate: REBASELINE-NEEDED (1 task(s) checked)
- [rebaseline-needed] narrow-appium-login-01: no stored baseline entry

rf-skill-eval report

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

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 199253 2301 14.7 34.8 0.0064 (est.) no
narrow-appium-login-01 rf-appium narrow Δ T−B unavailable unavailable unavailable unavailable unavailable unavailable

Skills

Skill Tasks Treatment outcome pass Baseline outcome pass Δ outcome pass Δ input tok Δ turns Δ cost $
rf-appium 1 100% – unavailable unavailable unavailable unavailable

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 12, 2026 •

Copy link
Copy Markdown

Skill Evaluation: rf-desktop (narrow, treatment, N=3, z-ai/glm-5.3-flash)

Model: z-ai/glm-5.3-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.03
Credit remaining on the key 18.244275147

Gate

gate: REBASELINE-NEEDED (1 task(s) checked)
- [rebaseline-needed] narrow-platynui-calculator-01: no stored baseline entry

rf-skill-eval report

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

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 100% 100% 0 429405 4941 20.5 60.6 0.0139 (est.) no
narrow-platynui-calculator-01 rf-platynui narrow Δ T−B unavailable unavailable unavailable unavailable unavailable unavailable

Skills

Skill Tasks Treatment outcome pass Baseline outcome pass Δ outcome pass Δ input tok Δ turns Δ cost $
rf-platynui 1 100% – unavailable unavailable unavailable unavailable

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 12, 2026 •

Copy link
Copy Markdown

Skill Evaluation: rf-web (narrow, treatment, N=3, z-ai/glm-5.3-flash)

Model: z-ai/glm-5.3-flash (provider openrouter, turn-limit factor 1.5)

OpenRouter spend

USD
Key spend during this job (includes concurrent jobs) 0.44
Harness estimate (OpenRouter list prices) 0.03
Credit remaining on the key 18.085306014

Gate

gate: REBASELINE-NEEDED (2 task(s) checked)
- [rebaseline-needed] narrow-browser-login-01: no stored baseline entry
- [rebaseline-needed] narrow-selenium-login-01: no stored baseline entry

rf-skill-eval report

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

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 67% 67% 0 202872 1614 13.5 33.2 0.0065 (est.) yes
narrow-browser-login-01 rf-browser narrow Δ T−B unavailable unavailable unavailable unavailable unavailable unavailable
narrow-selenium-login-01 rf-selenium narrow treatment 3 100% 100% 0 189061 1916 13.7 34.0 0.0061 (est.) no
narrow-selenium-login-01 rf-selenium narrow Δ T−B unavailable unavailable unavailable unavailable unavailable unavailable

Skills

Skill Tasks Treatment outcome pass Baseline outcome pass Δ outcome pass Δ input tok Δ turns Δ cost $
rf-browser 1 67% – unavailable unavailable unavailable unavailable
rf-selenium 1 100% – unavailable unavailable unavailable unavailable

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 12, 2026 •

Copy link
Copy Markdown

Skill Evaluation: rf-api (narrow, treatment, N=3, z-ai/glm-5.3-flash)

Model: z-ai/glm-5.3-flash (provider openrouter, turn-limit factor 1.5)

OpenRouter spend

USD
Key spend during this job (includes concurrent jobs) 0.11
Harness estimate (OpenRouter list prices) 0.04
Credit remaining on the key 18.41753881

Gate

gate: REBASELINE-NEEDED (2 task(s) checked)
- [rebaseline-needed] narrow-requests-users-01: no stored baseline entry
- [rebaseline-needed] narrow-restinstance-schema-01: no stored baseline entry

rf-skill-eval report

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

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 243882 2271 16.3 33.7 0.0078 (est.) no
narrow-requests-users-01 rf-requests narrow Δ T−B unavailable unavailable unavailable unavailable unavailable unavailable
narrow-restinstance-schema-01 rf-restinstance narrow treatment 3 100% 100% 0 199574 2529 17.0 45.6 0.0065 (est.) no
narrow-restinstance-schema-01 rf-restinstance narrow Δ T−B unavailable unavailable unavailable unavailable unavailable unavailable

Skills

Skill Tasks Treatment outcome pass Baseline outcome pass Δ outcome pass Δ input tok Δ turns Δ cost $
rf-requests 1 100% – unavailable unavailable unavailable unavailable
rf-restinstance 1 100% – unavailable unavailable unavailable unavailable

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.

@github-actions

github-actions Bot commented Nov 12, 2026 •

Copy link
Copy Markdown

Skill Evaluation: rf-core (narrow, treatment, N=3, z-ai/glm-5.3-flash)

Model: z-ai/glm-5.3-flash (provider openrouter, turn-limit factor 1.5)

OpenRouter spend

USD
Key spend during this job (includes concurrent jobs) 0.66
Harness estimate (OpenRouter list prices) 0.25
Credit remaining on the key 17.863636388000003

Gate

gate: REBASELINE-NEEDED (12 task(s) checked)
- [rebaseline-needed] narrow-language-bdd-01: no stored baseline entry
- [rebaseline-needed] narrow-language-data-driven-01: no stored baseline entry
- [rebaseline-needed] narrow-language-embedded-01: no stored baseline entry
- [rebaseline-needed] narrow-language-env-varfiles-01: no stored baseline entry
- [rebaseline-needed] narrow-language-suite-setup-tags-01: no stored baseline entry
- [rebaseline-needed] narrow-non-rf-control-01: no stored baseline entry
- [rebaseline-needed] narrow-python-library-flaky-listener-01: no stored baseline entry
- [rebaseline-needed] narrow-python-library-inventory-scope-01: no stored baseline entry
- [rebaseline-needed] narrow-python-library-mode-literal-01: no stored baseline entry
- [rebaseline-needed] narrow-rf-injection-positive-01: no stored baseline entry
- [rebaseline-needed] narrow-rf-mcp-execute-01: no stored baseline entry
- [rebaseline-needed] narrow-setup-requests-01: no stored baseline entry

rf-skill-eval report

Runs: 36 · pass: 36 · fail: 0 · incomplete: 0 · skipped checks: 0 · estimated cost (OpenRouter list prices): $0.25 · 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-language-bdd-01 rf-language narrow treatment 3 100% 100% 0 143392 998 11.0 20.4 0.0048 (est.) no
narrow-language-bdd-01 rf-language narrow Δ T−B unavailable unavailable unavailable unavailable unavailable unavailable
narrow-language-data-driven-01 rf-language narrow treatment 3 100% 100% 0 227429 1800 13.3 40.5 0.0074 (est.) no
narrow-language-data-driven-01 rf-language narrow Δ T−B unavailable unavailable unavailable unavailable unavailable unavailable
narrow-language-embedded-01 rf-language narrow treatment 3 100% 100% 0 141101 2157 11.0 20.2 0.0047 (est.) no
narrow-language-embedded-01 rf-language narrow Δ T−B unavailable unavailable unavailable unavailable unavailable unavailable
narrow-language-env-varfiles-01 rf-language narrow treatment 3 100% 100% 0 499967 5387 22.0 (2 at limit) 60.7 0.0160 (est.) no
narrow-language-env-varfiles-01 rf-language narrow Δ T−B unavailable unavailable unavailable unavailable unavailable unavailable
narrow-language-suite-setup-tags-01 rf-language narrow treatment 3 100% 100% 0 208378 2216 16.7 29.4 0.0067 (est.) no
narrow-language-suite-setup-tags-01 rf-language narrow Δ T−B unavailable unavailable unavailable unavailable unavailable unavailable
narrow-non-rf-control-01 plugin narrow treatment 3 100% 100% 0 29452 494 2.0 10.9 0.0012 (est.) no
narrow-non-rf-control-01 plugin narrow Δ T−B unavailable unavailable unavailable unavailable unavailable unavailable
narrow-python-library-flaky-listener-01 rf-python-library narrow treatment 3 100% 100% 0 235102 3055 15.3 27.9 0.0077 (est.) no
narrow-python-library-flaky-listener-01 rf-python-library narrow Δ T−B unavailable unavailable unavailable unavailable unavailable unavailable
narrow-python-library-inventory-scope-01 rf-python-library narrow treatment 3 100% 100% 0 173496 7668 12.0 59.1 0.0060 (est.) no
narrow-python-library-inventory-scope-01 rf-python-library narrow Δ T−B unavailable unavailable unavailable unavailable unavailable unavailable
narrow-python-library-mode-literal-01 rf-python-library narrow treatment 3 100% 100% 0 338470 4274 18.3 (1 at limit) 40.4 0.0109 (est.) no
narrow-python-library-mode-literal-01 rf-python-library narrow Δ T−B unavailable unavailable unavailable unavailable unavailable unavailable
narrow-rf-injection-positive-01 plugin narrow treatment 3 100% 100% 0 75118 1038 6.0 9.7 0.0025 (est.) no
narrow-rf-injection-positive-01 plugin narrow Δ T−B unavailable unavailable unavailable unavailable unavailable unavailable
narrow-rf-mcp-execute-01 plugin narrow treatment 3 100% 100% 0 286699 1633 13.3 26.0 0.0092 (est.) no
narrow-rf-mcp-execute-01 plugin narrow Δ T−B unavailable unavailable unavailable unavailable unavailable unavailable
narrow-setup-requests-01 rf-setup narrow treatment 3 100% 100% 0 145370 1332 11.3 23.3 0.0047 (est.) no
narrow-setup-requests-01 rf-setup narrow Δ T−B unavailable unavailable unavailable unavailable unavailable unavailable

Skills

Skill Tasks Treatment outcome pass Baseline outcome pass Δ outcome pass Δ input tok Δ turns Δ cost $
rf-language 5 100% – unavailable unavailable unavailable unavailable
rf-python-library 3 100% – unavailable unavailable unavailable unavailable
rf-setup 1 100% – unavailable unavailable unavailable unavailable

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 2 commits November 13, 2026 03:39
Re-baseline after the fixture, grader and hook changes of this PR
(N=6, both arms, all tiers, DeepSeek V4.1 Flash, turn factor 1.5).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01FHEmzL3ErAhGQykKWDx2wP
z-ai/glm-5.3-flash replaces deepseek/deepseek-v4.1-flash as the only
OpenRouter model (output $0.078/M instead of $1.20/M): allow-list, list
prices, workflow OPENROUTER_MODEL, tests and docs. Baselines move to
baselines/openrouter/glm-5.3-flash/ with the next re-baseline.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01FHEmzL3ErAhGQykKWDx2wP
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