test(uipath-maestro-bpmn): fix false-negative grading on 3 BPMN eval tasks - #3151
Conversation
…tasks From the claude-code nightly run 2026-09-08_04-17-10. Three gating criteria failed correct agent behavior. - error_mapping: the skill (expression-authoring.md, structural-bpmn.md, failure-escalation-guide.md) documents the runtime error key as capital `Error` and warns `vars.error` does NOT resolve. The agent correctly wrote `vars.Error.code`, but the check regex + prompt required lowercase `vars.error.code` - and the check docstring even cited the reference it contradicted. Correct the check regex/messages and the prompt/description to capital `Error`. - wiki_pageviews: the llm_judge failed read-only `uip maestro bpmn registry` discovery as a "live network fetch", though it is the documented way to author `uipath:*` payloads. Whitelist read-only registry discovery; gate on actual cloud lifecycle mutations / live data fetches. - minimal_fault_triage: the llm_judge applied "only inspected [4 sources]" as a closed whitelist and failed read-only inspection the prompt encourages (diagnostic priority ladder); no mutation occurred. Reword to gate on mutations only and allow any read-only diagnostic read. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
Claude finished @nikhil-maryala's task in 2m 49s —— View job Coder-eval task lint (advisory)3 task YAMLs changed (all modified); 0 Critical, 0 High, 0 Medium, 0 Low, 3 OK. Rubric: .claude/commands/lint-task.md. This check is advisory and never blocks merge. Evidence of passing run❌ High — PR body explicitly states "needs a coder-eval re-run on this branch to confirm the three now pass" — no claim that the changed tasks have been run and passed. Please edit the PR description to add a line like:
Per-task lint
|
|
I'll analyze this and get back to you. |
rockymadden
left a comment
There was a problem hiding this comment.
What
Fixes false-negative grading on 3 BPMN eval tasks from nightly 2026-09-08_04-17-10.
| Task | Change |
|---|---|
expressions/error_mapping |
check regex + prompt vars.error.code -> vars.Error.code |
multi_node/wiki_pageviews |
judge whitelists read-only uip maestro bpmn registry discovery |
operate-diagnose/minimal_fault_triage |
judge gates on mutations instead of a closed 4-source whitelist |
What I confirmed
- ✅ Casing claim holds.
references/expression-authoring.md:30-35says the engine seeds the error under the capital-Errorkey and thatvars.errordoes not resolve.structural-bpmn.md:340,351andpatterns/failure-escalation-guide.md:15,44,50agree. The old check contradicted the reference its own docstring cited. No lowercasevars.erroris left undertests/tasks/uipath-maestro-bpmn/. - ✅ Registry claim holds.
references/cli-conventions.md:16-17andSKILL.md:155,161makeregistry pull/list/getthe mandated discovery path. Failing an agent for following the skill was wrong. - ✅ The 4-source whitelist really was closed. The old prompt named status, incidents, variables, and asset; the mocks also serve
incident get,element-executions, andcursors(fixtures/mocks/responses/manifest.json). - ✅ The cheat path stays closed. Reading
mocks//fixtures//response JSON directly is still an explicit fail, matchinginitial_prompt:45.
Overall findings
🟢 The "needs a re-run" caveat is stale — your own CI already verified a third of this PR
This PR's smoke run 34278022399 ran skill-bpmn-operate-diagnose-minimal-fault-triage and scored llm_judge 0.98, status SUCCESS.
The same task on #3152's branch (same harness, without this fix) scores 0.45, status FAILURE (run 34376337458).
0.45 -> 0.98 on an identical task is direct proof of the diagnosis, and it reproduces on Codex / gpt-5.6-luna, not just claude-sonnet-5. That makes the false negative harness-independent, which is a stronger result than the PR claims.
Fix: put that in the PR body. It also clears the lint bot's High.
🟡 minor — the other two are still unverified
error_mapping is integration and wiki_pageviews is e2e, so neither ran in the PR gate (the smoke step reports Pass rate: 100.0% (1/1)). A targeted coder-eval run on each is cheap and would close the loop.
🟢 Merge this before #3152
#3152's smoke gate is red solely on this judge criterion. Landing this unblocks it.
Recommendation
Comment. The diagnosis is correct on all three and one is CI-proven. One in-scope defect in the wiki_pageviews rewrite is worth a one-line fix first, because it leaves alive the same judge ambiguity this PR exists to remove.
tl;dr
Good diagnosis, correct fixes. wiki_pageviews's judge prompt now contradicts itself: it whitelists registry pull while the sentence above still forbids "any live HTTP call". Fix that line. Your own smoke run already proved the minimal_fault_triage fix (0.98 here vs 0.45 on #3152), so drop the "needs a re-run" caveat and add the claim.
- wiki_pageviews: pass sentence said "any live HTTP call" while whitelisting registry pull (which is one) — narrow to "a live HTTP fetch of the modeled pageview data" so the pass and fail clauses agree. - minimal_fault_triage: drop traces/spans from the whitelist — no mock serves them in this sandbox (unmocked returns exit 1); trailing "any read-only CLI diagnostic read" already covers future additions. - error_mapping check: scope the docstring to what it grades (casing only); the <uipath:output source="=Error"> resolution binding is not graded and the skill example omits it — tracked in #3171. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
@rockymadden addressed (861384b):
Agreed on merge order — this should land before #3152. |

Summary
Fixes false-negative grading on 3 BPMN eval tasks from the claude-code nightly run
2026-09-08_04-17-10. In each case the agent behaved correctly but a criterion failed it.error_mapping— check had the wrong casingThe engine seeds the failed element's error under the capital
Errorkey (references/expression-authoring.md:30-35, verified againstPO.BpmnEnginein #2780);vars.errornever resolves. The agent correctly authored=vars.Error.code == …, but the check regex + prompt required lowercase — and the check docstring cited the very reference it contradicted. Corrected check + prompt to capitalError. Scope note: the check grades casing only; the<uipath:output source="=Error">resolution binding is tracked in #3171 (the skill's own example currently omits it).wiki_pageviews— judge failed read-only registry discoveryThe
llm_judgefailed the agent foruip maestro bpmn registrypull/search/get — read-only discovery and the documented authoring path. Whitelisted it, and narrowed the pass clause ("a live HTTP fetch of the modeled pageview data") so it no longer contradicts the whitelist.minimal_fault_triage— judge treated the 4 named sources as a closed whitelistThe agent used only read-only
uip maestro bpmn … --output jsonreads (no mutation) and was failed for "inspecting beyond permitted sources." Reworded to gate on mutations, while preserving the explicit fail for readingmocks//fixtures//response JSON directly. Droppedtraces/spansfrom the whitelist — no mock serves them in this sandbox.Verification
Ran all three on this branch via
run-coder-eval(agent=claude,claude-sonnet-5, run34374076677) — all 3 SUCCESS:error_mapping1.000,wiki_pageviews1.000,minimal_fault_triage0.992.Stronger still,
minimal_fault_triageis CI-proven harness-independently: this PR's own smoke run (34278022399) scored itsllm_judge0.98 / SUCCESS on Codex (gpt-5.6-luna), while the identical task on #3152's branch (same harness, without this fix) scores 0.45 / FAILURE (34376337458). 0.45 → 0.98 is direct proof of the diagnosis.Merge order
Land this before #3152 — that PR's smoke gate is red solely on this judge criterion.
🤖 Generated with Claude Code