1a4b2d2fae
In parallel mode, the behave runner previously replayed captured stdout/stderr for every worker chunk, creating noisy output that obscured failure diagnostics in CI and local runs. Changes to scripts/run_behave_parallel.py: - Added _chunk_has_failures() and _chunk_no_scenarios_ran() helpers to evaluate individual chunk summaries for failure/error/crash conditions. - Updated the aggregation loop in main() to conditionally replay captured stdout/stderr only for chunks whose summary indicates failures, errors, or no scenarios ran (crash detection). Passing chunks now suppress their output entirely. - Added robust exception handling in _worker_run_features() so that worker crashes produce a full traceback in stderr and return a crash summary with features.errors = 1, enabling the parent to detect the crash via _chunk_has_failures (and also _chunk_no_scenarios_ran, since no scenarios reached a terminal state) and replay the diagnostics. - The conditional replay uses summary-based checks rather than the raw runner.run() boolean, consistent with the existing exit-code logic. This avoids spurious log replay for @tdd_expected_fail scenarios whose runner.run() returns True even though the TDD inversion handler has corrected the scenario status to passed. - Existing summary merge, exit semantics, and the no-scenarios safety net are fully preserved. New Behave unit tests (17 scenarios) cover the chunk-level helpers, the conditional aggregation loop, the pure no-scenarios-ran path, stderr replay for non-crash failed chunks, and the worker crash path. New Robot integration tests (6 test cases) verify the same behavior end-to-end via the helper_behave_parallel_log_filtering.py script. Also updated: - CHANGELOG.md: add unreleased entry for this behavioral change. - features/steps/behave_parallel_log_filtering_steps.py: use contextlib.redirect_stdout/redirect_stderr instead of manual sys.stdout assignment; register module in sys.modules; document CWD requirement in _load_runner_module(). - robot/helper_behave_parallel_log_filtering.py: move import io to top-level; remove redundant inline imports; use contextlib for output capture; register module in sys.modules; document CWD requirement. Branch note: the canonical branch for this fix is bugfix/m3-behave-parallel-failed-chunk-logs. The PR head branch (bugfix/mX-behave-parallel-failed-chunk-logs) cannot be renamed via the Forgejo API; both branches are kept in sync at the same SHA. ISSUES CLOSED: #8351