Skip and todo annotations explain checks that should not behave like ordinary failures.

Skip And Todo Model

skip_todo_model.pl
use strict;
use warnings;

my $feature = ;
my %available = (
    json  => 1,
    db    => 0,
    cache => 0,
);
my %known_todo = (
    cache => 1,
);

my $state = "run";
if (!$available{$feature}) {
    $state = $known_todo{$feature} ? "todo" : "skip";
}
my $line = "$state - $feature";

print "feature=$feature\n";
print "available=$available{$feature}\n";
print "state=$state\n";
print "line=$line\n";
use strict;
use warnings;

my $feature = ;
my %available = (
    json  => 1,
    db    => 0,
    cache => 0,
);
my %known_todo = (
    cache => 1,
);

my $state = "run";
if (!$available{$feature}) {
    $state = $known_todo{$feature} ? "todo" : "skip";
}
my $line = "$state - $feature";

print "feature=$feature\n";
print "available=$available{$feature}\n";
print "state=$state\n";
print "line=$line\n";
use strict;
use warnings;

my $feature = ;
my %available = (
    json  => 1,
    db    => 0,
    cache => 0,
);
my %known_todo = (
    cache => 1,
);

my $state = "run";
if (!$available{$feature}) {
    $state = $known_todo{$feature} ? "todo" : "skip";
}
my $line = "$state - $feature";

print "feature=$feature\n";
print "available=$available{$feature}\n";
print "state=$state\n";
print "line=$line\n";
skip-todo Skip means the check cannot run in this environment. Todo means a known unfinished behavior is allowed to fail for now.