feat(uipath-maestro-flow): one canonical headless preamble on every zero-shot flow task - #3088
Conversation
…ero-shot flow task In the 2026-09-04 nightly, 5 of 8 `skill-flow-*` tasks built and validated a flow, reported success, and never executed it. The checker then ran `flow debug` and found a null End-node output mapping, a faulted script, and an empty result. `flow validate` had passed on all of them. Every one of those prompts contained "Do NOT ask for approval, confirmation, or feedback". That phrasing forbids asking. It does not say nobody is there to ask, so an agent can honor it and still stop at a consent gate waiting for a reply that never arrives. Measured across the 128-task suite: 0 tasks said the run was headless, 51 of the 119 non-simulated tasks said nothing about autonomy at all, and the 68 that did were spread across 9 wording variants — the ninth found by the guard added here, not by the sweep. Task prompts, not an experiment config: flow tasks run under nightly.yaml via daily.sh in coder_eval_uipath, smoke.yaml on every PR, default.yaml locally, and whatever a dispatch selects. coder_eval has no pattern-scoped defaults, so a config carrying this would either miss those runners or reach the 319 simulated tasks of every other skill. Keeping it in the prompt makes it travel with the task and work everywhere today, with no cross-repo change. - One canonical paragraph on all 119 zero-shot tasks. It states that nobody is present, that the task's implied actions are authorized including tenant writes, and the two things to hold back on: do not delete or overwrite what this run did not create, and exhaust the documented resolution path before giving up on a lookup. - _shared/test_headless_preamble.py enforces presence, identical wording, absence on the 9 simulated tasks, and that no superseded variant comes back. Each guard verified by breaking it. - test-task-template.yaml points authors at the canonical block instead of telling them to hand-write autonomy language. Skill side, both true with a user watching: - `flow debug` consent comes from the mandate. A request to build something that does X is a request for it to work. Debug also overwrites the Studio Web solution behind the local .uipx SolutionId, so never debug a solution this run did not scaffold. - "Publish to Studio Web" is no longer marked `(default)` in either What's next dropdown — rule #5's non-interactive fallback takes the marked option, which would have auto-published to a tenant. Both menus also stopped gating Debug on consent, which contradicted rule #2. Modifies Critical Rules 2 and 5, per CONTRIBUTING. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Claude finished @rockymadden's task in 4m 44s —— View job SummaryAdds one canonical headless-run paragraph to all 119 zero-shot flow task prompts, replacing 9 ad-hoc autonomy variants (and 51 tasks that said nothing). Backed by a four-guard pytest suite that enforces presence, exact wording, simulated-task exclusion, and no regression to superseded variants. Also updates SKILL.md Critical Rules 2 and 5 to align Change-by-Change Review1.
|
| Area | Status | Notes |
|---|---|---|
| Frontmatter | OK | No frontmatter changes |
| E2E Tests | OK | 119 task prompts updated; test infrastructure added |
| Skill Body | OK | Critical Rules 2 and 5 modified, internally consistent |
| References & Assets | OK | greenfield, brownfield, run.md all updated symmetrically |
| Repo Hygiene | OK | All changes scoped to maestro-flow; no secrets; no cross-skill refs |
Issues for Manual Review
- Preamble vs. rule feat(CodedAgents): group skill by functionality #5 interaction in headless mode: The preamble says "take the best available option," while rule feat(CodedAgents): group skill by functionality #5 says "stop and report the open decision" when no dropdown option is marked recommended. The specificity ordering is correct (rule feat(CodedAgents): group skill by functionality #5 wins for dropdowns, rule feat: new coded agent skills #2 wins for debug), but the interplay across these three documents is subtle. Worth confirming in the next nightly that agents navigate it correctly — which is exactly what the PR description says is the real check.
- No eval run: The PR correctly notes this changes agent behavior, so the nightly is the real verification. The pytest guards ensure structural correctness; behavioral correctness depends on that run.
Conclusion
Clean, well-motivated PR that solves a real problem (agents stopping at consent gates in headless runs). The approach — canonical text in the prompt, enforced by tests — is the right trade-off given coder_eval's lack of pattern-scoped defaults. The skill-side changes (rule #2 mandate, rule #5 carve-out, (default) removal) are internally consistent and correctly aligned.
No blocking issues. Approve.
|
Claude finished @rockymadden's task in 11m 16s —— View job Coder-eval task lint (advisory)
Coder-eval task lint (advisory)119 task YAMLs modified (0 added); all receive the same 10-line headless preamble. 15 files sampled across all directories for full rubric evaluation. Verdicts: 0 Critical, 0 High, 0 Medium, 0 Low introduced by this PR. Pre-existing findings below. Rubric: .claude/commands/lint-task.md. This check is advisory and never blocks merge. Evidence of passing run❌ High — PR body explicitly states "No eval run." and explains: "This changes agent behavior on the same task set, so a Per-task lintAll 119 files receive the identical 10-line preamble addition. The preamble itself is clean across all rubric axes:
Some files also removed old autonomy variants ("Do NOT ask for approval…") — the preamble subsumes them. One file ( Sampled files with unique findings (all pre-existing on
|
…e reads Self-review of the new guard. The module docstring was 24 lines restating the commit message and PR body — the nightly counts, the variant tally, the history. Two facts there are load-bearing for anyone editing the file: why the text is in the prompt rather than a config, and why this parses with regex instead of PyYAML. The rest went. Prose is now 14 of 83 lines, from 30 of 101. The presence check built a `needles` list from every line of the canonical block, then discarded it except for the first sentence, and ran `all()` over the resulting one-element list. It only ever checked "This run is headless." — which is the right cheap marker, since the wording test covers the full text, but the code said something else. Now it says what it does. Four tests each re-read every file in the suite; `_tasks()` is cached. All four guards re-proven after the rewrite: removing the preamble, rewording it, leaking it into a simulated task, and reintroducing a superseded variant each fail the expected test. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Out of scope. The template still tells authors to hand-write autonomy language, which the canonical preamble supersedes, but changing it is a separate call from fixing the flow suite. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Dropped the Scope is now |
Several tasks say "Do NOT run or debug the flow — the grader executes it with the seeded inputs", and one (skill-flow-eval-no-auto-upload) deliberately asserts a refusal. The preamble says the actions a task implies are authorized, which sits against those without saying which wins. Added the precedence sentence to the canonical block and all 119 tasks. The test constant moved in the same commit, so the guard and the tasks cannot disagree. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
🟡 Changes recommended
Debug authorization can trigger real side effects without explicit consent, and the completion workflow can still stop at a redundant headless decision gate.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
Adds a canonical headless-execution preamble to Maestro Flow evaluations and revises debug-consent guidance.
Changes:
- Adds identical headless instructions to 119 zero-shot tasks.
- Adds a regression guard for coverage, wording, and simulated tasks.
- Revises debug authorization and removes automatic Studio Web publishing defaults.
File summaries
| File | Description |
|---|---|
skills/uipath-maestro-flow/SKILL.md |
Revises debug consent rules. |
skills/uipath-maestro-flow/references/operate/run.md |
Updates debug authorization guidance. |
skills/uipath-maestro-flow/references/author/greenfield.md |
Removes publishing default. |
skills/uipath-maestro-flow/references/author/brownfield.md |
Removes publishing default. |
tests/tasks/uipath-maestro-flow/_shared/test_headless_preamble.py |
Guards canonical preamble usage. |
tests/tasks/uipath-maestro-flow/bindings/idempotent_reconfigure.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/bindings/multi_connector_independence.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/bindings/no_duplicate_connection_bindings.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/bindings/reconfigure_different_connection.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/ceql_where.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/complex_array.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/datafabric_connector/contractregistry_crud_filters.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/datafabric_connector/e2e_contract_intake_pipeline.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/datafabric_connector/integration_create_get.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/datafabric_connector/smoke_activation_negative.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/datafabric_connector/smoke_activation_positive.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/datafabric_connector/smoke_create_all_types.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/datafabric_connector/smoke_error.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/datafabric_connector/smoke_file_activities.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/datafabric_connector/smoke_query.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/datafabric_connector/smoke_update.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/datafabric_connector/smoke_update_existing_flow.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/datafabric_connector/trigger_lifecycle.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/drive_to_slack.yaml |
Converts prompt and adds preamble. |
tests/tasks/uipath-maestro-flow/connector_features/dtl_load_by_default_false.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/dtl_load_by_default_true.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/enhanced_enum.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/enum.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/generate_schema.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/generic_dynamic_node/generic_dynamic_node.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/jdbc_databricks_query/jdbc_databricks_query.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/multiselect.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/non-catalog-http-fallback/non_catalog_http_fallback.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/paginated_reference_lookup.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/path_params.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/query_params.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/searchable_joins.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/slack-http-fallback/slack_http_fallback.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/testmanager_attachments/testmanager_attachments.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/testmanager_crud_grounded/testmanager_crud_grounded.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/testmanager_execution_results/testmanager_execution_results.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/testmanager_generic_records/testmanager_generic_records.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/testmanager_requirement_lifecycle/testmanager_requirement_lifecycle.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/testmanager_testcase_lifecycle/testmanager_testcase_lifecycle.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_features/testmanager_testset_lifecycle/testmanager_testset_lifecycle.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_trigger/trigger_with_filter.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/connector_trigger/webhook_waitfor_parallel.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/context-grounding/batch_transform/batch_transform.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/context-grounding/summarize/summarize.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/e2e/devcon_expense_approval.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/e2e/escalation_jira_ticket/escalation_jira_ticket.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/e2e/escalation_orchestrator_paths/escalation_orchestrator_paths.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/e2e/escalation_slack_alert/escalation_slack_alert.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/e2e/jira_create_issue/jira_create_issue.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/e2e/jira_get_issue/jira_get_issue.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/e2e/jira_lifecycle/jira_lifecycle.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/e2e/jira_search_triage/jira_search_triage.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/edit/add_node/add_node.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/edit/add_output/add_output.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/edit/group_to_subflow/group_to_subflow.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/edit/move_node/move_node.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/edit/remove_node/remove_node.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/edit/update_node/update_node.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/evaluate/child_simulation/child_simulation_crud.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/evaluate/evaluator_type_choice.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/evaluate/inline_agent_eval/inline_agent_eval.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/evaluate/local_crud.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/evaluate/no_auto_upload.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/evaluate/simulation/simulation_crud.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/hitl/quality_01_schema_design.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/hitl/quality_02_result_downstream.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/hitl/quality_03_boolean_decision.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/hitl/quality_04_brownfield_insert.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/hitl/smoke_01_hitl_node_placed.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/hitl/smoke_02_completed_port_wired.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/hitl/smoke_03_multi_outcome_routing.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/ixp/e2e_01_invoice_extraction_greenfield.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/ixp/e2e_02_project_selection.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/ixp/e2e_03_project_creation_handoff/e2e_03_project_creation_handoff.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/ixp/integration_handle_routing.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/ixp/routing.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/ixp/routing_listing.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/ixp/routing_negative.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/ixp/scaffold_minimal.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/ixp/scaffold_multinode.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/multi_node/bellevue_weather/bellevue_weather.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/multi_node/billing_discrepancy_detector/billing_discrepancy_detector.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/multi_node/billing_dispute_analyst/billing_dispute_analyst.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/multi_node/billing_dispute_resolution/billing_dispute_resolution.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/multi_node/billing_invoice_lookup/billing_invoice_lookup.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/multi_node/billing_resolution_writer/billing_resolution_writer.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/multi_node/calculator/calculator.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/multi_node/customer_escalation/customer_escalation.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/multi_node/dice_roller/dice_roller.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/multi_node/feet_inches/feet_inches.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/multi_node/loop_multiply/loop_multiply.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/multi_node/multi_city_weather/multi_city_weather.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/multi_node/reading_list/reading_list.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/multi_node/slack_channel_description/slack_channel_description.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/multi_node/slack_weather_pipeline/slack_weather_pipeline.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/multi_node/wiki_pageviews/wiki_pageviews.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/single_node/api_workflow/api_workflow.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/single_node/coded_agent/coded_agent.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/single_node/decision/decision.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/single_node/delay/delay.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/single_node/file_attachment/file_attachment.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/single_node/lowcode_agent/lowcode_agent.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/single_node/openmeteo_weather/openmeteo_weather.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/single_node/outlook_trigger_inbox/outlook_trigger_inbox.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/single_node/outlook_waitfor_email/outlook_waitfor_email.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/single_node/rpa/rpa.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/single_node/subflow/subflow.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/single_node/switch/switch.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/single_node/terminate/terminate.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/single_node/transform_filter/transform_filter.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/single_node/transform_group_by/transform_group_by.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/single_node/transform_map/transform_map.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/smoke/init_validate.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/smoke/inline_agent_robust.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/smoke/merge_parallel_sync.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/smoke/registry_discovery.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/smoke/scheduled_trigger.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/voice/voice_inbound_call.yaml |
Adds headless preamble. |
tests/tasks/uipath-maestro-flow/voice/voice_outbound_call.yaml |
Adds headless preamble. |
Review details
Suppressed comments (1)
tests/tasks/uipath-maestro-flow/_shared/test_headless_preamble.py:60
- The PR now documents nine superseded wording variants, but this test still says eight. Update the count so the guard explains the current baseline accurately.
"""8 variants is what made the old line unmaintainable. One wording, or none."""
- Files reviewed: 124/124 changed files
- Comments generated: 5
- Review effort level: Balanced
💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
…unbounded consent
A 10th autonomy variant survived the sweep: five billing tasks carried
"Build the complete flow / without stopping to ask me." The guard
advertised catching superseded variants and did not match that wording,
so it passed with the duplication in place. Removed from the five, and
the matcher now covers it — verified by reintroducing the phrase and
watching the test fail. devcon_expense_approval's "Build the complete
flow as a UiPath Flow project called ..." is task text and is untouched.
Both What's next menus were unconditional, so a request that already
named the next step ("run debug and iterate") still stopped for a
redundant selection — the exact gate this work removes elsewhere. An
instruction in the original request is now the selection; the menu shows
only when the next step was unspecified.
Rule #2's mandate said an ordinary build request authorizes a real run.
That is too broad for side effects reaching someone who is not the user:
a phone call, an email to a real person. Those now need the run asked for
explicitly, whoever is watching, and rule #2 points at the outbound-call
case in inline-voice-agent/impl.md, whose own gate this never touched.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…3090) On 2026-09-04 two flow tasks were scored FAILURE for reasons that had nothing to do with the agent: skill-flow-outlook-trigger-inbox AADSTS50173 — the Outlook grant was revoked on 2026-08-31 skill-flow-generic-dynamic-node the ServiceNow developer instance was hibernating, so every metadata call 403'd Both were root-caused as skill defects first. The 403 is several thousand characters into the checker output, and nothing above it says the tenant is down, so the reports read as "the agent wrote a display name where an ID belongs" — which it did, but only because the lookup it was told to use could not answer. A `pre_run` failure lands the run as FinalStatus.ERROR rather than FAILURE, and PreRunCommand's own docstring gives the reason: "the agent should not run against a broken environment." This uses that. preflight_connections.py takes connector keys, lists their connections with --all-folders (without it an empty result is a false negative), and exits non-zero unless at least one is Enabled. Wired into the two tasks above. Behaviour verified against six tenant states: all-enabled, hibernating, mixed with one up, no connections in any folder, CLI non-zero, and a Failure envelope. Only those two tasks are wired. 23 others name a connector, but that list comes from grepping prompts for `uipath-*` and it catches non-connectors like uipath-rpa and uipath-platform — worth doing deliberately, not from a crude match. Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Resolves fifteen conflicts for #2756, all from main #3088 (one canonical headless preamble on every zero-shot flow task) meeting the campaign's loop-neutral prompt rewrites at the tail of `initial_prompt`. Resolution, identical in every file: keep the campaign's loop-neutral prompt text (no `uip` command hints, no .uiproj-only path), drop the superseded autonomy sentences ("Do NOT ask for approval...", "Do NOT pause between planning...", "...in a single pass") that #3088 replaced, and end the prompt with the canonical headless paragraph exactly as `_shared/test_headless_preamble.py` requires. Files: connector_features/{non-catalog,slack}-http-fallback, connector_trigger/webhook_waitfor_parallel, context-grounding/{batch_transform, summarize}, evaluate/{evaluator_type_choice,inline_agent_eval}, multi_node/slack_weather_pipeline, single_node/{delay,transform_filter, transform_group_by,transform_map}, smoke/{init_validate,merge_parallel_sync, scheduled_trigger}. ixp/routing.yaml and ixp/routing_negative.yaml auto-merged but the campaign-only scope sentence (09-01 routing RCA) still contained "Do NOT ask for approval, confirmation, or missing details", which the new guard rejects as a superseded variant. Reworded to "pick a sensible default for any missing detail and state it in your final report"; the scope statement itself is unchanged. Verified: uipath-maestro-flow 1159 passed (incl. test_headless_preamble and test_same_ground_corpus), uipath-maestro-case 124 passed / 14 skipped, tests/scripts 109 passed / 26 skipped, uipath-maestro-bpmn 12 passed; scripts/check-cli-verbs.py clean on all touched yaml. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JSsrfZwCh4tJeqpzjMeixP
Replaces #3086 and #3079. Same problem, an approach that works under every runner without a second config or a cross-repo change.
Problem
In the 2026-09-04 nightly, 5 of 8
skill-flow-*tasks built and validated a flow, reported success, and never executed it. The checker then ranflow debugand found a null End-node output mapping, a faulted script, and an empty result.flow validatehad passed on all of them.Every one of those prompts contained "Do NOT ask for approval, confirmation, or feedback." That phrasing forbids asking. It does not say nobody is there to ask, so an agent can honor it and still stop at a consent gate waiting for a reply that never arrives.
Measured across the 128-task suite:
The ninth variant was found by the guard in this PR, not by the sweep that preceded it.
Why the task prompt and not an experiment config
Two earlier attempts put this in a config. Both failed on the same thing: flow tasks run under
nightly.yamlviadaily.shincoder_eval_uipath,smoke.yamlon every PR,default.yamllocally, and whatever a dispatch selects.coder_evalhas no pattern-scoped defaults —defaultsandvariantsboth apply run-wide, and task-level is the only per-task granularity. So a config carrying this either misses those runners or reaches the 319 simulated tasks of every other skill, which is what the Slack thread vetoed.Keeping it in the prompt makes it travel with the task. It works everywhere today, with no new config, no workflow input, no dispatch guard, and no change to
coder_eval_uipath.The original objection to n copies was to hand-maintaining them. A test removes that.
Changes
One canonical paragraph on all 119 zero-shot tasks. It states that nobody is present, that the task's implied actions are authorized including tenant writes and real messages, and the two things to hold back on: do not delete or overwrite what this run did not create, and exhaust the documented resolution path before giving up on a lookup.
_shared/test_headless_preamble.pyenforces four things, each verified by breaking it:Skill side
Both independent of headlessness and true with a user watching:
flow debugconsent comes from the mandate. A request to build something that does X is a request for it to work; building plus validating does not discharge it. Debug also overwrites the Studio Web solution behind the local.uipxSolutionId— confirmed in 3 of 8 runs and by the eval suite's owncleanup_solutions.py— so never debug a solution this run did not scaffold.(default)in either What's next dropdown. Rule feat(CodedAgents): group skill by functionality #5's non-interactive fallback takes the marked option, which would have auto-published to a tenant. Both menus also stopped gating Debug on consent, which contradicted rule feat: new coded agent skills #2.Modifies Critical Rules 2 and 5, called out per CONTRIBUTING.
Verification
tests/tasks/uipath-maestro-flow/.main; both flavors compose.skill-flow-*nightly is the real check.What this costs
~650 characters of repeated prompt text across 119 files. That is the trade for an instruction that reaches every runner without asking another repo to change first.
Follow-ups (separate)
greenfield.mdStep 2: assert one.flow+ oneproject.uiprojafter scaffold.bindings-no-duplicatespassed its actual regression and failed only on a stray duplicate project.script/impl.md: extend thenode -e "new Function(...)"check from syntax to a value test. Would have caught the off-by-one that shipped"Suite 2000"as a city name.variables-and-expressions.md: document the=js:boundary — an End-node object spread returnednullwith a clean validate. Needs a repro.dice_rollernever terminates.test-task-template.yamlstill tells authors to hand-write autonomy language, which the canonical preamble supersedes. Left alone here as a separate call.🤖 Generated with Claude Code