feat(plugin): add optimize-skill and the --split row filter it measures with - #129
Open
uipreliga wants to merge 1 commit into
Open
feat(plugin): add optimize-skill and the --split row filter it measures with#129uipreliga wants to merge 1 commit into
uipreliga wants to merge 1 commit into
Conversation
uipreliga
requested review from
akshaylive,
bai-uipath and
tmatup
as code owners
August 21, 2026 03:18
|
Claude finished @uipreliga's task in 1m 48s —— View job Code Review in Progress
|
…es with Adds the `/coder-eval:optimize-skill` skill — prose only, no Python — plus the one product change it needs to measure anything: `Dataset.split_field` and a `--split` row filter in `task_loader.expand_dataset`. Both are inert when unused: a dataset with no `split_field` and a run with no `--split` behave exactly as before. Stage B here is a manual reading of two runs. There is no gate, no statistics and no `coder_eval.optimize` package in this PR. One published skill changes behaviour: `analyze`'s frontmatter `description` is replaced by the measured winner of the round that tutorial 08 documents. Also fixes a dependency defect this PR's CI surfaced, unrelated to the split: `evaluation/judge_bedrock.py` imports `httpx`, which `pyproject.toml` never declared. It arrived transitively via `anthropic` until `anthropic` 1.0.0 (released 2026-08-20) moved to `httpx2`. A FRESH resolve — what `uv tool install` and `pip install coder-eval` do, since a wheel carries no lockfile — then stopped installing `httpx`, so `criteria/llm_judge.py` raised on import, the discovery loop swallowed it, and `llm_judge` vanished from the registry. `uv.lock` hid this from every `uv sync --frozen` job. `httpx` is now declared, and `tests/test_declared_dependencies.py` asserts the invariant on the DECLARATION rather than the installed set — the only form that fails in the locked jobs, where this bug was invisible. Imports guarded by `try/except ImportError` are derived as optional and exempt, so the soft dependencies (`google.antigravity`, `openai`) need no allowlist. Squashed from feat/plugin-optimize-skill: 7376062 feat(dataset): 1/3 — add Dataset.split_field and the --split row filter 240d66c feat(plugin): 2/3 — add the optimize-skill skill and split-label the activation template 8920410 docs: 3/3 — add the skill-optimization tutorial, and fix the reachability guidance it disproved 2c30397 style: apply ruff format to the reachability lint assertion ae3c39b docs(harness): record the all-skipped-run-exits-0 gap found while adding --split b53c7d4 fix: code review fixes for the split-field / optimize-skill plan d7d56f1 feat(plugin): promote a measured `analyze` description, and close the two open findings 844348d docs(tutorial): Stage C completed — the analyze promotion is confirmed on holdout e340b58 docs: record the bare-name collision hazard, and mark the plan complete Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
uipreliga
force-pushed
the
pr/split-mvp
branch
from
August 21, 2026 03:38
8acd9d7 to
a6b828d
Compare
This was referenced Aug 21, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

