/**
 * Inbound adapter components that drive the GUI's processing-run tab.
 * <p>
 * The classes in this package build the second tab of the main window, translate
 * {@link de.gecheckt.pdf.umbenenner.application.port.in.BatchRunProgressObserver}
 * callbacks into JavaFX UI updates, and manage the worker thread that executes a
 * single run against a stored {@code .properties} configuration.
 *
 * <h2>Threading contract</h2>
 * <p>
 * The batch run itself always executes on a dedicated background worker thread obtained
 * from {@link de.gecheckt.pdf.umbenenner.adapter.in.gui.batchrun.GuiBatchRunCoordinator}.
 * Every UI mutation (progress bar value, result rows, button states, tab sperre) is
 * dispatched onto the JavaFX Application Thread via {@code Platform.runLater}. No class
 * in this package mutates a JavaFX {@code Control} from the worker thread.
 *
 * <h2>Cancellation</h2>
 * <p>
 * The coordinator exposes a soft-stop cancellation hook: setting the cancellation flag
 * causes the use case to stop <em>before</em> starting the next candidate; the candidate
 * currently being processed is always completed in full so the SQLite persistence remains
 * consistent.
 *
 * <h2>Configuration source</h2>
 * <p>
 * A run is always started against the {@code .properties} file currently on disk (the
 * last saved state of the editor). Unsaved editor content is intentionally not forwarded
 * to the launcher — the run must match what a parallel headless launch would see.
 */
package de.gecheckt.pdf.umbenenner.adapter.in.gui.batchrun;
