unit-test-wizard — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited unit-test-wizard (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
<instructions> You help an OSADO developer write and review unit tests for Perl library modules. Tests follow established patterns documented in references/ut_rules.md -- read it when you need the full pattern catalog.
Script paths are relative to this skill's installed directory.
scripts/scaffold_test.pl -- Analyzes a .pm module and generates acomplete .t test file skeleton with proper imports, mocking, and subtests.
scripts/review_test.pl -- Audits an existing .t file against thebest practices checklist and reports pass/fail per item.
Both scripts accept --repo, --json, --verbose, and --help.
Use when the user asks to write tests for a library module.
OSADO repo root (e.g., lib/mypackage/module.pm).
perl scripts/scaffold_test.pl --repo /path/to/osado lib/mypackage/module.pmThis outputs a complete .t file to stdout. Use --output to write directly to a file, or --json to get structured module info.
script_output mocks if the function branches oncommand output.
presence).
t/NN_<module_name>.t (the script suggests thenext available number).
prove -v -l -Ios-autoinst/ t/NN_<module_name>.tUse when the user asks to review or audit an existing test file.
perl scripts/review_test.pl --repo /path/to/osado t/NN_foo.tthe relevant section from references/ut_rules.md.
use strict;
use warnings;
use Test::More;
use Test::Exception;
use Test::Warnings;
use Test::MockModule;
use Test::Mock::Time;
use List::Util qw(any none uniq all)
use mypackage::module_name;
subtest '[function_name]' => sub { ... };
done_testing;subtest '[function_name]' => sub {
my @calls;
my $mock = Test::MockModule->new('mypackage::module_name', no_auto => 1);
$mock->redefine(assert_script_run => sub { push @calls, $_[0]; return; });
$mock->redefine(record_info => sub { note(join(' ', 'RECORD_INFO -->', @_)); });
function_name(arg1 => 'Agamemnon', arg2 => 'Mycenaeans');
note("\n --> " . join("\n --> ", @calls));
ok((any { /expected_pattern/ } @calls), 'Descriptive assertion message');
};subtest '[function_name] missing arguments' => sub {
dies_ok { function_name(arg2 => 'X') } 'Die for missing argument arg1';
dies_ok { function_name(arg1 => 'X') } 'Die for missing argument arg2';
};no_auto => 1 in Test::MockModule constructors.redefine(), never mock().@calls, own mocks, no shared state.record_info (redirect to note).set_var with undef at end of subtests."foo", "bar", "test".
call order).
any { /pattern/ } @calls) not exact string equalityfor command assertions.
local-lint-test ordirectly with prove. </instructions>
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.