Skip to main content
ClaudeWave
Skill1.6k repo starsupdated 3d ago

manual-testing

Use immediately after finishing any code change in Relaticle (implementation, fix, refactor, migration) before reporting work as complete. The skill itself decides whether to run; do not skip on 'small' changes. Triggers an adversarial post-task QA pass: reads the diff, scores risk, generates an SBTM charter, drives a real browser through a pairwise-reduced test matrix across Filament/Livewire/REST/MCP surfaces, classifies findings by severity, auto-fixes High findings within strict guardrails, and promotes High+ findings to permanent Pest browser regression tests. Reports land in .context/testing/reports/. Skip with [skip-qa] in the user message or MANUAL_TESTING_SKIP=1.

Install in Claude Code
Copy
git clone --depth 1 https://github.com/relaticle/relaticle /tmp/manual-testing && cp -r /tmp/manual-testing/.github/skills/manual-testing ~/.claude/skills/manual-testing
Then start a new Claude Code session; the skill loads automatically.

SKILL.md

# Manual Testing for Relaticle

Adversarial post-task QA. Pretend 1000s of users in production are about to exercise this change from every angle. Find what they would find. Fix what's safe to fix. Report what isn't.

## When to invoke

Self-invoke immediately after finishing any code change in this codebase, before reporting work as complete. The skill decides for itself whether the change is testable; do not pre-filter.

## Skip conditions

Run `.github/skills/manual-testing/bin/should-skip.sh` first. If it exits 0, exit the skill with one line: the reason from the script. If it exits 1, proceed.

Skip rules (encoded in the script):

1. `MANUAL_TESTING_SKIP=1` env var, a hard override.
2. Branch is `main`, `master`, or `release/*`.
3. Diff is empty.
4. Every path in the diff matches a trivial pattern: `*.md`, `*.txt`, `*.lock`, `*.gitignore`, `composer.lock`, `package-lock.json`, `pnpm-lock.yaml`, `yarn.lock`, `tests/**`.

Additionally, **the skill itself** (not the script) must check the user's message in the current turn for `[skip-qa]`, `skip qa`, `no test`, or `dont test` BEFORE invoking the script. If found, exit with `SKIP user-request:<phrase>` logged to `.context/testing/reports/skipped.log`. The script handles env-var, branch, empty-diff, and trivial-path cases; the user-message gate is the skill's responsibility because the script has no access to chat context.

## Workflow phases

### 1. DETECT

Run `.github/skills/manual-testing/bin/should-skip.sh`. If exit 0, exit the skill with the one-line reason. If exit 1, capture the diff: `git diff HEAD --name-only` for paths, `git diff HEAD --stat` for the size summary.

### 2. CLASSIFY

Load `references/risk-rubric.md`. Score Likelihood and Impact against the diff:

1. **Likelihood**: pick the anchor (1-5) that best matches the most-impactful change in the diff. When in doubt, round up.
2. **Impact**: start with the rubric anchor. Then grep the diff for the high-impact tag patterns. Any match forces Impact = 5. Record which pattern fired.
3. **Total**: `L × I`, classify into smoke/light/medium/deep tier.
4. **Surfaces**: walk the surface scoping table; any matching path adds its surfaces to the matrix.

Print the classification at the top of the working notes:

```
Risk: 4×5=20 → deep
- Likelihood 4: cross-cutting refactor of TaskPolicy + 2 callers in Filament and MCP.
- Impact 5: high-impact tag matched (`app/Policies/TaskPolicy.php`).
- Surfaces: Filament UI, REST API, MCP.
- Auto-fix ceiling: High only, never in auth/tenancy/migration code.
```

### 3. CHARTER

Load `references/personas.md`, `references/oracles.md`, `references/tours.md`. Compose the charter using exactly this grammar:

> **Explore** `<changed area>` **with** `<personas, tours, surfaces, time budget>` **to discover** `<information goal>`.
> **Definition of Done:** machine-checkable list of assertions.

Definition of Done items must be **measurable**. Bad: "form looks good." Good: "Filament Tasks list view loads in <2s for 1000 records."

Use `templates/charter.md` as the structural starting point and fill in all `<placeholders>`.

