fix(process-mining): grade the real add-table verb, and make the verb linter see leaf verbs - #2544
fix(process-mining): grade the real add-table verb, and make the verb linter see leaf verbs#2544Cellcote wants to merge 1 commit into
Conversation
… linter see leaf verbs `skill-pm-add-table-queryable` required `uip pm apps model add-table`, which is not a verb — the CLI has `uip pm apps data-model add-table` (`apps model` is the semantic model: fields/get/update). The eval therefore rewarded a hallucinated verb and penalised agents that followed the skill: on 2026-08-05 the agent typed the wrong verb, errored, retried correctly, and scored 1.0; on 2026-08-10 it went straight to the correct verb and scored 0.778 FAILURE. The 3.0-weight criterion was the entire delta. `scripts/check-cli-verbs.py` reported the set clean because of two defects: - `enumerate_paths` treated `\b` as a partial match and trimmed the token it had just accumulated. A `\b` following a word character *confirms* the token ended, so this dropped the leaf verb from every `uip <group> <leaf>\b` pattern — the repo's standard shape — leaving only the command group verified. - `classify.best_match` then fell back to the parent group, so a bogus leaf under a real group passed as reachable. Also scan `command_not_executed` (and `command_executed` bounded to `max_count: 0`), which were skipped entirely. A negative whose verb does not exist can never fire, so it awards its weight unconditionally. These report Medium, not High — they inflate scores rather than breaking the run, and the guard is sometimes deliberate. False positives are guarded three ways: positional arguments after a leaf verb, partial kebab tokens (`create-`), and anything under an `unwalkable_groups` entry are never claimed missing. Repo-wide this yields 0 High and 2 Medium (advisory, in uipath-governance). Tags: all six process-mining tasks now carry the required `skill` + `tier` + `mode:*` + `lifecycle:*` from the closed vocabularies. `mode:fix`, `lifecycle:extend` and `lifecycle:maintain` were outside them and `tier` was missing on four tasks, so those tasks were invisible to `make` targets, coverage reports and evalboard drilldown. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Claude finished @Cellcote's task in 3m 18s —— View job Coder-eval task lint (advisory)
Coder-eval task lint (advisory)5 task YAMLs changed; verdict counts: 0 Critical, 0 High, 0 Medium, 0 Low, 5 OK. Rubric: .claude/commands/lint-task.md. This check is advisory and never blocks merge. Evidence of passing run❌ High — PR body explicitly states "the eval tasks themselves were not re-run against a tenant for this PR." The author provides a rationale (changes are to grader regexes and tags only, verified statically against the
Per-task lint
|
|
Claude finished @Cellcote's task in 4m 26s —— View job PR Review: fix(process-mining) — grader verb fix & verb linter improvements
SummaryFixes a grader bug where Change-by-Change Review1.
|
| Area | Status | Notes |
|---|---|---|
| Frontmatter | N/A | No SKILL.md changes |
| E2E Tests | OK | Task YAML fixes are well-scoped; linter tests cover regressions |
| Skill Body | N/A | No skill content changes |
| References & Assets | N/A | No reference changes |
| Repo Hygiene | OK | No new paths, no secrets, scoped changes |
Issues for Manual Review
- Verb correctness is catalog-verified but not tenant-verified. The PR correctly notes the eval tasks were not re-run. The next nightly run on
add_table_queryablewill be the real validation that the corrected regex matches what the agent actually types. - Tag reclassification (
mode:fix→mode:diagnose). The reasoning (followsuipath-api-workflow/diagnose/runtime_fixprecedent) is sound, but the skill owner should confirm these two repair tasks (mapping_fix_in_place,transform_fix_apply_not_reingest) are correctlydiagnoserather thanbuild.
Conclusion
Clean PR. The grader bug is real, the fix is correct (verified against catalog), the linter improvements are well-reasoned with good false-positive guards, and the tag changes align with the documented taxonomy. All 7 new tests target specific regressions. No issues found that would block merge.
|
Superseded by the split requested in review:
Same commit content, separated so the grader fix and the tooling fix can be |
Why
The process-mining eval set looked flaky across the two most recent nightly runs
(2026-08-05,
2026-08-10).
It wasn't flake — it was a grader bug that the CLI-verb linter could not see.
Only 2 of 6 tasks moved between the runs, each by exactly one criterion:
skill-pm-add-table-queryableskill-pm-custom-app-pipeline-e2e(The runs are not otherwise comparable — different model, different
uipbuild,and the task set itself changed between them. Details at the bottom.)
1.
skill-pm-add-table-queryablegraded a verb that doesn't existThe 3.0-weight criterion required
uip pm apps model add-table. The catalog hasuip pm apps data-model add-table;apps modelis the semantic model(
fields/get/update) and has noadd-tablechild. The skill teaches thecorrect verb in both
SKILL.md(Rule 1) andreferences/data-model.md.So the eval rewarded a hallucinated verb and penalised agents that followed the
skill:
apps model add-table, it errored, it retried withapps data-model add-table. The regex matched the failed attempt → passed.0.778, FAILURE.
The green run was the wrong result. Fixed to
apps\s+data-model\s+add-table.2. Why
check-cli-verbs.pyreported the set cleanTwo defects, each now covered by a regression test:
\bdiscarded the leaf verb. OnAT_BOUNDARYthe walker bailed andcalled
_trim_to_word_boundary, dropping the token it had just accumulated.But
\bafter a word character confirms the token ended — the opposite of apartial match. Since
uip <group> <leaf>\bis this repo's standard patternshape, the checker was only ever validating the command group.
best_matchthen fellback to
pm apps model, a real group, and reported reachable.Third gap, also fixed:
iter_command_patternsonly yieldedcommand_executed,so negative criteria were never verb-checked. A negative whose verb does not
exist can never fire, so it awards its weight on every run.
command_executedwith
max_count: 0is the other negative idiom here and gets the same handling.Negatives report Medium, not High — they inflate scores rather than breaking
the run, and the guard is sometimes deliberate.
False positives are guarded three ways, all tested: positional arguments after a
leaf verb (
is resources run list <connector> <activity>), partial kebab tokens(
create-from a pattern matchingcreate-raw/create-resource), andanything under an
unwalkable_groupsentry.Also pinned
encoding="utf-8"on the file reads — the script crashed on Windowsunder cp1252.
3. Tag hygiene
Five of six tasks were missing required tags or using values outside the closed
vocabularies in
tests/README.md§Tag Taxonomy (mode:fix,lifecycle:extend,lifecycle:maintainare not valid;tierwas absent on four). Those tasks wereinvisible to
maketargets, coverage reports and evalboard drilldown.add_table_queryablemode:build, lifecycle:extendintegration, mode:build, lifecycle:setupapp_types_discovery_smokesmoke, mode:diagnose, discoversmoke, mode:diagnose, lifecycle:discovermapping_fix_in_placemode:fix, lifecycle:maintainintegration, mode:diagnose, lifecycle:setupquery_group_by_sugarmode:diagnosesmoke, mode:diagnose, lifecycle:discovertransform_fix_apply_not_reingestmode:fix, lifecycle:maintainintegration, mode:diagnose, lifecycle:setupThe two repair tasks follow the precedent set by
uipath-api-workflow/diagnose/runtime_fix(mode:diagnosefor "here is anerror, fix it"), with
lifecycle:setupbecause they mutate tenant state. Thebare
discovertag duplicatinglifecycle:discoverwas dropped.custom_app_pipeline_e2ewas already correct.Verification
pytest tests/scripts/test_verb_checkers.py— 21 passed (14 existing + 7 new).check-cli-verbs.py tests/tasks/uipath-process-mining/*.yaml— 0 High, 0 Medium..github/invokes this script;/audit-verbsuses--report(exit 0 on Medium) and/lint-taskmerges--jsonfindings.The 2 Medium findings are both in
tests/tasks/uipath-governance/aops-policy/deployment_configure_smoke.yaml—negatives against
deployment user add/add-user, which don't exist (the realverb is
configure, which auto-registers). Plausibly intentional guards; leftalone as out of scope, but worth a look from that skill's owner.
Passing-run claim: the eval tasks themselves were not re-run against a tenant
for this PR — the change is to grader regexes and tags, verified statically
against the
uipcatalog (1.200.0-dev.8173) and the linter's own test suite.Re-running
skill-pm-add-table-queryableshould be part of the next nightly.Not addressed here
Deliberately out of scope, from the same investigation:
gemini-3.5-flashonuip8093;08-10 ran
gpt-5.6-terraon 8173, andmapping_fix_in_placegained twocriteria in between. With one replicate per task, a single criterion flips
the whole task. Pin the model or run ≥3 replicates before calling anything flaky.
custom_app_pipeline_e2e's "inspect the transformations" criterion isincidental to the task goal and cost the 08-05 run a FAILURE for no behavioural
reason — drop it or make it advisory (
pass_threshold: 0).uip pmverbs are referenced. Critical Rule 10(
apps model fields, the DNA-46960 duration lockout) has zero tasks despitebeing called out in the frontmatter, and the whole
queryfamily beyondrunis untested. Separate PR.
🤖 Generated with Claude Code