Skip to content

fix(rf-desktop): working fixture locators, locator check, less hook overhead; CI evals on GLM 5.3 Flash - #4

Merged
manykarim merged 6 commits into
mainfrom
change/fix-desktop-eval-turn-overhead
Nov 13, 2026
Merged

manykarim merged 6 commits into
mainfrom
change/fix-desktop-eval-turn-overhead

Conversation

@manykarim

@manykarim manykarim commented Nov 12, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Fixes why rf-desktop's skill arm scored below the baseline arm on the OpenRouter tier, removes hook output that cost every skill arm turns, and switches the CI eval model to GLM 5.3 Flash. OpenSpec change: fix-desktop-eval-turn-overhead, 28 of 29 tasks done.

rf-desktop and the grader

  • Fixture README: eval/fixtures/sut-platynui/README.md gave locators that don't work on a real desktop. It now uses @Id (num1Button, plusButton, equalButton, CalculatorResults), verified with platynui-cli on Windows 11, and a window locator that works in both the English and German display language. This was the main defect.
  • New check, custom.platynui:locators_ok (platynui_locators): it rejects a plain @AutomationId and buttons found only by their English @Name. It gates the narrow task, and the partial task's fallback now takes a list of checks.
  • keywords_resolve: min_calls counts library calls reached through user keywords. Seven correct suites no longer fail on call count.
  • Manual live check: scripts/desktop-live-check.py and docs/ci/desktop-live-check.md run the eval suites against the real Calculator on Windows, after screening them for unsafe code.

