RaduAna-Maria
90d · built 2026-09-30
Performance
What RaduAna-Maria shipped in the selected window, measured in ETV, and how it compares with the 90 days before it.
Effective capacity
+16.4engineers
delivers like 17.4 (17.4x pre-AI)
Output (ETV)
3.1ETV
−57.0% vs 7.3 prior
Features share
33.8%
+5.1 pp vs prior window
Fixes share
8.9%
+8.8 pp vs prior window
Work mix
33.8% Features5.7% Maintenance28.7% Tests22.9% Docs8.9% Fixes
20 commits over 90 days, ending 2026-09-30.
Daily performance
Daily ETV, stacked by Features, Maintenance, Tests, Docs and Fixes.
Repository spread
Where this developer's commits land. Concentrated work (top1 > 80%) vs polymath spread (top1 < 30%).
Most impactful commits
Top 10 by ETV in the last 90 days.
- 0.7ETVfeat(hooks): migrate session hooks from sh/ps1 twins to Node scripts [PILOT-7743] (#3489) * feat(hooks): migrate session hooks from sh/ps1 twins to single Node scripts PowerShell execution policy (GPO-enforced AllSigned/Restricted) blocks invoking .ps1 files on locked-down Windows machines, and Constrained Language Mode breaks the .NET calls the .ps1 twins relied on. node is a native executable — no execution policy applies — and is guaranteed present wherever the skills were installed through the Node-based uip CLI. Each hook is now one hooks/<name>.mjs; the hooks.json polyglot keeps its canonical shape, with both branches guarding for a missing node (silent exit 0) before spawning the same script. With no .ps1 files left there is nothing to Authenticode-sign, so the Azure DevOps release gate drops its signing stage and becomes the blocking per-release FOSSA gate (fetch-signed-hooks.mjs -> run-release-gate.mjs, trigger-and-wait only); npmjs package integrity stays with the --provenance attestation. Contract guards now run the .mjs scripts directly (44 tests, unchanged assertions). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(hooks): telemetry pipes the raw payload to uip track --hook With UiPath/cli#4444 the field derivation lives in the CLI, so the plugin ships no telemetry script at all: every telemetry entry in hooks.json pipes the raw hook payload to `uip track --hook` — one process per event instead of two, and the event schema, sanitization, and allowlist become one co-versioned codebase. send-telemetry.mjs is deleted; set-session-env.mjs and suggest-permissions.mjs stay (they are deliberately uip-free so session start never pays a CLI boot). The wrapper is fail-soft by contract: `uip` absent, or a CLI predating --hook (unknown option), exits 0 with no output — telemetry is silently dropped until the CLI updates. The PowerShell branch resolves uip.cmd explicitly: PowerShell prefers npm's uip.ps1 shim, which execution policy can block, while a .cmd file is not governed by it. test_send_telemetry_hook.py now guards the wrapper contract (verbatim stdin passthrough under bash/dash/zsh, fail-soft exits, inline hand-off, async-except-SessionEnd registration shape); the derivation contract moved to the CLI repo's track-hook.spec.ts. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(hooks): export agent-session context for uip command requests [PILOT-7743] `uip track --hook` no longer derives a tool-use event from shell tool calls (UiPath/cli#4444): each `uip` command is recorded once, as the CLI's own request. To keep the session facts that event carried, set-session-env now also exports UIPATH_AGENT_MODEL, UIPATH_PERMISSION_MODE, UIPATH_EFFORT_LEVEL and UIPATH_SKILLS_VERSION from the SessionStart payload and version-manifest.json; the CLI stamps them on every request as the optional agent_model / permissionMode / effortLevel / skillsVersion dimensions. Values use the CLI's quote-free charset and 120-char cap before landing in the sourced env file. A changed value re-exports on resume/clear/compact; an unchanged one is not duplicated. TELEMETRY.md documents schema v4 and the new request dimensions. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * docs(telemetry): skills events no longer carry toolName or toolUseId [PILOT-7743] Matches UiPath/cli#4444: schema v4 drops both keys; the populated skillName / fileExtension / subagentType field names the kind of call. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>github.com-UiPath-skills · 58c1a7c2 · 2026-09-29
- 0.4ETVfeat(ci): sign the PowerShell hooks in an Azure DevOps release gate [PILOT-7718] (#3413) * feat(ci): sign the PowerShell hooks before publishing to npmjs Locked-down Windows policy (WDAC, AppLocker) can refuse PowerShell script files that carry no Authenticode signature. Where it does, the agent host is refused at load time on every tool call, so the hooks shipped in @uipath/skills are unusable on those machines. Signing and publishing cannot run in the same place. The code-signing certificate is never exported and is reachable only through an Azure DevOps service connection, while npm mints provenance attestations only for GitHub Actions and GitLab CI identities. So the work is split: publish.yml starts .pipelines/release-gate.yml over the REST API, that pipeline signs hooks/*.ps1 on a Windows agent and returns them as an artifact, and publish-npmjs overlays them before packing. Provenance is unaffected: an attestation binds the tarball digest to the publishing identity and source commit, and does not require the tarball to be derivable from source alone. Notable details: - The gate signs the exact commit being published, not the branch tip, which could otherwise move between dispatch and checkout and yield valid signatures over bytes nobody released. The commit, the script set, and each file's digest are all asserted before the overlay. - sign-hooks runs as a separate job with its own environment so its OIDC subject is stable across release lines. publish-npmjs keeps no environment, leaving the subject npm's trusted publisher matches untouched. - publish-npmjs now packs, verifies, then publishes that exact tarball. Verifying the working tree would prove nothing about what got packed, and the failure worth catching is a signature destroyed on the way in. - Gated on npmjs only. dev publishes on every push to main and flavor packages ship no hooks/, so neither is gated. - Fail-open until REQUIRE_HOOK_SIGNING is set, so this ships inert. - FOSSA runs in the same gate, blocking stable promotions only. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix(ci): pin the signing template to a tag that exists uipath.package-signing.2.2.0 was taken from the version list in the signing wiki page, but that repository publishes no 2.1.x or 2.2.x -- 2.0.18 is the highest tag. Azure DevOps failed the run at YAML parse time with "No commit found for SHA: refs/tags/uipath.package-signing.2.2.0". 2.0.18 still satisfies both constraints: >= 2.0.7 for the post-DigiCert AzureSignTool flow, and >= 1.6.0 for .ps1 support. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix(ci): capture the Key Vault permission script on hosted agents The signing template publishes ProvisionKeyVaultPermissions.ps1, but its existence check runs in the template's setup steps -- before Sign-Package.ps1 could have written the file. On a Microsoft-hosted agent, which starts from a clean VM each run, the file never exists at that point, so the artifact never appears and the documented "download the script from the pipeline logs" remediation is unavailable. It silently assumes a persistent agent. Probe for the file and publish it ourselves after the template call, so a permission failure hands over whatever script the signer generated. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix(ci): drop the dead ProvisionKeyVaultPermissions handling Reverts the capture step added in 95b7f35a3. Neither it nor the signing template's equivalent can ever fire: nothing writes ProvisionKeyVaultPermissions.ps1, so both steps only ever skip. A Key Vault permission failure surfaces as a 403 from the template's own signing step instead. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * refactor(ci): drop the unused local hook signer, test the real checker `scripts/sign-hooks.ps1` was unreferenced: no workflow, pipeline, npm script, or test invoked it, and it was absent from package.json `files[]` so it never shipped. Signing runs through the release gate's signing template. Its only remaining effect was a wrong comment in check-hook-signatures.mjs, which credited the script with the cryptographic verification the gate performs. Corrected. Cover check-hook-signatures.mjs instead, which does run on every npmjs publish: ten cases over both targets it accepts, including bytes appended after a signature block. Checked non-vacuous by mutation -- disabling either guard fails exactly the case written for it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * refactor(ci): move signed publishing into its own workflow publish.yml is restored to its state on main and carries no signing steps. Signing and the npmjs publish that consumes it now live in publish-signed.yml, triggered by manual dispatch only so the two workflows cannot both publish a version. Both use the same per-channel concurrency group, so a run in one serializes against a run in the other. No unsigned fallback here: a gate failure fails the publish, which the ratchet in the previous shape allowed to pass. Covered by publish-signed-workflow.test.mjs -- dispatch-only triggers, overlay before pack, verify before publish, no fallback path. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * test(ci): add a dry-run path and a temporary trigger to exercise signing `dry_run` defaults to true, so a dispatch validates the flow without publishing; unticking it is a deliberate act. The publish step is guarded on `github.event_name == 'workflow_dispatch'` as well as the input, so the temporary push trigger cannot reach `npm publish` regardless of how inputs evaluate. The trigger is scoped to this branch and must come out before merge. Tests assert the guard and that no trigger names main or a release branch, rather than asserting the absence of a push trigger. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix(ci): set the artifact format parameter instead of appending it A pipeline artifact's downloadUrl already carries `format=zip`. Appending `&format=file&subPath=...` left two `format` parameters; the service honours the first, so it returned the zip and ignored `subPath`. Every per-file download got an archive, and parsing manifest.json failed on the zip header. Set the parameters on a parsed URL instead. Extracted as `artifactFileUrl` so the construction is unit-testable, since this path had no coverage -- the GitHub run had never reached it, failing earlier on Azure DevOps access. Found by running the gate contract end to end against a real artifact. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * chore(ci): drop the temporary push trigger now signing is verified The trigger existed only because workflow_dispatch is not selectable until the file is on the default branch. It has served its purpose: run 13486314 signed all three hooks, the overlay survived `npm pack`, and the dry-run guard held -- the push event skipped `npm publish` as designed. The publish step keeps its `github.event_name == 'workflow_dispatch'` guard, so a trigger added later for testing still cannot publish. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>github.com-UiPath-skills · 3e8f0d1d · 2026-09-22
- 0.4ETVfeat(hooks): twin .sh/.ps1 session hooks with polyglot dispatch for zero-install cross-platform support (#1929) * fix(hooks): port session hooks from bash to PowerShell for Windows compatibility Session hooks required bash, which is absent on Windows machines without Git Bash — the plugin's primary enterprise environment. Port all four hooks.json-registered scripts (ensure-uip, suggest-permissions, set-session-env, send-telemetry) to PowerShell compatible with both Windows PowerShell 5.1 and pwsh 7+, and register them with shell: powershell (Claude Code resolves pwsh first, falls back to powershell.exe, and always spawns with -ExecutionPolicy Bypass). - send-telemetry: ConvertFrom-Json replaces the string-aware awk pass; same region-scoped extraction contract, same schema v2 key set. - SessionEnd registration is now synchronous (30s timeout): async hooks still running at session teardown are killed after a grace window shorter than PowerShell + `uip track` startup, silently dropping the session-end event (measured on Claude Code 2.1.202). - ensure-uip hooks.json command propagates the script exit code, which otherwise collapses to 1 under the -Command spawn form. - Contract guards run the hooks via pwsh (preinstalled on ubuntu runners). - validate-skill-descriptions.sh stays bash: it is a git pre-commit/CI validator invoked by .githooks/pre-commit and validate-skills.yml, not a session hook. Verified end-to-end: fresh --plugin-dir session made real tool calls and all six event shapes (session-start, tool-use x3, completion, session-end) reached `uip track` with correct fields and a consistent session_id. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(hooks): twin .sh/.ps1 session hooks with polyglot dispatch No shell ships by default on both Windows and macOS, so a single-language hook always leaves one platform needing an install (bash via Git Bash on Windows, or pwsh on macOS/Linux). Keep BOTH implementations as behavioral twins and let one bash/PowerShell polyglot command per hooks.json entry dispatch to the right twin: bash runs the .sh via backtick-comment substitution; PowerShell hides the bash branch in a <# #> block comment and runs the .ps1. No `shell` field — the polyglot relies on Claude Code's default selection (bash where available, PowerShell on Windows without Git Bash). - Twin sync rule recorded in CLAUDE.md, CONTRIBUTING.md, the PR-review hook checklist, and TWIN SCRIPT headers in all eight scripts: any change to one twin requires the equivalent change to the other in the same PR. - Telemetry contract guards now parametrize over both twins (bash + pwsh) so CI enforces the sync rule. - SessionEnd stays synchronous (30s timeout) for both twins: async hooks are killed at teardown before PowerShell + `uip track` can hand off the session-end event. Verified: polyglot dispatch, silence, exit-code propagation, and stdin passthrough in git-bash and Windows PowerShell 5.1; the registered command strings run both real twins correctly; live headless session delivered all five event shapes through the bash branch. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(hooks): make polyglot dispatch zsh-safe via heredoc wrapper zsh parses the whole -c string before executing, so the bare PowerShell branch (`& ...ps1`) was a parse error and the hook never ran. This matters because Codex executes POSIX hooks via `$SHELL -lc` — zsh on default macOS. Wrap the PowerShell branch in a quoted heredoc (: <<'POLYEOF' ... POLYEOF): sh-family shells now parse it as inert data, while PowerShell still sees it inside the <# #> block comment. Verified: git-bash, bash -lc, dash (sh -c, the Claude Code Linux hook shell), zsh -lc, and Windows PowerShell 5.1 — dispatch, silence, exit-code propagation, stdin passthrough — plus a live `codex exec` run on Windows (Codex spawns hooks via PowerShell there; the .ps1 twin ran with the full payload) and a live Claude Code session (bash branch, full event stream). Known limitation: fish as the login shell under Codex cannot parse the command; the hook is skipped, non-fatally. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(hooks)!: remove the ensure-uip SessionStart hook Drop the automatic @uipath/cli + @uipath/rpa-tool installation at session start (both twins and the hooks.json entry). The plugin now expects the uip CLI to already be on PATH; telemetry silently drops events when it is absent, and the remaining hooks never fail the session. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>github.com-UiPath-skills · 064e9e7d · 2026-07-09
- 0.3ETVfix(hooks): resolve agent_model per event and align the telemetry twins (#3248) agent_model was empty on 97% of uip.skills.* events (PILOT-7497). Claude Code does not put `model` in the hook payload except on SessionStart, and only from some of the paths that fire it — verified against 2.1.236 by capturing live payloads and tracing the bundle. The shared envelope behind PostToolUse / Stop / SessionEnd carries no `model` key at all, so those three could never populate the dimension: 100% empty by construction, not a parsing bug. Resolve it per event instead: envelope `model` first, then the last assistant entry of `transcript_path`. Per-event rather than cached at session start, so a mid-session `/model` switch is tracked instead of frozen at a stale value. Subagent turns are written to a separate <session>/subagents/agent-<id>.jsonl, so the main transcript yields the main-loop model; a subagent's own model already rides as subagentModel. A bounded 256KB tail keeps this O(1) in transcript size (~10ms) — the last assistant entry sits within ~28KB of EOF even in a 5MB transcript. A cold SessionStart fires before the transcript exists, so that path still relies on the envelope and degrades to "". Also fixes two twin divergences the parity suite did not cover: * an object-shaped `model` was dropped by the bash twin but stringified to `@{id=...}` by the PowerShell one. Both now accept a string, or an object's id falling back to display_name. * Get-Prop unrolled a single-element array on return, so `["x"]` arrived as the string `x` where bash yielded "". Fixed with `return ,$value`. That affected every field, not just `model`. String-typed fields now reject JSON literals in both twins, so `null` / `true` can no longer land as the text "null" / "True". Checked against 14 days of live data first: no field has ever carried a literal and effortLevel is always a string, so nothing observed changes. transcript_path is read locally only and is never forwarded. Refs PILOT-7497 Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>github.com-UiPath-skills · 84d6e86f · 2026-09-14
- 0.2ETVdocs: use placeholders for example values that trip content scanners (#3201) * docs: use placeholders for example values that trip content scanners A customer content-inspection gate blocked the published package on 21 findings. All were false positives on documentation examples — no credential, live PII, or cardholder data exists in the repo — but a shape-based gate cannot tell the difference, and a blocked artifact blocks the rollout either way. Replace the literal example values we control with the repo's existing <UPPER_SNAKE_CASE> placeholder convention, which identity-commands.md and the audit guides already use: - uipath-admin: literal --expiration dates and audit export date ranges become <EXPIRATION_DATE> / <FROM_DATE> / <TO_DATE>; generated folder names become audit_<from>_<to>_<generatedAt>. Both audit references are now free of literal calendar dates, so the scoping question does not come back on the next scan. - uipath-rpa: mail-merge sample data becomes <COMPANY_NAME> / <STREET_ADDRESS> / <CONTACT_NAME> / <PHONE_NUMBER>; the placeholder GUID drops its digit runs; the regex reference table masks digit positions as N with a note; the "number too long" test row describes its length. Left verbatim on purpose: Orchestrator error code 170002, two support-forum thread IDs inside URLs, and a Databricks documentation URL. Those are product data the playbooks exist to convey, not examples, so they need an allowlist on the scanning side rather than an edit here. Document the rule in CONTRIBUTING.md and .claude/rules/content-quality.md so new examples do not reintroduce the problem. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * docs: use one placeholder per value in audit date examples <FROM_DATE>T00:00:00Z glued a placeholder to a literal time fragment. It kept the literal in the file, and read worse than either form alone — every sibling flag in those same blocks (<USER_GUID>, <ORCHESTRATOR_SOURCE_GUID>) already uses one placeholder per value. Use <FROM_TIMESTAMP> / <TO_TIMESTAMP> for the seven affected examples in audit-commands.md and audit-workflow-guide.md, and reword the events-date gotcha so it explains the midnight expansion instead of spelling it out against a placeholder. The literal T23:59:59Z on the login-history examples carried the end-of-day rule; state it in prose there so the guidance survives. Add the rule to both guideline files: give each value one placeholder covering the whole value, and state the expected precision in prose. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>github.com-UiPath-skills · d30097ff · 2026-09-10
- 0.2ETVrefactor(uipath-planner): group case-only files and evals into case/ subfolders (#2929) * refactor(uipath-planner): group case-only files into case/ subfolders CODEOWNERS gave the Case Management owners co-ownership of the planner's case surface one file at a time. Every new case-only file meant another per-file line, so the block grew without bound and drifted whenever a file was added or renamed. Move the five case-only files into `case/` subfolders that mirror the existing skill layout, so ownership can be expressed per folder: references/case/ case-design-lane-guide.md, case-design-layers-guide.md assets/templates/case/ case-sdd-template.md, sdd-viewer.html scripts/case/ audit_sdd.py Six per-file CODEOWNERS lines collapse to three folder lines, and a new case-only file is covered by dropping it in the matching folder — no CODEOWNERS edit at all. Category-mirrored folders rather than one flat skills/uipath-planner/case/ keep the references/ + assets/templates/ + scripts/ layout that .claude/rules/skill-structure.md mandates. The lane guide resolves reference paths against the skill base directory and forbids hunting for files, so every pointer to a moved file is updated: SKILL.md, both moved guides, the moved template, sdd-generation-guide.md, product-selection-guide.md, audit_sdd.py's LAYERS_MD lookup, and three test files. Same-directory sibling links inside references/case/ are unchanged. Verified: skills:check-links resolves all 6461 links; skills:validate and skills:build pass for both flavors; audit_sdd.py runs from its new home with model checks armed; planner case tests pass, including the twin-parity self-containment check that reads the moved files. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * chore(uipath-planner): trim planner from case eval ownership Drop the explanatory comment block above the case folder rules — the paths carry the intent, and the block was three lines of prose in a file that is read as data. Remove @RaduAna-Maria from the case-related eval entries so the Case Management owners review those on their own. `_shared/` is included: every task that consumes it is a case task, so it is case-only in practice. The three skill-side `case/` folder rules and the general /tests/tasks/uipath-planner/ rule keep @RaduAna-Maria unchanged. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * refactor(uipath-planner): group case evals into tests/.../case/ Same reason as the skill-side `case/` folders: ownership was declared one eval directory at a time, so the block grew with every case task added. Move the nine case evals — bpmn_vs_case_management, the six case_design / case_finalize_draft dirs, case_sla_response_map, and deferral_single_case.yaml — under tests/tasks/uipath-planner/case/. Nine CODEOWNERS entries collapse to one, and a new case eval is covered by landing it in the folder. `_shared/` deliberately stays at the suite root. Its __init__.py bridges the uipath-maestro-case and uipath-planner checker packages by that exact path, and test_shared_twins.py pins sdd_check.py byte-identical across the two suites; moving it would force an edit to the maestro-case suite and leave the bridge asymmetric. It keeps its own CODEOWNERS line, so the block goes 9 -> 2. Because `_shared/` did not move, the four `$SKILLS_REPO_PATH/.../_shared/` references in the case task YAMLs need no change. Two path computations shift by one level and are updated: the three moved checkers' sys.path bootstrap (parents[1] -> parents[2]) and test_finalize_checkers.py's lookup of the picker and reject checkers. case_sla_response_map/ had no CODEOWNERS entry before and is now covered by the folder rule. Per the earlier decision, the unified rule keeps @jundayin, so no reviewer loses access; bpmn_vs_case_management and deferral_single_case gain them. Verified: 34 task YAMLs before and after, all nine case tasks still found by the recursive glob the Makefile and CI use; the three moved checkers import `_shared` and run; _shared suite passes (29 tests), including test_finalize_checkers.py subprocessing the moved checkers, test_shared_twins.py and test_case_twin_parity.py; per-task tests pass from their new locations. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * chore(uipath-planner): drop explanatory comment from case eval rules Keeps the earlier decision to hold prose out of CODEOWNERS. The reason `_shared/` stays at the suite root lives in the commit history and the PR, not in the file the review tooling reads as data. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>github.com-UiPath-skills · 5ab5ce81 · 2026-09-01
- 0.2ETVfix(uipath-planner): write the SDD skeleton before Phase 3, raise SDD turn budgets (#2850) Run 2026-08-27_04-13-44 lost skill-sdd-integration-gap-detection and skill-sdd-integration-need-driven-selection to the per-turn watchdog: both turns were hard-killed at 1800s with no SDD on disk (ERROR, score 0.000). Neither agent ever called Write — 93% / 86% of each budget went to reasoning blocks, and both agents' own progress lists scheduled "Write SDD to disk" as their final task, so the only gradeable artifact was the one thing the kill took out. Skill: - Phase 3 gains Step 0, a hard gate: write the skeleton (header + Planner Handoff header/marker with Status: draft + Decisions Made / Recommended Scope + Phase 1/2 sections) BEFORE generating any Phase 3 section, then append sections as they are generated. This promotes the buried write-early blockquote into an executable step. - The Step 0.5 progress list now carries "Write SDD skeleton to disk" as task 4 and renames the terminal task to "Finalize SDD (Status: ready)"; new Rule G-9 forbids reordering the write to the end. The old list taught the deferral the traces show. - Step 2 item 6's collision check now runs before the Step 0 write — moving the write earlier moved the clobber risk earlier with it. - Level 0 estate sweep is capped at one round: an empty estate is a final answer, and a rejected flag is not retried with a guess. Both runs burned reasoning cycles on repeat sweeps (one guessed `--filter`, rejected as ValidationError; another re-ran the same list with client-side filtering). Tests: - Both tasks move to the proven constraint_gate budget (2700s turn / 3600s task) from 1800s/2700s, which also clears the orchestrator's inverted-limits warning. - Both prompts gain the guard the passing siblings carry: name the SDD file, load the skill, no `uip` commands, the SDD is the only deliverable. - gap_detection.yaml gains the required mode:build tag. Not yet re-run under coder-eval; needs a passing-run claim before merge. Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>github.com-UiPath-skills · 3416b259 · 2026-08-27
- 0.1ETVfix(rpa): discovery agent writes its own context files; gate empty projects (#2646) * fix(rpa): discovery agent writes its own context files; gate empty projects The discovery subagent had no write tools, so it returned the context document and the main agent wrote the files — an extra round-trip that also let the write get skipped whenever the main agent moved on. The subagent now owns both outputs. It was also spawned for new and freshly-scaffolded projects, where it can only produce a document of empty tables. The greenfield check only covered a missing project.json, so a scaffolded-but-empty project still paid for a full discovery pass. - agent: add Write/Edit tools; new Step 5 writes .claude/rules/project-context.md + AGENTS.md (marker merge logic moved here from SKILL.md); Step 6 returns a context-files: status line plus the document so the main agent keeps session context without re-reading - agent: new Step 2 gate returns SKIP: <reason> for no project.json, zero authored .xaml/.cs files, or a lone untouched scaffolded entry point - SKILL.md: new "Skip gate" section applies the same three conditions before spawning; discovery flow only writes files itself when the agent reports context-files: not-written (read-only subagent hosts such as UiPath Autopilot), and treats a SKIP: return as a gate trip - execution-maps-guide, README: follow the reworked flow Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix(rpa): gate covers library and test scaffolds; align exclusion lists Verified against fresh Studio 26.0.201 blank projects: libraries scaffold NewActivity.xaml (not NewActivity1.xaml) and blank test cases ship a Comment activity inside the root Sequence, so both slipped past the gate. Entry-point list now names all four scaffold shapes; content test ignores Comment activities and ViewState metadata. Exclusion lists in SKILL.md and the agent unify to all dot-directories + obj/ + bin/, covering .templates/, .tmh/, .project/ seen in fresh scaffolds. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(rpa): tighten skip-gate wording Same gate semantics, terser prose per token-optimization rules: scaffold entry-point names and the untouched-content test move out of the overlong table row into two short lines. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>github.com-UiPath-skills · f769435b · 2026-08-19
- 0.1ETVfeat(hooks): accept Autopilot/Delegate tool names in telemetry gate (#2010) UiPath Autopilot / Delegate honor hooks.json with the same envelope and lifecycle events as Claude Code, but rename their shell and file tools: ExecuteBashCommand / ExecutePowershellCommand (vs Bash / PowerShell) and ReadFile / WriteFile / EditFile / LsDirectory (vs Read / Write / Edit / Glob / Grep). Their tool_input still carries command / file_path, so the existing attribution and uipSubcommand / fileExtension derivation fire once the renamed names are gated. Add the renamed names to the attribution gate and field derivation in both twins (send-telemetry.sh / .ps1), kept behaviorally identical. The anchored `uip` matcher is deliberately left unchanged — it already matches the same `uip ...` command strings these agents carry, and loosening it to a bare substring would over-attribute (e.g. "equipment") and break `$UIP` detection, contradicting the documented region-scoping design. Document the rename in TELEMETRY.md (trigger table + cross-agent section) and add parametrized tests covering the new tool names plus an over-attribution guard. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>github.com-UiPath-skills · af6b617d · 2026-07-14
- 0.1ETVfeat(uipath-automation-discovery): estimation accelerator (PILOT-6044) (#1815) Sizing 23 finance opportunities by hand diverged ~6,000 h from the official estimate. Per the source feedback (UV-14914) the miss was methodology, not base numbers: disconnected matrix/catalogue artifacts, ambiguous Tool vs Process-Automation grain, no above-ceiling handling, no redeploy/rebuild model. Add an optional Phase 4.5 that sizes each prioritized opportunity: opportunity → complexity band → pack-hours → adjustment factors → contingency. - references/estimation-guide.md — the method + the four fixes: an above-ceiling/decompose rule (>7 apps / >8 variations), a multi-entity redeploy factor, an existing-automation rebuild discount, confidence-tiered contingency, and one unified band→hours mapping that resolves grain. - assets/templates/estimation-worksheet-template.md — per-opportunity table, unified mapping, decomposition log, calibration register, scenario roll-up. - SKILL.md — Phase 4.5, Critical Rule 6, triggers, nav, anti-patterns. Accuracy guardrail (Critical Rule 6): band→hours numbers and matrix thresholds are authoritative user-supplied references, never invented; if absent, stop and ask. Factor/contingency percentages are [CALIBRATE] defaults tuned against actuals. This fixes the root cause instead of baking in unverifiable numbers. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>github.com-UiPath-skills · 1f9a934f · 2026-07-09