Playwright tests#3022
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! 🚀 New features to boost your workflow:
|
- Add core-workflow-testing skill with team_user workflows for browser-based regression testing - Add --reset flag to bootstrap_data command to delete and recreate team data - Add --port flag to runserver invoke task for custom port binding Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… site testing workflow Ensures Playwright browsers are available, Celery worker is confirmed ready before tests run, and test artifacts are uploaded on failure for debugging. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…est-healer agent Sets up the foundation for browser-based E2E testing: - playwright.config.ts: multi-project setup with storageState auth reuse, Celery webserver, 1-worker serial execution, and 2-minute per-test timeout - auth.setup.ts: authentication fixture that persists session to .auth/user.json - playwright.yml: GitHub Actions workflow with bootstrap data reset, artifact uploads on failure - playwright-test-healer agent: specialized Claude agent for debugging failing Playwright tests - user-workflows skill: documents team_user E2E test coverage Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Extracts the login(), setupPage(), confirmDeletion(), and deleteActionRow() functions—along with EMAIL, PASSWORD, TEAM_SLUG, and TEAM_URL constants—into a single shared module. Without this, every spec file duplicated ~15 lines of identical setup code. Also exports TEAM_SLUG so per-file URL constants (e.g. CHATBOTS_URL, NEW_ACTION_URL) can be derived from a single source of truth. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… and custom actions Covers the team setup workflows a user performs before building chatbots: - 01-authentication: sign in/out, redirect verification - 02-team-management: edit team name, toggle feature flags, danger zone - 03-service-providers: create/delete LLM, speech, messaging, auth, and tracing providers; bulk delete across all provider types - 04-custom-actions: CRUD for OpenAPI-backed custom actions, schema validation Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…channels Covers the core chatbot authoring lifecycle: - 05-chatbot-management: create, view, edit pipeline, edit settings, archive, copy, and search/filter chatbots - 06-chatbot-versions: view version table, create a new version via pipeline edit + Celery async task, verify row appears after polling completes - 07-channels: copy API URL, access web channel, enumerate available channel types, configure a SureAdhere messaging provider and verify it unlocks Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Covers runtime and data management features: - 08-sessions: view/filter all-sessions table, view chatbot sessions tab, session detail page and tabs, navigate older/newer, end session, start new session dialog (chat export marked fixme pending Celery timing) - 09-source-material: create and search source material - 10-surveys: create a survey with URL and message template - 11-consent-forms: create forms with default, custom, and no-identifier settings - 12-tags: create a tag via Manage Tags - 13-collections: create media and indexed (RAG) collections - 14-participants: table columns, filter panel, date range, chatbot filter, and CSV export Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Covers the remaining user-facing surfaces: - 15-profile: update first/last name, configure notification preferences, create and revoke an API key - 16-dashboard: analytics cards, bot performance table, most active participants, session length distribution, date range and granularity filters, channel/chatbot/participant/tag filters, save filter preset - 17-notifications: trigger a notification via a failed LLM call, view notification table structure, filter/date-range/silence/preferences controls Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Move database seeding to CI step in playwright.yml workflow - Add STATUS: PASSED/FAILED reporting format to user-workflows skill - Update site_testing.yml to check for STATUS: FAILED in test output - Refactor playwright.config.ts to use SECRET_KEY env var with fallback Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Scope cell assertions to the unique actionRow locator to avoid matching multiple rows with the same description from previous test runs. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Rename skill from user-workflows to core-workflow-testing and move workflow markdown files under playwright/workflows/ for colocation with test infrastructure. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add JSON reporter output for CI test result parsing and allow REUSE_SERVER=1 to skip launching dev server/celery in CI where they are started separately. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add workflow verification before fixing tests to distinguish between broken tests and broken features. Add structured status reporting and streamline the debugging workflow. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Rename to Playwrite Test Checker. Run Playwright tests directly in CI, then use Claude test-healer agent only for failures. Auto-create PRs with test fixes and fail CI only when core workflows are broken. Pin action versions and add frontend build step. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…lery beat flag - Reduce default test timeout from 2 minutes to 30 seconds - Call setupPage() in login helper before navigating - Remove -B (beat) flag from Celery worker in CI workflow Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove Tier 1 (auth, team management, service providers) and Tier 3 (custom actions, source material, surveys, consent forms, tags, collections, participants, profile, dashboard, notifications) test files and workflows. Also remove all filtering/search tests and the session navigation (Older/Newer) test from the remaining Tier 2 files. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…nd feature flags - Add --superuser option to make the test user a Django superuser - Use OPENAI_API_KEY env var for a working LLM provider alongside a non-working one - Enable feature flags (evaluations, human_annotations) for the team - Remove assistant creation (no longer needed) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove chatbot-management, chatbot-versions, channels, and sessions specs that are being replaced by consolidated workflow-based tests. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Pass OPENAI_API_KEY from secrets to both Playwright workflows - Use --superuser flag in bootstrap_data seed command Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace granular test specs with two workflow-based tests: - 02: Create and test a chatbot (end-to-end with chat interaction) - 03: Evaluations, datasets, and annotations workflow Update team_user.md to document the new consolidated workflows. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Replace hardcoded chatbot ID 1011 with dynamic discovery of published chatbots - Replace hardcoded 'Working OpenAI' provider with dynamic provider selection - Both tests now work regardless of which chatbot IDs or LLM providers exist Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Use timestamped unique names for all created resources (evaluators, datasets, evaluations, annotations) to avoid name conflicts across runs - Replace "Clone from sessions" with "Create manually" for dataset creation since session cloning requires pre-existing sessions - Fix chat test to use pressSequentially for Alpine.js reactivity - Tighten URL assertions to detect form validation failures (not.toHaveURL /new/) - Dynamically select first available chatbot/evaluator/dataset in dropdowns - Use data-tip attribute selector instead of brittle CSS class chains - Handle chat errors gracefully (no LLM API key configured) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
@coderabbitai full review |
✅ Actions performedFull review triggered. |
📝 WalkthroughWalkthroughThis pull request introduces a comprehensive Playwright-based test automation framework for Open Chat Studio. It adds a new AI agent configuration ( Estimated code review effort🎯 4 (Complex) | ⏱️ ~50 minutes 🚥 Pre-merge checks | ❌ 3❌ Failed checks (1 warning, 2 inconclusive)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. 📝 Coding Plan
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment Tip You can enable review details to help with troubleshooting, context usage and more.Enable the |
There was a problem hiding this comment.
Actionable comments posted: 12
🧹 Nitpick comments (6)
.claude/agents/playwright-test-healer.md (2)
63-73: Add language specifier to status report code block.📝 Suggested fix
-``` +```text Test: <test name> → FIXED | WORKFLOW_FAILED | PASSED Test: <test name> → FIXED | WORKFLOW_FAILED | PASSED ... STATUS: FIXED -``` +```🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.claude/agents/playwright-test-healer.md around lines 63 - 73, Update the markdown code fence in .claude/agents/playwright-test-healer.md for the status report block so it includes the language specifier "text" (i.e., change the opening fence from ``` to ```text for the block that contains the "Test: <test name> ..." lines and "STATUS: FIXED"); leave the closing fence unchanged. This ensures proper syntax highlighting by tagging the status report code block as text.
15-20: Add language specifier to code block.The code block showing the input format lacks a language specifier.
📝 Suggested fix
-``` +```text - 05-chatbot-management.spec.ts > Chatbot Management > Create a chatbot - 02-team-management.spec.ts > Team Management > Invite a Team Member -``` +```🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.claude/agents/playwright-test-healer.md around lines 15 - 20, Add a language specifier to the fenced code block that lists failing tests so syntax highlighting is explicit; update the code block containing "- 05-chatbot-management.spec.ts > Chatbot Management > Create a chatbot ..." to start with ```text (instead of ```), leaving the contents unchanged—locate the fenced block in .claude/agents/playwright-test-healer.md and modify the opening fence accordingly..github/workflows/playwright.yml (1)
71-71: Consider using secrets for test credentials.The test password is hardcoded in the workflow file. While this is acceptable for test environments, consider storing it as a repository secret for better hygiene and to avoid accidental exposure if these credentials are reused elsewhere.
- run: uv run python manage.py bootstrap_data --email tester@playwright.com --password My0riginalP@ssw0rd! --team-slug agent --team-name Agent --reset + run: uv run python manage.py bootstrap_data --email tester@playwright.com --password ${{ secrets.PLAYWRIGHT_TEST_PASSWORD }} --team-slug agent --team-name Agent --reset🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.github/workflows/playwright.yml at line 71, The workflow currently hardcodes the test credentials in the run step (the uv run python manage.py bootstrap_data invocation); replace the hardcoded password (and optionally the email) with GitHub Actions secrets and reference them in the run step (e.g. use the secret name PLAYWRIGHT_TEST_PASSWORD via ${{ secrets.PLAYWRIGHT_TEST_PASSWORD }} and/or PLAYWRIGHT_TEST_EMAIL) and ensure those secrets are added to the repository/actions secrets configuration; update the run invocation to interpolate those secrets so no plaintext credentials remain in the workflow file.playwright/helpers/common.ts (1)
19-26: Promote the debug-toolbar workaround to a shared helper here.
setupPage()already owns the#djDebugworkaround, but both new spec files still reimplement the samepage.evaluateblock locally. Exporting a callablehideDebugToolbar(page)from this module would keep the selector and workaround in one place.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@playwright/helpers/common.ts` around lines 19 - 26, Extract the '#djDebug' workaround into a new exported helper named hideDebugToolbar(page: Page) that performs the DOM hide (e.g., via page.evaluate or page.addInitScript with the same selector logic), export that function from this module, and update setupPage(page: Page) to call hideDebugToolbar(page) so all tests can reuse the single implementation; reference the existing setupPage and the new hideDebugToolbar symbols when making the change..claude/skills/core-workflow-testing/SKILL.md (1)
25-28: Add a language identifier to these fenced blocks.
markdownlint-cli2is already flagging both examples with MD040.textis enough if you do not want syntax highlighting.Also applies to: 36-43
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.claude/skills/core-workflow-testing/SKILL.md around lines 25 - 28, The fenced code blocks containing the examples that show "Status: <SUCCESS | FAILED>" and "Comment: <if something failed, describe the failure>" need a language identifier to satisfy markdownlint MD040; update each triple-backtick fence (including the other block at the later example) to include a language like "text" (e.g., change ``` to ```text) so the blocks are explicitly labeled without adding syntax highlighting.playwright/tests/02-create-and-test-chatbot.spec.ts (1)
112-114: Wait on the chat outcome instead of sleeping 5 seconds.This step currently passes after a fixed delay even if the send action never yields a bot reply or the expected error state. Waiting on one of those concrete outcomes will keep the failure in this test instead of pushing it to the downstream sessions check.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@playwright/tests/02-create-and-test-chatbot.spec.ts` around lines 112 - 114, Replace the fixed sleep (await page.waitForTimeout(5000);) with an explicit wait for a concrete chat outcome: use Promise.race (or page.waitForSelector with {timeout}) to wait for either the bot response selector or the error/alert selector to appear on the page; for example, replace the sleep in the test where page is used with awaiting Promise.race between page.waitForSelector('<bot-response-selector>') and page.waitForSelector('<error-or-alert-selector>') (both with sensible timeouts) so the test proceeds only when a reply or an error is actually present.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In @.claude/skills/core-workflow-testing/SKILL.md:
- Line 13: The current heuristic that derives a workflow section from the
numeric prefix of spec filenames is incorrect; replace it with an explicit
filename→flow mapping and use that map when parsing the failing-tests string.
Add a dictionary (map) keyed by exact spec filenames (e.g.
"02-create-and-test-chatbot.spec.ts" -> the Flow 1/section for "Chatbot
Management", "03-evaluations-datasets-annotations.spec.ts" -> the Flow 2/section
for its flow, etc.), and change the code that extracts section numbers from the
failing-list to look up each spec filename in this map and collect unique flows;
if a filename is missing from the map fall back to current behavior or log a
clear warning. Ensure the mapping is referenced wherever the spec-number
heuristic was used so only the explicitly mapped workflow sections are run.
In @.claude/skills/playwright-cli/references/request-mocking.md:
- Around line 28-35: The fenced code block under the "URL Patterns" heading is
missing a language tag which triggers MD040; update the opening triple-backtick
fence for that block (the block showing patterns like "**/api/users",
"**/api/*/details", "**/*.{png,jpg,jpeg}", "**/search?q=*") to use the text
language tag (i.e., change "```" to "```text") so the docs linter no longer
flags the block.
In @.claude/skills/playwright-cli/references/running-code.md:
- Around line 83-86: The example uses page.waitForLoadState('networkidle') which
conflicts with the playright-test-healer guidance to avoid networkidle; update
the example to either replace the call with a recommended wait strategy (e.g.,
waitForLoadState('load') or an explicit waitForSelector / waitForResponse
pattern) or add a short inline note after the code block saying that networkidle
is discouraged for tests and linking to the healer guidance; target the example
that uses playwright-cli run-code and the page.waitForLoadState('networkidle')
invocation when making this change.
In @.github/workflows/playwrite_test_checker.yml:
- Around line 149-175: Playwright failures currently pass unless
claude_repair.outputs.structured_output explicitly contains "STATUS:
WORKFLOW_FAILED", which lets empty/malformed or no-repair outputs hide broken
tests; update the workflow to require an explicit success token from the healer
(e.g. check for "STATUS: WORKFLOW_FIXED" or another defined success marker) and
treat any other claude_repair output (empty, malformed, or lacking that success
marker) as a failure: change the logic around steps.playwright.outcome and
steps.claude_repair.outputs.structured_output so the auto-commit/pr branch
creation only runs when the healer indicates success, and in the "Fail if core
workflows are broken" step (or a new step) exit 1 whenever playwright failed and
the structured_output does not contain the explicit success string.
- Around line 107-117: The readiness step named "Wait for server to be ready"
currently uses curl -s which treats HTTP 5xx/4xx as success; update the step so
the curl invocation fails on HTTP errors (for example by adding the -f/--fail
flag) or point it at a dedicated health endpoint (e.g., /health or /healthz)
that returns 2xx only when Django is fully ready; modify the command in that
step to use curl -fsS (or curl -f) and/or change the URL to the health endpoint
so the loop only exits when a successful 2xx response is returned.
In @.gitignore:
- Around line 44-48: The .gitignore is missing the persisted Playwright auth
state; add an ignore entry for the Playwright auth directory (e.g., ignore
"playwright/.auth/" or "playwright/.auth/*") so files like
"playwright/.auth/user.json" written by playwright/tests/auth.setup.ts are not
committed; update the .gitignore block that lists Playwright artifacts
(playwright-report/, playwright-results*, .playwright-cli, test-results/) to
include the .auth pattern.
In `@apps/web/management/commands/bootstrap_data.py`:
- Around line 131-134: The seed command only sets user.is_superuser and
user.is_staff when the --superuser flag is present, so reruns without the flag
leave prior promotions intact; update the logic in the bootstrap command (where
the variables user and superuser are handled, e.g., in the management command's
handle/bootstrap logic) to explicitly set user.is_superuser = bool(superuser)
and user.is_staff = bool(superuser) (or otherwise assign False when superuser is
falsy) before calling user.save() so the flag is idempotent across runs.
In `@playwright/tests/03-evaluations-datasets-annotations.spec.ts`:
- Around line 159-163: The tests "run the evaluation" (where
evalRow.locator('a[href*="/runs/new/"]').click(...) is used) and "verify
evaluation results" currently use page.waitForTimeout(3000);—replace these
arbitrary sleeps with concrete waits and assertions: after clicking the run
link, wait for a run row or status indicator to appear (e.g., use
page.waitForSelector or locator.waitFor on a run list element and assert its
status text/visibility using Playwright's expect), and in the "verify evaluation
results" test wait for the results table or completion badge to be visible and
assert expected contents; target the existing locators/buttons
(evalRow.locator('a[href*="/runs/new/"]') and the details panel/run list/result
table locators used in that test) so the test fails if no job started or no
results rendered.
- Around line 236-240: The current check uses noItemsMsg.isVisible(...) which is
subject to a race and ignores timeout; replace that call with await
noItemsMsg.waitFor({ state: 'visible', timeout: 3000 }) inside a try/catch and
return when it succeeds (catch should continue normally if timeout occurs),
i.e., in the block using the Locator noItemsMsg, swap isVisible(...) ->
waitFor({ state: 'visible', timeout: 3000 }) and handle the success by returning
early (items already annotated) and handle the thrown timeout by falling through
to the subsequent assertions.
- Around line 115-136: This test block assumes an existing chatbot and will fail
when run in isolation; fix it by adding setup that creates/seeds a chatbot
before the selection logic (e.g., in a beforeEach or at the start of this spec)
and then use that created chatbot's label when operating on chatbotSelect and
versionSelect; implement the seeding via the same API/fixture used elsewhere (or
call the app API to create a chatbot/version), store the created chatbot display
name/label and use it in chatbotSelect.selectOption(...) and subsequent version
selection, and ensure any created test data is cleaned up after the test run.
In `@playwright/tests/auth.setup.ts`:
- Around line 8-9: Replace the password locator that uses
page.getByRole('textbox', { name: 'Password' }) with Playwright's recommended
labeled lookup: use page.getByLabel('Password') (e.g., await
page.getByLabel('Password').fill('My0riginalP@ssw0rd!')), leaving the email line
as-is; update the locator in auth.setup.ts where the two fill calls occur
(referencing the page.getByRole(...) call for Password) so the password input
uses page.getByLabel instead.
In `@tasks.py`:
- Around line 179-185: The ngrok URL is hardcoded to port 8000 in ngrok_url(),
so when runserver(c, public, port) starts Django on a custom port the public URL
is wrong; update ngrok_url to accept an optional port parameter (e.g.,
ngrok_url(c, port=None)) and use that port when composing the tunnel URL instead
of the hardcoded 8000, then change the call inside runserver (where ngrok_url(c)
is invoked) to pass the runserver's port variable so ngrok publishes the correct
backend port; adjust any callers of ngrok_url accordingly to preserve default
behavior when port is None.
---
Nitpick comments:
In @.claude/agents/playwright-test-healer.md:
- Around line 63-73: Update the markdown code fence in
.claude/agents/playwright-test-healer.md for the status report block so it
includes the language specifier "text" (i.e., change the opening fence from ```
to ```text for the block that contains the "Test: <test name> ..." lines and
"STATUS: FIXED"); leave the closing fence unchanged. This ensures proper syntax
highlighting by tagging the status report code block as text.
- Around line 15-20: Add a language specifier to the fenced code block that
lists failing tests so syntax highlighting is explicit; update the code block
containing "- 05-chatbot-management.spec.ts > Chatbot Management > Create a
chatbot ..." to start with ```text (instead of ```), leaving the contents
unchanged—locate the fenced block in .claude/agents/playwright-test-healer.md
and modify the opening fence accordingly.
In @.claude/skills/core-workflow-testing/SKILL.md:
- Around line 25-28: The fenced code blocks containing the examples that show
"Status: <SUCCESS | FAILED>" and "Comment: <if something failed, describe the
failure>" need a language identifier to satisfy markdownlint MD040; update each
triple-backtick fence (including the other block at the later example) to
include a language like "text" (e.g., change ``` to ```text) so the blocks are
explicitly labeled without adding syntax highlighting.
In @.github/workflows/playwright.yml:
- Line 71: The workflow currently hardcodes the test credentials in the run step
(the uv run python manage.py bootstrap_data invocation); replace the hardcoded
password (and optionally the email) with GitHub Actions secrets and reference
them in the run step (e.g. use the secret name PLAYWRIGHT_TEST_PASSWORD via ${{
secrets.PLAYWRIGHT_TEST_PASSWORD }} and/or PLAYWRIGHT_TEST_EMAIL) and ensure
those secrets are added to the repository/actions secrets configuration; update
the run invocation to interpolate those secrets so no plaintext credentials
remain in the workflow file.
In `@playwright/helpers/common.ts`:
- Around line 19-26: Extract the '#djDebug' workaround into a new exported
helper named hideDebugToolbar(page: Page) that performs the DOM hide (e.g., via
page.evaluate or page.addInitScript with the same selector logic), export that
function from this module, and update setupPage(page: Page) to call
hideDebugToolbar(page) so all tests can reuse the single implementation;
reference the existing setupPage and the new hideDebugToolbar symbols when
making the change.
In `@playwright/tests/02-create-and-test-chatbot.spec.ts`:
- Around line 112-114: Replace the fixed sleep (await
page.waitForTimeout(5000);) with an explicit wait for a concrete chat outcome:
use Promise.race (or page.waitForSelector with {timeout}) to wait for either the
bot response selector or the error/alert selector to appear on the page; for
example, replace the sleep in the test where page is used with awaiting
Promise.race between page.waitForSelector('<bot-response-selector>') and
page.waitForSelector('<error-or-alert-selector>') (both with sensible timeouts)
so the test proceeds only when a reply or an error is actually present.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: b7446b2f-e16d-48ca-a0b0-6679a4ca73d7
⛔ Files ignored due to path filters (1)
package-lock.jsonis excluded by!**/package-lock.json
📒 Files selected for processing (22)
.claude/agents/playwright-test-healer.md.claude/skills/core-workflow-testing/SKILL.md.claude/skills/playwright-cli/SKILL.md.claude/skills/playwright-cli/references/request-mocking.md.claude/skills/playwright-cli/references/running-code.md.claude/skills/playwright-cli/references/session-management.md.claude/skills/playwright-cli/references/storage-state.md.claude/skills/playwright-cli/references/test-generation.md.claude/skills/playwright-cli/references/tracing.md.claude/skills/playwright-cli/references/video-recording.md.github/workflows/playwright.yml.github/workflows/playwrite_test_checker.yml.gitignoreapps/web/management/commands/bootstrap_data.pypackage.jsonplaywright.config.tsplaywright/helpers/common.tsplaywright/tests/02-create-and-test-chatbot.spec.tsplaywright/tests/03-evaluations-datasets-annotations.spec.tsplaywright/tests/auth.setup.tsplaywright/workflows/team_user.mdtasks.py
- Replace spec-number heuristic with explicit filename→flow mapping in SKILL.md - Add fence language to URL pattern code block in request-mocking.md - Replace deprecated networkidle with domcontentloaded in running-code.md - Use curl -sf for server readiness probe in CI workflow - Fail CI when healer output is empty or doesn't confirm recovery - Add playwright/.auth/ to .gitignore - Replace waitForTimeout with assertion in evaluation spec - Use getByLabel for password field in auth setup - Pass custom port through to ngrok_url in tasks.py Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Merged "run the evaluation" and "verify evaluation results" into a single test that polls for "Completed" status and asserts the results heading and table are visible, matching workflow steps 4-5. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Technical Description
This PR adds
Demo
Docs and Changelog