str, 'level'=>'ok'|'warn'|'bad'|'info', 'label'=>str, 'value'=>str, 'detail'=>str]. * Override in subclasses. Default returns nothing. * * @return array> */ public function autocheck(array $session_state): array { return []; } /** Convenience finding builder for subclasses. */ protected function finding(string $id, string $level, string $label, string $value = '', string $detail = ''): array { if (!in_array($level, ['ok', 'warn', 'bad', 'info'], true)) $level = 'info'; return compact('id', 'level', 'label', 'value', 'detail'); } /** Returns true if any of this step's automation is implemented. Override or rely on autocheck() returning [] by default. */ public function has_autocheck(): bool { $r = new ReflectionMethod($this, 'autocheck'); return $r->getDeclaringClass()->getName() !== WPH_Step::class; } }