**Time budgets per tier:** smoke 2 min, light 5 min, medium 10 min, deep up to 60 min.

If the charter has fewer than 3 DoD items, regenerate. DoD is what prevents the LLM from declaring success on incomplete work.

### 4. PLAN

Build the candidate matrix (Persona × Surface × Tour × Data-state). Reduce in this order:

1. Filter by surface scoping (from CLASSIFY phase).
2. Filter by tour-relevance per surface (per `references/tours.md` selection table).
3. Apply pairwise: every (Persona, Surface) pair appears at least once; every (Surface, Tour) pair at least once; every (Persona, Data-state) at least once.
4. **Hard-add** the multi-tenant checklist row whenever any model/policy/scope path was touched (see `references/multi-tenant-checklist.md`). Never reduced away.
5. Boundary-value analysis: for each text input on the diff, add 2-4 nasty-data cells from `references/data-nasties.md`.

Target matrix sizes:

| Tier | Cells |
|---|---|
| smoke | 3-5 |
| light | 8-12 |
| medium | 15-25 |
| deep | 30-50 + multi-tenant checklist |

**On smoke-tier cell count:** the rubric's "1 persona, single surface, happy path + 1 negative" is the *baseline*. The 3-5 target comes from boundary-state expansion (typical / empty / error) within that single persona+surface combination. So a smoke run is genuinely lightweight: it rotates one cell through 3-5 data states.

Print the matrix as a table at the top of the report (one row per cell). Each cell will be filled with an outcome during EXECUTE.

### 5. SETUP

Verify the dev environment is reachable:

```bash
agent-browser open https://calm-lemur.test
agent-browser get title
```

If unreachable, exit the skill with `BLOCKED: dev server unreachable at https://calm-lemur.test`. Suggest: check Herd status, run `herd start`, verify `.env` `APP_URL`.

If two teams aren't present (required by the multi-tenant checklist when applicable), seed a second team. See the setup section of `references/multi-tenant-checklist.md`.

Gather login-link URLs for every persona in the matrix. Cache them in `.context/testing/state/login-urls.json`.

### 6. EXECUTE

For each cell in the matrix (in order; the multi-tenant checklist runs **first** when present, so a leak halts execution before further cells run):

1. Load `references/surfaces.md` for the relevant surface playbook.
2. Log in as the persona via login-link.
3. Drive the surface through the tour's steps.
4. Apply the data-nasty payload (if the cell is a boundary-value cell).
5. **Visual sweep (Filament UI / Livewire surfaces only):** if the cell's tour is Supermodel, or if any browser-touching cell has not yet been visually swept, run the probes from `references/visual-probes.md` (P1–P8) at the viewports listed there, plus the state-explosion checklist. Take an annotated screenshot per state and per viewport. Then answer the Image-oracle rubric in `references/oracles.md
agent-browser-relaticleSkill

Use whenever driving agent-browser against the local Relaticle app (relaticle.test and its panels) for testing, QA, business review, or UI automation. Covers Filament v5 + Livewire v4 quirks specific to this codebase: panel URL derivation (domain-routed vs path-routed, never assumed), login flows for the app and sysadmin panels, seeded credentials, Select/date-picker interaction, the $wire.mountAction gold pattern, tenant switching, Reverb/queue hazards, and session isolation. Every hard fact here is a DATED CACHED HINT. When one fails, re-derive from the running app and update this file (self-heal). Not for other sites or generic browser automation.

ai-sdk-developmentSkill

