feat(maestro-case): build missing agents and agentic processes inline during planning#1622
feat(maestro-case): build missing agents and agentic processes inline during planning#1622song-zhao-25 wants to merge 13 commits into
Conversation
|
Claude finished @song-zhao-25's task in 4m 2s —— View job PR Review: feat(maestro-case): build missing agents inline during planning
SummaryAdds a third option ("Create the missing agent(s) inline") to the Rule 17 empty-lookup gate in Change-by-Change Review1.
|
| Area | Status | Notes |
|---|---|---|
| Frontmatter | OK | name matches, description under 1024 chars, allowed-tools correctly adds Agent |
| E2E Tests | Medium | Deferred — blocked on unreleased --local CLI flag; explicitly documented |
| Skill Body | OK | Rule 17 updated cleanly, anti-pattern carve-out well-scoped, Phase 1 bullet is bridge-level |
| References & Assets | OK | Authoritative content in registry-discovery.md + agent/planning.md; other files use bridge references. Minor verbosity in planning.md §3.4 callout (Low) |
| Repo Hygiene | OK | CODEOWNERS present, no secrets, scoped changes, skill-status.json entry exists |
Issues for Manual Review
--localflag accuracy. The PR documents--localsemantics (PascalCase keys,searchvsgetmatching behavior, solution discovery walk) based on an unreleased CLI (PR #2614). These claims can't be verified against the published CLI. Once the flag ships, the documented shapes should be spot-checked.solution_folderruntime resolution. The PR honestly notes this is "not yet end-to-end verified on a tenant" —validateaccepts it structurally but deploy-time behavior is unproven. Worth tracking.- Sub-agent behavior. The builder brief template instructs
uipath-agentsto build non-interactively with--skip-solution-registrationand return structured JSON. Whether the agents skill reliably follows this contract when invoked as a sub-agent is a runtime concern not testable from docs alone.
Conclusion
Clean, well-structured PR. The architectural layering is sound: cross-cutting orchestration in registry-discovery.md, agent-specific contract/brief/binding in agent/planning.md, bridge references everywhere else. The capability probe + graceful degradation design means the feature is safe to merge independently of the unreleased CLI flag. The main gap is test coverage, which is acknowledged and blocked on external dependencies. Approve — no blocking issues.
199721c to
45812c8
Compare
When an SDD-referenced agent can't be resolved at the Rule 17 empty-lookup gate, the skill now offers a third option — "Create the missing agent(s) inline" — alongside force-pull and skip. On Create, it builds each selected agent as an in-solution low-code sibling during Phase-1 planning by spawning a sub-agent that invokes the uipath-agents skill (parallel, capped at 10), registers the siblings via `uip solution project add`, then rediscovers and binds them via `uip maestro case registry search "<name>" --local`. Built agents enter Phase 2 as normal resolved tasks, not placeholders. Agent-only first cut; the orchestration is written type-agnostically so other non-connector kinds can be enabled later. Reverses the prior "plain-text handoff, never auto-invoke" stance and carves out the SKILL.md anti-pattern for the agent path (non-agent kinds and uipath-planner keep no-auto-invoke). Key properties: - Gate-selected agents only; SDD content alone never triggers a build. - Capability probe on `registry --local`; gracefully degrades to today's placeholder behavior when the CLI lacks the flag. - Binding reuses name+folder with the `solution_folder` sentinel (resourceKey="solution_folder.<name>"); ships inside the solution .uipx. - Contract pins only wired fields (typed Case Variable -> type; unwired -> agent free-styles); type-vocabulary mapping is uipath-agents' concern. - Rediscovery uses `registry search "<name>" --local` (matches by name); `get --local` matches only entityKey/project Id, never the display name. - I/O verify rewires matched fields, warns on missing/extra, never blocks. - solution_folder runtime resolution carries an explicit unverified caveat. Edits across SKILL.md (Rule 17, anti-pattern), planning.md, registry-discovery.md (new Create-on-Missing orchestration), agent plugin planning.md (new Creating an Agent inline) + impl-json.md, placeholder-tasks.md, phased-execution.md, phase-0-interview.md, bindings-v2-sync.md, case-commands.md (--local docs). Verified by adversarial review (contradictions, completeness, rubric, CLI-fact accuracy). Tests deferred until the CLI `registry --local` flag ships (PR #2614). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Follow-up to the inline Create-on-Missing agent build. Addresses skill-review findings against the feature: - Grant the Task tool in SKILL.md allowed-tools — the Create path spawns build sub-agents (one per agent, capped at 10) but the restrictive allowlist omitted the agent-spawning tool, so the path would stall under a host that honors it. - Add --output json to the inline `registry search --local` commands in impl-json.md and placeholder-tasks.md (both parse PascalCase output). - Phase-0 bucket-C empty-match line now lists the conditional Create option. - Anchor the phased-execution completion-report link (#completion-report-shape). - Note both `solution project add` positionals must be absolute (§3 Register). - Add a rename-on-name-collision rule in §1 Select (the solution_folder.<name> sentinel and exact-name search rediscovery both key on the name). - Fix the concurrency-cap precedent (uipath-automation-discovery caps at 3). - Mark the builder-brief I/O slots as substitution placeholders; replace "pick a sensible type" with purpose-anchored wording. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The create-missing-agent feature spawns sub-agents (one per agent, invoking uipath-agents). The skill uses an explicit allowed-tools allowlist, so the sub-agent launcher must be listed by its exact runtime name. Verified against the Claude Code docs (tools-reference.md / skills.md): the launcher tool is `Agent`; `Task` is an unrelated family (the TaskCreate/Update/List task-list tools). A wrong token is silently denied by the permission system, which would have blocked all inline agent builds at runtime. Correct `Task` -> `Agent`. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…gent brief The agent-plugin build brief said "the caller registers" without pointing to where. Add an explicit link from agent/planning.md § Creating an Agent inline to registry-discovery.md § Create-on-Missing Step 3 (sequential `uip solution project add` + `resources refresh`), and note it must precede rediscovery (which reads the .uipx Projects[]). No behavior change — surfacing only. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Remove the "agent-side analog of § Creating a Connection" framing from the Creating-an-Agent-inline intro — connection mechanics don't transfer; the load-bearing pointer to § Create-on-Missing remains. - Drop the `uipath-automation-discovery` concurrency-cap precedent citation in § Create-on-Missing (keeps "cap is a resource throttle, not a safety mechanism"). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ct EntityKey claim
L1 CLI dry-run against a local --local build surfaced two doc inaccuracies in
the create-on-missing rediscovery step:
- `registry --local --output json` PascalCases I/O property keys (poText ->
PoText, classification -> Classification), so reading field names from
`Resource.{Inputs,Outputs}` mis-cases them and would wire fields the agent
doesn't have (outputs have no case-preserving fallback). Verify/bind now reads
case-preserving names + types from the sibling's raw `entry-points.json`;
`--local` is used only to locate/confirm the sibling.
- `Resource.EntityKey` is an opaque derived key, NOT "the .uipx ProjectKey
pre-pack" — verified: `get --local` matches that EntityKey but rejects the
.uipx Projects[].Id. Audit-only; the node binds by name+folder.
Verified on CLI 1.197.0 (feat/case-registry-local): the full chain links
(solution init -> agent init --skip-solution-registration -> input/output add
-> project add -> search --local finds the sibling) and a solution_folder.<name>
agent binding passes `uip maestro case validate` (isolated against a known-valid
fixture). get-by-name returns 0 (search-by-name required); duplicate names are
CLI-blocked.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…d resolution L2 deploy spike (alpha.uipath.com/CaseManagement) verified end-to-end that a local-only sibling bound via solution_folder.<name> co-deploys with the case at `uip solution deploy run` and resolves to the created Orchestrator folder. Also corrects an earlier inference: `uip maestro case debug` builds the .uis from the ENTIRE solution directory (case-debug-studio-web-service.ts:353-356, buildSolutionPackageFromDir(solutionDir)) and uploads the whole solution to Studio Web — so a registered sibling resolves at debug too, with no debug_overwrites mapping needed (that maps pre-existing tenant resources; resources refresh skips in-solution siblings by design). Prerequisite for both deploy and debug: register the sibling in the .uipx (Step 3) first. Closes the documented open risk on solution_folder runtime resolution. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…e (idempotency) Resolution previously checked only the tenant index (agent-index.json); --local was used only after building. So an agent that already existed as an in-solution sibling (a re-run, a user-built agent, or a prior Create) was not seen at resolution -> it fell to the Create gate -> `agent init` hit "directory exists". Add a local-sibling check between "tenant index missed" and the gate: if `registry search "<name>" --type agent --local` returns an exact-name Source:local match, resolve it directly (bind solution_folder.<name>, read I/O from the sibling's entry-points.json) and do NOT enter Create. Only agents absent from BOTH the tenant index and local siblings reach the gate. This makes planning idempotent and treats in-solution siblings as first-class resolvable resources. Residual-corner guard: a sibling whose dir exists but was never registered (interrupted between agent init and project add, so --local can't see it) is treated as already-built in the failure contract -- register + rediscover, never Retry/Skip. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ess Orchestration)
Generalizes the inline-create feature from agent-only to {agent, agentic
process}. The type-agnostic orchestration (gate, multi-select, parallel build,
register, --local rediscover, bind, idempotency) is unchanged; this adds the
process-specific build path and the dual-type wording.
- NEW plugins/tasks/process/planning.md § Creating an agentic process inline:
scaffold `uip maestro bpmn init --skip-solution-registration`, brief ->
`uipath-maestro-bpmn`, bind `solution_folder.<name>` + resourceSubType
"ProcessOrchestration". AGENTIC_PROCESS only — regular RPA process is not
inline-buildable.
- process/planning.md: local-sibling resolution before the gate (idempotency)
+ solution_folder folder-path branch; process/impl-json.md: built-inline note.
- registry-discovery § Create-on-Missing: route per kind (uipath-agents /
uipath-maestro-bpmn), `--type agent|processOrchestration`, generalized gate +
multi-select + the "resolve in-solution siblings before gating" note.
- SKILL.md Rule 17 + anti-pattern, planning.md §3.1/§3.4 callouts,
placeholder-tasks / phased-execution / phase-0 notes: agent -> {agent,
agentic process}.
I/O note: BPMN has no I/O CLI verb (unlike `uip agent input/output add`) and
`validate` won't catch a .bpmn<->entry-points drift, so the build must keep both
consistent and verify treats the .bpmn as authoritative. Pre-verified:
solution_folder + ProcessOrchestration binding passes `case validate`; --local
discovers a process sibling with I/O (after CLI fix dc3fd5a9).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adversarial review (contradiction/completeness/rubric/CLI-facts) of the agentic-process extension surfaced 2 high + 3 medium + 3 low; all fixed: - H1 (case-commands.md): `tasks describe --type processOrchestration` is invalid (CLI DESCRIBABLE_TYPES excludes it; `--type process` routes to the processOrchestration index). Corrected the flag doc. - H2 (placeholder-tasks Upgrade Procedure): generalized the callout + Step 2 to cover a declined/failed agentic-process sibling (`--type processOrchestration` lookup), which was silently dropped. - M1: collapsed the process Step-3 binding to a delta vs the agent section (was near-verbatim duplication). - M2: made the .bpmn↔entry-points guidance actionable — verify reads entry-points.json (build-kept-consistent); .bpmn (`<uipath:variables>`) is source-of-record; on drift re-invoke uipath-maestro-bpmn, don't hand-patch. - M3 (phase-0 Resolve table): split regular process/rpa (process-index.json, entityKey) from AGENTIC_PROCESS (processOrchestration-index.json, reaches the Create gate); dropped the misapplied `processOrchestrationId` identifier. - L1 (SKILL.md Phase-1 bullet), L2 (completion-report tables: Resource column + agentic-process example + retitled reject section), L3 (registry-discovery per-type verify read + the bare-`process` code-span). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…sistency fixes Three review findings on the create-on-missing agentic-process path: - HIGH — built-sibling I/O read used the agent entry-points.json shape for both kinds. Branch by kind: agent keys I/O under entryPoints[0].input/output.properties; agentic process (Process Orchestration) keys it under inputSchema/outputSchema.properties. Reading input.properties on a BPMN sibling returns undefined -> empty contract -> silent mis-wire on every agentic-process Create. (planning.md, registry-discovery.md) - MEDIUM — build brief hard-coded `bpmn init --skip-solution-registration` and asserted an OptedOut envelope the build-target skill (uipath-maestro-bpmn) documents nowhere. Delegate scaffolding to that skill; keep the (CLI-verified) skip-registration flag as the caller's no-register constraint; drop the unverified status assertion. (planning.md) - MEDIUM — bindings-v2-sync.md claimed `resources refresh` maps the inline sibling via debug_overwrites.json, contradicting the newer L2-verified note. In-solution siblings are skipped by refresh and resolve via whole-solution packaging, not debug_overwrites; point to the L2 note as the single source. (bindings-v2-sync.md) Plus four LOW/NIT doc fixes in the same blocks: - .bpmn I/O lives in root <uipath:variables> (inputs scoped to the start event by elementId), not "start-event <uipath:variables>". (planning.md, registry-discovery.md) - collapse the duplicated verify-read mechanics in planning.md to a pointer to §4. (planning.md) - add --output json to the inline registry search. (impl-json.md) - scope the L2 resolution note: deploy is spike-verified, debug is inferred from the packaging behavior, not separately spiked. (agent/planning.md) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… the solution_folder sentinel The create-on-missing path authored the case agent/process task binding with folderPath default = the `solution_folder` sentinel. That passes `validate`, and deploy correctly *provisions* the sibling into the real solution Orchestrator folder — but the deployed case package's runtime binding is never remapped, so when the case starts the sibling it uses the literal string "solution_folder" as the folder → runtime failure "folder not exist" at invocation in Studio Web. Fix: the runtime folderPath binding default is "" (empty = co-located; the case starts the sibling in its own deployed folder). The `solution_folder` sentinel stays ONLY in the resource-identity layer — resourceKey, resources/solution_folder/ declarations, bindings_v2.json key + value.folderPath — which drove correct provisioning. The runtime folderPath and the identity sentinel are intentionally decoupled for inline siblings; added a resourceKey carve-out so the <folderPath>.<name> formula doesn't collapse to ".name". Corrected the over-stated "deploy verified" claims to deploy-provisions / runtime-needs-"". Applies to both the agent and agentic-process (ProcessOrchestration) inline-build paths. Runtime-verified on alpha.uipath.com 2026-06-24. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Make the agentic-process inline-build brief mode-agnostic: lead with the "caller registers via uip solution project add" contract and reframe --skip-solution-registration as conditional (meaningful only when the builder scaffolds via `uip maestro bpmn init`; a no-op when it hand-authors the .bpmn). uipath-maestro-bpmn documents manual XML authoring, not an init flow, so the prior hard instruction assumed a scaffold mode that skill doesn't teach. Also: cap the Create multiSelect at 4 options (batch when more are empty); de-duplicate the folderPath="" rationale to the canonical agent Step 3 while keeping the value + "folder not exist" warning everywhere; document probe caching for the pre-gate sibling check; note the dropped sibling stays registered in the .uipx (reject case); state Create's dependency on the type skill being installed (degrades to placeholder if absent). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
fb467d8 to
643d790
Compare
Summary
Teaches the
uipath-maestro-caseskill to build a missing agent inline during Phase-1 planning instead of only leaving a placeholder. When an SDD-referenced agent can't be resolved at the Rule 17 empty-lookup gate, the skill offers a third option — Create the missing agent(s) inline — alongside force-pull and skip. On Create it builds each selected agent as an in-solution low-code sibling by spawning a sub-agent that invokes theuipath-agentsskill (parallel, capped at 10), registers the siblings, and rediscovers + binds them viaregistry --local. Built agents enter Phase 2 as normal resolved tasks.Agent-only first cut; the orchestration is written type-agnostically so other non-connector kinds can be enabled later.
This feature relies on
uip maestro case registry <search|list|get> --local, which ships in CLI PR #2614 (still open). The published@uipath/clidoes not yet have it. The skill probes for--localand gracefully degrades — when the flag is absent the Create option is suppressed and behavior is exactly as today. So this PR is safe to merge independently, but the feature only activates once a CLI with--localis released. Please don't expect the Create path to be exercisable in CI until then.What changed (10 files, docs-only)
SKILL.md— Rule 17 gains the agent-onlyCreateoption (constraint + redirect); the "never auto-invoke other skills / on-demand creation is future" anti-pattern is carved out for the agent path (non-agent kinds +uipath-plannerkeep no-auto-invoke);allowed-toolsaddsAgent(the sub-agent launcher).references/registry-discovery.md— 3-option gate + new § Create-on-Missing orchestration (capability probe → multi-select → parallel sub-agents--skip-solution-registration→ sequentialuip solution project add→resources refresh→ rediscover/verify/bind).references/plugins/tasks/agent/planning.md— new § Creating an Agent inline: the typed-contract derivation, the self-contained build brief handed touipath-agents, the failure contract.impl-json.md,placeholder-tasks.md,phased-execution.md,phase-0-interview.md,planning.md,bindings-v2-sync.md,case-commands.md— consistency edits +--localcommand docs.Key design decisions
uipath-agents(not a manual handoff): agent-build knowledge stays inuipath-agents; the case skill passes a pinned brief and verifies the result.solution_foldersentinel (resourceKey="solution_folder.<name>"); the sibling ships inside the solution.uipxand co-deploys — never a separate tenant publish.uipath-agents' concern.registry search "<name>" --local(matches by name);get --localmatches onlyentityKey/project Id.Verification
get "<Name>" --local, which matches onlyentityKey— switched tosearch.allowed-toolstoken verified against the Claude Code docs: the sub-agent launcher isAgent(notTask, which is the unrelated task-list family) — corrected ine306645a.Runtime resolution — risk materialized and fixed (commit
fb467d8)The previously-documented open risk (runtime resolution of the
solution_foldersentinel) materialized in a live end-to-end run and is now fixed.folder not exist.folderPathdefault = thesolution_foldersentinel. Deploy correctly provisions the sibling into the real solution folder (resource refresh+debug_overwrites.json), but the deployed case package's runtime binding was never remapped — so the running case used the literal stringsolution_folderas the Orchestrator folder. CLI source confirms the case package'sbindings[].defaultis passed through verbatim;validateaccepts bothsolution_folderand"".folderPathbindingdefaultis now""(empty = co-located; the case starts the sibling in its own deployed folder). Thesolution_foldersentinel stays ONLY in the resource-identity layer (resourceKey,resources/solution_folder/,bindings_v2.jsonkey/value.folderPath) — they are intentionally decoupled for inline siblings, with aresourceKeycarve-out so the<folderPath>.<name>formula doesn't collapse to.name. The over-stated "deploy verified" doc claims were corrected to deploy-provisions / runtime-needs-"". Applies to both the agent and agentic-process paths.alpha.uipath.com(2026-06-24).Tests
Deferred — they need the released
--localflag plus fixtures (a pre-seeded solution with a built sibling). Planned: a smoke (gate-offer), an integration (local-rediscovery), and an e2e (io-mismatch), grading artifacts rather than commands. Tracked as a follow-up once #2614 ships.🤖 Generated with Claude Code