skills — Engineering Performance
16 engineers all time · Jan 2026 – Sep 2026 · built 2026-09-30 · GitHub
Performance snapshot
Today's rolling 90-day reading for skills, compared with the start of the series. Pick a window to move that comparison point.
Avg. perf / dev / mo
−33.6%
0.83 → 0.55 ETV
Active engineers
+140.0%
5.0 → 12.0
Features
−4.6pp
19.4% → 14.8%
vs. UiPath
0.46x
0.79x → 0.46x · −54% below
skills vs. UiPath
Per-engineer ETV for skills against UiPath as a whole. Both lines are 90-day rolling averages scaled to a 30-day month, so they share one axis and can be read against each other at any point. Pick a window to zoom the chart to it.
Performance Composition
Each month's output split by type of work: Features (new value), Maintenance (sustaining systems), Tests, Docs, and Fixes (rework). The yellow line is output per engineer, so when it rises each engineer is delivering more, whatever the team size did. Unit: Engineering Throughput Value (ETV).
Engineering capacity
Effective engineers behind skills, against its pre-AI baseline. Each subject has its own: skills's is 0.83 ETV / dev / mo, its first reading in Q1 2026. Per-engineer ETV divided by that gives a capacity multiple, and that multiple applied to the engineers active in the trailing 90 days turns it into engineer-equivalents. The line is the real headcount, so the gap between line and area is what the leverage is worth. Because each baseline is its own, every subject opens at 1.0x on its first day: multiples measure improvement and are not comparable between subjects.
Knowledge concentration
How dependent is this repo on a small number of engineers? Higher top-1 share = higher key-person risk.
uipreliga owns 25.7 % of commits.
Behind the numbers
Written summary of the work completed each month.
No monthly reports available yet.
Top engineers
Most impactful commits
Top 10 by ETV in the all-time window.
- 5.9ETVtest: remove $TASK_DIR/$SKILLS_REPO_PATH host-path deps from task yamls (#3271) * test: remove $TASK_DIR/$SKILLS_REPO_PATH host-path deps from task yamls Task sandboxes (docker/tempdir drivers) don't have access to a full host repo checkout, so scripts/fixtures a task needs must be staged via sandbox.template_sources (visible to the agent, used for pre_run/post_run tooling) or reached via $REFERENCE_DIR (mirrors reference.directory on disk, used for grading/run_command/llm_judge criteria, invisible to the agent). - Migrated uipath-admin, uipath-governance (incl. compliance-pack), and uipath-review (agents/* and rpa/*) task families off $SKILLS_REPO_PATH: moved shared helper scripts from _shared/ to _setup/ where they were actually pre_run/post_run tooling, added sandbox.template_sources entries to stage them into the sandbox, and switched run_command criteria to the $REFERENCE_DIR-relative runpy bootstrap. - Fixed the uipath-solution deploy/config-lifecycle e2e tasks and pack_determinism_integration.yaml to stage their zip/solution fixtures via template_sources instead of an absolute $SKILLS_REPO_PATH path. - Extracted a standalone flow_project_finder.py (verbatim copy of _shared/flow_check.find_project_dir, no grading logic) so the ixp handoff grader's pre_run/post_run tooling no longer needs $SKILLS_REPO_PATH to reach a shared grading module. - Cleaned up assorted stale $SKILLS_REPO_PATH/$TASK_DIR references in docstrings and comments across uipath-maestro-flow, uipath-maestro-bpmn, uipath-insights, and elsewhere. - Added include_reference: false to llm_judge success criteria that were missing it. - Left a documented set of exceptions in place (optional ambient skills/<name>/references/*.md strengthening checks that degrade gracefully, tasks needing genuinely broader host-repo access, and meta-tests recognizing the token as legacy text). - Repointed several checker unit tests at scripts that had moved to _shared/_setup during this migration (cleanup_solutions.py, check_athena_cm_event_case.py, check_athena_cm_event_rules.py, check_cm_golden_case.py, check_sla_from_sdd.py, check_timer_connector.py, seed.py) — these were breaking the maestro-case and maestro-flow checker unit test CI jobs. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * fix(tests): close admin/governance checker path bugs from host-path removal Two issues surfaced after removing $SKILLS_REPO_PATH/$TASK_DIR from the admin/governance task yamls: - reference.directory: . only copied the leaf task folder into $REFERENCE_DIR, so verify_*.py scripts invoked via runpy.run_path() couldn't find admin_helpers.py/gov_helpers.py in the family-level _setup/. Widened to .. and prefixed the $REFERENCE_DIR script path with the leaf folder name across all 54 affected yaml files (identity, authz, apms, audit, access-policy, aops-policy). - audit_helpers.py — pure grading logic documenting the audit checker's record-schema/casing rules — lived in uipath-admin/_setup/, which is wholesale-mounted via template_sources into 36 unrelated identity/authz/apms agent sandboxes. Moved it to audit/, colocated with its three consumers, closing that leak. admin_helpers.py and gov_helpers.py stay in _setup/ since they're generic CLI plumbing with no judging-specific logic. Also restored explicit sys.path.insert in the three verify_audit_*.py scripts and in the relocated audit_helpers.py — runpy.run_path() does not auto-add a script's directory to sys.path the way direct `python3 script.py` execution does, so colocation alone isn't sufficient. Verified by reproducing the grading invocation in isolation for identity/audit/governance cases (reaches real logic instead of ModuleNotFoundError) and by running pytest tasks/uipath-admin/ (33 passed). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * fix(tests): address PR #3271 review findings — staging bugs, answer-key leaks, doc drift Full remediation of the automated 8-axis review on #3271 (3 critical + 5 high blockers, plus non-blocking/nit findings), each independently verified before fixing: Blockers: - 17 uipath-review/agents tasks staged `path: ../_setup`, one level short of the real `_setup/` — fixed to `../../_setup`. - Fixing that path re-activated a real answer-key leak: 16 `_setup/inject_*.py` scripts named the exact rule_id their own grader greps for, once staged into the agent's own sandbox. Reworded every literal rule-id token out of those docstrings/comments. The 17th task (stale_generated_files) failed agents in the opposite direction — its checker matched a canary literal anywhere in the report, including the sandbox's own harness scaffolding; scoped the assertion to defect-section citations only. - 5 uipath-ixp tasks staged `../_shared/fixtures` with no mount_point (defaults to sandbox root, but prompts say `./fixtures/`) — repointed to the already-migrated `../_setup/fixtures` with `mount_point: fixtures`. - `jira_is.py` was never relocated for 5 maestro-flow Jira tasks: pre_run's `_setup/seed_jira.py`/`teardown_jira.py` bare-import it, but it still sat at the task root (never staged) — moved into each task's own `_setup/`. Grading's `_shared/check_jira_*.py` also import it locally — added a merged `_shared/jira_is.py` superset (FOLDER_NAME/issue_absent from the escalation copy, myself()/retry plumbing from the create-issue copy). - `uipath-governance/cleanup_policy.py` was referenced from `compliance-pack/_setup/cleanup_policy.py` but never moved there — moved. - `seed_coded_order.py` kept `parents[3]` after being staged into the sandbox; the branch silently flipped to a fallback that calls a nonexistent `df choice-sets add-value` verb — pointed at the co-staged sibling `seed_choice_set.py` instead, removed the broken fallback. - Split the fused 1057-line `ixp/e2e_03.../_setup/handoff.py`: agent-visible `handoff.py`/`handoff_tenant.py` keep only pre_run/post_run tooling and tenant plumbing; the primary grading gate (`check_main` and its answer-key helpers) moved to `_shared/check_ixp_handoff.py`, reached only via $REFERENCE_DIR. Deleted the now-unused `_setup/flow_project_finder.py` copy. Repointed test_handoff.py and e2e_04's criterion accordingly. - 4 checkers (`check_cm_golden_{seed,bindings,semantics}.py`, `check_is_smoke.py`) resolved a `fixtures/sdd.md` / fixture path that never moved with them — pointed at the reference-mirror location instead of the agent-writable sandbox copy. Non-blocking / nits / what's-missing, also addressed: - `test_cleanup_codedapp_folder.py` repointed to the moved `_setup/` script, converted to real pytest functions, added `pytest-coded-apps-check` and `pytest-review-check` CI jobs (test-helpers.yml). - Dead `sys.path.insert` entries removed from 3 api-workflow checkers. - `coded_in_flow_e2e.yaml`'s `reference.directory` widened to `../..` to match its siblings and actually reach `_shared/`. - `smoke-skills.yml`'s `resolve_task_yaml()` now falls back to a skill's full smoke suite when a changed `_shared/`/`_setup/` file resolves to no owning task yaml (previously silently selected nothing). - CODEOWNERS: restored specific ownership for 10 checker files relocated into `_shared/` during the migration (guardrails + maestro-flow connector checkers), so they don't silently fall back to the broader family default. - Orphaned YAML comments reattached to the settings they describe (ixp/name_resolution.yaml, e2e_04_build_mechanics.yaml). - Stale doc drift fixed: tests/README.md (`_setup` vs `_shared` shape + the old $SKILLS_REPO_PATH example), uipath-maestro-bpmn/README.md, generate-task.md scaffolder instructions, test-task-template.yaml, flow-v2-preview.yaml's stale grader rationale, stage_shared.sh's still-load-bearing scope, and the troubleshoot smoke task's now-outdated "coder-eval doesn't inject TASK_DIR" comment (documented as the intentional broad-host-access exception it always was). Verified: pytest green per-family (maestro-flow 1235, maestro-case 139, agents 17, admin 33, review 41, coded-apps 6, maestro-bpmn 19, planner 89), all changed YAMLs parse, scripts/check-task-driver.py clean, and every relocated/rewritten script's import path traced by hand against its actual staged or reference-mirrored location. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * fix(ci): register review/coded-apps checker jobs as required checks test-helpers.yml added pytest-review-check and pytest-coded-apps-check in the previous commit but docs/REQUIRED-CHECKS.md's target set table was never updated to match, tripping test_every_test_helpers_job_is_required. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * fix(tests): remove $SKILLS_REPO_PATH host-path dep from disabled eval_run task Missed in the earlier sweep since .disabled files aren't discovered by coder_eval. Stages _setup via sandbox.template_sources like its active sibling tasks (e.g. single_node/switch), instead of reaching cleanup_solutions.py through the host repo path. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>Akshaya Shanbhogue · a46c4e10 · 2026-09-14
- 1.4ETVfeat: add agent review (#1069) * feat: add agent review * fix: scaffold lowcode review fixtures in Python, not via uip CLI * fix: address comments * fix: flaky tests * fix: update agent review skill * fix: stabilize uipath-review agent tests for the unreleased review CLI The review-CLI verbs (`uip agent review` / `uip codedagent review`) are not in the deployed CLI yet, and the skill explicitly permits recording them as skipped — so asserting the agent runs them was non-deterministic and failed the smoke pipeline (~50% on low-code). - Drop the `uip agent review` command_executed criterion from the low-code judgment tests and `uip codedagent review` from the coded judgment tests; keep the one reliable instance in the coded delegation smoke. - Add an explicit "load the uipath-review skill" line to the low-code prompts so the agent doesn't select the built-in /review (PR-review) skill. - Remove the low-code delegation smoke — its only distinct assertion was the flaky `uip agent review`; the rest is covered by the low-code judgment tests. Keeps `uip agent validate` on low-code tests (a real, reliably-run command). All 8 remaining agent tests pass at score 1.000 under experiments/default.yaml. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>cristian-groza · e5872ae5 · 2026-06-09
- 1.3ETVSDD creation skill (#239) * Add solution desing skill to create projects from PDDs * refactor * refactor v2 * refactor v3 * changes * add tests * imrpove case management template * improvements * solution support * improvements more, hope doneRaduAna-Maria · 830eba22 · 2026-04-23
- 1.2ETVfeat(audit): /audit-verbs CLI-verb reachability pipeline + /lint-task axis (#833) * feat(lint): add CLI-verb reachability axis to /lint-task Verifies that `uip` verbs referenced in task YAMLs and skill docs exist in the catalog snapshot (`assets/uip-catalog-snapshot.json`), with retired verbs suggesting canonical replacements from `.claude/rules/cli-renames.md`. Catalog is regenerated nightly via the refresh workflow. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs(tests): document test authoring workflow and rules Restructure tests/README.md's authoring section into a numbered `/test-coverage` → `/generate-task` → `/lint-task` → run flow, add a top-level CLAUDE.md pointer, and introduce `.claude/rules/test-writing.md` with the must-do checklist and anti-patterns. Merge `.claude/rules/task-authoring.md` into test-writing.md so the sandbox `env_packages` rule and template pointer live next to the rest of the test-authoring guidance. CLAUDE.md now points to a single rules file instead of two. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * feat(audit): /audit-verbs slash command with markdown report flags Add a one-shot command that runs both verb audits and writes their reports to tests/reports/, alongside the existing /test-coverage outputs. Tests and skills can be audited independently via `/audit-verbs tests` / `/audit-verbs skills`, or together with the default no-arg invocation. - Add `--report PATH` to scripts/check-cli-verbs.py and scripts/check-skill-verbs.py so reports are produced by the checkers themselves rather than by ad-hoc post-processing. - Add .claude/commands/audit-verbs.md describing the four-phase flow (ensure catalog → run audits → summarize → exit code). Reports remain gitignored under tests/reports/. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(audit): address code-review findings; add regression tests Three bugs surfaced by the multi-model code review of the CLI verb audit pipeline: - check-cli-verbs.py: enumerate_paths(allow_partial=True) returned mid-token literals when the regex went dynamic inside a verb token, causing patterns like `uip\s+solution\w+\s+list` to be classified as reachable via the prefix `solution`. Trim accumulated paths back to the last whitespace before returning a partial. - check-cli-verbs.py: extract_verb_paths emitted duplicate verb paths for `(uip|$UIP)`-style alternations, inflating the "Top unmatched verbs" report table. Dedup while preserving order. - build-uip-catalog.py: missing `uip` binary raised an unhandled FileNotFoundError. Wrap subprocess.run with a helpful sys.exit. Plus hygiene from the same review: - build-uip-catalog.py: move UNWALKABLE declaration above its first use, beside other module constants. - check-skill-verbs.py: drop redundant `tokens[0] in unwalkable` short-circuit in severity classification (equivalent to the n=1 iteration of the existing loop). - check-skill-verbs.py: log to stderr when read_text fails on a .md file instead of swallowing silently. - refresh-uip-catalog.yml: sanitize $CLI_VERSION before interpolating into the PR title/body/branch (defense in depth — input is trusted today but the regex was already used for the branch name only). Regression tests in tests/scripts/test_verb_checkers.py cover the three correctness fixes plus the redundant-OR simplification. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(audit): address second-round code review; pin behavior with tests Highs: - check-skill-verbs.py noise filter only fired on single-token tails, so "the uip CLI works" produced a Stale finding. Filter now matches the first token regardless of length (PROSE_NOISE set). - refresh workflow pinned @uipath npm scope to public registry, matching smoke-skills.yml. The internal GH Packages feed carries divergent 1.0.0-alpha.* prereleases and silently fails without auth. Mediums: - check-cli-verbs.py --report now exits 1 only on High, mirroring the contract in audit-verbs.md Phase 4 (was 1 on Medium too). - Word-boundary anchors (\b/\B) treated as dynamic; previously the AT branch skipped them silently and could yield false-reachable verdicts. - build-uip-catalog.py: ThreadPoolExecutor lifted outside the BFS while loop; install_all_tools logs stderr (npm errors) not stdout. - check-skill-verbs.py: extracted _aggregate() to dedupe Counter rollups between write_report and the text path. Docs: - Corrected build-uip-catalog.py docstring and audit-verbs.md guidance to reflect public-npm reality (no NPM_TOKEN needed). Three new regression tests pin the High/Medium fixes: - test_scan_suppresses_prose_noise - test_report_exit_zero_when_only_medium - test_extract_verb_paths_treats_word_boundary_as_dynamic Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * feat(gate): per-skill CLI verb gate as required check Adds .github/workflows/verb-gate.yml — fails a PR when stale `uip <verb>` references exist in the markdown of any skill the PR touches. Mirrors the detect → matrix pattern from smoke-skills.yml / activation-gate.yml so only edited skills are checked, letting the existing doc-drift backlog be swept opportunistically per skill instead of all-at-once. Infrastructure edits (catalog snapshot, checker script, this workflow) fan out to every skill — same rationale as smoke-skills.yml's "test infrastructure changed → run everything" branch — so the nightly refresh-uip-catalog PR will surface CLI-wide drift the moment it lands. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(audit): kill verb-checker false positives + catalog rpa gap Multiple targeted fixes after the CLI Verb Gate's first run flagged ~700 findings, the vast majority of which were parser noise rather than stale verbs: scripts/check-skill-verbs.py - PLACEHOLDER regex accepts optional `.ext` after `<X>` / `[X]` so `validate <ProjectName>.flow` stops at the placeholder instead of treating `<ProjectName>.flow` as a verb token. - Inline `#` shell comments end verb extraction. Fixes `uip registry pull # refresh cache` swallowing the comment text. - Reject dot-bearing tokens (registry resource keys like `core.action.script`, version literals). No catalog verb contains a dot, so this is safe. - Reject leading non-alphanumeric tokens. Catches `uip — heading` patterns and other markdown-rendered non-commands. - Expand PROSE_NOISE with common prepositions, modal verbs, and the literal words "commands"/"version"/"tool" that appear in narrative ("Run uip commands against the platform"). scripts/build-uip-catalog.py + snapshot - PLATFORM_SPECIFIC_PREFIXES seeds `rpa` into UNWALKABLE when it's not exposed as a top-level subcommand. Linux-built catalogs lack the rpa tool (needs Studio Helm), so every `uip rpa <verb>` reference was being flagged as Stale with null prefix. With this fix consumers fall back to Uncertain — same treatment as codedagent/context-grounding. The current snapshot is patched in-place to unblock immediately; future refreshes regenerate it. .github/workflows/verb-gate.yml - Gate blocks only on Stale findings where `matched_prefix == null` (no valid catalog prefix at all). Findings with a valid prefix but a suspicious tail (positional argument values mis-parsed as sub-verbs) surface as ::warning annotations on the PR instead of failing the build. Hard-fail stays for the unambiguous case where the entire verb path is unknown to the catalog. tests/scripts/test_verb_checkers.py - Regression tests for the three new false-positive classes: `<X>.flow` placeholders, inline `#` comments, dot-separated argument values. Local projection after fixes: 4 skills still show 1 blocking finding each. Three are real stale verbs (`auth login` → `login`, `orchestrator folder list` → `or folders list`); one is a doc that literally documents `(uip orchestrator does not exist)` as a negative example and trips the parser. Down from 18/19 failing. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * feat(refresh): auto-merge nightly catalog refresh when checks pass The nightly refresh-uip-catalog workflow opened a PR that sat waiting for a human to merge. Two failure modes: 1. Unreviewed PRs block subsequent refreshes (the existing "skip if open refresh PR" check short-circuits) — so a stalled PR freezes the catalog until someone gets to it. 2. Concurrent skill PRs gate against the stale catalog and may pass gates they'd fail against the latest CLI surface. Switch to PAT-based PR creation and arm auto-merge: - `GH_TOKEN: secrets.GH_PAT` (same PAT already used by activation-gate.yml). Required because PRs opened with the default GITHUB_TOKEN do not trigger `pull_request:` workflows — the verb gate and smoke tests would never run, and `--auto` would merge before any drift signal arrived. - `gh pr merge --auto --squash --delete-branch` — waits for all required status checks, then squashes and deletes the branch. If a check fails (real CLI drift breaking skill docs or task YAMLs), the PR stays open with the gate annotations attached, surfacing the affected references for a human sweep. Body text updated to explain the auto-merge contract: green = no drift, no review needed; red = real signal worth investigating. Repo settings prerequisite: 'Allow auto-merge' must be enabled (Settings → General → Pull Requests). If branch protection requires review approval, the bypass list must include whoever owns GH_PAT or the github-actions bot — otherwise the PR will sit waiting for a human approver even after checks pass. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * refactor(refresh): scope auto-merge to refresh PRs only, not repo-wide Previous commit used `gh pr merge --auto` which depends on the repo's 'Allow auto-merge' setting — a repo-wide capability that any human or workflow could opt into for any PR. That's a convention, not a hard restriction. Replace with a dedicated `automerge-catalog-refresh.yml` workflow that: - Triggers on `check_suite: completed` (fires when any CI suite finishes). - Lists open PRs filtered by branch pattern `auto/refresh-uip-catalog-*` AND label `automated` — defense-in-depth re-verifies the branch pattern per-PR before merging. - Checks the full statusCheckRollup: skips if anything is still running, skips if anything failed, merges with `--squash --delete-branch` when every check is SUCCESS/SKIPPED/NEUTRAL. - Accepts `workflow_dispatch` with optional `pr_number` for emergency manual triggers. The repo-wide 'Allow auto-merge' setting can stay off. Auto-merge is now enforced in code by the branch-name filter, scoped strictly to the catalog refresh PR class. refresh-uip-catalog.yml drops the inline `gh pr merge --auto` call and updates the PR body to reference the dedicated automerger workflow. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * chore(catalog): refresh uip catalog to 1.2.0 Regenerated against uip 1.2.0 (was 1.0). Clears most of the apparent "doc drift" the verb checker had been flagging — top offenders like `agent migrate` (71 hits), `solution resource list` (57), `solution init` (38), `api-workflow registry stub` (17), and `agent guardrails list` (16) were catalog drift, not real stale references. New top-level groups now walkable: agenthub, tm, tools, traces, update, user, vss. `codedagent` is no longer wholesale unwalkable — broken into per-subcommand unwalkable entries so the checker walks the ones the runner exposes. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * feat(audit): register 1.2.0 verb renames + fix latent classifier bugs Adds the two retired-verb entries that 1.2.0 introduced: - `flow` → `maestro flow` (100 leaf verbs moved under the `maestro` group) - `solution new` → `solution init` Wiring these surfaced two latent bugs in the cli-verb classifier that the empty rename table had been hiding: 1. `load_renames` kept markdown backticks in the dict keys, so entries like `| `solution new` |` produced `'`solution new`'` keys that no extracted verb could ever match. Strip backticks in the loader. 2. `classify` preferred any catalog longest-prefix over a more-specific renames entry, so `solution new` (retired) was getting shadowed by the still-walkable parent group `solution` and mis-classified as reachable. When the renames match is more specific than the catalog prefix, prefer the renames verdict. Both bugs are pinned with regression tests. After the fix, two task YAMLs that pattern-match `uip\s+solution\s+new` correctly surface as Medium with the canonical replacement suggested. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * feat(audit): honor uip-check-skip + track cli/main via @alpha catalog Three reviewer items folded into the audit pipeline before merge: 1. `<!-- uip-check-skip -->` opt-out in check-skill-verbs.py. The maestro skills already ship `.maintenance/check-uip-commands.sh` that supports a per-line skip marker for intentional historical references — CLI version-comparison tables documenting removed prefixes, fallback-prefix sentences. Without honoring the marker here, the new gate hard-fails on lines that explicitly opted out (concrete usability regression flagged in review). Drops hard-fail findings from 35 → 25 across the 9 affected skills; pinned with regression test `test_skip_marker_suppresses_line`. 2. Refresh workflow tracks @alpha from GitHub Packages, not @latest from public npm. Public npm carries the cut-release `latest` line which lags `cli/main` by ~2 weeks; auditing against it would mean the gate audits skill docs against a CLI surface two weeks behind what developers actually run. Matches the install pattern already established in smoke-skills.yml. 3. Self-heal `automated` label in the refresh workflow. The label is the join key the auto-merger uses to identify refresh PRs, and it doesn't currently exist in the repo. Creating it idempotently with `gh label create --force` keeps the workflow self-contained — no one-time repo setup required after a fresh fork. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>uipreliga · a396797d · 2026-05-26
- 1.0ETVMove uip solution comands to uipath-solution skill (#821) * refact(skills): move task-list ownership from solution-design to planner Solution-design now produces architecture only — SDDs end with a Next Steps pointer at uipath-planner. The planner reads SDDs via the new ## Planner Handoff header, derives tasks per the project list, and emits live TaskCreate calls. Single source of truth for skill-routing prompts; clearer separation between architecture (solution-design) and orchestration (planner). Cross-skill contract: - ## Planner Handoff heading is the load-bearing detection marker - 6-field header (Execution autonomy, SDD scope, Project list section, Tasks file, Generated by, Generation date) - Pipeline: PDD → solution-design (SDD) → planner (tasks.md) → execution Solution-design changes: - Removed Implementation Plan section from all 6 SDD templates - Added ## Planner Handoff header + ## Next Steps to all 6 templates - SKILL.md: added When to Use, fleshed out Workflow, dropped rules 8/11, added planner redirect to description, listed package-selection-guide - sdd-generation-guide.md: collapsed Phase 1 Steps 4/4.25/4.3/4.5 into one orchestrator step linking to canonical level homes; deleted Phase 3 Steps 3 and 4 (no more TaskCreate / execute-implementation flows); rewrote Phase 3 Step 2 to write the Planner Handoff header - product-selection-guide.md: explicit canonical home for Levels 1, 1.75, 2.5 Part B, 3; clarified RPA-specific levels live in rpa-product-guide - rpa-product-guide.md: explicit canonical home for Levels 1.5, 2, 2.5 Part A and naming/REFramework guidance Planner changes: - SKILL.md slimmed from 385 to 163 lines; restructured around two lanes (PDD-driven, non-PDD) plus an Entry Guard - Description rewritten with PDD redirect; TaskCreate/TaskUpdate/TaskList added to allowed-tools - 4 new references extracted: pdd-driven-lane-guide.md, non-pdd-lane-guide.md, multi-skill-patterns-guide.md, plan-and-tasks-format.md - Question budget reframed to count AskUserQuestion calls (not individual questions); cap stays at 5 - Dropped Stop conditions section and test coverage question — testing is always thorough, specialists handle their own pause points - New regenerate-with-preservation logic: identity tuple matching preserves completed work across SDD revisions; archive footer for removed tasks Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * update tests * updates * resolve claude comments * add test * resolve comments * refactor * feat(skills): merge uipath-solution-design + uip solution ops into uipath-solution Merge the PDD->SDD authoring half of uipath-solution-design with the `uip solution` CLI lifecycle slice of uipath-platform into a single bifurcated skill at skills/uipath-solution/. Design half keeps the 15 critical rules and 3-phase workflow; Operate half lifts solution CLI guidance into 9 explicit rules plus the pre/post-rename probe. uipath-platform retains auth, Orchestrator, resources, IS, traces, and licensing; its description and Task Navigation drop solution tokens and redirect to uipath-solution. Retarget consumers (uipath-planner SKILL + 4 refs, uipath-rpa, uipath-review, uipath-maestro-case, uipath-maestro-flow). Rename activation dataset and gate-script baseline per R1b (omit, rebaseline after next full run). Bump plugin to 0.0.29. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * iteration 2 * resolve issues * add tests * resolve comment * do not update versions * solve tests --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>RaduAna-Maria · feca7721 · 2026-05-19
- 1.0ETVtest(uipath-agents): add 10 coded-agent tests for high-priority coverage gaps (#633) Closes the highest-priority gaps in the coded test-coverage report with 10 new e2e/integration tests. Each test has a user-facing prompt (the agent must consult the skill to figure out the fix) and either a check script asserting artifact shape or direct command_executed / file_contains criteria. - local_workspace_iterate — Studio Web Local Workspace iteration: enforces 4 of 5 Local-Workspace anti-patterns (no scaffold-new, no manual push, preserve project.uiproj, preserve UIPATH_PROJECT_ID) - push_pull_roundtrip — uip codedagent push + pull roundtrip against an existing Studio Web project - hitl_wait_task — interrupt(WaitTask) HITL pattern - hitl_create_task_with_app — interrupt(CreateTask) + Action Center app binding - coded_in_flow_published — Flow Integration Pattern 2: a published coded agent referenced from a separate Maestro Flow - antipattern_openai_agents_hitl — OpenAI Agents framework boundary: interrupt() does not work, skill must remove it - deploy_folder_and_rebump — uip codedagent deploy --folder plus patch-version bump on re-deploy - auth_one_shot_login — uip login one-shot form with both --organization and --tenant (Critical Rule 2) - existing_project_resume — existing-coded state with has_venv == false / has_entry_points == false; skill must prep venv + regenerate schema in place - llamaindex_rag — LlamaIndex Workflow + UiPath Context Grounding (ContextGroundingQueryEngine) for RAGRadu Mihai Gheorghe · 14316f47 · 2026-05-18
- 0.9ETVci: make the Tier 1 / Tier 2 required-check set enablable (#3100) * ci: make the Tier 1 / Tier 2 required-check set enablable Prerequisites from the 2026-09-03 PR CI audit. No ruleset change here — the new contexts must report on a real PR before they can be required, or every open PR blocks on a pending check that never arrives. Drop the `paths:` filters that make a check unrequirable. When a filter excludes a PR the workflow never runs, no check is reported, and a required context stays pending forever. Removed from test-helpers.yml, validate-skills.yml, validate-skill-status.yml and validate-skill-flavors.yml, each carrying the rationale already used in validate-version-sync.yml and validate-skills-sh.yml. The jobs are all sub-60s; the ones that can short- circuit do so inside the job, where a skip counts as a pass. Add fixed-name aggregators to the two matrix gates. `activation-gate.yml` and `verb-gate.yml` name their gate job `${{ matrix.skill }}` — 61 distinct check names in one quarter, so no literal context can ever match. `Skill activation gate` and `CLI verb gate` roll up detect + every leg under `if: always()`. That brings ~13,000 runs/quarter of existing coverage under enforcement at no added CI cost. Resolve both check-name collisions. Two jobs sharing a context make it ambiguous which run satisfied it: verb-gate's detect job is now `Detect changed skills (CLI verb gate)`, and publish.yml's push-event guard is `Validate version sync (publish guard)` — the latter could otherwise land a same-named check on the merge commit for the already-required PR check. Keep the two detect jobs required, against the audit's recommendation. Both smoke workflows gate on `needs: detect` + `if: ...skip != 'true'`, so a detect FAILURE skips the gated job — and GitHub counts a skipped job as a pass. The repo's most expensive gate would report green having run nothing. Documented as Rule 3 and pinned by a test. docs/REQUIRED-CHECKS.md is the target set; scripts/apply-required-checks.sh parses it and PUTs the ruleset, warning about any context not seen on recent PR heads. `required-check contract guard` (test-helpers.yml) fails if a required job is renamed, regains a `paths:` filter, collides on a name, or depends on an uncovered job — the drift is otherwise invisible, since the ruleset lives in the GitHub API and nothing in the build reads the doc. Validated: actionlint and shellcheck clean on every changed file (only the pre-existing custom-runner-label warnings remain); 169 tests pass under tests/scripts/; both failure modes confirmed by negative control. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MwcGSztKjzjPbGhNCSAQQ2 * ci: close the gaps a multi-axis review found in the required-check work Three HIGH findings, all real and reproduced locally, plus five smaller ones. Give the doc table exactly ONE parser. It had two — awk in apply-required-checks.sh, a regex in the contract guard — with different tolerances. A row the script accepted but the guard dropped would be PUT to the ruleset having never been checked against the workflows; a row with an annotation in the first cell would be applied as a mangled context GitHub waits for forever, which is the "blocks every open PR" failure this whole change exists to prevent. scripts/parse-required-checks.py is now the only parser: the script shells out to it, the test imports it, and it errors on a row it cannot read instead of dropping it. Make the Rule 3 guard actually check the rollup. It short-circuited on the mere substring `always()` in a job's `if:`, so gutting a gate-summary to `run: echo ok` kept 61 tests green while the required context reported success regardless of what any leg did — the exact failure the rule describes. It now asserts the job reads each `needs.<job>.result`. Stop swallowing real failures inside two newly-required checks. verb-gate's `|| true` was only ever masking a crash (the checker returns 0 unconditionally in --json mode), and validate-skills.yml's single `|| true` over a `git diff | grep` pipeline masked a failed `git diff` as "nothing to validate". Both reported green having validated nothing; both now fail loud, demonstrated locally. Also: widen the trigger guard past `paths:` to `paths-ignore:`, `branches:`, `branches-ignore:` and a `types:` list missing `synchronize` — each starves a required context identically; reject an unexpanded `${{ }}` context, Rule 1's second documented cause, which nothing checked; replace the `>= 15` row floor with an exact count, since it let a partial parse silently drop 8 of 23 rows and shrink every parametrized suite; add `per_page=100` to the doc's pre-apply command, which already truncates at 30 on 3 of 5 open PR heads today; allow-list the two good job results in both aggregators instead of deny-listing the two bad ones, so an unrecognized value fails closed; pin validate-skill-flavors.yml's three actions to the SHAs its siblings use, now that it runs on every PR; and fix `read -r reply` aborting under `set -e` on non-tty stdin, plus a `--help` that was a hardcoded line range into its own header. Validated: 217 tests pass; actionlint and shellcheck clean on all new code; parser and guard emit byte-identical 23-context lists. Five negative controls confirm the new assertions fire — gutted aggregator, paths-ignore, dropped synchronize, half-backticked row (fails the test AND blocks the apply script), and an unexpanded expression context. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MwcGSztKjzjPbGhNCSAQQ2 * docs(claude): register REQUIRED-CHECKS.md as a same-PR registry CLAUDE.md is loaded into every agent session here; CONTRIBUTING.md is not. The same-PR rule for the required-check set was only in CONTRIBUTING.md, so an agent renaming a workflow job would never see it — and renaming a job that produces a required context blocks EVERY open PR, not just its own. Follows the pattern rule 5 already sets for assets/skill-status.json and skills.sh.json: a registry not discovered from disk gets a numbered rule with its verification commands plus a File Conventions row. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MwcGSztKjzjPbGhNCSAQQ2 * ci: guard the required aggregators with !cancelled(), not always() `always()` runs a job during run cancellation too. Both gate workflows set `cancel-in-progress: true`, and activation-gate.yml also triggers on `ready_for_review` — so taking a PR out of draft starts a second run that cancels the first on the SAME head SHA. The cancelled run's aggregator still executed, read `needs.detect.result == "cancelled"`, and reported the required context FAILED. This PR's own head carried a red `Skill activation gate` beside a green one on 1056e6c56 (runs 34055252280 and 34055306035). Nothing blocked, because the good run happened to finish last — by ~70s. Once the context is required that ordering decides whether merge is blocked. `${{ !cancelled() }}` skips the aggregator when the run is cancelled: a skipped job counts as a pass and the newer run on that SHA reports the real answer. It still runs and fails when a needed job fails, and when a leg hits timeout-minutes (a timed-out job does not cancel the run, so the result arrives as `cancelled` and the explicit check fires). The trade, documented in Rule 3: manually cancelling a run now leaves the aggregator skipped rather than failed, so write access can skip these two gates. Accepted — both are quality gates behind CODEOWNERS approval, and the alternative blocks merge at random on superseded runs. test_required_job_needs_are_covered now rejects `always()` outright instead of accepting it, and keeps demanding that the rollup actually read each `needs.<job>.result`. Both negative controls verified: reverting to `always()` fails the guard, and gutting the rollup to `echo` fails it too. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MwcGSztKjzjPbGhNCSAQQ2 * ci: catch a required job that never reaches the target-set table Rebasing this branch onto main dropped `maestro-bpmn checker unit tests` from docs/REQUIRED-CHECKS.md: the job came from main, the table row was added in the merge commit, and rebase discards merge commits. 24 contexts became 23 and all 87 tests still passed — every existing test reads the doc and checks it against the workflows, so a job missing from the table is invisible by construction. Add the reverse direction for test-helpers.yml, the one workflow where the rule is unconditional: it holds cheap, deterministic, always-run guards, so a job here that is not required has no legitimate reason to exist. Advisory or nondeterministic checks belong elsewhere (Rule 4), which is why this is not generalised to every workflow. Restores the dropped row. Negative control: deleting it again fails the new test with the job name. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MwcGSztKjzjPbGhNCSAQQ2 * ci: stop ready_for_review from cancelling a run on its own head SHA The previous commit claimed `!cancelled()` made a superseded run's aggregator report `skipped`, which counts as a pass. Measured, it does not: dispatching activation-gate.yml and cancelling it mid-flight reported cancelled Skill activation gate (run 34067126301). A job skipped by `if:` during RUN cancellation is reported `cancelled`, and `cancelled` is non-passing exactly like `failure`. So `!cancelled()` alone left the race it was meant to remove, and the trade-off noted in Rule 3 — that manual cancellation becomes a merge bypass — does not exist either. Both claims are corrected here. The real cause is two runs on one SHA. activation-gate.yml triggers on `ready_for_review`, the only event that fires on a commit a run is already in flight for, while `cancel-in-progress: true` cancelled that in-flight run. GitHub keeps the latest check run per context name, so merge turned on which of the two recorded its result last. Fix it where it happens: cancel-in-progress: ${{ github.event.action != 'ready_for_review' }} Every other event arrives with a new SHA, where cancelling is free — the superseded run's red lands on a commit nobody is merging. verb-gate.yml has no `ready_for_review` trigger and needs no change. `!cancelled()` stays on both aggregators for what it actually does: resolves the aggregator the instant a run is cancelled instead of after a runner acquisition, and keeps a bogus "could not determine which skills to gate" error out of a superseded run's log. Cost: one extra activation-gate run per draft flip. It is cheap — `gate` skips on drafts, so the run that is no longer cancelled is a detect plus a skipped matrix. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MwcGSztKjzjPbGhNCSAQQ2 * ci: close the same-SHA cancel hazard and the ruleset-clobber risk Review found the Rule 3a fix was half right. `ready_for_review` is not the only event that fires on a commit a run is already in flight for: `reopened` does too (closing a PR does not cancel its runs), and it is a default `pull_request` type — so the hazard was live on five more required workflows still carrying `cancel-in-progress: true`. Replace the deny-list with an allow-list on every required workflow: `cancel-in-progress: ${{ github.event.action == 'synchronize' }}`. Only `synchronize` moves the head SHA, so it is the only event where a superseded run's red lands on a commit nobody is merging. A new contract guard, `test_concurrency_only_cancels_on_a_new_head_sha`, enforces it. apply-required-checks.sh sent a literal body carrying only `conditions` and `rules`. Live state also carries `enforcement` and two `bypass_actors` (OrganizationAdmin, RepositoryRole 5), plus `required_reviewers` and `dismissal_restriction` the literal `pull_request` block dropped. GitHub's behaviour for omitted fields on PUT rulesets is undocumented; if omitted means cleared, the first run drops admin bypass on `main`. Build the body from the live ruleset and author only the status-check list. Also in the script: fail closed when the open-PR list or a check-run read fails (an auth error was indistinguishable from "no open PRs", which skipped the one safety check), move the count line to stderr so `--dry-run` stdout is pipeable JSON, and add `--check` — the doc-to-ruleset direction nothing else covers. Contract guard holes, each with a negative control: - `if n` dropped jobs with no `name:`, whose context is the job id — the exact direction the reverse guard was written to close - `"cancelled()" in condition` also accepted the inverse `${{ cancelled() }}`, an aggregator that skips every normal run and reports a pass - counting an `env:` mapping as consumption accepted a rollup whose `run:` is `echo ok` - `glob("*.yml")` missed a colliding job in a `.yaml` workflow - no invariant kept `ready_for_review` on activation-gate.yml, without which a PR opened as a draft is never re-gated - the uncovered-needs message recommended `always()`, which the same test rejects Cut the four-way duplication of the `!cancelled()` rationale to one canonical copy in the doc plus a pointer from each aggregator, correct the doc's "`always()` aggregator" wording, and record the accepted cost of validate-skill-flavors.yml running on GitHub-hosted minutes. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>uipreliga · c7837b29 · 2026-09-08
- 0.8ETVfix(uipath-review): reduce review verbosity and fix grade formula (#2471)Andrei Ancuța · c27677a8 · 2026-08-18
- 0.8ETVrefact(skills): move task-list ownership from solution-design to planner (#538) * refact(skills): move task-list ownership from solution-design to planner Solution-design now produces architecture only — SDDs end with a Next Steps pointer at uipath-planner. The planner reads SDDs via the new ## Planner Handoff header, derives tasks per the project list, and emits live TaskCreate calls. Single source of truth for skill-routing prompts; clearer separation between architecture (solution-design) and orchestration (planner). Cross-skill contract: - ## Planner Handoff heading is the load-bearing detection marker - 6-field header (Execution autonomy, SDD scope, Project list section, Tasks file, Generated by, Generation date) - Pipeline: PDD → solution-design (SDD) → planner (tasks.md) → execution Solution-design changes: - Removed Implementation Plan section from all 6 SDD templates - Added ## Planner Handoff header + ## Next Steps to all 6 templates - SKILL.md: added When to Use, fleshed out Workflow, dropped rules 8/11, added planner redirect to description, listed package-selection-guide - sdd-generation-guide.md: collapsed Phase 1 Steps 4/4.25/4.3/4.5 into one orchestrator step linking to canonical level homes; deleted Phase 3 Steps 3 and 4 (no more TaskCreate / execute-implementation flows); rewrote Phase 3 Step 2 to write the Planner Handoff header - product-selection-guide.md: explicit canonical home for Levels 1, 1.75, 2.5 Part B, 3; clarified RPA-specific levels live in rpa-product-guide - rpa-product-guide.md: explicit canonical home for Levels 1.5, 2, 2.5 Part A and naming/REFramework guidance Planner changes: - SKILL.md slimmed from 385 to 163 lines; restructured around two lanes (PDD-driven, non-PDD) plus an Entry Guard - Description rewritten with PDD redirect; TaskCreate/TaskUpdate/TaskList added to allowed-tools - 4 new references extracted: pdd-driven-lane-guide.md, non-pdd-lane-guide.md, multi-skill-patterns-guide.md, plan-and-tasks-format.md - Question budget reframed to count AskUserQuestion calls (not individual questions); cap stays at 5 - Dropped Stop conditions section and test coverage question — testing is always thorough, specialists handle their own pause points - New regenerate-with-preservation logic: identity tuple matching preserves completed work across SDD revisions; archive footer for removed tasks Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * update tests * updates * resolve claude comments * add test * resolve comments * refactor --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>RaduAna-Maria · 0b6d67ef · 2026-05-15
- 0.7ETVRPA: Merge coded-workflows + rpa-workflows into unified uipath-rpa skill (#160)Gabriela Vaduva · 833f595e · 2026-04-07