Cycle-overrun fault primitive

Tests verifying the cycle-overrun fault primitive sub-feature (Cycle-overrun fault primitive (FEAT_0018)).

Test Case: Budget breach faults task and halts dispatch TEST_0815
status: implemented
verifies: REQ_0070, REQ_0102
links incoming: REQ_0102, REQ_0070

Item with interval(5ms); budget(1ms); sleeps 3ms in execute(). After one wakeup: task state is Faulted{BudgetExceeded}, overrun_count >= 1, Observer::on_task_fault fired exactly once. Subsequent wakeups must NOT invoke execute() again.

Test Case: Clear task fault resumes dispatch TEST_0816
status: implemented
verifies: REQ_0070
links incoming: REQ_0070

After the task is Faulted (per Budget breach faults task a... (TEST_0815)), clear_task_fault transitions back to Running. Subsequent wakeups invoke execute() again. Observer::on_task_clear fires exactly once. A second breach re-fires the full cycle.

Test Case: Iteration budget faults executor with silent cascade TEST_0817
status: implemented
verifies: REQ_0071, REQ_0073
links incoming: REQ_0071

Executor with iteration_budget(10ms). Two items registered: one healthy, one breaching. After one breach: executor state is Faulted{IterationBudgetExceeded}, Observer::on_executor_fault fired once, and the healthy item transitioned to Faulted{ExecutorFaulted} WITHOUT per-task on_task_fault firing. clear_executor_fault cascade-clears both, firing on_executor_clear once and on_task_clear per cleared task.

Test Case: Fault handler dispatches in place of main item TEST_0818
status: implemented
verifies: REQ_0072
links incoming: REQ_0072

Item registered via add_with_fault_handler(main, handler). After main breaches budget: subsequent wakeups invoke handler.execute(), not main.execute(). clear_task_fault restores main dispatch.

Test Case: Overrun count persists across clears TEST_0819
status: implemented
verifies: REQ_0102
links incoming: REQ_0102, REQ_0070

Force a breach, clear, force another breach. overrun_count is monotonic; not reset by clear_task_fault.

Test Case: Fault state set from worker visible from main TEST_0820
status: implemented
verifies: REQ_0073
links incoming: REQ_0070, REQ_0073

Multi-worker setup; per-task fault state and overrun_count set from a pool worker thread are visible to the main thread without torn reads or panics.

Test Case: Overrun post-execute path zero allocations TEST_0821
status: implemented
verifies: REQ_0060, REQ_0104
links incoming: REQ_0070

CountingAllocator tracks the steady-state overrun post-execute path via the differential-measurement pattern (large vs small run_n); per-iteration allocs == 0.

Test Case: Fault callbacks forwarded to tracing TEST_0822
status: implemented
verifies: REQ_0073
links incoming: REQ_0073

taktora-executor-tracing’s TracingObserver forwards on_task_fault, on_task_clear, on_executor_fault, on_executor_clear to tracing::warn! / tracing::info! on target taktora.fault with the documented field shape.