Conversation
|
Claude finished @DevMomo's task in 4m 16s —— View job PR Review: test(bpmn): port the live-tier and field-shape Maestro Flow evals to the BPMN suite
SummaryAdds 30 task directories (21 live-tier, 9 field-shape) with 30 graders and shared helpers for the BPMN eval suite. This is a well-structured port from the Flow eval suite with meticulous traceability: every grader assertion is tagged F/I/T in its docstring, criteria match the Flow source one-for-one in type/order/weight/threshold, and 23 tasks have passing CI run evidence in Change-by-Change Review1.
|
| Area | Status | Notes |
|---|---|---|
| Frontmatter | N/A | No skill SKILL.md changes |
| E2E Tests | OK | 30 tasks with CI evidence, proper structure |
| Skill Body | N/A | No skill content changes |
| References & Assets | N/A | No skill reference changes |
| Repo Hygiene | Minor | 3 tasks missing mode:* tag; no secrets, no personal paths, no cross-skill deps |
Issues for Manual Review
- Budget arithmetic: Each live grader documents its timeout budget (solution init + import + debug + variables-all + incidents + margin). The arithmetic is internally consistent in the files I sampled, but I cannot verify the actual CLI wall-clock times — the budgets are derived from CI observations.
- Tenant fixture availability: The live tasks depend on specific connections and projects on the alpha tenant (e.g.,
is-sandboxes-test@uipath.com-uipath-sandbox-380, projectCE). These are documented as tenant prerequisites but cannot be verified from code review. check_escalation_orchestrator_paths.pyis 600 lines and grades 7 debug runs in one criterion. This is correct (it matches Flow's own grader structure), but is the most complex single grader in the PR — worth a closer read by someone familiar with the escalation scenario.
Conclusion
This is a thorough, well-documented port. The assertion-map discipline (every grader docstring traces each check to its Flow source with line numbers) is excellent and makes future maintenance feasible. The shared helper changes are narrow, CI-motivated, and covered by unit tests. The 3 missing mode:* tags are the only required fix — everything else is clean. Request one small change (add "mode:build" to the 3 multi_node tasks), then this is ready to merge.
|
Claude finished @DevMomo's task in 1m 35s —— View job Coder-eval task lint (advisory)Running advisory lint on 30 changed task YAMLs…
|
nikhil-maryala
left a comment
There was a problem hiding this comment.
Request changes. Tally: 1 Blocker / 0 Critical / 5 Major / 8 Minor / 1 Nit.
This is a large, careful port, and a lot of it checks out:
pytest tests/tasks/uipath-maestro-bpmn/: 767 passed, 1 skipped.check-task-host-paths,check-task-driverandcheck-cli-verbsare clean. All 22 task IDs validate against pinned coder-eval 0.12.4.- The YAMLs are clean: no
@uipath/cliinenv_packages, no gating--output jsoncheck, and no$TASK_DIR/$SKILLS_REPO_PATH. Every referenced grader exists, with matching argv. - The graders fail closed on an empty sandbox or a malformed CLI envelope, and the imported artifact is sha256-pinned.
- The field-shape mutations I tried (enum,
showHidden, path param, multiselect, paginated id, searchable joins) fail when wrong and pass when right.
Blocking:
- All three path-to-ga escalation graders crash at this head. #3469 (already on main, and identical in this branch's
bpmn_live.py) changedindex_runtime_connectorsto 3-tuple keys, but these graders still unpack two. Every correct artifact scores 0 on the weight-5.0 criterion. The "green" run IDs cited in the PR body and ledger (35503094182, 35524004307) date from 2026-09-20, before #3469. check_jira_create_issuejournals every regex-matched key for deletion before confirming it. Teardown can then permanently delete other people's issues in the shared CE project.testmanager_crud_groundedgives 6.5 of 9.5 weight for an agent-writtenresult.json. The Flow original wasskip: true.generic_dynamic_nodepasses on any stray[].check_enum_flowskips any=-expression.body_objectcalls per-field body inputs "valid" and merges them. The skill says those inputs don't merge and fail at runtime, so the static graders pass artifacts the skill forbids.
CI: Run skill smoke tests shows 94.7% against a 95% bar. The failing task (skill-bpmn-operate-diagnose-minimal-fault-triage) isn't in this PR, so this PR doesn't cause it. path-to-ga approval is expected to be pending, but those three tasks carry the Blocker, so they shouldn't be approved as they stand.
rockymadden
left a comment
There was a problem hiding this comment.
🔴 Changes requested. Three live graders crash on every run, and the Jira cleanup can delete issues this run never created.
What
- Ports 15 live-tier and 7 field-shape Maestro Flow evals to the BPMN suite, plus shared helpers (
body_object/body_fields,find_bpmn_file,resolve_project(exclude_under=)) and the porting docs. - Graders import the agent's
.bpmn, runuip maestro bpmn debugon alpha and grade variables, incidents and tenant state.
Overall findings
- 🔴 critical: "every task green" isn't true at head. The cited runs predate #3469 (the fix it introduced was already in this branch's base). The three escalation graders (inline) can't pass now. Fix: re-dispatch all 22 on head and update the run ids in
parity-ledger.md. - 🟠 major: the live sequence is duplicated, which contradicts the description. "Graders import these instead of carrying private copies" holds for the body helpers only. Solution init/import, sha256 pin, final-status/incident handling,
_leaves, the haystack builders andCOMPLETED_STATUSESare copied into about 12 graders (e.g.check_channel_description.py:121-262,check_dice_runs_simulated.py:129-264). Several bugs below exist only because the copies drifted. Fix:bpmn_live.import_and_debug()plusoutput_leaves(skip_inputs=). - 🟠 major: shared with #3476.
body_objectis byte-identical there, so the merge finding (inline,bpmn_check.py) has to land in both, or one PR reintroduces it. - 🟡 minor: the docs read like session notes, not repo docs. "One Sonnet subagent per task", dated "Where it stands" and "Resuming" steps, "Learned on CI run …". The ledger's planning tables are stale (inline). Fix: move the process narrative into the PR description and keep only what a future porter acts on.
Not caused by this PR: tags such as negative, uipath-salesforce, lifecycle:execute and missing mode:* are inherited from Flow and are off the tests/README.md vocabulary.
I read the code and ran nothing. The crash, the unpacks and the timeout arithmetic are confirmed by reading; runtime behaviour on alpha is not verified.
tl;dr
- Three escalation graders crash, and the "all green" runs are stale.
- Jira cleanup can delete other people's CE issues, and it reports failed deletes as OK.
- Several graders accept more than their Flow originals did (enum, generic_dynamic_node, path_params, billing, testmanager).
body_objectendorses a body shape the skill says fails at runtime.
There was a problem hiding this comment.
Copilot review overview
🟡 Changes recommended
Unresolved grader crashes, unsafe Jira cleanup, and false-positive grading paths can invalidate results or affect shared tenant data.
Get a fresh assessment by requesting another Copilot review.
Review effort: Balanced
Findings: 1
Open (1)
What changed in this PR
Ports 22 Maestro Flow evaluations to the BPMN suite, adding live tenant execution and Integration Service field-shape coverage.
Changes:
- Adds 15 live-debug and 7 connector field-shape tasks.
- Adds shared BPMN grading, artifact discovery, and request-body helpers.
- Documents the live-port workflow and parity results.
| File | Description |
|---|---|
_porting/LIVE-ADDENDUM.md |
Defines live-port rules. |
_porting/LIVE-HANDOFF.md |
Records port status and handoff. |
_porting/parity-ledger.md |
Tracks task parity and CI runs. |
_shared/bpmn_check.py |
Extends artifact and body helpers. |
_shared/check_billing_invoice_lookup.py |
Grades live invoice lookup. |
_shared/check_channel_description.py |
Grades Slack description retrieval. |
_shared/check_complex_array.py |
Checks complex-array artifacts. |
_shared/check_databricks_query.py |
Checks JDBC query wiring. |
_shared/check_df_smoke_error.py |
Checks Data Fabric error shape. |
_shared/check_dice_runs_simulated.py |
Grades simulated dice execution. |
_shared/check_enum_flow.py |
Checks enum body fields. |
_shared/check_escalation_jira_ticket.py |
Grades Jira escalation execution. |
_shared/check_escalation_orchestrator_paths.py |
Grades escalation branches. |
_shared/check_escalation_slack_alert.py |
Grades Slack escalation alerts. |
_shared/check_generic_dynamic_node.py |
Grades dynamic connector execution. |
_shared/check_jira_create_issue.py |
Grades Jira issue creation. |
_shared/check_jira_get_issue.py |
Grades Jira issue retrieval. |
_shared/check_managed_http_fallback.py |
Checks HTTP fallback forms. |
_shared/check_multiselect.py |
Locates multiselect artifacts. |
_shared/check_paginated_reference_lookup.py |
Checks resolved paginated references. |
_shared/check_path_param_value.py |
Checks path-parameter values. |
_shared/check_searchable_joins.py |
Checks Salesforce connector presence. |
_shared/check_slack_http_fallback.py |
Grades Slack HTTP fallback. |
_shared/check_slack_multiselect.py |
Checks Slack recipient arrays. |
_shared/check_slack_weather_pipeline.py |
Grades the weather pipeline. |
_shared/check_testmanager_crud_grounded.py |
Checks Test Manager round trips. |
_shared/check_webhook_waitfor_parallel.py |
Checks webhook parallel topology. |
_shared/test_bpmn_check.py |
Tests shared BPMN helpers. |
connector_features/complex_array/complex_array.yaml |
Adds complex-array task. |
connector_features/datafabric_connector/smoke_error/smoke_error.yaml |
Adds Data Fabric error task. |
connector_features/enum/enum.yaml |
Adds enum task. |
connector_features/generic_dynamic_node/generic_dynamic_node.yaml |
Adds dynamic-node task. |
connector_features/jdbc_databricks_query/jdbc_databricks_query.yaml |
Adds JDBC task. |
connector_features/multiselect/multiselect.yaml |
Adds multiselect task. |
connector_features/paginated_reference_lookup/paginated_reference_lookup.yaml |
Adds pagination task. |
connector_features/path_params/path_params.yaml |
Adds path-parameter task. |
connector_features/query_params/query_params.yaml |
Adds query-parameter task. |
connector_features/searchable_joins/searchable_joins.yaml |
Adds searchable-joins task. |
connector_features/slack_http_fallback/slack_http_fallback.yaml |
Adds Slack fallback task. |
connector_features/testmanager_crud_grounded/_setup/seed.py |
Seeds Test Manager data. |
connector_features/testmanager_crud_grounded/testmanager_crud_grounded.yaml |
Adds Test Manager CRUD task. |
connector_trigger/webhook_waitfor_parallel/webhook_waitfor_parallel.yaml |
Adds webhook wait task. |
e2e/escalation_jira_ticket/_setup/jira_is.py |
Provides Jira operations. |
e2e/escalation_jira_ticket/_setup/seed.py |
Seeds escalation inputs. |
e2e/escalation_jira_ticket/_setup/teardown_jira.py |
Cleans escalation issues. |
e2e/escalation_jira_ticket/escalation_jira_ticket.yaml |
Adds Jira escalation task. |
e2e/escalation_jira_ticket/test_jira_is.py |
Tests Jira deletion behavior. |
e2e/escalation_orchestrator_paths/_setup/seed.py |
Seeds routing cases. |
e2e/escalation_orchestrator_paths/escalation_orchestrator_paths.yaml |
Adds orchestrator-path task. |
e2e/escalation_slack_alert/_setup/seed.py |
Seeds Slack alert input. |
e2e/escalation_slack_alert/escalation_slack_alert.yaml |
Adds Slack alert task. |
e2e/jira_create_issue/_setup/jira_is.py |
Provides Jira create helpers. |
e2e/jira_create_issue/_setup/seed_jira.py |
Seeds Jira creation data. |
e2e/jira_create_issue/_setup/teardown_jira.py |
Cleans created issues. |
e2e/jira_create_issue/jira_create_issue.yaml |
Adds Jira creation task. |
e2e/jira_get_issue/_setup/jira_is.py |
Provides Jira retrieval helpers. |
e2e/jira_get_issue/_setup/seed_jira.py |
Creates a seed issue. |
e2e/jira_get_issue/_setup/teardown_jira.py |
Removes the seed issue. |
e2e/jira_get_issue/jira_get_issue.yaml |
Adds Jira retrieval task. |
interactive/cli_dice_roller_simulated/cli_dice_roller_simulated.yaml |
Adds interactive dice task. |
multi_node/billing_invoice_lookup/billing_invoice_lookup.yaml |
Adds invoice lookup task. |
multi_node/slack_channel_description/slack_channel_description.yaml |
Adds Slack description task. |
multi_node/slack_weather_pipeline/slack_weather_pipeline.yaml |
Adds Slack/weather pipeline task. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Several target="body" inputs do not merge at runtime (registry-workflow.md, "Body shape"), so body_object now raises BodyShapeError on them, on a whole-body expression, and on a non-object. Graders fail on a designated node's bad body and record it per node where they loop. Same helper as #3502. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
rockymadden
left a comment
There was a problem hiding this comment.
🟡 Commented. Every critical and major from the last round is fixed. What remains is minor, and the alpha re-run on these commits hasn't finished.
What changed since the last review (ee738ed1f..d0bd27cf2)
- The three escalation graders unpack the three-part connector keys.
- Jira cleanup: keys come only from the Create step, are recorded before any status check, and teardown reports failed deletes.
body_objectaccepts only one JSON object. #3476 got the same change.- About 11 graders use the shared helpers in
bpmn_live.py(import_exact,fetch_variables,fetch_incidents,require_clean_run,output_leaves,input_echo_ids). - enum, path_params, generic_dynamic_node, billing, weather, databricks, smoke_error, multiselect and webhook are tightened back toward Flow.
- testmanager_crud_grounded is skipped again, as in Flow.
✅ Fixed
All 32 findings from my last review, and 11 of Nikhil's 16 threads. They are resolved, each with a reply.
⏳ Still standing (existing threads, not repeated here)
- 🟡 minor: tags outside the vocabulary. Inherited from Flow; needs a decision.
- 🟡 minor:
public_value_presentin the orchestrator grader still matches echoed inputs, plus the dice, channel_description and df-spelling items in that thread. - 🟡 minor: the typed-draft preference in
find_bpmn_fileapplies to every caller. - 🟡 minor:
_failwrappers are still duplicated. - 🟡 minor: paginated_reference_lookup only checks the first send node (Copilot thread).
Overall findings
- 🟡 minor: nothing on this head is verified live yet. Eval run 36053143338 (21 tasks, alpha) is still running on
faaf738e3.b587e0670only changes how an empty body input reads. Until the run is green, the tightened graders could reject correct processes. Fix: wait for the run, then update the run ids inparity-ledger.md. - Checked: the path_params artifact from run 35790934047 puts the key in
target="path"(issueId), so the narrowed path check matches what agents actually emit.
Local tests pass (776, Python 3.13). I read the code and ran nothing against the tenant.
tl;dr
- The blockers are gone; about ten minor findings remain.
- Approval waits on the alpha re-run.
nikhil-maryala
left a comment
There was a problem hiding this comment.
Re-review of d0bd27cf2 — Approve. New findings: 0 Blocker / 0 Critical / 0 Major / 3 Minor / 1 Nit. This replaces my Request changes.
The Blocker and all five Majors are fixed. Each was re-checked on this head against the original failing fixtures:
- [BLOCKER] 3-tuple unpack: fixed. All three escalation graders now unpack
(key, path, _object_name)(jira_ticket:234, slack_alert:179, orchestrator_paths:165).resolve_contractreturns a Contract on the Slack and Jira fixtures. With theuipstub, correct runs pass, and a wrong channel, missing text, wrong summary or literal severity fails. - [MAJOR] Jira keys journaled before confirmation: mostly fixed. A passing run journals only CE-100, since Globals are no longer scanned. A narrower failing-run case is left over (new Minor 1).
- [MAJOR] testmanager self-report: fixed. It's back to
skip: true, with a comment saying why. - [MAJOR] generic_dynamic_node stray
[]: fixed. Start-event{"meta":{"tags":[]}}now fails, and a declaredrecords=[]passes. - [MAJOR] enum
=js:'low': fixed. It now failsimportance='high'. - [MAJOR]
body_objectmerge: fixed. It raisesBodyShapeErroron severaltarget="body"inputs, an expression body, invalid JSON or a non-object, matching the skill's one-body rule. A correct single-body artifact still passes, and an empty body reads as{}. Nothing on main callsbody_object. - Minors resolved: dead
TimeoutExpiredrecovery,teardown_jiraenvelope, copiedagent:block, webhook fork-branch check, path_param,slack_channel_descriptiontimeout, ledger/handoff notes.
Gates: pytest tests/tasks/uipath-maestro-bpmn/ 776 passed / 1 skipped. check-task-host-paths and check-task-driver are OK. All required CI checks pass. The mutation tests of the new bpmn_live helpers (require_clean_run, output_leaves, input_echo_ids) behave correctly. path-to-ga approval needs an allowlisted approver, which is now reasonable since the Blocker is fixed.
Earlier minors that are still open (not blocking; the inline comments from my first review still apply):
- Task timeouts:
jira_create_issueandjira_get_issueare 1800 (formula: 2160), andjdbc_databricks_queryis 1500 (formula: 1680). - Tag taxonomy: a missing
mode:*,lifecycle:execute, double tier tags, and connector-key tags. - Input-echo gaps:
check_escalation_orchestrator_paths.py:341andcheck_channel_description.py:166still read Globals with no echo skip. - Dice:
INT_REstill reads7.5as 5. find_bpmn_file: it still prefers a typed draft over the untyped deliverable.- Duplication:
_fail,find_connector_nodes,normalizedandCANDIDATE_TAGSare still copied across graders. - Nits: unused
NS/HTTP_TYPE, andresolve_projectwithoutexclude_under.
nikhil-maryala
left a comment
There was a problem hiding this comment.
Re-review of a0c3e4641 — Approve. New findings: 0 Blocker / 0 Critical / 0 Major / 1 Minor / 0 Nit.
All four findings from my d0bd27cf2 review are fixed:
- [MINOR] Nested Jira keys journaled: fixed.
collect_candidate_keysnow reads only the top-levelresponse.keyviaconnector_response_values, which is documented as "never same-named nested metadata". Probe:{"response":{"key":"CE-100","fields":{"parent":{"key":"CE-7"}},"self":"x CE-9"}}→['CE-100'].- Intermediate
aae6853c8had regressed this further: it dropped the PASS-branch narrowing, so a passing run journaled and deleted a nested CE-7. Moving toconnector_response_valuesina0c3e4641makes the narrowing unnecessary.
- Intermediate
- [MINOR]
input_echo_idsstart-only: fixed. Verbatim=vars.Xcopies are now followed transitively through every element'suipath:output, including output names.output_leavesskips echoed top-level output names too, and there's a new test for it (test_input_echo_ids_follows_copies_through_any_element). - [MINOR]
df_smoke_errorvs BATCH1-ADDENDUM: fixed.mentions_entityaccepts the objectName, an exact value on any input (context_inputsis.//uipath:input, so path, query, body and untargeted all count), or an exact context-path segment. The docstring matches. - [NIT]
Elementsguard and regression test: fixed. There areisinstance(..., list)guards onVariables/Elements/Outputs.test_graders_unpack_the_full_connector_keywalks the graders' AST for the connector-key unpack, so the 3-tuple Blocker can't come back unnoticed.
Also resolved since last round: the tag taxonomy (connector-key, negative, simulation and double-tier tags removed; mode:build added; lifecycle:generate), the typed-draft preference in find_bpmn_file (the rule is gone and ambiguity fails again), the 7 private _fail copies, the orchestrator start-event echo, dice 7.5, and the channel_description echo half.
Gates: pytest tests/tasks/uipath-maestro-bpmn/ 852 passed / 1 skipped, and check-task-host-paths is OK. Every required check passes. path-to-ga approval needs an allowlisted approver, and smoke is pending.
Still open, none of it blocking:
jira_create_issueandjira_get_issuetask timeouts are 1800 andjdbc_databricks_queryis 1500, all below the LIVE-HANDOFF formula.- channel_description counts any Slack node.
- The weather null-readback fallback has no echo skip.
jira_getstill reads root non-input Globals.billinguses a substring match andmanaged_httpaccepts the key anywhere (both inherited from Flow).- Remaining duplication:
find_connector_nodes,normalized,CANDIDATE_TAGS. - Nits: unused
NS/HTTP_TYPE, andresolve_projectwithoutexclude_under.
nikhil-maryala
left a comment
There was a problem hiding this comment.
Re-review of 995cfe4a9 — Approve. Tally: 0 Blocker / 0 Critical / 0 Major / 0 Minor / 0 Nit.
This fixes a false failure. The task contract sets caseKey = the incoming correlationId (escalation_orchestrator_paths.yaml:106), so excluding input echoes for caseKey failed every correct run (eval run 36056004092). PASSTHROUGH_FIELDS = {"caseKey"} drops the echo exclusion for that field only. The classifier exclusion stays, and the other classification fields (escalationPath, severity, engineeringNeeded, responseMode) still skip echoes. The docstring's assertion map is updated to match.
Everything else is unchanged since my approval of a0c3e4641, and that approval's open minors (dice 5.0, timeouts, and the inherited loose graders) still apply.
nikhil-maryala
left a comment
There was a problem hiding this comment.
Re-review of 0e48eec6d — Approve. Tally: 0 Blocker / 0 Critical / 0 Major / 1 Minor / 0 Nit.
This commit only touches the docs: _porting/parity-ledger.md now lists the post-review eval runs (36053143338, 36056004092, 36058708886) as each row's final result and keeps the earlier result in the notes. That's the right way to keep the ledger, and it's honest. It records two tasks that went from PASS to FAIL after the review fixes: escalation_slack_alert, where the Slack step faulted at runtime in both runs, and paginated_reference_lookup, where the agent never resolved the channel id.
Both failures are attributed to agent or runtime behaviour, not the graders. That fits what I verified last round: the escalation graders pass correct stubbed runs and fail wrong ones, and paginated check_wired still rejects wrong channels. One of the two carries a gate tag, so there's one inline Minor. No code changed, and my approval of 995cfe4a9 otherwise stands.
nikhil-maryala
left a comment
There was a problem hiding this comment.
Re-review of 739f53975 — Approve. Tally: 0 Blocker / 0 Critical / 0 Major / 0 Minor / 0 Nit.
Both of my last open items are addressed:
- [MINOR] dice
5.0: fixed.find_int_in_rangenow accepts a whole-valued float (after theboolcheck, asint(leaf)). The newtest_check_dice_runs_simulated.pypins the boundaries:5.0/5/"5"pass, and7.5,0,7,6.5andTruefail. I ran it and it passes. - [MINOR]
escalation_slack_alertpath-to-ga: resolved as option (a). The ledger row now records per-run incident evidence showing the grader judged correctly. Run 36053143338 had nofolderKeyinput on the Slack node (102010, "Value cannot be null (Parameter 'Folder')"). Run 36056004092 had the binding but omitted the requiredsend_as(102003, IS 400). Both are agent authoring faults. The row also names the skill gap (Slack send node:folderKeybinding and requiredsend_as), which is worth a follow-up skill issue.
The rest of the diff since my last review is main merged in.
Re-adds the live-tier ports removed from test/bpmn-port-connectors so the work continues here: Jira get/create/lifecycle/search, escalation jira/slack/ orchestrator_paths, bellevue_weather, slack_channel_description, slack_weather_pipeline, billing_invoice_lookup, billing_discrepancy_detector, generic_dynamic_node, jdbc_databricks_query, slack_http_fallback, testmanager_crud_grounded, Data Fabric smoke_error, webhook_waitfor_parallel. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0162cmh6J5y8h6rZtzwyT37S
Adds the porting brief, connector and live addenda, normalization contract, parity ledger and a handoff document describing what is done, what remains and how each port is made, so the live-tier work can resume on this branch. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0162cmh6J5y8h6rZtzwyT37S
Faithful port of Flow interactive/bellevue_weather_simulated: same simulation persona and constraints, same five criteria and weights. Live grader runs the ephemeral solution + bpmn debug sequence, so that criterion's timeout is 1050 and task_timeout is raised to cover turns plus grading; every other run_limit is Flow's. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0162cmh6J5y8h6rZtzwyT37S
Faithful port of Flow interactive/cli_dice_roller_simulated: same simulation, criteria, weights and criterion timeouts. Only task_timeout grows (2400 to 2800) so the multi-run live check fits under the single turns-plus-grading watchdog. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0162cmh6J5y8h6rZtzwyT37S
… user) Faithful port of Flow interactive/slack_channel_description_simulated with all five criteria kept (validate, advisory debug command, live grader, static channel regex, name advisory). Live criterion timeout sized to the BPMN CLI sequence (1050); everything else is Flow's verbatim. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0162cmh6J5y8h6rZtzwyT37S
Pilot for the twelve Integration Service field-shape evals. Same prompt, criteria and weights as Flow connector_features/ceql_where; the grader reads the CEQL where clause off the connector node's query inputs in either curated or generic form. Verdict for the other eleven is recorded in _porting/LIVE-HANDOFF.md. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0162cmh6J5y8h6rZtzwyT37S
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0162cmh6J5y8h6rZtzwyT37S
Batch 10 (run 35538279757) failed four ports on the grader, not the agent: identical .bpmn copies read as ambiguity, a live grader reading its own ephemeral import as a second project, wait-for-event classified by BPMN tag instead of the Intsvc.WaitForEvent wrapper, and HttpExecution-only where the skill also teaches Intsvc.UnifiedHttpRequest. Slack's generic resource for emoji.list is emoji_list_GET, so the fallback grader accepts both spellings. All four replay green on the downloaded CI artifacts. Ledger and handoff record the batch, including the two real failures left for iteration 2. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0162cmh6J5y8h6rZtzwyT37S
The two remaining Jira live graders raised FileNotFoundError when pre_run's seed did not run; jira_get_issue already reports it as a FAIL line. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0162cmh6J5y8h6rZtzwyT37S
…ity ledger Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0162cmh6J5y8h6rZtzwyT37S
…d batch 11 registry-workflow.md lists Intsvc.UnifiedHttpRequest beside HttpExecution for the managed HTTP sendTask and the eval agent emits either, so the weather, pipeline, fallback and billing graders classify by both. Ledger and handoff record run 35783045540: four green, one infra 504, one harness stop, three agent failures at Flow-level flakiness, billing_discrepancy_detector parked. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0162cmh6J5y8h6rZtzwyT37S
…ord batch 12 The agent left a bpmn-init draft under <Name>Solution/ beside its real solution (run 35785806030, slack_channel_description_simulated); both had project.uiproj. find_bpmn_file now drops candidates that carry no registry-typed node before declaring ambiguity. Ledger and handoff record batch 12: two green, two parked with runtime evidence, one grader defect fixed. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0162cmh6J5y8h6rZtzwyT37S
Faithful ports of three Integration Service field-shape evals: same criteria, weights and run limits. A shared check_managed_http_fallback grader accepts the native connector node or the managed HTTP fallback (HttpExecution, UnifiedHttpRequest, or the generic uipath-uipath-http connector), mirroring Flow's acceptance; the Jira path parameter and the Gmail enum body are read from inputs in either registry body form. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0162cmh6J5y8h6rZtzwyT37S
Same Slack group-DM scenario and criteria as Flow. The shared users-multiselect grader ports Flow's parse_users and is_users_key tolerance verbatim and reads the request body in both registry forms. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0162cmh6J5y8h6rZtzwyT37S
…nd searchable_joins evals Criteria one-for-one with Flow, including the two advisory CLI-discovery checks on the paged Slack channel listing. Connector presence is graded on the Intsvc.ActivityExecution connectorKey; the resolved channel id is searched across the send-message node's inputs. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0162cmh6J5y8h6rZtzwyT37S
…ndoff Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0162cmh6J5y8h6rZtzwyT37S
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0162cmh6J5y8h6rZtzwyT37S
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0162cmh6J5y8h6rZtzwyT37S
…tform gap closes Each carries its CI evidence in a comment. Criteria stay one-for-one with Flow so the tasks resume unchanged once the gap is fixed; skipping keeps known failures out of the nightly and smoke gates, as the structural PR's review asked for its own parked tasks. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0162cmh6J5y8h6rZtzwyT37S
They never went green in CI (skill or platform gaps, evidence in each YAML) and were carried as skip: true. A PR of passing tasks should not ship eight skipped ones; they live on a stacked branch until their gap closes. The ledger is collapsed to one final row per task and points at that branch. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0162cmh6J5y8h6rZtzwyT37S
…n_check body_object/body_fields come over verbatim from #3476 so the two branches merge cleanly; eight graders drop their private copies of context_value, context_inputs, has_type, all_node_values and body readers in favour of the shared ones. Assertions unchanged; every touched grader replays green on its passing CI artifact. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0162cmh6J5y8h6rZtzwyT37S
Answer the GUESS blocks CI has since settled (connector-mode HTTP is Intsvc.ActivityExecution; the Slack fallback uses emoji_list_GET; the Slack send objectName is send_message_to_channel_v2), wrap docstring and code lines over 120 characters, and cut the handoff to status, methodology, recipe, runtime facts, skill findings and resume steps; batch narratives live in the ledger. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0162cmh6J5y8h6rZtzwyT37S
- Escalation graders unpack index_runtime_connectors' 3-tuple keys. - Jira create keys come only from the Create node's outputs in the seed project and are journaled before any status check; teardown reports failed deletes and keeps going; a debug timeout still journals its key. - body_object reads the one target="body" object the runtime consumes and raises BodyShapeError on several inputs or a non-object. - enum, path_params, generic_dynamic_node, billing, weather, databricks, df smoke_error, multiselect and webhook graders no longer accept what their Flow originals rejected. - The live sequence moves into bpmn_live (import_exact, fetch_variables, fetch_incidents, require_clean_run, output_leaves, input_echo_ids). - testmanager_crud_grounded is skipped again, as in Flow. - slack_channel_description task_timeout follows the stated formula. - Porting docs drop session notes and stale planning claims. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Tags follow the tests/README.md vocabulary: one tier, mode and lifecycle per task, the flat connector marker, outcome-graded on live graders. - find_bpmn_file fails on ambiguity again; only the parked task needed the typed-draft preference. - Output checks skip input echoes (orchestrator, channel description); dice reads whole integers only; df smoke_error accepts the context path and plain curated names; paginated and webhook check every candidate. - Jira graders keep every key the Create node reported for teardown, and the escalation grader matches the Create op on objectName too. - Graders use bpmn_check.fail and output_leaves(elements=) instead of private copies; LIVE_OVERHEAD_SECONDS is gone. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Jira create journals only the Create node's top-level response.key, so a nested foreign key is never deleted. - input_echo_ids follows verbatim copies through any element, and output_leaves drops the copied output names; both tolerate a malformed Variables/Elements shape. - df smoke_error accepts the entity as an exact value on any input. - Regression tests pin index_runtime_connectors' key shape and fail any grader that unpacks it short. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The contract sets caseKey to the correlationId input, so skipping input echoes for it failed every correct run (eval run 36056004092). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…lack_alert faulted Jint serialises numbers as doubles, so a correct dice roll can read back as 5.0 from variables-all; find_int_in_range now takes it (7.5, 0, 7 and booleans still fail), with a unit test. The ledger row for escalation_slack_alert now carries the per-run incident evidence: no folderKey input in run 36053143338, missing required send_as in run 36056004092. The grader judged both correctly. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0162cmh6J5y8h6rZtzwyT37S
…oxes Main's task-driver gate (2026-09-23) forbids a template_sources entry for skills/uipath-maestro-bpmn: the skill arrives through agent.plugins, which is what selects the generation under test, and a cwd copy hands a preview-arm run the shipped v1 guidance. The 22 ported tasks drop the entry; sandbox blocks that only carried it are removed. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0162cmh6J5y8h6rZtzwyT37S
739f539 to
9b7f450
Compare
nikhil-maryala
left a comment
There was a problem hiding this comment.
Re-review of 9b7f45096 — Approve. Tally: 0 Blocker / 0 Critical / 0 Major / 0 Minor / 0 Nit.
The branch was rebased onto main. The PR's file set is unchanged, and the only content change is the new commit, which drops the template_dir entry that staged skills/uipath-maestro-bpmn into all 22 ported tasks' sandboxes.
- The removal is exactly those entries. The removed lines are 22 ×
- type: template_dirplus 22 ×path: …/skills/uipath-maestro-bpmn. Inslack_weather_pipeline.yamla blank line also goes, and the 6-level path belongs to the nestedsmoke_error.yaml. No criteria, prompts, weights or timeouts changed. - The remaining
template_sourcesare all_setupmounts, so seed and teardown scripts still stage. No PR task referencesskills/uipath-maestro-bpmnany more. - Gates on this head:
check-task-driver.py tests/tasks tests/experiments→ "OK — no task stages a skill directory via template_sources", which is main's new gate this commit satisfies.check-task-host-paths --base-ref origin/main→ OK.pytest tests/tasks/uipath-maestro-bpmn/→ 853 passed / 1 skipped.
The rationale holds: the skill under test arrives through agent.plugins, and a cwd copy would hand a preview-arm run the shipped v1 guidance. The ledger's post-review runs were taken with the staged copy present, so one dispatch on this head would confirm nothing depended on it. That's optional.