rf-core hooks (every plugin's skill arm)

  • Formatting drift is opt-in (RF_AGENTSKILLS_FORMAT_CHECK).
  • The Stop reminder stays quiet once the suite has run after the last write.

Skill: rf-platynui names robotcode doc keyword PlatynUI.BareMetal in its Library Import section.

CI eval model: z-ai/glm-5.3-flash replaces deepseek/deepseek-v4.1-flash as the only OpenRouter model. Output tokens cost $0.078 per million instead of $1.20. Baselines for all plugins are under baselines/openrouter/glm-5.3-flash/, and the DeepSeek ones are removed.

Results: rf-desktop

Run Arm Narrow gate Partial gate Turns (narrow / partial) Turn-limit stops Live on Windows
DeepSeek, before (42993062842) without skill 3/6 6/6 20.7 / 20.0 5 0 of 63 suites (all runs)
with skill 2/6 5/6 23.5 / 22.8 8
DeepSeek, after (43263363544) without skill 6/6 6/6 19.8 / 21.5 6 22 of 22
with skill 5/6 5/6 21.3 / 19.0 6
GLM, after (43397156347) without skill 6/6 6/6 12.7 / 13.7 0 24 of 24
with skill 6/6 6/6 17.3 / 17.8 1
  • Live checks: run on German Windows 11 with PlatynUI 0.12.0.dev330. The skill example passed in every live run.
  • robocop format: runs in the skill arms dropped from 1.17 and 0.67 per session to 0.
  • robotcode doc: barely used. Sessions still parse the libdoc spec with python -c: about 4 per session on GLM, 6–11 on DeepSeek.

Results: the GLM baselines (all plugins)

Pass rate without / with the skill:

Plugin narrow partial realistic adversarial
rf-core 0.88 / 1.00 — — 0.40 / 0.87
rf-api 1.00 / 1.00 1.00 / 1.00 1.00 / 1.00 1.00 / 1.00
rf-web 1.00 / 1.00 1.00 / 1.00 1.00 / 1.00 0.94 / 0.94
rf-mobile 1.00 / 1.00 1.00 / 1.00 — 1.00 / 1.00
rf-desktop 1.00 / 1.00 1.00 / 1.00 — —

GLM passes most tasks without the skill, so the CI gate still catches regressions but shows little of a skill's benefit outside rf-core. The Claude baselines (task 11.4) are what show that benefit.

Spend: the GLM re-baseline cost $5.86 of key spend; the DeepSeek one cost $10.14.

Known follow-ups (not in this PR)

Test plan

  • tests/eval, tests, plugins/rf-core/tests, plugins/rf-desktop/tests
  • drift, skills, marketplace, catalogue, governance, docs voice, openspec validate --strict
  • GLM re-baseline of all plugins (N=6), with the PR evals on GLM passing against the new baselines
  • Live check on Windows for the DeepSeek and GLM runs
  • 11.4: Claude baselines (Haiku 5.5)

🤖 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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
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.17
Harness estimate (OpenRouter list prices) 0.02
Credit remaining on the key 11.469476033

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.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 224177 3204 16.7 47.8 0.0073 (est.) no
narrow-appium-login-01 rf-appium narrow baseline (stored) 6 100% 100% 0 102104 1817 8.3 17.9 0.0036 (est.) –
narrow-appium-login-01 rf-appium narrow Δ T−B +0 pp +122073 +1387 +8.3 +29.9 +0.0037

Skills

Skill Tasks Treatment outcome pass Baseline outcome pass Δ outcome pass Δ input tok Δ turns Δ cost $
rf-appium 1 100% 100% +0 pp +122073 +8.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 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.19
Harness estimate (OpenRouter list prices) 0.04
Credit remaining on the key 11.445733079

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.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-platynui-calculator-01 rf-platynui narrow treatment 3 100% 100% 0 405574 4601 19.0 58.1 0.0128 (est.) no
narrow-platynui-calculator-01 rf-platynui narrow baseline (stored) 6 100% 100% 0 192866 3103 12.7 30.3 0.0064 (est.) –
narrow-platynui-calculator-01 rf-platynui narrow Δ T−B +0 pp +212709 +1498 +6.3 +27.8 +0.0064

Skills

Skill Tasks Treatment outcome pass Baseline outcome pass Δ outcome pass Δ input tok Δ turns Δ cost $
rf-platynui 1 100% 100% +0 pp +212709 +6.3 +0.0064

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.20
Harness estimate (OpenRouter list prices) 0.04
Credit remaining on the key 11.434695472999998

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.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-browser-login-01 rf-browser narrow treatment 3 100% 100% 0 223354 1487 14.3 35.9 0.0073 (est.) no
narrow-browser-login-01 rf-browser narrow baseline (stored) 6 100% 100% 0 78368 1947 7.3 21.6 0.0027 (est.) –
narrow-browser-login-01 rf-browser narrow Δ T−B +0 pp +144986 -460 +7.0 +14.3 +0.0046
narrow-selenium-login-01 rf-selenium narrow treatment 3 100% 100% 0 156700 1224 11.7 30.1 0.0052 (est.) no
narrow-selenium-login-01 rf-selenium narrow baseline (stored) 6 100% 100% 0 69708 1398 7.2 15.3 0.0023 (est.) –
narrow-selenium-login-01 rf-selenium narrow Δ T−B +0 pp +86991 -174 +4.5 +14.8 +0.0029

Skills

Skill Tasks Treatment outcome pass Baseline outcome pass Δ outcome pass Δ input tok Δ turns Δ cost $
rf-browser 1 100% 100% +0 pp +144986 +7.0 +0.0046
rf-selenium 1 100% 100% +0 pp +86991 +4.5 +0.0029

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.31
Harness estimate (OpenRouter list prices) 0.06
Credit remaining on the key 11.315381699

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.06 · 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-requests-users-01 rf-requests narrow treatment 3 100% 100% 0 288059 2645 17.3 63.5 0.0093 (est.) no
narrow-requests-users-01 rf-requests narrow baseline (stored) 6 100% 100% 0 78259 822 8.7 16.1 0.0026 (est.) –
narrow-requests-users-01 rf-requests narrow Δ T−B +0 pp +209799 +1822 +8.7 +47.5 +0.0067
narrow-restinstance-schema-01 rf-restinstance narrow treatment 3 100% 100% 0 358718 3229 18.7 (1 at limit) 76.8 0.0115 (est.) no
narrow-restinstance-schema-01 rf-restinstance narrow baseline (stored) 6 100% 100% 0 81163 936 8.3 13.2 0.0027 (est.) –
narrow-restinstance-schema-01 rf-restinstance narrow Δ T−B +0 pp +277555 +2293 +10.3 +63.7 +0.0088

Skills

Skill Tasks Treatment outcome pass Baseline outcome pass Δ outcome pass Δ input tok Δ turns Δ cost $
rf-requests 1 100% 100% +0 pp +209799 +8.7 +0.0067
rf-restinstance 1 100% 100% +0 pp +277555 +10.3 +0.0088

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.65
Harness estimate (OpenRouter list prices) 0.26
Credit remaining on the key 10.981631511000003

Gate

gate: PASS (12 task(s) checked)

rf-skill-eval report

Runs: 36 · pass: 36 · fail: 0 · incomplete: 0 · skipped checks: 0 · estimated cost (OpenRouter list prices): $0.26 · turn-limit stops: 4

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 130452 851 9.3 18.8 0.0043 (est.) no
narrow-language-bdd-01 rf-language narrow baseline (stored) 6 100% 100% 0 72096 1767 8.0 27.9 0.0025 (est.) –
narrow-language-bdd-01 rf-language narrow Δ T−B +0 pp +58355 -916 +1.3 -9.1 +0.0018
narrow-language-data-driven-01 rf-language narrow treatment 3 100% 100% 0 218222 5906 13.7 59.6 0.0074 (est.) no
narrow-language-data-driven-01 rf-language narrow baseline (stored) 6 33% 33% 0 104165 1381 9.3 21.9 0.0034 (est.) –
narrow-language-data-driven-01 rf-language narrow Δ T−B +67 pp +114056 +4525 +4.3 +37.7 +0.0040
narrow-language-embedded-01 rf-language narrow treatment 3 100% 100% 0 163324 2951 11.3 39.8 0.0056 (est.) no
narrow-language-embedded-01 rf-language narrow baseline (stored) 6 100% 100% 0 193298 8008 14.8 68.9 0.0068 (est.) –
narrow-language-embedded-01 rf-language narrow Δ T−B +0 pp -29974 -5057 -3.5 -29.1 -0.0012
narrow-language-env-varfiles-01 rf-language narrow treatment 3 100% 100% 0 535302 6647 22.0 (3 at limit) 79.8 0.0170 (est.) no
narrow-language-env-varfiles-01 rf-language narrow baseline (stored) 6 50% 50% 0 189963 9104 16.8 86.0 0.0069 (est.) –
narrow-language-env-varfiles-01 rf-language narrow Δ T−B +50 pp +345338 -2458 +5.2 -6.1 +0.0101
narrow-language-suite-setup-tags-01 rf-language narrow treatment 3 100% 100% 0 318220 8231 19.0 (1 at limit) 146.4 0.0112 (est.) no
narrow-language-suite-setup-tags-01 rf-language narrow baseline (stored) 6 100% 100% 0 110236 2432 12.8 20.9 0.0038 (est.) –
narrow-language-suite-setup-tags-01 rf-language narrow Δ T−B +0 pp +207984 +5799 +6.2 +125.5 +0.0074
narrow-non-rf-control-01 plugin narrow treatment 3 100% 100% 0 27021 125 2.0 4.0 0.0010 (est.) no
narrow-non-rf-control-01 plugin narrow baseline (stored) 6 100% 100% 0 25918 102 2.0 2.9 0.0009 (est.) –
narrow-non-rf-control-01 plugin narrow Δ T−B +0 pp +1103 +24 +0.0 +1.2 +0.0001
narrow-python-library-flaky-listener-01 rf-python-library narrow treatment 3 100% 100% 0 343718 4099 19.3 52.9 0.0111 (est.) no
narrow-python-library-flaky-listener-01 rf-python-library narrow baseline (stored) 6 100% 100% 0 158597 2642 11.8 26.4 0.0053 (est.) –
narrow-python-library-flaky-listener-01 rf-python-library narrow Δ T−B +0 pp +185121 +1457 +7.5 +26.5 +0.0058
narrow-python-library-inventory-scope-01 rf-python-library narrow treatment 3 100% 100% 0 218063 2231 14.0 37.8 0.0069 (est.) no
narrow-python-library-inventory-scope-01 rf-python-library narrow baseline (stored) 6 67% 67% 0 218709 3597 15.5 (2 at limit) 31.9 0.0071 (est.) –
narrow-python-library-inventory-scope-01 rf-python-library narrow Δ T−B +33 pp -646 -1366 -1.5 +5.9 -0.0002
narrow-python-library-mode-literal-01 rf-python-library narrow treatment 3 100% 100% 0 201782 6571 12.3 70.5 0.0069 (est.) no
narrow-python-library-mode-literal-01 rf-python-library narrow baseline (stored) 6 100% 100% 0 120891 1707 9.7 17.9 0.0040 (est.) –
narrow-python-library-mode-literal-01 rf-python-library narrow Δ T−B +0 pp +80891 +4863 +2.7 +52.7 +0.0029
narrow-rf-injection-positive-01 plugin narrow treatment 3 100% 100% 0 109350 1051 8.0 17.2 0.0037 (est.) no
narrow-rf-injection-positive-01 plugin narrow baseline (stored) 6 100% 100% 0 91845 1657 6.7 19.6 0.0031 (est.) –
narrow-rf-injection-positive-01 plugin narrow Δ T−B +0 pp +17505 -606 +1.3 -2.4 +0.0006
narrow-rf-mcp-execute-01 plugin narrow treatment 3 100% 100% 0 209832 1165 10.3 30.7 0.0068 (est.) no
narrow-rf-mcp-execute-01 plugin narrow baseline (stored) 6 100% 100% 0 166644 2096 9.2 22.9 0.0056 (est.) –
narrow-rf-mcp-execute-01 plugin narrow Δ T−B +0 pp +43189 -932 +1.2 +7.8 +0.0012
narrow-setup-requests-01 rf-setup narrow treatment 3 100% 100% 0 163887 4394 11.3 47.6 0.0055 (est.) no
narrow-setup-requests-01 rf-setup narrow baseline (stored) 6 100% 100% 0 87372 816 8.0 12.3 0.0029 (est.) –
narrow-setup-requests-01 rf-setup narrow Δ T−B +0 pp +76516 +3578 +3.3 +35.4 +0.0026

Skills

Skill Tasks Treatment outcome pass Baseline outcome pass Δ outcome pass Δ input tok Δ turns Δ cost $
rf-language 5 100% 77% +23 pp +139152 +2.7 +0.0044
rf-python-library 3 100% 89% +11 pp +88455 +2.9 +0.0028
rf-setup 1 100% 100% +0 pp +76516 +3.3 +0.0026

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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FHEmzL3ErAhGQykKWDx2wP
Replaces the DeepSeek V4.1 Flash baselines: N=6, both arms, all tiers,
turn factor 1.5. The run cost $5.86 of OpenRouter spend.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FHEmzL3ErAhGQykKWDx2wP
@manykarim manykarim changed the title fix(rf-desktop): fix-desktop-eval-turn-overhead (OpenSpec change) fix(rf-desktop): working fixture locators, locator check, less hook overhead; CI evals on GLM 5.3 Flash Nov 13, 2026
@manykarim
manykarim marked this pull request as ready for review November 13, 2026 18:21
@manykarim
manykarim merged commit 4bd69c5 into main Nov 13, 2026
1 of 2 checks passed
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