🔧 chore(qa): add the beta-tester E2E testing skill - #4836
mauretto78 wants to merge 2 commits into
Conversation
How to use the beta-tester skillQuick guide for anyone who wants to try it. This is a copy of the Usage section at the top What it doesAsk Claude Code to beta-test something and it drives a real Chrome browser through it — clicking, The environment is optional and defaults to
Some examples: Before it can run
If you have just switched branches, restart the container and rebuild the frontend first — the What you get backIt opens by stating which environment it is on and what it verified, writes its test checklist Two things it deliberately will not do. It will not report something as a bug when it cannot point Questions or something that behaves oddly: comment here and I'll fix the skill. |
🧪 Test-Guard Report✅ PASS — All changed source files have adequate test coverage. Coverage Analysis: ⏭️ SKIPNo source files to analyze — all changed files are tests or excluded. Test File Matching: ✅ PASSNo source files to check Per-File Evaluation: ✅ PASSNo source files to evaluate. Result: ✅ PASS |
🧪 Test-Guard Report✅ PASS — All changed source files have adequate test coverage. Coverage Analysis: ⏭️ SKIPNo source files to analyze — all changed files are tests or excluded. Test File Matching: ✅ PASSNo source files to check Per-File Evaluation: ✅ PASSNo source files to evaluate. Result: ✅ PASS |
Summary
Adds
beta-tester, a Claude Code skill that drives a real Chrome browser through a runningMateCat instance to test a given feature or flow, severity-scores the bugs it confirms, writes the
regression test in whichever harness will actually run it, and offers to file the confirmed ones
into the Matecat team backlog on Asana.
Two files, both under
.claude/. No application code is touched.Type
feat— new user-facing featurefix— bug fixrefactor— restructure without behavior changechore— build, deps, config, docsperf— performance improvementtest— test coverageChanges
.claude/skills/beta-tester/SKILL.mdlocal/staging/production) with a pre-flight gate that verifies the target rather than trusting it, and checks the daemons and the Vite bundle are not stale; execution workflow requiring an oracle before any assertion is scored; a bug-shape generator built from this repo's documented contracts; a severity model with floors; the reporting format; and aFiling to Asanasection mapping confirmed findings onto the team backlog..claude/settings.jsonget_me,get_project,get_projects,get_task,search_tasks) so a run does not stall on prompts while checking for duplicate tasks. Task creation and commenting are deliberately not pre-allowed — the permission prompt is the confirmation gate.Testing
vendor/bin/phpunit --exclude-group=ExternalServices --no-coveragepasses./vendor/bin/phpstanpasses (0 errors, with baseline)The two suites are unchecked because this PR adds Markdown and a permissions entry, and touches no
PHP or JS — there is nothing for them to exercise.
The skill was run end to end against the local stack (
develop @ 43c500cc), driving Chrome throughthe full project-creation flow: name → upload → convert → analyze → open the job in the editor. It
produced a correct pass, and independently found one real defect in
public/js/components/analyze/AnalyzeHeader.js(amailto:href written as a literal stringinstead of a JSX expression, at lines 191 and 205 — line 34 of the same file does it correctly).
That fix is not in this PR; it is reported separately so this change stays purely additive.
The safety gates were exercised: invoking with
productionrefuses, and the pre-flight mismatchcheck stops a run whose declared tier does not match the resolved host. For the Asana section, the
board, section and every custom-field option GID were read from the live API rather than assumed,
and the duplicate-search path was executed against the real backlog.
AI Disclosure
Claude Code (claude-opus-5)
Notes
The skill is deliberately scoped to what it can honestly do:
production. Its third step is deliberately trying to break things, andwww.matecat.comholds real customer data. Naming production in the skill is the point — so itrecognises and refuses it rather than being silent. Post-release smoke-checking stays with
deploy-matecat.CI, so a spec nobody runs would look like coverage without being it. Regression tests are
routed to Jest/RTL or PHPUnit instead, and a genuinely browser-only bug gets a precise
reproduction and an explicit statement that no harness here can hold it.
documented contract is reported as
[OBSERVATION], left unscored, and never filed.P0 - Emergency.P0 means a production incident, and a skill barred from production cannot have observed one —
escalating to P0 stays a human decision. Findings whose cause turns out to be environmental (a
stale daemon, a disconnected VPN) are never filed either; during development those were the most
convincing false positives by a wide margin.
.claude/is covered by the.*rule on line 1 of.gitignore, so these files needgit add -f. That matches thedeploy-matecatskill, which lives at the same path.Follow-up, not blocking: with the VPN down,
POST /api/app/convert-filehangs with no timeoutand no user-facing error — the upload sits at "Importing" indefinitely. Worth deciding whether
that endpoint should have a client-side timeout.