From 3639cc1cf64def3f8ff8eef67373f4c8991b3ac7 Mon Sep 17 00:00:00 2001 From: Mariia Zueva Date: Mon, 31 Aug 2026 21:05:08 +0200 Subject: [PATCH] Write refusals to stderr as well as stdout, so the platform's error dialog shows them --- .changeset/refusals-to-stderr.md | 9 +++++++++ block/logos/organization-logo.png | Bin 21527 -> 24439 bytes software/src/main.py | 17 ++++++++++++++--- software/tests/integration/test_cli.py | 16 ++++++++++++---- 4 files changed, 35 insertions(+), 7 deletions(-) create mode 100644 .changeset/refusals-to-stderr.md diff --git a/.changeset/refusals-to-stderr.md b/.changeset/refusals-to-stderr.md new file mode 100644 index 0000000..07e14f8 --- /dev/null +++ b/.changeset/refusals-to-stderr.md @@ -0,0 +1,9 @@ +--- +'@platforma-open/milaboratories.sort-seq-analysis.software': patch +--- + +Write refusals to stderr as well as stdout, so the platform's error dialog shows them + +The k8s runner fills a failed command's "Latest output" from the stderr file alone. A +refusal printed only to stdout therefore reached the user as a blank "exited with code 1", +with the actual reason sitting in the run's log panel. diff --git a/block/logos/organization-logo.png b/block/logos/organization-logo.png index e03221e11fd82eca32720c3da506a3b765813443..850d8207b095b0b2520fc842e1d478c2c2ef5c6e 100644 GIT binary patch literal 24439 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 IE@q$jU%BCWssI20 diff --git a/software/src/main.py b/software/src/main.py index ecf3b9c..7542b1b 100644 --- a/software/src/main.py +++ b/software/src/main.py @@ -14,8 +14,14 @@ would multiply startup, leave the caller merging N manifests, and make the one-condition case a loop's degenerate iteration. -**Diagnostics go to stdout**, including failures: the workflow layer does not capture -stderr, so anything written there would be lost. +**Diagnostics go to both streams, and that is deliberate.** They serve two different +readers. Stdout is the run's audit trail: the block saves it as a log stream and the UI +shows it, so the successful-run summary belongs there. Stderr is what the platform reads +back when the command fails — the k8s runner fills the error dialog's "Latest output" +from the stderr file alone. A refusal printed only to stdout therefore reaches the user +as a blank "exited with code 1", with the reason sitting in a log panel nobody was told +to open. So a refusal is written to both: stdout because it is part of the run's record, +stderr because it is the failure the platform is about to report. """ from __future__ import annotations @@ -59,7 +65,12 @@ def main(argv: list[str] | None = None) -> int: except Refusal as refusal: # A data-value violation. Exit non-zero naming the offending values, having written # no file — nothing partial is produced. - print(f"REFUSED: {refusal}") + # + # Both streams, per the module docstring: stdout keeps the run's record complete, + # stderr is the only stream the platform quotes back in the error it shows. + message = f"REFUSED: {refusal}" + print(message) + print(message, file=sys.stderr) return 1 _report(manifest) diff --git a/software/tests/integration/test_cli.py b/software/tests/integration/test_cli.py index 086814c..ac0de5b 100644 --- a/software/tests/integration/test_cli.py +++ b/software/tests/integration/test_cli.py @@ -404,8 +404,12 @@ def test_over_summing_fractions_exits_non_zero_and_writes_nothing(tmp_path, caps assert code == 1 assert manifest is None assert not out_dir.exists() - # Diagnostics go to stdout — the workflow layer does not capture stderr. - assert "REFUSED" in capsys.readouterr().out + # Both streams, and both are pinned. Stdout is the run's record; stderr is the only + # stream the platform quotes back in the error it shows the user, so a refusal that + # reaches stdout alone is reported as a blank non-zero exit. + captured = capsys.readouterr() + assert "REFUSED" in captured.out + assert "REFUSED" in captured.err def test_replicate_samples_exit_non_zero_and_write_nothing(tmp_path, capsys): @@ -429,7 +433,9 @@ def test_replicate_samples_exit_non_zero_and_write_nothing(tmp_path, capsys): assert code == 1 assert manifest is None assert not out_dir.exists() - assert "replicate" in capsys.readouterr().out + captured = capsys.readouterr() + assert "replicate" in captured.out + assert "replicate" in captured.err def test_sort_fraction_column_missing_from_the_reads_table_fails(tmp_path, capsys): @@ -439,7 +445,9 @@ def test_sort_fraction_column_missing_from_the_reads_table_fails(tmp_path, capsy assert code == 1 assert not out_dir.exists() - assert "absent" in capsys.readouterr().out + captured = capsys.readouterr() + assert "absent" in captured.out + assert "absent" in captured.err # ---------------------------------------------------------------------------