verify
Installation
SKILL.md
Verify
Tests passing is not the finish line. Exercise the actual flow once, in the running application, and report what you observed: never what should happen.
Process
- Pick the flow the change owns. The route a user would hit, the command an operator would run, the job the system would dispatch, the Filament/Livewire page a back-office user would open. Select a small scenario that can expose the changed behavior: grouped or aggregated UI needs multiple related records with distinct values; interactive state needs the action and its reversal (for example expand, collapse, expand), checking controls and content agree each time. Use existing suitable records or isolated fixtures under the guardrails below. Keep the pass focused on the change, not a broad test suite.
- Run it for real.
- HTTP / UI: load the URL the app is already served at. For a Laravel app on Herd that is
https://<dir>.test. Use the project's browser tooling (agent-browser, Boost'sbrowser-logs) to load the page, perform the action, and screenshot the result. A Pest browser test, including one pointed at127.0.0.1, is a test run, not this step. Ifagent-browserfails withERR_CERT_COMMON_NAME_INVALIDafterherd secure, close and reopen the browser session so Chromium reloads the trust store; if a dev toolbar (such as Laravel Debugbar) covers a click target, collapse or disable it rather than forcing the click. - Console: run the artisan command with realistic arguments.
- Jobs / listeners: dispatch through the real path (
dispatchSyncor trigger the event), then check the side effect where it lands, database rows, storage, logs.
- HTTP / UI: load the URL the app is already served at. For a Laravel app on Herd that is
- Check the seams the tests can't see. Before driving the flow, watch them under
Monitorwhere available:tail -f storage/logs/laravel.log | grep --line-buffered -E 'ERROR|CRITICAL|Exception', plusphp artisan queue:workwhen a queued job is involved, so each error arrives tied to the action that caused it. Otherwise read the log tail after each action. Look for browser console errors, the Laravel log (storage/logs/or Boost'sread-log-entries/last-error), a queue that needed a running worker, an unbuilt frontend (a Vite manifest error means runnpm run build, not that the change is broken).- Calculated reports: for one nontrivial record, reconcile detail rows, totals, badges/status, units, and the selected period against an independent worked example or source records. When adjacent values intentionally use different periods or populations, confirm the UI makes that difference explicit. Record the scenario and observed values; an unexplained mismatch fails verification.
- Report faithfully. What you did, what you saw (status codes, redirects, rendered state, rows written), and anything that surprised you: with the evidence. If a step couldn't be exercised (needs credentials, a webhook, a human), say so plainly instead of marking it verified. List each screenshot's path, so a PR opened later can embed it. Start each step's line with ✅ worked as expected, ❌ broke, or ⚠️ surprised you or could not be exercised.
Guardrails
- Verify against local/dev: never run mutating flows against a real environment's data without explicit approval.
- Leave no residue: throwaway records created during verification get cleaned up, or created under an obviously-fake identity the seeds already use.