Offer the dead-end, unrecoverable-failure and retry-cutoff policies on the settings form

Three settings decide what the engine does when a step cannot go on, and none of them was reachable from the settings page, which offered the other eight.

Setting What it decides
on_unrecoverable_failure a step that threw and has spent its retries: raise an incident and leave the run going, or fail the whole run
on_dead_end a branch that took none of its outgoing flows: raise an incident and halt it, or end it quietly and log it
max_advance_attempts how many attempts a failing step gets before either of those applies

All three ship in config/install, are typed and constrained in the config schema and are read by IncidentStore, so the only way to change one was to edit configuration by hand or write an update hook. docs/troubleshooting.md sent a site builder to on_dead_end: complete as the site-wide escape hatch, and docs/incidents.md documented all three as raw YAML.

They go in a section of their own, closed, because the defaults are the right answer for a site that has not met either situation yet. Each option says what it does rather than naming its stored value, and the descriptions say when the other one is the answer.

The cutoff is refused below one rather than quietly overruled: the engine floors the stored value at one, so a zero is a setting the site asked for and did not get, with nothing saying so. A #min on a number element is a browser hint, which a configuration form cannot rely on. A value that is not submitted at all is not a refusal, so a caller validating one section of the form is unaffected.

Tests

  • SettingsFormDurationTest::testTheSiteFormHoldsEverySettingItIsNamedFor — the section and all three fields.
  • SettingsFormDurationTest::testTheFailurePoliciesRoundTripThroughTheForm — submitted and read back from configuration, the cutoff as the integer the schema types it as.
  • SettingsFormDurationTest::testTheAttemptCutoffRefusesLessThanOne — 0, -1 and empty refused, 1 accepted.

The documentation names the page and keeps the stored keys beside it; the French catalogue carries the thirteen new strings (scripts/check-translations.php exits 0). phpcs and phpstan level 5 are clean.

Merge request reports

Loading
Loading