Feat/tm playwright first mile - #2322
Conversation
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 59ee1b964f
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Test coverage + passing-run claimsTwo coder_eval tasks added per
Tenant prerequisites for the e2e task are documented in the task header and in |
|
Claude finished @addyGarg's task in 4m 4s —— View job Coder-eval task lint (advisory)2 task YAMLs changed; verdict counts: 0 Critical, 0 High, 2 Medium, 0 Low, 0 OK. Rubric: .claude/commands/lint-task.md. This check is advisory and never blocks merge. Evidence of passing run
✅ Accepted — claims are present in the PR thread. Consider moving them into the PR body for discoverability. Per-task lint
|
| Task | Criterion (line) | Verb | Catalog status |
|---|---|---|---|
playwright_pack_generate.yaml |
command_executed (L29) |
tm pack |
Not in catalog |
playwright_first_mile_e2e.yaml |
command_executed (L42) |
tm pack |
Not in catalog |
playwright_first_mile_e2e.yaml |
command_executed (L75) |
tm testsets playwright-context |
Not in catalog |
Both task headers explicitly document this dependency (pack_generate L1–3, e2e L5–8) and are appropriately tiered (integration / e2e, not smoke) so they won't run on the PR-gate @latest runner. The per-task verdict is downgraded from High → Medium because the gap is deliberate and documented. Once cli#3226 publishes, the catalog will include these verbs and this finding will auto-resolve.
Conclusion
|
Claude finished @addyGarg's task in 3m 14s —— View job PR Review: Playwright First Mile
SummaryAdds Playwright first-mile support to the Change-by-Change Review1.
|
| Area | Status | Notes |
|---|---|---|
| Frontmatter | OK | Description updated correctly, 271 chars, valid → redirects |
| E2E Tests | Issue | expected_turns > max_turns in e2e task (Medium); no smoke tier yet (acknowledged) |
| Skill Body | OK | SKILL.md changes well-scoped, new commands + anti-patterns correct |
| References & Assets | OK | Guide is thorough, one minor missing code fence language tag (Low) |
| Repo Hygiene | OK | CODEOWNERS already covers both paths, no secrets, no cross-skill refs |
Issues for Manual Review
- CLI command accuracy: The hidden commands (
playwright-context,--playwright-projects) and the new--labelsflag ontestcases addare not verifiable from this review — they depend on an unreleased CLI (UiPath/cli#3226). The guide and SKILL.md document them consistently, but correctness depends on that CLI PR. - E2e task's
run_commandcriterion (line 98):grep -qE '"Status": "(Finished|Passed)"'matches any execution in the PWE2E project, not necessarily the one the agent just created. If the project has prior executions in terminal state, this criterion passes vacuously. Consider scoping to the latest execution or a specific execution ID.
Conclusion
Solid PR — the guide is one of the most thorough reference docs in this repo, with excellent failure-mode triage and agent-friendly waiting guidance. Two actionable items: fix the expected_turns/max_turns mismatch (Medium) and optionally add a language tag to the pipeline overview code block (Low). The missing smoke tier is a known, tracked gap. Recommend merging after the run_limits fix.
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b5f23e80d9
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Review round applied — PR is now release-safeThanks @ganeshborle — all 19 comments addressed, replied inline, resolved. Two decisions worth surfacing: 1. Nothing Playwright is advertised in SKILL.md any more. I verified the published The reference guide now opens with an availability gate: probe the CLI, stop and tell the user if the capability is absent, and if the optional project-scoping commands are missing, run the test set without scoping rather than retrying. So no path instructs an agent to call something 2. The e2e task is withdrawn; one smoke task added. Honest answer to "did we run and test it?" — it cannot pass yet (needs the unpublished CLI plus an e2e tenant with serverless Playwright), and a scheduled always-failing task is just noise. Action items (tracked, not in this PR)
|
Split: held tests moved outPer the review direction, this PR now contains only what is safe to ship today, and the tests that need the unreleased CLI live in their own branch to merge later. Stays here — the skill content (lean: no command rows, no hidden-command guidance, availability-gated guide) plus one smoke task that passes on the currently published CLI (suite prep + capability check + the never- Moved out — the integration and e2e tasks, on branch Also folded the three failure-triage sections in the guide into one — same guidance, a third of the words. |
Decision on the two open items1. The command surface stays in The distinction that settles it: the only person who can be inconvenienced is someone who manually tries the Playwright flow on an older CLI, and for them the guide's availability check says stop and report — a one-off, graceful outcome. A test in CI, by contrast, breaks continuously for everyone. So the commands are documented; the tests are held (see below). What I kept from your review: no command names in the description or in Concepts, no generic flags ( 2. Integration and e2e tasks are split into their own PR — branch Two things worth your eyes before merge
|
Related PRs#2401 — integration + e2e eval tasks. Deliberately split out of this PR: those tasks drive the full pipeline, so they cannot pass until the external-package commands reach npm UiPath/cli#3336 — register Ordering, for anyone picking this up: this PR can merge independently (nothing in it requires an unreleased command to function — the guide gates on availability). #3336 should land in the same 1.200 line as cli#3226. #2401 merges last, once Validation statusThe flow this skill describes is verified end to end on the alpha |
|
Maybe add a PR description. |
|
Please rebase the changes. |
Teach agents the full Playwright flow on serverless via uip alone: pack --type playwright, upload, automatic ingestion (PW_* labels, no link step), label-based test-set fill, the hidden playwright-context probe as the RPA-vs-Playwright discriminator, and per-project runs with --playwright-projects. New references/playwright-first-mile-guide plus SKILL.md command rows, concept, navigation entry, and anti-patterns (never link-automation Playwright test cases; hidden commands are absent from --help by design). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr
A context-free agent ran the whole Playwright pipeline from the skill alone and filed defects; all fixed: the ingestion poll no longer uses --filter <PackageName> (names are "<suite> > <title>" — the filter never matches and reads as a false "flag off"); TestCount semantics (per test, not per project); IsAutomated:false is normal on ingested test cases; playwright-context fields are comma-joined strings, not arrays; run --wait prints the execution id in an early log line (30-min default timeout, 60s polls); new stuck-in-Pending triage (JobKeys in testcaselogs prove dispatch; then it's a missing serverless runtime — stop, don't retry); PW_Path_* label documented; Critical Rule 3 notes progress lines precede the JSON envelope. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr
Second context-free agent run (patched guide) was flawless through dispatch; remaining gaps were all post-dispatch and are now covered: the Pending triage checks the Orchestrator jobs themselves (uip or jobs list --folder-key; Faulted + empty HostMachineName = missing serverless runtime), warns that faulted jobs may never sync back (TM stays Pending — don't sit out the 30-min wait), and states there is no CLI cancel verb for a TM execution. Also: labels select tests while --playwright-projects selects browsers (the one guess the agent had to make), and the label spot-check wording no longer overpromises. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr
Third context-free run reached Finished/2-passed on serverless; the guide now prevents its two traps: the default folder moves ahead of the playwright-context probe with an explicit false-negative warning (no default folder => a real Playwright set reports IsPlaywright false, and a literal reader would then run every browser), and report get documents its required --project-key/--test-set-key. Also: whole-suite-on-one-browser labeling recipe and a quoting note for label names with spaces. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr
A silent multi-minute --wait tripped an agent-harness watchdog twice in the clean-slate cold run; the guide now tells agents to start the run without --wait and poll with bounded 'uip tm wait --timeout' / get-stats calls instead. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr
The npm-installed clean-slate run (real uip, no harness crutches) surfaced the results-lost failure mode and several trap-shaped doc errors, all fixed: new Finished-with-None triage (pod ran, upload leg broke; report get shows the lost results as Skipped; retrying keeps faulting — cap and report), the execution id comes from the "Execution started:" line not the test-set line, a wait --timeout expiry returns a misleading RetryWillNotFix envelope (means "still running"), the telemetry-flush slow-exit quirk, and a carve-out so autonomous tasks that authorize project creation don't stall on "ask the user". Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr
First pure-user run on a real cloud tenant got the whole first mile through and exposed the last environment-shaped gaps: folder choice must come from the unflagged folders list (--all includes folders the user cannot use -> folderNotFoundOrNoAccess), the default folder needs a Cloud Robots - Serverless machine (create/assign documented; missing machine = instantly-Cancelled execution, a state the guide never covered), login refresh is the non-interactive fix for the Logged-in-but-401 session, None-result causes broadened beyond storage/network (identity faults land there too; HostMachineName is not a reliable discriminator), and auto-updater output joins the pre-envelope noise note. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr
Two tasks per the test-writing rules: - playwright_pack_generate (integration, mode:build, lifecycle:generate) - offline pack: scaffold -> tm pack --type playwright --no-create-test-cases -> nupkg with embedded testCases.json; criteria simulated green against the PR-built CLI. Tiered integration (not smoke) on purpose: the PR-gate runner installs @uipath/cli@latest, which lacks these commands until UiPath/cli#3226 publishes — retag to smoke then. - playwright_first_mile_e2e (e2e, mode:operate, lifecycle:setup, path-to-ga) — the full pipeline to executed results on a capable tenant; equivalent flow proven live by five cold-agent runs (local full-serverless: 2/2 passed; alpha DevTest: first mile green, execution blocked by a tenant identity fault). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr
Gate fixes: run_command criteria graded via expected_exit_code (the schema has no expected_output_pattern field — grep -q now carries the assertion), and the path-to-ga tag is deferred until an allowlisted approver signs off (the gate requires one; the intent stays recorded in the task header and PR notes). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr
The approval gate greps every added line for the literal tag phrase, including prose comments; reworded so the deferred-tag note no longer trips it. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr
machines assign takes machine KEYS not names (verified against the CLI); ingestion poll now baselines the pre-upload count so pre-existing test cases can't fake completion; multi-package projects get explicit label-scoping guidance (labels aren't package-qualified); the e2e task's criteria tightened — filter detection is argument-order independent, the chromium criterion rejects extra projects, and the terminal-state check inspects only the newest execution. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr
Review round with @ganeshborle: - SKILL.md carries no command names in the description/concepts, no rows for commands that are absent from the published CLI, and no "hidden from --help" guidance; the generic notes I had added (JSON envelope, CLI quirks, autonomy carve-out) are reverted and Rules 3/7 restored/rephrased. What remains: the Playwright concept, the navigation entry, the --labels selector (mutually exclusive wording), the verified report get project-key requirement (--query dropped as a generic option), and the never-link-automation guard. - the reference guide opens with an availability gate: probe the CLI, stop if the capability is absent, and run without project scoping if the optional commands are missing — no instructions to call something that help does not list. - tests: the e2e task is withdrawn (it cannot pass until the CLI publishes and an e2e tenant has serverless Playwright, so it would only add scheduled noise); one smoke task replaces both, grading the preparation work and the capability check, which hold before and after the CLI ships. Sandbox-local, nothing to clean up. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr
Same guidance, a third of the words: the Cancelled / None-results / stuck-Pending sections shared the same two diagnostic commands and the same "stop, don't retry" conclusion, so they are now one section with three shapes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr
The alternation was dead code — the second branch matched every pack invocation including --help, so the first branch never contributed. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr
Restores the command rows for the paired 1.200 line: the pack command section, the playwright-context probe, and the --playwright-projects note on the run row. Kept from the review round: no command names in the description or Concepts, no generic flags on command rows, and no "hidden from --help" guidance — the callout states the Test Manager and CLI requirement plainly and points at the guide's availability check, so an agent on an older CLI is told to stop rather than to try anyway. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr
… task The task failed on CI at 0.88 for one reason: it asserted playwright.config.ts by exact name, and the agent wrote a valid config with a different extension. Every other criterion passed. The check now matches playwright.config.* so it grades the requirement (a config is present) instead of a formatting choice. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr
A fresh cold run took a suite with a failing test through to 2/2 green on a real tenant, and the gaps were all in the second half: - "Iterating on the suite" now covers getting a fix back in — bump the version, re-upload, and note that membership and the stored project selection survive so the same test set re-runs unchanged. It also states the weak spot plainly: nothing observably confirms an update landed (list-automations reports a two-component PackageVersion), so wait, re-run, and treat a verbatim repeat of the old failure as a stale package rather than a bad fix. - Prefer starting a run without --wait: it returns a full JSON envelope with ExecutionId immediately (the previous text claimed otherwise). - A zero Duration on an already-finished execution is normal. - Prerequisites carry the exact project-create command, and note that login status' ExpirationDate can read stale while calls succeed. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr
Self-review before requesting review: - the "two tests written" check counted per file, so a valid two-file suite failed it — the same brittleness class as the config-extension bug CI caught. It now counts occurrences across the tests directory. - the add row showed the comma form for --test-case-keys; both selectors are variadic (commas still accepted), so it says that. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr
…t check - add/pack rows carry real syntax: key and label examples, and the NuGet/SemVer version rule (three numeric parts, optional prerelease; 1.0 is rejected — verified against the CLI). - upload step says how to pick a free version: `or packages list --search <name>` exposes Version and IsLatestVersion. - ingestion check is deterministic instead of a count heuristic: match the test case names against the tests the pack step reported. The baseline-count and "wait for it to grow" wording is gone — it was vague and multiple pre-existing test cases could satisfy it. - dropped the CLI-recency prerequisite (CLI and skills release in lockstep, so it would go stale) and the login/auth bullets that duplicated SKILL.md's rules. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr
…verifies updates From a cold run against a fresh tenant folder, which reached 2/2 green only after fixing two things the guide did not mention: - Step 4 now states the folder needs BOTH a serverless machine and a member who can run unattended. A machine alone leaves the job Pending forever; testsets run has no flag to pick the user, so folder membership is the only lever, and `users update --allow-unattended` is a dead end (it wants Windows credentials serverless never uses). - new triage shape: CannotIssueUserTokenDueToUserNotPartOfOrg means the folder's robot-user pool is stale — unlike the other shapes this is CLI-fixable by moving to a folder that satisfies Step 4. - corrects a wrong claim: an update IS verifiable — the test case logs carry TestCaseVersion (confirmed 1.0.1 after a bump), so the guide no longer says re-runs happen on faith. - notes that fixing a folder does not rescue an already-pending run, and that --playwright-projects is absent from run --help. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr
Main documented that tm testcases list --filter matches name or key by prefix; the guide now gives that as the reason a package-name filter never matches an ingested test case (named "<suite> > <title>"), instead of my vaguer "the package name is only in the description". Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr
3adb4ef to
ed7e6f0
Compare
ganeshborle
left a comment
There was a problem hiding this comment.
Looks good to me :)
There are some minor comments, if you can take care!
…rm skill Review round (approved, remaining comments): - the hidden-command note now explains the two cases separately: a missing probe costs the pre-check only (skip Step 5, scoping still works), a rejected --playwright-projects means the build cannot scope a run. Validated both against a stable CLI. - folder/machine/robot-user setup and job-side troubleshooting now point at /uipath:uipath-platform's orchestrator references, so that detail tracks the owning skill instead of drifting here. - the playwright-context field list says to read the fields off the JSON response rather than depend on the list staying current. - the add row carries fuller placeholders as suggested, but keeps the space-separated form: keys accept the comma variant, labels do NOT — `--labels A,B` is read as one label and matches nothing (verified live: "No test cases carry any of the labels: A,B", while the same two space-separated succeed). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr
Final cold run reached 2/2 green with no wrong turns, and its findings are folded in: - Step 7 gains the missing verification: get-stats returns a PlaywrightExecutionSnapshot whose Projects is the list the run actually used. Counting logs cannot prove it — there is one log per test, not per test x project — so a task asking for "chromium only" had no documented proof of success until now. - corrects the packages list claim: --search returns the feed's latest version only, not a version history (verified after uploading two). - the ingestion check is executable as written: a plain pack prints only TestCount, so match count plus name shape, or --dry-run first. - notes wait's fixed 60 s poll (a shorter --timeout can report a timeout for a finished run), that multi-project runs give no per-browser breakdown, and that stdout carries progress and updater lines around the JSON envelope. - the label example now uses the package-unique PW_File_* label the guide itself recommends. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr
Third cold run finished 2/2 green without deviating from the guide once;
these are the traps it still had to work out for itself:
- output-reading guidance moves up front: the JSON envelope shares the
stream with auto-updater chatter (including "Update completed with
failures.", unrelated to the command), progress lines and telemetry
warnings. Judge by the envelope's Result, extract from the first {.
- pass/fail is Result, NOT HasError — a Failed log reports
HasError: false (verified), and HasError is the field a newcomer
reaches for first.
- the snapshot pointer added last round now carries the version caveat:
its Version is two-component like list-automations and
playwright-context, so read only Projects from it; TestCaseVersion on
the logs remains the only version proof.
- JUnit export is counts-only for Playwright: the XML names cases after
the spec file, not the test title.
- ingestion polls should count TestCaseKey, not Id.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr
…2428) * feat(uipath-test): Playwright first-mile pipeline Teach agents the full Playwright flow on serverless via uip alone: pack --type playwright, upload, automatic ingestion (PW_* labels, no link step), label-based test-set fill, the hidden playwright-context probe as the RPA-vs-Playwright discriminator, and per-project runs with --playwright-projects. New references/playwright-first-mile-guide plus SKILL.md command rows, concept, navigation entry, and anti-patterns (never link-automation Playwright test cases; hidden commands are absent from --help by design). Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr * fix(uipath-test): correct the first-mile guide from a cold-agent run A context-free agent ran the whole Playwright pipeline from the skill alone and filed defects; all fixed: the ingestion poll no longer uses --filter <PackageName> (names are "<suite> > <title>" — the filter never matches and reads as a false "flag off"); TestCount semantics (per test, not per project); IsAutomated:false is normal on ingested test cases; playwright-context fields are comma-joined strings, not arrays; run --wait prints the execution id in an early log line (30-min default timeout, 60s polls); new stuck-in-Pending triage (JobKeys in testcaselogs prove dispatch; then it's a missing serverless runtime — stop, don't retry); PW_Path_* label documented; Critical Rule 3 notes progress lines precede the JSON envelope. Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr * fix(uipath-test): round-2 cold-run findings on the first-mile guide Second context-free agent run (patched guide) was flawless through dispatch; remaining gaps were all post-dispatch and are now covered: the Pending triage checks the Orchestrator jobs themselves (uip or jobs list --folder-key; Faulted + empty HostMachineName = missing serverless runtime), warns that faulted jobs may never sync back (TM stays Pending — don't sit out the 30-min wait), and states there is no CLI cancel verb for a TM execution. Also: labels select tests while --playwright-projects selects browsers (the one guess the agent had to make), and the label spot-check wording no longer overpromises. Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr * fix(uipath-test): round-3 findings from the full-serverless cold run Third context-free run reached Finished/2-passed on serverless; the guide now prevents its two traps: the default folder moves ahead of the playwright-context probe with an explicit false-negative warning (no default folder => a real Playwright set reports IsPlaywright false, and a literal reader would then run every browser), and report get documents its required --project-key/--test-set-key. Also: whole-suite-on-one-browser labeling recipe and a quoting note for label names with spaces. Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr * fix(uipath-test): bounded-poll waiting guidance for agents A silent multi-minute --wait tripped an agent-harness watchdog twice in the clean-slate cold run; the guide now tells agents to start the run without --wait and poll with bounded 'uip tm wait --timeout' / get-stats calls instead. Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr * fix(uipath-test): round-4 findings from the clean-slate cold run The npm-installed clean-slate run (real uip, no harness crutches) surfaced the results-lost failure mode and several trap-shaped doc errors, all fixed: new Finished-with-None triage (pod ran, upload leg broke; report get shows the lost results as Skipped; retrying keeps faulting — cap and report), the execution id comes from the "Execution started:" line not the test-set line, a wait --timeout expiry returns a misleading RetryWillNotFix envelope (means "still running"), the telemetry-flush slow-exit quirk, and a carve-out so autonomous tasks that authorize project creation don't stall on "ask the user". Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr * fix(uipath-test): round-5 findings from the alpha cloud cold run First pure-user run on a real cloud tenant got the whole first mile through and exposed the last environment-shaped gaps: folder choice must come from the unflagged folders list (--all includes folders the user cannot use -> folderNotFoundOrNoAccess), the default folder needs a Cloud Robots - Serverless machine (create/assign documented; missing machine = instantly-Cancelled execution, a state the guide never covered), login refresh is the non-interactive fix for the Logged-in-but-401 session, None-result causes broadened beyond storage/network (identity faults land there too; HostMachineName is not a reliable discriminator), and auto-updater output joins the pre-envelope noise note. Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr * test(uipath-test): coder_eval tasks for the Playwright first-mile Two tasks per the test-writing rules: - playwright_pack_generate (integration, mode:build, lifecycle:generate) - offline pack: scaffold -> tm pack --type playwright --no-create-test-cases -> nupkg with embedded testCases.json; criteria simulated green against the PR-built CLI. Tiered integration (not smoke) on purpose: the PR-gate runner installs @uipath/cli@latest, which lacks these commands until UiPath/cli#3226 publishes — retag to smoke then. - playwright_first_mile_e2e (e2e, mode:operate, lifecycle:setup, path-to-ga) — the full pipeline to executed results on a capable tenant; equivalent flow proven live by five cold-agent runs (local full-serverless: 2/2 passed; alpha DevTest: first mile green, execution blocked by a tenant identity fault). Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr * test(uipath-test): schema-conform the playwright tasks, defer path-to-ga Gate fixes: run_command criteria graded via expected_exit_code (the schema has no expected_output_pattern field — grep -q now carries the assertion), and the path-to-ga tag is deferred until an allowlisted approver signs off (the gate requires one; the intent stays recorded in the task header and PR notes). Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr * test(uipath-test): avoid the GA-gate trigger phrase in a comment The approval gate greps every added line for the literal tag phrase, including prose comments; reworded so the deferred-tag note no longer trips it. Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr * fix(uipath-test): address codex review (all six P2s) machines assign takes machine KEYS not names (verified against the CLI); ingestion poll now baselines the pre-upload count so pre-existing test cases can't fake completion; multi-package projects get explicit label-scoping guidance (labels aren't package-qualified); the e2e task's criteria tightened — filter detection is argument-order independent, the chromium criterion rejects extra projects, and the terminal-state check inspects only the newest execution. Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr * fix(uipath-test): address review — release-safe scope, one smoke test Review round with @ganeshborle: - SKILL.md carries no command names in the description/concepts, no rows for commands that are absent from the published CLI, and no "hidden from --help" guidance; the generic notes I had added (JSON envelope, CLI quirks, autonomy carve-out) are reverted and Rules 3/7 restored/rephrased. What remains: the Playwright concept, the navigation entry, the --labels selector (mutually exclusive wording), the verified report get project-key requirement (--query dropped as a generic option), and the never-link-automation guard. - the reference guide opens with an availability gate: probe the CLI, stop if the capability is absent, and run without project scoping if the optional commands are missing — no instructions to call something that help does not list. - tests: the e2e task is withdrawn (it cannot pass until the CLI publishes and an e2e tenant has serverless Playwright, so it would only add scheduled noise); one smoke task replaces both, grading the preparation work and the capability check, which hold before and after the CLI ships. Sandbox-local, nothing to clean up. Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr * refactor(uipath-test): fold three failure sections into one Same guidance, a third of the words: the Cancelled / None-results / stuck-Pending sections shared the same two diagnostic commands and the same "stop, don't retry" conclusion, so they are now one section with three shapes. Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr * test(uipath-test): simplify the pack-probe criterion pattern The alternation was dead code — the second branch matched every pack invocation including --help, so the first branch never contributed. Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr * feat(uipath-test): document the full Playwright command surface Restores the command rows for the paired 1.200 line: the pack command section, the playwright-context probe, and the --playwright-projects note on the run row. Kept from the review round: no command names in the description or Concepts, no generic flags on command rows, and no "hidden from --help" guidance — the callout states the Test Manager and CLI requirement plainly and points at the guide's availability check, so an agent on an older CLI is told to stop rather than to try anyway. Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr * fix(uipath-test): accept any Playwright config extension in the smoke task The task failed on CI at 0.88 for one reason: it asserted playwright.config.ts by exact name, and the agent wrote a valid config with a different extension. Every other criterion passed. The check now matches playwright.config.* so it grades the requirement (a config is present) instead of a formatting choice. Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr * fix(uipath-test): cover the fix-and-republish loop from a live run A fresh cold run took a suite with a failing test through to 2/2 green on a real tenant, and the gaps were all in the second half: - "Iterating on the suite" now covers getting a fix back in — bump the version, re-upload, and note that membership and the stored project selection survive so the same test set re-runs unchanged. It also states the weak spot plainly: nothing observably confirms an update landed (list-automations reports a two-component PackageVersion), so wait, re-run, and treat a verbatim repeat of the old failure as a stale package rather than a bad fix. - Prefer starting a run without --wait: it returns a full JSON envelope with ExecutionId immediately (the previous text claimed otherwise). - A zero Duration on an already-finished execution is normal. - Prerequisites carry the exact project-create command, and note that login status' ExpirationDate can read stale while calls succeed. Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr * fix(uipath-test): harden the count criterion, show the variadic key form Self-review before requesting review: - the "two tests written" check counted per file, so a valid two-file suite failed it — the same brittleness class as the config-extension bug CI caught. It now counts occurrences across the tests directory. - the add row showed the comma form for --test-case-keys; both selectors are variadic (commas still accepted), so it says that. Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr * fix(uipath-test): review round — concrete syntax, deterministic ingest check - add/pack rows carry real syntax: key and label examples, and the NuGet/SemVer version rule (three numeric parts, optional prerelease; 1.0 is rejected — verified against the CLI). - upload step says how to pick a free version: `or packages list --search <name>` exposes Version and IsLatestVersion. - ingestion check is deterministic instead of a count heuristic: match the test case names against the tests the pack step reported. The baseline-count and "wait for it to grow" wording is gone — it was vague and multiple pre-existing test cases could satisfy it. - dropped the CLI-recency prerequisite (CLI and skills release in lockstep, so it would go stale) and the login/auth bullets that duplicated SKILL.md's rules. Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr * fix(uipath-test): serverless needs a robot user, and TestCaseVersion verifies updates From a cold run against a fresh tenant folder, which reached 2/2 green only after fixing two things the guide did not mention: - Step 4 now states the folder needs BOTH a serverless machine and a member who can run unattended. A machine alone leaves the job Pending forever; testsets run has no flag to pick the user, so folder membership is the only lever, and `users update --allow-unattended` is a dead end (it wants Windows credentials serverless never uses). - new triage shape: CannotIssueUserTokenDueToUserNotPartOfOrg means the folder's robot-user pool is stale — unlike the other shapes this is CLI-fixable by moving to a folder that satisfies Step 4. - corrects a wrong claim: an update IS verifiable — the test case logs carry TestCaseVersion (confirmed 1.0.1 after a bump), so the guide no longer says re-runs happen on faith. - notes that fixing a folder does not rescue an already-pending run, and that --playwright-projects is absent from run --help. Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr * fix(uipath-test): explain the ingestion filter miss as prefix matching Main documented that tm testcases list --filter matches name or key by prefix; the guide now gives that as the reason a package-name filter never matches an ingested test case (named "<suite> > <title>"), instead of my vaguer "the package name is only in the description". Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr * fix(uipath-test): elaborate the missing-command rule, link the platform skill Review round (approved, remaining comments): - the hidden-command note now explains the two cases separately: a missing probe costs the pre-check only (skip Step 5, scoping still works), a rejected --playwright-projects means the build cannot scope a run. Validated both against a stable CLI. - folder/machine/robot-user setup and job-side troubleshooting now point at /uipath:uipath-platform's orchestrator references, so that detail tracks the owning skill instead of drifting here. - the playwright-context field list says to read the fields off the JSON response rather than depend on the list staying current. - the add row carries fuller placeholders as suggested, but keeps the space-separated form: keys accept the comma variant, labels do NOT — `--labels A,B` is read as one label and matches nothing (verified live: "No test cases carry any of the labels: A,B", while the same two space-separated succeed). Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr * fix(uipath-test): show how to prove a run was project-scoped Final cold run reached 2/2 green with no wrong turns, and its findings are folded in: - Step 7 gains the missing verification: get-stats returns a PlaywrightExecutionSnapshot whose Projects is the list the run actually used. Counting logs cannot prove it — there is one log per test, not per test x project — so a task asking for "chromium only" had no documented proof of success until now. - corrects the packages list claim: --search returns the feed's latest version only, not a version history (verified after uploading two). - the ingestion check is executable as written: a plain pack prints only TestCount, so match count plus name shape, or --dry-run first. - notes wait's fixed 60 s poll (a shorter --timeout can report a timeout for a finished run), that multi-project runs give no per-browser breakdown, and that stdout carries progress and updater lines around the JSON envelope. - the label example now uses the package-unique PW_File_* label the guide itself recommends. Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr * fix(uipath-test): final-check fixes — output noise, Result vs HasError Third cold run finished 2/2 green without deviating from the guide once; these are the traps it still had to work out for itself: - output-reading guidance moves up front: the JSON envelope shares the stream with auto-updater chatter (including "Update completed with failures.", unrelated to the command), progress lines and telemetry warnings. Judge by the envelope's Result, extract from the first {. - pass/fail is Result, NOT HasError — a Failed log reports HasError: false (verified), and HasError is the field a newcomer reaches for first. - the snapshot pointer added last round now carries the version caveat: its Version is two-component like list-automations and playwright-context, so read only Projects from it; TestCaseVersion on the logs remains the only version proof. - JUnit export is counts-only for Playwright: the XML names cases after the spec file, not the test title. - ingestion polls should count TestCaseKey, not Id. Claude-Session: https://claude.ai/code/session_0138XHhf1Jg5ozDUdbpX19Zr --------- (cherry picked from commit 4f65d49) Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

What
Teaches the
uipath-testskill the Playwright first mile: take a Playwright suite from a repo to executed results in Test Manager, using onlyuipcommands.references/playwright-first-mile-guide.md— the seven-step pipeline (pack → upload → automatic ingestion → label-filled test set → context probe → project-scoped run → results), plus how to get a fix back in and what to do when a run produces no results.SKILL.md— the external-package concept, a Pack section, theplaywright-contextrow, the--playwright-projectsnote on the run row, the--labelsselector ontestcases add, a navigation entry, and one anti-pattern (neverlink-automationa Playwright test case — ingestion links them).playwright_package_prep_smoke.yaml) that passes on the currently published CLI.The pipeline differs from the Studio/RPA one in a way worth calling out: there is no link step. Uploading the package is enough — ingestion creates one test case per Playwright test, already bound, and labels each with
PW_Tag_*,PW_Project_*,PW_Suite_*,PW_File_*.Why
The CLI commands landed in UiPath/cli#3226 and the Test Manager side is deployed, but nothing taught an agent the order, the traps, or how to tell a Playwright test set from an RPA one. Without this, an agent reaches for
link-automation(wrong pipeline), polls ingestion with a filter that never matches, or applies project scoping to a test set that cannot take it.How it was validated
Not by reading — by running. Six cold agents, each given only this skill and a logged-in
uip, on a local serverless stack and on the alphatestmanagerdev/DevTesttenant. Every gap they hit was folded back in:--filter <PackageName>never matches (names are"<suite> > <title>", package only in the description) → a false "ingestion never happened"IsAutomated: falseis normal on ingested test casesfolders list; the default folder needs a Cloud Robots–Serverless machinereport getrequires--project-key/--test-set-key(verified against the CLI)Cancelled,None-results and stuck-PendingshapesLatest full run on alpha: pack → upload → ingestion (~10 s) → label-filled test set → chromium-only run → 1 passed / 1 failed with the real Playwright error surfaced, then a fix-and-republish loop (bump version, re-upload, ingestion updates in place, re-run the same test set) → 2/2 passed, confirmed by
report get,testcaselogs listand the JUnit export.Related
latest(the eval runner installs@uipath/cli@latestand tasks may not pin a version). Keeping them here would mean a scheduled task that fails every run.playwright-contexton stable builds (it waspreviewCommand, so absent from every stable release while--playwright-projectsworked). Until that lands, a stable CLI answersunknown commandfor the probe; the guide's availability check handles it — skip the probe, and only drop project scoping if the run flag itself is rejected.This PR can merge independently: nothing in it needs an unreleased command to function, because the guide gates on availability.