From 3f0bae0ccffeb3a157865a748d6aa49a43187b51 Mon Sep 17 00:00:00 2001 From: Tim Stranske Date: Sun, 26 Apr 2026 16:07:15 -0500 Subject: [PATCH 1/2] Restore terminal coverage env test state --- .../terminal-disposition-coverage.test.js | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/.github/scripts/__tests__/terminal-disposition-coverage.test.js b/.github/scripts/__tests__/terminal-disposition-coverage.test.js index 02fa032c6..232447fe7 100644 --- a/.github/scripts/__tests__/terminal-disposition-coverage.test.js +++ b/.github/scripts/__tests__/terminal-disposition-coverage.test.js @@ -289,13 +289,28 @@ test('summarizes verifier model compatibility with configurable unsupported mode }); test('accepts aggregate metrics unsupported verifier model env name', () => { + const originalUnsupportedVerifierModels = process.env.UNSUPPORTED_VERIFIER_MODELS; + const originalTerminalDispositionUnsupportedCodexModels = + process.env.TERMINAL_DISPOSITION_UNSUPPORTED_CODEX_MODELS; + process.env.UNSUPPORTED_VERIFIER_MODELS = 'legacy-bad, gpt-5.2-codex'; delete process.env.TERMINAL_DISPOSITION_UNSUPPORTED_CODEX_MODELS; try { assert.deepEqual(normalizeUnsupportedCodexModels(), ['gpt-5.2-codex', 'legacy-bad']); } finally { - delete process.env.UNSUPPORTED_VERIFIER_MODELS; + if (originalUnsupportedVerifierModels === undefined) { + delete process.env.UNSUPPORTED_VERIFIER_MODELS; + } else { + process.env.UNSUPPORTED_VERIFIER_MODELS = originalUnsupportedVerifierModels; + } + + if (originalTerminalDispositionUnsupportedCodexModels === undefined) { + delete process.env.TERMINAL_DISPOSITION_UNSUPPORTED_CODEX_MODELS; + } else { + process.env.TERMINAL_DISPOSITION_UNSUPPORTED_CODEX_MODELS = + originalTerminalDispositionUnsupportedCodexModels; + } } }); From 63160cfe70075df279ab9c401f68006dc9b0937b Mon Sep 17 00:00:00 2001 From: Tim Stranske Date: Sun, 26 Apr 2026 16:08:12 -0500 Subject: [PATCH 2/2] Lock parse error overflow attribution --- tests/scripts/test_aggregate_agent_metrics.py | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/tests/scripts/test_aggregate_agent_metrics.py b/tests/scripts/test_aggregate_agent_metrics.py index baf6c9dd2..fa5a3f8a0 100644 --- a/tests/scripts/test_aggregate_agent_metrics.py +++ b/tests/scripts/test_aggregate_agent_metrics.py @@ -499,6 +499,52 @@ def test_append_parse_error_detail_caps_stored_details() -> None: assert details[-1].line is None +def test_parse_error_detail_overflow_does_not_use_incoming_identity() -> None: + details = [ + aggregate_agent_metrics.ParseErrorDetail( + path="first.ndjson", + artifact="first-artifact", + artifact_family="first-family", + line=1, + reason="invalid-json", + ), + aggregate_agent_metrics.ParseErrorDetail( + path="second.ndjson", + artifact="second-artifact", + artifact_family="second-family", + line=2, + reason="non-object-json", + ), + ] + + aggregate_agent_metrics._append_parse_error_detail( + details, + aggregate_agent_metrics.ParseErrorDetail( + path="third.ndjson", + artifact="third-artifact", + artifact_family="third-family", + line=3, + reason="unreadable-file", + ), + detail_limit=2, + ) + + contract = aggregate_agent_metrics._parse_error_contract(details) + + assert len(details) == 2 + assert details[0].path == "first.ndjson" + assert details[-1].path == "__multiple__" + assert details[-1].artifact == "__multiple__" + assert details[-1].artifact_family == "__multiple__" + assert details[-1].reason == "additional-parse-errors-after-detail-limit" + assert contract["count"] == 3 + assert contract["by_reason"] == { + "additional-parse-errors-after-detail-limit": 2, + "invalid-json": 1, + } + assert "third-artifact" not in contract["by_artifact"] + + def test_read_ndjson_preserves_artifact_name_with_id_extraction_dir(tmp_path: Path) -> None: metrics_dir = ( tmp_path