This is PR 1 of 3 extracted from #109 (
225 files, +53,889 / −3,807, 202 commits). Thethree land serially, each based on
main: this one, then the execution track, then thedogfood correctness fixes. #109 stays open as the reference tree until all three have merged.
Blast radius
optimize-skillis prose only. This PR adds no Python for it — no gate, no statistics,no
coder_eval.optimizepackage. The skill is a 349-lineSKILL.mdplus two referencesurfaces and a task template.
The product change is 100 lines across five files:
models/tasks.pyDataset.split_field— one new optional keyorchestration/task_loader.py--splitrow filter insideexpand_datasetorchestration/config.py,cli/run_command.py,orchestration/experiment.pyBoth are inert when unused. A dataset with no
split_fieldis unlabelled, and anunlabelled dataset with no
--splitexpands exactly as it does today. No task file intasks/changes behaviour, no default inexperiments/default.yamlmoves.Filtering runs before variant resolution, so row selection takes part in no config-merge
layer and needs no
MergeFieldstrategy — CE014 does not apply.One existing skill changes behaviour — read this as a product change
d7d56f1replaces the frontmatterdescriptionof the publishedanalyzeskill withthe measured winner of an optimization round. A skill's
descriptionis what the modelmatches on to decide whether to engage, so this is an activation-behaviour change to
something users already have installed, not a docs edit.
docs/tutorials/08-optimizing-a-skill.mddocuments the exact round that produced it —candidates, both arms, and the holdout confirmation.
The other five
SKILL.mdfrontmatter edits are the shared-description-budget ripple:optimize-skilljoins the listing, and the combined length is capped because that budget isshared with every skill a user has installed.
What this PR does not do
significance test, no promotion rule, no refusal path.
coder_eval.optimizepackage. It does not exist yet at this point in the stack.produces better outcomes. That is PR2.
they get their final numbers and the collision guard.
Reading ahead
The two follow-ups are built after this one merges, so their branches do not exist yet.
Once each is pushed these compare views render exactly that PR's diff, with no PR and no CI
needed:
https://github.com/UiPath/coder_eval/compare/pr/split-mvp...pr/split-execution-trackhttps://github.com/UiPath/coder_eval/compare/pr/split-execution-track...pr/split-dogfood-fixes(A PR based on a non-
mainbranch triggers no CI here — every gating workflow filters onbranches: [main, develop]anddevelopdoes not exist on this remote. That is why the threeare serial rather than a stacked chain, and why the compare view is the read-ahead mechanism.)
One unrelated fix, forced by this PR's CI
CI surfaced a pre-existing dependency defect that has nothing to do with the split, and it is
fixed here rather than deferred because it breaks every fresh install today.
evaluation/judge_bedrock.pydoesimport httpx, andpyproject.tomlnever declaredhttpx.It arrived transitively through
anthropic— untilanthropic1.0.0, released2026-08-20, moved to
httpx2. A fresh resolve then stops installinghttpx:A fresh resolve is what
uv tool install(the published action) andpip install coder-evaldo — a wheel carries no lockfile, so users get whatever the ranges allow. The consequence is
not an install error but a silent capability loss:
criteria/llm_judge.pyimportsjudge_bedrock, so it raised;criteria/__init__.pycatches import failures and logs them; andllm_judgesimply disappeared from the registry. A task using it then died at orchestrator setupwith
Missing criterion checkers for types: {'llm_judge'}.Why no existing check caught it. Every
--frozenjob — the Quality Gate, Windows, all thelive suites, and
make verify— installs fromuv.lock, which pinnedanthropic0.102.0 andtherefore contained
httpx. The bug was invisible to the entire locked half of CI. Onlyaction-dogfood, which resolves like a real consumer, could see it.The fix is two parts:
httpx. We import it directly; leaning on a transitive path was the defect.Verified against CI's exact resolve (
anthropic1.0.0 +mcp2.0.0 +httpx): all 15criterion checkers register,
llm_judgeincluded, and the CLI runs.tests/test_declared_dependencies.py— asserts every unguarded third-party import undersrc/is a declared dependency. It checks the declaration, not whether the moduleimports, because "can I import it" passes in every locked environment and is precisely the
blind spot that shipped this. Imports wrapped in
try/except ImportErrorare derived asoptional and exempt, so genuine soft dependencies (
google.antigravity,openai) need nohand-maintained allowlist. Confirmed to fail, naming
httpxand its file, when thedeclaration is removed.
This does not cap
anthropicormcp. Both just released majors under our unbounded ranges,and whether to add upper bounds is a dependency-policy decision that deserves its own change —
the import surface we use is small and verified working on 1.0.0.
Verification
Full gate on this tree with
--all-extras:376 files already formatted,ruff checkclean,pyright0 errors, 0 warnings, and 4723 passed, 0 failed.