TRIGGER when working with ai-sdk which is Laravel official first-party AI SDK. Activate when building, editing AI agents, chatbots, text generation, image generation, audio/TTS, transcription/STT, embeddings, RAG, vector stores, reranking, structured output, streaming, conversation memory, tools, queueing, broadcasting, and provider failover across OpenAI, Anthropic, Gemini, Azure, Groq, xAI, DeepSeek, Mistral, Ollama, ElevenLabs, Cohere, Jina, and VoyageAI. Invoke when the user references ai-sdk, the `Laravel\Ai\` namespace, or this project's AI features — not for other AI packages used directly.

business-reviewSkill

Use when the user asks to business-review their work (local mode default, via 'business-review' or 'review my branch'), a Relaticle pull request ('--pr <N>' or a bare PR number), or a described change (--describe). v3 is a panel-of-QAs engine. It resolves the live environment first (URLs/creds/queue/Redis/Reverb are DISCOVERED from the running app, never assumed), runs a browser-capability preflight, auto-tiers by blast radius, synthesizes journeys from the diff plus Relaticle CRM priors, walks them happy AND sad through the real browser, sweeps the regression ledger, adversarially cold-reproduces every bug, and emits a substance-gated verdict (ai-approved / ai-rejected / ai-needs-human, or blocked on a degraded channel). Browser-truth only: never tinker or hit the DB to fix or fake a result. On request ('fix all issues', --fix) enters fix mode: fix → re-verify each finding against its original repro → re-gate. Publishing to the PR is opt-in and hard-disabled on a degraded run. Does NOT do code/security/scope review; for that use /code-review, /review, /deep-review.

cashier-stripe-developmentSkill

Handles Laravel Cashier Stripe integration including subscriptions, webhooks, Stripe Checkout, invoices, charges, refunds, trials, coupons, metered billing, and payment failure handling. Triggered when a user mentions Cashier, Billable, IncompletePayment, stripe_id, newSubscription, Stripe subscriptions, or billing. Also applies when setting up webhooks, handling SCA/3DS payment failures, testing with Stripe test cards, or troubleshooting incomplete subscriptions, CSRF webhook errors, or migration publish issues.

configuring-horizonSkill

Use this skill whenever the user mentions Horizon by name in a Laravel context. Covers the full Horizon lifecycle: installing Horizon (horizon:install, Sail setup), configuring config/horizon.php (supervisor blocks, queue assignments, balancing strategies, minProcesses/maxProcesses), fixing the dashboard (authorization via Gate::define viewHorizon, blank metrics, horizon:snapshot scheduling), and troubleshooting production issues (worker crashes, timeout chain ordering, LongWaitDetected notifications, waits config). Also covers job tagging and silencing. Do not use for generic Laravel queues without Horizon, SQS or database drivers, standalone Redis setup, Linux supervisord, Telescope, or job batching.

echo-developmentSkill

Develops real-time broadcasting with Laravel Echo. Activates when setting up broadcasting (Reverb, Pusher, Ably); creating ShouldBroadcast events; defining broadcast channels (public, private, presence, encrypted); authorizing channels; configuring Echo; listening for events; implementing client events (whisper); setting up model broadcasting; broadcasting notifications; or when the user mentions broadcasting, Echo, WebSockets, real-time events, Reverb, or presence channels.

fortify-developmentSkill

ACTIVATE when the user works on authentication in Laravel. This includes login, registration, password reset, email verification, two-factor authentication (2FA/TOTP/QR codes/recovery codes), passkeys, profile updates, password confirmation, or any auth-related routes and controllers. Activate when the user mentions Fortify, auth, authentication, login, register, signup, forgot password, verify email, 2FA, passkeys, WebAuthn, or references app/Actions/Fortify/, CreateNewUser, UpdateUserProfileInformation, FortifyServiceProvider, config/fortify.php, or auth guards. Fortify is the frontend-agnostic authentication backend for Laravel that registers all auth routes and controllers. Also activate when building SPA or headless authentication, customizing login redirects, overriding response contracts like LoginResponse, or configuring login throttling. Do NOT activate for Laravel Passport (OAuth2 API tokens), Socialite (OAuth social login), or non-auth Laravel features.

infer-conventionsSkill

Use this skill to analyze how a Laravel application is actually written and record its conventions as shared rules. Trigger when the user wants to detect, infer, document, or standardize project conventions or coding style, set up or grow `.ai/rules`, resolve mixed or conflicting patterns (e.g. \"are we using Form Requests or inline validation?\"), or onboard agents and teammates to \"how we do things here\". Covers: a systematic sweep of ~49 Laravel convention dimensions (validation, models, architecture, testing, frontend, database, console), open-ended house-pattern discovery, conflict reporting, and recording rules scoped to the right paths via the Boost `record-rule` MCP tool. Do not use for one-off code review, enforcing formatting a linter already handles, or editing `.ai/rules` files by hand.