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() !== ATT_HC_Step::class; } /** * Optional: render extra UI inside this step's card (forms, inputs, etc.). * Default: nothing. Override when the step needs interactive controls * beyond the standard status + notes pattern. */ public function render_extra(array $session_state): void {} /** * Optional: handle a step-specific POST (submitted from a form rendered by * render_extra). Return a finding to append to the autocheck list, or null * to do nothing. * * @param string $action_name name from the form's step_action field * @param array$input $_POST contents (sanitised by caller) */ public function handle_action(string $action_name, array $input): ?array { return null; } }