Second half of the Maestro Flow → Maestro BPMN eval port (structural half: #3426). Adds the live tier, where the grader runs the process on the tenant, plus the Integration Service field-shape family. Every task in this PR is green in CI; the eight ports that never went green live on the stacked branch
test/bpmn-port-parked, eachskip: truewith its evidence, and are not part of this diff.What
22 task directories, their graders, shared helpers, two docs (
_porting/LIVE-HANDOFF.md,_porting/LIVE-ADDENDUM.md) and the per-task ledger (_porting/parity-ledger.md)..bpmn(sha256-pinned), runsuip maestro bpmn debugwith seeded inputs, then gradesdebug-instance variables-allandincidents, re-reading the tenant where Flow did (Jira issues, Slack posts, Data Service records). Recipe in_shared/bpmn_live.py; every debug call is priced by_shared/test_criterion_budgets.py.bpmn_check.body_object/body_fields(identical to test(bpmn): read connector request bodies in both registry forms #3476, so the branches merge cleanly) read a request body in both registry forms;find_bpmn_filetreats byte-identical copies as one artifact and drops untyped drafts;resolve_project(exclude_under=…)keeps a live grader's own ephemeral import out of the candidate set; managed-HTTP graders acceptIntsvc.UnifiedHttpRequestbesideHttpExecution. Graders import these instead of carrying private copies.Criteria are one-for-one with the Flow source (type, order, weight, threshold); every grader assertion is tagged F (Flow translation), I (plumbing) or T (listed tolerance) in its docstring. Only live criterion timeouts and
task_timeoutdeviate, sized to the BPMN CLI sequence.CI results (alpha tenant, codex driver)
All 22 pass; run ids per task in
_porting/parity-ledger.md:Parked (branch
test/bpmn-port-parked, not in this PR)bellevue_weather and bellevue_weather_simulated (managed-HTTP response shape), jira_search_triage (multi-instance over a connector response, 400008), jira_lifecycle (three different runtime failures; Flow flaky too), billing_discrepancy_detector (Data Service where clause from a process variable), slack_channel_description_simulated (Slack channel pagination; Flow passes 4/12), ceql_where (Flow's filter tree has no BPMN carrier), enhanced_enum (no WooCommerce connector node). Skill findings for the BPMN skill owners are in
_porting/LIVE-HANDOFF.md.Not in this PR
The 4 probes needing tenant fixtures (billing_dispute_analyst / _resolution / _writer use Flow inline agents; file_attachment needs a file-typed variable). Depends on #3476 only for the smoke gate (per-field body form); the shared helper code here is identical to #3476's, so the merge is clean in either order.
🤖 Generated with Claude Code
https://claude.ai/code/session_0162cmh6J5y8h6rZtzwyT37S