# Perl Clinic > Modern-Perl review and Test2::V0 tests for one Perl module or script. Paste the code and its .t file, pick the Perl > it runs on, and get a free scan with every legacy idiom and real defect, its line and fix, plus a map of which public > subs the tests call. A metered run reviews and rewrites the module, or writes the test file; the page re-scans both. > Built on the SkillSafe skills @affaan-m/perl-patterns and @affaan-m/perl-testing (affaan-m/everything-claude-code, MIT). Perl Clinic is an independent tool for Perl code. It is not affiliated with or endorsed by The Perl Foundation; Perl is a trademark of The Perl Foundation. https://perl-clinic.skillsafe.ai/ ## What is free - The scan, in the browser, with POD, comments and __END__ ignored: no strict / no warnings; the strict/warnings/feature boilerplate where use v5.36 would do; say without the feature; @_ unpacking instead of signatures; prototypes; return undef; two-argument open, bareword filehandles, unchecked open; new Class(...) indirect object syntax; string eval; no strict 'refs' and symbolic references; SQL built by interpolation; Exporter through @ISA and @EXPORT; a .pm that does not end in 1; (below 5.38); native try/catch before 5.40 and the class keyword before 5.38; mutable globals, circumfix dereference, positional captures, eval-then-$@, blessed hashrefs, blessed()&&isa, each. - The test file: no done_testing or plan, Test::More, is_deeply, eval and $@ instead of dies/lives, monkey-patched subs, our variables, no subtests, fixed plans. - The module's shape (packages, public and private subs, exports, Moo attributes) and which public subs the .t calls. - Every rule is gated by the Perl version (5.26 to 5.40+). Findings CSV and the scan as Markdown. ## The metered lanes Two tasks on gpt-terra, metered per run, routed by `task`. Input string fields: `task` (review or tests), `code`, `tests`, `version` (such as 5.36), `facts` (the page's scan) and the optional `focus`. - `review` replies with `verdict` (ship, refactor, rework), `summary`, `findings` (rule, severity, title, where, why, fix), `prescan` (agree or disagree with each code error and warning), `rewrite` (name and the whole file), `kept` and `caveats`. The page requires every scan error and warning to be answered by rule id, refuses a ship verdict over an undisputed error, re-scans the rewrite (idioms left that are not listed as kept, new problems), and names a package, public sub or export that disappeared. It shows the diff and offers a .patch. - `tests` replies with `summary`, `file` (name and the whole .t), `covers` (sub and the cases asserted), `skipped` (sub and why), `bugs` (behaviours the tests expect to fail against the current code), `run` and `caveats`. The page requires Test2::V0 and done_testing, re-scans the file, requires every public sub to be covered or skipped, checks each claimed sub is really called, and flags calls to subs or attributes the module does not define. ## Links - API tutorial: https://perl-clinic.skillsafe.ai/api.html - Source skills: https://skillsafe.ai/skill/@affaan-m/perl-patterns and https://skillsafe.ai/skill/@affaan-m/perl-testing