Skip to content

Feat/tm playwright first mile - #2322

Merged
addyGarg merged 24 commits into
mainfrom
feat/tm-playwright-first-mile
Aug 3, 2026
Merged

Feat/tm playwright first mile#2322
addyGarg merged 24 commits into
mainfrom
feat/tm-playwright-first-mile

Conversation

@addyGarg

@addyGarg addyGarg commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

What

Teaches the uipath-test skill the Playwright first mile: take a Playwright suite from a repo to executed results in Test Manager, using only uip commands.

  • New 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, the playwright-context row, the --playwright-projects note on the run row, the --labels selector on testcases add, a navigation entry, and one anti-pattern (never link-automation a Playwright test case — ingestion links them).
  • One smoke task (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 alpha testmanagerdev/DevTest tenant. Every gap they hit was folded back in:

  • ingestion polling with --filter <PackageName> never matches (names are "<suite> > <title>", package only in the description) → a false "ingestion never happened"
  • IsAutomated: false is normal on ingested test cases
  • folder choice must come from the unflagged folders list; the default folder needs a Cloud Robots–Serverless machine
  • report get requires --project-key/--test-set-key (verified against the CLI)
  • no-results triage: Cancelled, None-results and stuck-Pending shapes

Latest 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 list and the JUnit export.

Related

  • test(uipath-test): Playwright integration and e2e tasks (hold until C… #2401 — the integration and e2e eval tasks, split out: they drive the full pipeline and cannot pass until the commands reach npm latest (the eval runner installs @uipath/cli@latest and tasks may not pin a version). Keeping them here would mean a scheduled task that fails every run.
  • UiPath/cli#3336 — registers playwright-context on stable builds (it was previewCommand, so absent from every stable release while --playwright-projects worked). Until that lands, a stable CLI answers unknown command for the probe; the guide's availability check handles it — skip the probe, and only drop project scoping if the run flag itself is rejected.
  • UiPath/cli#3226 — the commands this skill documents, merged into the 1.200 line.

This PR can merge independently: nothing in it needs an unreleased command to function, because the guide gates on availability.

@addyGarg
addyGarg marked this pull request as draft July 29, 2026 10:35
@github-actions

github-actions Bot commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

PR Review: Playwright First-Mile Guide

  • Read review criteria and project conventions
  • Read full diff and changed files
  • Check skill structure and link validity
  • Check for cross-skill references, secrets, CODEOWNERS
  • Post review findings

View job run

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread skills/uipath-test/references/playwright-first-mile-guide.md Outdated
Comment thread skills/uipath-test/references/playwright-first-mile-guide.md Outdated
@addyGarg

Copy link
Copy Markdown
Contributor Author

Test coverage + passing-run claims

Two coder_eval tasks added per .claude/rules/test-writing.md:

playwright_pack_generate (integration · mode:build · lifecycle:generate) — offline: scaffold a minimal Playwright suite → tm pack --type playwright --no-create-test-cases → assert the .nupkg exists and embeds testCases.json, plus the never-link-automation anti-pattern guard. Passing-run claim: all criteria simulated green against a CLI built from UiPath/cli#3226 (pack Success, TestCount 2, nupkg + embedded metadata verified via unzip). Deliberately tiered integration, not smoke: the PR-gate smoke runner installs @uipath/cli@latest, which lacks these commands until 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 (pack → upload → auto-ingestion → label fill → playwright-context probe → chromium-only run → results). Passing-run claim: the equivalent flow was executed live by five context-free agent runs during skill authoring — on a full local serverless stack it reached 2/2 passed, chromium-only, selection persisted; on alpha DevTest the first mile is green end-to-end with execution currently blocked by a tenant-side serverless identity fault (Serverless.Runtime.CannotIssueUserTokenDueToUserNotPartOfOrg), hence the path-to-ga tag.

Tenant prerequisites for the e2e task are documented in the task header and in references/playwright-first-mile-guide.md.

@addyGarg
addyGarg marked this pull request as ready for review July 30, 2026 06:41
@github-actions

github-actions Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

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

⚠️ PR body is empty ("No description provided"), but passing-run claims exist in the PR comment from @addyGarg:

playwright_pack_generate: "all criteria simulated green against a CLI built from UiPath/cli#3226 (pack Success, TestCount 2, nupkg + embedded metadata verified via unzip)"

playwright_first_mile_e2e: "the equivalent flow was executed live by five context-free agent runs during skill authoring"

✅ Accepted — claims are present in the PR thread. Consider moving them into the PR body for discoverability.

Per-task lint

tests/tasks/uipath-test/playwright_pack_generate.yaml — verdict: Medium (theme-captured; see Theme 1)

tests/tasks/uipath-test/playwright_first_mile_e2e.yaml — verdict: Medium (theme-captured; see Theme 1)

Within-PR duplicates

No duplicate clusters detected. The two tasks exercise materially distinct operations: playwright_pack_generate is an offline pack-only integration test (no tenant), while playwright_first_mile_e2e is the full pack → upload → ingest → fill → probe → run → results pipeline. The shared scaffolding step is template reuse, not duplication.

Themes

Theme 1 — CLI verb reachability: unreleased tm pack / tm testsets playwright-context verbs (High before downgrade)

Both tasks gate on CLI verbs that ship with UiPath/cli#3226, which has not yet published to @uipath/cli@latest. Affected criteria:

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

⚠️ 2 task(s) have issues, max severity Medium (after theme-aware downgrade from High). Both findings trace to a single root cause — unreleased CLI verbs from cli#3226 — which the author has explicitly documented and mitigated via tier tagging. Advisory only — not blocking merge.

@github-actions

github-actions Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Claude finished @addyGarg's task in 3m 14s —— View job


PR Review: Playwright First Mile

  • Read review criteria and project conventions
  • Read full PR diff and changed files
  • Check skill structure and conventions
  • Check test tasks for compliance
  • Verify links, cross-references, and content quality
  • Post review findings

Summary

Adds Playwright first-mile support to the uipath-test skill: a new reference guide (playwright-first-mile-guide.md) documenting the pack → upload → ingest → label-fill → probe → run pipeline, command-table updates in SKILL.md, two new anti-patterns, and two coder_eval test tasks (integration + e2e). The SKILL.md changes are well-scoped, the guide is thorough and prescriptive, and the test criteria validate the right behaviors.

Change-by-Change Review

1. skills/uipath-test/SKILL.md (+25/-8)

Severity: OK

Clean, well-scoped additions:

  • Description updated with Playwright signals (tm pack, PW_*, --playwright-projects) and improved redirect (Studio/RPA test automation authoring→uipath-rpa). Length 271 chars — well under 1024.
  • New "External (Playwright) test packages" concept entry (line 32) with link to guide.
  • testcases add command updated with --labels selector and mutual-exclusivity note.
  • testsets run updated with --wait and --playwright-projects; new playwright-context command row.
  • New Pack Commands section (lines 163–169) with correct syntax.
  • report get command corrected: --project-key/--test-set-key now shown as required, not optional — this is a fix, not just Playwright-related.
  • Critical Rule feat(CodedAgents): single skill #3 augmented with stdout-parsing caveat, Rule chore: compact skills #7 split for user-named vs agent-chosen folders.
  • Two new anti-patterns for Playwright (link-automation and hidden-command guidance).
  • Navigate-to-workflow table expanded; existing publish-and-link row clarified with "(Studio/RPA)".
  • New "Known CLI quirks" block below the navigation table — useful operational guidance.

No issues found.

2. skills/uipath-test/references/playwright-first-mile-guide.md (+168, new)

Severity: Low

Excellent guide — prescriptive 7-step pipeline, correct CLI commands with --output json, explicit anti-patterns, bounded polling with stop conditions, and three failure-mode triage sections (None results, instant Cancelled, stuck Pending). Content follows token-optimization rules well.

Minor items:

  • Line 7: code block missing language identifier. The pipeline overview uses bare triple-backticks. Per content quality rules, add a language tag (e.g., ```text). Fix this →

3. tests/tasks/uipath-test/playwright_first_mile_e2e.yaml (+109, new)

Severity: Medium

Well-structured e2e task. Success criteria properly grade behavior (command patterns, anti-pattern guard, terminal-state run_command). The initial_prompt is goal-oriented and delegates teaching to the skill. Tags are valid (uipath-test, e2e, mode:operate, lifecycle:setup, feature:test-case).

Issues:

  • Line 22–23: expected_turns: 50 exceeds max_turns: 49. The agent is expected to take 50 turns but will be hard-killed at 49. Either bump max_turns to 50+ or lower expected_turns to 49. Fix this →

4. tests/tasks/uipath-test/playwright_pack_generate.yaml (+62, new)

Severity: OK

Clean integration task. Offline-only (no tenant), validates pack prerequisites, output artifact, embedded metadata, and the link-automation anti-pattern. Tags are valid. Inherits agent/sandbox from experiment — correct per conventions. The NOTE comment explaining why it's integration not smoke is helpful.

What's Missing

  • No smoke-tier task for the Playwright feature. Both tasks are integration and e2e. The PR author's comment explains this is intentional — tm pack --type playwright ships with a CLI PR that hasn't published to @latest yet, so the PR-gate smoke runner can't run them. The playwright_pack_generate task is designed to be retagged to smoke once the CLI publishes. Acknowledged, not a gap — but worth tracking.

Area Ratings

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 --labels flag on testcases add are 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_command criterion (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.
|

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread skills/uipath-test/references/playwright-first-mile-guide.md Outdated
Comment thread tests/tasks/uipath-test/playwright_first_mile_e2e.yaml Outdated
Comment thread tests/tasks/uipath-test/playwright_first_mile_e2e.yaml Outdated
Comment thread tests/tasks/uipath-test/playwright_first_mile_e2e.yaml Outdated
Comment thread skills/uipath-test/SKILL.md Outdated
Comment thread skills/uipath-test/SKILL.md Outdated
Comment thread skills/uipath-test/SKILL.md Outdated
Comment thread skills/uipath-test/SKILL.md Outdated
Comment thread skills/uipath-test/SKILL.md Outdated
Comment thread tests/tasks/uipath-test/playwright_first_mile_e2e.yaml Outdated
Comment thread tests/tasks/uipath-test/playwright_first_mile_e2e.yaml Outdated
Comment thread tests/tasks/uipath-test/playwright_first_mile_e2e.yaml Outdated
Comment thread tests/tasks/uipath-test/playwright_pack_generate.yaml Outdated
Comment thread tests/tasks/uipath-test/playwright_pack_generate.yaml Outdated
@addyGarg

Copy link
Copy Markdown
Contributor Author

Review round applied — PR is now release-safe

Thanks @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 @uipath/test-manager-tool (1.198.0) carries no Playwright surface — no --type playwright, no playwright-context. So your release-cut concern is exactly right: anything documented would fail for every user today. Removed from SKILL.md: the playwright-context row, the --playwright-projects mention, the Playwright callout, the Pack Commands section, and all "hidden from --help" guidance. The generic notes I had added (JSON-envelope, CLI quirks, autonomy carve-out) are reverted, and Rules 3/7 are restored/rephrased.

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 --help does not list. If you would rather the guide itself not ship before the CLI does, I can trim this PR to the generic fixes only — happy either way.

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. playwright_package_prep_smoke.yaml replaces it: it grades the preparation work and the capability check, so it passes on todays published CLI and stays valid after the new commands ship, writes only into the sandbox working directory, and creates no tenant state to clean up.

Action items (tracked, not in this PR)

  1. Re-add the e2e task (with proper setup/teardown for the project + package it creates) once the CLI is published and an e2e tenant has serverless Playwright.
  2. Update the cli README with the new commands — only when they are in prod.
  3. Re-add the Playwright command surface to SKILL.md when the capability is live, and unhide it in the CLI at the same time.
  4. TM API: add an explicit boolean to the playwright-project-context response instead of clients inferring "not Playwright" from an empty payload (raised on UiPath/cli#3226 too).

@addyGarg

Copy link
Copy Markdown
Contributor Author

Split: held tests moved out

Per 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-link-automation guard).

Moved out — the integration and e2e tasks, on branch test/tm-playwright-integration-e2e. They cannot pass until the external-package commands reach npm latest (the eval runner installs @uipath/cli@latest and tasks may not pin a version), so keeping them here would only add scheduled noise. Their PR carries the merge preconditions and a one-line manual run command.

Also folded the three failure-triage sections in the guide into one — same guidance, a third of the words.

@addyGarg

Copy link
Copy Markdown
Contributor Author

Decision on the two open items

1. The command surface stays in SKILL.md. I had stripped the playwright-context row, the --playwright-projects note and the pack section on the grounds that no published CLI has them. Restoring them, with the reasoning that changed my mind: #3226 is merged into the same 1.200 line this skill targets (version-manifest.jsontargetCli: ^1.200.0), and uip skills install resolves skills by the CLI's own minor — so a CLI that can pull skills 1.200 is a 1.200 CLI and carries all four commands. The pairing you were protecting is satisfied by construction.

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 (--wait, --query) on command rows, and no "hidden from --help" guidance anywhere — that was your real objection and it stays fixed. The callout now states the Test Manager + CLI requirement plainly and points at the guide's availability check.

2. Integration and e2e tasks are split into their own PR — branch test/tm-playwright-integration-e2e, to merge once the commands reach npm latest (the eval runner installs @uipath/cli@latest and tasks may not pin a version). Its description carries the three preconditions and a one-line manual run command. That answers your "did we run and test it? / this runs daily" concern directly: nothing that can fail on a schedule lands here.

Two things worth your eyes before merge

  • The reference guide (165 lines) is the largest part of this PR and none of your 19 comments touched it — every one was on SKILL.md or the test YAMLs. If you want the same leanness pass applied there, say so and I will trim it (my own read: roughly 25–30 lines could go, the earned parts being the ingestion-poll trap and the no-results triage).
  • The remaining smoke test is deliberately modest: most of what it grades a capable agent might do unaided, the genuinely skill-informed signal being the lockfile requirement. Real coverage lives in the held PR.

@addyGarg

Copy link
Copy Markdown
Contributor Author

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 latest (the eval runner installs @uipath/cli@latest and tasks may not pin a version). Keeping them here would mean a scheduled task that fails every run. This PR therefore ships the skill plus one smoke task that passes on the currently published CLI; #2401 carries its merge preconditions in the description and each task header.

UiPath/cli#3336 — register playwright-context on stable, hidden from help. Found while validating this skill against a freshly built CLI: in cli#3226 the probe was registered with previewCommand, which gates on the binary carrying a prerelease tag — so it was absent from every stable release, permanently, while --playwright-projects (only hideHelp) worked. The skill documents both, so the two must have the same availability. #3336 is the one-line fix. Until it is in a released line, a stable CLI answers unknown command for the probe — which the guide handles: its availability check says skip the probe and carry on, and only drop project scoping if the run flag itself is rejected.

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 npm view @uipath/cli version reports 1.200.x and the eval tenant has Playwright support (its e2e task additionally needs working serverless execution).

Validation status

The flow this skill describes is verified end to end on the alpha testmanagerdev/DevTest tenant with a CLI built from cli main and this skill installed: 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, same test set re-run) → 2/2 passed, confirmed by report get, testcaselogs list and the JUnit export. The gaps that run exposed are folded into the guide.

@ganeshborle

Copy link
Copy Markdown
Contributor

Maybe add a PR description.

Comment thread skills/uipath-test/SKILL.md Outdated
Comment thread skills/uipath-test/SKILL.md Outdated
Comment thread skills/uipath-test/references/playwright-first-mile-guide.md Outdated
Comment thread skills/uipath-test/references/playwright-first-mile-guide.md Outdated
Comment thread skills/uipath-test/references/playwright-first-mile-guide.md
Comment thread skills/uipath-test/references/playwright-first-mile-guide.md Outdated
Comment thread tests/tasks/uipath-test/playwright_package_prep_smoke.yaml
Comment thread skills/uipath-test/references/playwright-first-mile-guide.md Outdated
Comment thread skills/uipath-test/references/playwright-first-mile-guide.md Outdated
@addyGarg
addyGarg requested a review from ganeshborle August 3, 2026 08:19
@ganeshborle

Copy link
Copy Markdown
Contributor

Please rebase the changes.

addyGarg and others added 8 commits August 3, 2026 14:29
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
addyGarg and others added 13 commits August 3, 2026 14:29
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
@addyGarg
addyGarg force-pushed the feat/tm-playwright-first-mile branch from 3adb4ef to ed7e6f0 Compare August 3, 2026 09:00

@ganeshborle ganeshborle left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me :)
There are some minor comments, if you can take care!

Comment thread skills/uipath-test/references/playwright-first-mile-guide.md Outdated
Comment thread skills/uipath-test/references/playwright-first-mile-guide.md Outdated
Comment thread skills/uipath-test/references/playwright-first-mile-guide.md
Comment thread skills/uipath-test/references/playwright-first-mile-guide.md
Comment thread skills/uipath-test/SKILL.md Outdated
Comment thread tests/tasks/uipath-test/playwright_package_prep_smoke.yaml
addyGarg and others added 3 commits August 3, 2026 14:56
…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
@addyGarg
addyGarg merged commit 4f65d49 into main Aug 3, 2026
17 checks passed
@addyGarg
addyGarg deleted the feat/tm-playwright-first-mile branch August 3, 2026 10:37
addyGarg added a commit that referenced this pull request Aug 3, 2026
…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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants