fix(uipath-maestro-flow): document node add id derivation, forbid same-batch id guessing - #2958
fix(uipath-maestro-flow): document node add id derivation, forbid same-batch id guessing#2958rockymadden wants to merge 3 commits into
Conversation
…e-batch id guessing `node add` generates the node id from `--label` plus a counter and has no `--id` flag. That was documented only as "with a generated `id`", so an agent can hard-code a guessed id in a `$vars` reference inside the same `&&` chain as the `node add` that creates the node. A wrong id passes `flow validate` (no expression checking) and faults only at runtime. Seen in skill-flow-bellevue-weather-simulated: label "Normalize Bellevue conditions" generated `normalizeBellevueConditions1` while the decision node in the same chain referenced `$vars.normalizeConditions1`. Validate returned Valid; debug faulted with [400302] on both gateway edges, then [400001] no outgoing condition met. - editing-operations-cli.md: new "Generated node IDs" section — derivation rules, the always-appended counter, the fact that the counter increments against ids already in the file (so the id is not a pure function of the label), the capture recipe, and the prohibition. - greenfield.md: T1 "capture it from the chained output" was advice; make it a prohibition and move all `$vars` references to T2. - SKILL.md rule #11: the rule already owns "a bad $vars reference silently resolves to undefined at runtime"; extend it to the node id itself. This is the file an agent reads in turn 1, so the rule has to live here too. Derivation verified against uip 1.202.0; every documented example reproduced on a clean flow. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Claude finished @rockymadden's task in 2m 11s —— View job PR Review: fix(uipath-maestro-flow): document node add id derivation, forbid same-batch id guessing
SummaryDocuments how Change-by-Change Review1.
|
| Area | Status | Notes |
|---|---|---|
| Frontmatter | OK | No frontmatter changes |
| E2E Tests | OK | Existing tests at tests/tasks/uipath-maestro-flow/ cover this skill; this is a documentation-only fix for an observed eval failure, not a new CLI workflow |
| Skill Body | OK | Rule #11 extension is consistent with existing style; links verified |
| References & Assets | OK | New section follows naming conventions; all relative links resolve; no cross-skill deps |
| Repo Hygiene | OK | No secrets, no personal paths, no new skill folder (CODEOWNERS unaffected), changes scoped to single skill |
Issues for Manual Review
- The
café münchen→cafMNchen1example implies each dropped accent character acts as a word boundary (theübetweenmandncapitalizes theN). The PR states this was verified againstuip1.202.0 — worth confirming this behavior persists across CLI updates, since it's a surprising edge case an agent might encounter with non-English labels. - The caveat about digit-leading labels (
99 bottles→99Bottles1passingflow validatedespite breaking rule Handle uipcli or rpa-tool instalation at session start #12) is documented but not enforced — flagged as out-of-scope CLI behavior.
Conclusion
Clean PR. The three-location placement (SKILL.md rule, CLI reference, greenfield guide) correctly addresses the failure mode at every level an agent might read. The derivation documentation is precise, example-backed, and verified against the actual CLI. No issues found — approve.
…tion to carve-outs Self-review caught two defects in the previous commit. 1. "No label -> last dot-segment of the node type" was wrong, generalized from a single coincidental sample (`core.logic.merge` -> `merge1`). `core.action.http.v2` -> `httpRequest1` and `core.trigger.scheduled` -> `scheduledTrigger1`, and the source of that base name is not exposed by `registry get`. Replaced the asserted mechanism with the observed behavior plus the actionable rule: always pass `--label`. 2. The examples demonstrated `node add` on OOTB node types, which rule #9 forbids. Since the eval failure this PR addresses was itself caused by using `node add` for OOTB nodes, the section risked reinforcing the very error. Added a scope guard pointing at rule #9. Also confirmed `--id` fails loudly (`unknown option '--id'`, ValidationError) rather than being silently ignored, and stated the token-casing step explicitly so `API` -> `Api` follows from the rule, not just the example. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… docs - greenfield: restore the T3 consumer the rewrite dropped. The original said "capture it for T2/T3"; T3's `node configure <NODE_ID>` needs the same captured ids, so saying only "T2" understated it. - editing-operations-cli: drop the duplicated "there is no `--id` flag" from the automatic-behavior bullet. It is stated two lines below in the section the bullet links to, and again in greenfield and SKILL.md rule #11. - SKILL.md rule #11: tighten the appended prohibition (~30% shorter). The rule is dense already; the reference file carries the detail. Anchors verified by hand: `check-skill-links.mjs:119` strips the fragment (`raw.split("#")[0]`) and validates only the file path, so no CI gate covers them. All 27 anchored links in the three changed files resolve. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Problem
uip maestro flow node addgenerates the node id from--labelplus a counter, and has no--idflag. The skill documented this as only "Inserts node intonodesarray with a generatedid".With no stated derivation, an agent will hard-code a guessed id in a
$varsreference inside the same&&chain as thenode addthat creates the node. The guess is unverifiable at that point, and a wrong one is invisible:flow validatedoes not check expression correctness, so the flow reports Valid and faults only at runtime.Observed in the
skill-flow-bellevue-weather-simulatedcoder-eval (weighted score 0.333, gating criterion failed):--label 'Normalize Bellevue conditions'→normalizeBellevueConditions1"expression": "$vars.normalizeConditions1.output.temperatureF > 60"One wrong word. Everything upstream ran clean (trigger, HTTP 200 from open-meteo, normalize script returned real values).
Changes
references/author/editing-operations-cli.md— new### Generated node IDssection:node addfor OOTB nodes (rule feat(CodedWorkflows): Add coded workflows plugin #9)1--labelis mandatory in practice: without one the CLI picks its own base name and it is not the type's last segment (core.action.http.v2→httpRequest1)--output-filter "Node.Id", PascalCase)references/author/greenfield.md— T1 said "capture it from the chained output", which is advice. Now a prohibition: all$varsreferences belong in T2, written against the ids T1 returned.SKILL.mdrule #11 — extended. The rule already owns "a bare node reference resolves toundefinedat runtime"; the wrong-<nodeId>case is its sibling. This matters because the failing agent readSKILL.mdin turn 1 and never openedediting-operations-cli.mdbefore authoring — documenting only in the reference file would not have prevented the failure.+31 / -4 across three files.
Verification
Derivation probed directly against
uip1.202.0, not inferred from the artifact. Every documented example reproduced on a clean flow. Three findings changed what got written:--idflag exists (node add --help), so "capture the id" is the only available guidance.handMade1present,--label "Hand made"yieldshandMade2. An agent that knows the algorithm perfectly still cannot predict the id.Data.Node.Id, PascalCase.--output-filter "Node.id"silently returnsData: [].Self-review then caught a third: I had written "no label → last dot-segment of the node type", generalized from one coincidental sample (
core.logic.merge→merge1). It is wrong —core.action.http.v2→httpRequest1,core.trigger.scheduled→scheduledTrigger1— andregistry getdoes not expose the real source, so the doc now states the observed behavior instead of asserting a mechanism.--idalso confirmed to fail loudly (unknown option '--id'), not be silently ignored.Also corrected two claims from an earlier draft: accented letters are dropped, not transliterated (
café münchen→cafMNchen1), andFetch data (v2)→fetchDataV21(v2plus counter).Gates:
skills:check-links✅ ·skills:validate✅ (both flavors) ·check-skill-verbs.py✅ no new findings.The
studiowebflavor replacesgreenfield.md's entireproject-creationblock, so that edit does not reach it — another reason the rule needed to be inSKILL.mdand the CLI reference as well. No flavor override required updating.Out of scope
This is one of several fixes identified from the same eval failure. Deliberately not included:
$varsreference-integrity check in the finalize step. The durable fix, and it belongs inuip maestro flow validate(a dangling$vars.<id>is statically decidable from the file alone) rather than in a skill-authored shell check.node addis the only node-CRUD surface that fits a Bash chain, so the batching rule quietly pushes toward the CLI path rule feat(CodedWorkflows): Add coded workflows plugin #9 forbids for OOTB nodes. The eval agent usednode addfor all seven OOTB nodes despite having readSKILL.md. Worth fixing in the CLI:node addshould reject user-owned node types.flow debugas a validation step, so an agent that follows it cannot self-verify what the grader measures.🤖 Generated with Claude Code