From 50f690b861af843d9112c8f090ea04512c910cbe Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 23 Oct 2025 19:40:34 +0000 Subject: [PATCH 1/4] Initial plan From 84665a2efcc89d15405516d01875c40026397700 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 23 Oct 2025 19:50:46 +0000 Subject: [PATCH 2/4] Initial exploration - understand max-turns limit handling Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .github/workflows/artifacts-summary.lock.yml | 2 +- .github/workflows/audit-workflows.lock.yml | 2 +- .github/workflows/blog-auditor.lock.yml | 2 +- .github/workflows/brave.lock.yml | 2 +- .github/workflows/changeset-generator.lock.yml | 2 +- .github/workflows/ci-doctor.lock.yml | 2 +- .github/workflows/cli-version-checker.lock.yml | 2 +- .github/workflows/commit-changes-analyzer.lock.yml | 2 +- .github/workflows/copilot-agent-analysis.lock.yml | 2 +- .github/workflows/daily-doc-updater.lock.yml | 2 +- .github/workflows/daily-news.lock.yml | 2 +- .github/workflows/daily-perf-improver.lock.yml | 2 +- .github/workflows/daily-test-improver.lock.yml | 2 +- .github/workflows/dev-hawk.lock.yml | 2 +- .github/workflows/dev.firewall.lock.yml | 2 +- .github/workflows/dev.lock.yml | 2 +- .github/workflows/dictation-prompt.lock.yml | 2 +- .github/workflows/duplicate-code-detector.lock.yml | 2 +- .github/workflows/example-workflow-analyzer.lock.yml | 2 +- .github/workflows/github-mcp-tools-report.lock.yml | 2 +- .github/workflows/go-logger.lock.yml | 2 +- .github/workflows/go-pattern-detector.lock.yml | 2 +- .github/workflows/instructions-janitor.lock.yml | 2 +- .github/workflows/issue-classifier.lock.yml | 2 +- .github/workflows/lockfile-stats.lock.yml | 2 +- .github/workflows/mcp-inspector.lock.yml | 2 +- .github/workflows/notion-issue-summary.lock.yml | 2 +- .github/workflows/pdf-summary.lock.yml | 2 +- .github/workflows/plan.lock.yml | 2 +- .github/workflows/poem-bot.lock.yml | 2 +- .github/workflows/q.lock.yml | 2 +- .github/workflows/repo-tree-map.lock.yml | 2 +- .github/workflows/research.lock.yml | 2 +- .github/workflows/schema-consistency-checker.lock.yml | 2 +- .github/workflows/scout.lock.yml | 2 +- .github/workflows/security-fix-pr.lock.yml | 2 +- .github/workflows/semantic-function-refactor.lock.yml | 2 +- .github/workflows/smoke-claude.lock.yml | 2 +- .github/workflows/smoke-codex.lock.yml | 2 +- .github/workflows/smoke-copilot.lock.yml | 2 +- .github/workflows/smoke-detector.lock.yml | 2 +- .github/workflows/smoke-genaiscript.lock.yml | 2 +- .github/workflows/smoke-opencode.lock.yml | 2 +- .github/workflows/technical-doc-writer.lock.yml | 2 +- .github/workflows/test-jqschema.lock.yml | 2 +- .github/workflows/test-post-steps.lock.yml | 2 +- .github/workflows/test-svelte.lock.yml | 2 +- .github/workflows/tidy.lock.yml | 2 +- .github/workflows/unbloat-docs.lock.yml | 2 +- .github/workflows/video-analyzer.lock.yml | 2 +- .github/workflows/weekly-issue-summary.lock.yml | 2 +- 51 files changed, 51 insertions(+), 51 deletions(-) diff --git a/.github/workflows/artifacts-summary.lock.yml b/.github/workflows/artifacts-summary.lock.yml index a218ccd3ba4..6f39dfc6483 100644 --- a/.github/workflows/artifacts-summary.lock.yml +++ b/.github/workflows/artifacts-summary.lock.yml @@ -1373,7 +1373,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/audit-workflows.lock.yml b/.github/workflows/audit-workflows.lock.yml index 4bed58e6005..f02bef3277f 100644 --- a/.github/workflows/audit-workflows.lock.yml +++ b/.github/workflows/audit-workflows.lock.yml @@ -1878,7 +1878,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/blog-auditor.lock.yml b/.github/workflows/blog-auditor.lock.yml index aea19a8daa4..d79adbc5966 100644 --- a/.github/workflows/blog-auditor.lock.yml +++ b/.github/workflows/blog-auditor.lock.yml @@ -1804,7 +1804,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/brave.lock.yml b/.github/workflows/brave.lock.yml index de923408bd3..adbfec89740 100644 --- a/.github/workflows/brave.lock.yml +++ b/.github/workflows/brave.lock.yml @@ -2463,7 +2463,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/changeset-generator.lock.yml b/.github/workflows/changeset-generator.lock.yml index ab528642ca7..38231dc21dc 100644 --- a/.github/workflows/changeset-generator.lock.yml +++ b/.github/workflows/changeset-generator.lock.yml @@ -2171,7 +2171,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/ci-doctor.lock.yml b/.github/workflows/ci-doctor.lock.yml index e49f633e11d..d230d134854 100644 --- a/.github/workflows/ci-doctor.lock.yml +++ b/.github/workflows/ci-doctor.lock.yml @@ -1901,7 +1901,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/cli-version-checker.lock.yml b/.github/workflows/cli-version-checker.lock.yml index 168f0a46e1a..397d45138fd 100644 --- a/.github/workflows/cli-version-checker.lock.yml +++ b/.github/workflows/cli-version-checker.lock.yml @@ -1743,7 +1743,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/commit-changes-analyzer.lock.yml b/.github/workflows/commit-changes-analyzer.lock.yml index 6fd830ed825..e6432d9feb4 100644 --- a/.github/workflows/commit-changes-analyzer.lock.yml +++ b/.github/workflows/commit-changes-analyzer.lock.yml @@ -1696,7 +1696,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/copilot-agent-analysis.lock.yml b/.github/workflows/copilot-agent-analysis.lock.yml index eb0f73d8061..4d1eae89403 100644 --- a/.github/workflows/copilot-agent-analysis.lock.yml +++ b/.github/workflows/copilot-agent-analysis.lock.yml @@ -1985,7 +1985,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/daily-doc-updater.lock.yml b/.github/workflows/daily-doc-updater.lock.yml index ce7b0ba0176..69630698d40 100644 --- a/.github/workflows/daily-doc-updater.lock.yml +++ b/.github/workflows/daily-doc-updater.lock.yml @@ -1659,7 +1659,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/daily-news.lock.yml b/.github/workflows/daily-news.lock.yml index 476f0de294a..f7e111ede53 100644 --- a/.github/workflows/daily-news.lock.yml +++ b/.github/workflows/daily-news.lock.yml @@ -1546,7 +1546,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/daily-perf-improver.lock.yml b/.github/workflows/daily-perf-improver.lock.yml index 1e19285ce7a..c538bb3bd2b 100644 --- a/.github/workflows/daily-perf-improver.lock.yml +++ b/.github/workflows/daily-perf-improver.lock.yml @@ -1896,7 +1896,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/daily-test-improver.lock.yml b/.github/workflows/daily-test-improver.lock.yml index 2ceb9414125..d7275e6f66d 100644 --- a/.github/workflows/daily-test-improver.lock.yml +++ b/.github/workflows/daily-test-improver.lock.yml @@ -1870,7 +1870,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/dev-hawk.lock.yml b/.github/workflows/dev-hawk.lock.yml index 742ccd624fa..0063fc899ff 100644 --- a/.github/workflows/dev-hawk.lock.yml +++ b/.github/workflows/dev-hawk.lock.yml @@ -1803,7 +1803,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/dev.firewall.lock.yml b/.github/workflows/dev.firewall.lock.yml index 48518f36b36..8949ff47993 100644 --- a/.github/workflows/dev.firewall.lock.yml +++ b/.github/workflows/dev.firewall.lock.yml @@ -518,7 +518,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/dev.lock.yml b/.github/workflows/dev.lock.yml index cdec08ce993..17888f2f750 100644 --- a/.github/workflows/dev.lock.yml +++ b/.github/workflows/dev.lock.yml @@ -497,7 +497,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/dictation-prompt.lock.yml b/.github/workflows/dictation-prompt.lock.yml index 2772f9622bb..8218c28879e 100644 --- a/.github/workflows/dictation-prompt.lock.yml +++ b/.github/workflows/dictation-prompt.lock.yml @@ -1457,7 +1457,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/duplicate-code-detector.lock.yml b/.github/workflows/duplicate-code-detector.lock.yml index 7208ccd9cec..6a19b841ec0 100644 --- a/.github/workflows/duplicate-code-detector.lock.yml +++ b/.github/workflows/duplicate-code-detector.lock.yml @@ -1523,7 +1523,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/example-workflow-analyzer.lock.yml b/.github/workflows/example-workflow-analyzer.lock.yml index b6c3ab1811a..e44d86960a9 100644 --- a/.github/workflows/example-workflow-analyzer.lock.yml +++ b/.github/workflows/example-workflow-analyzer.lock.yml @@ -1431,7 +1431,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/github-mcp-tools-report.lock.yml b/.github/workflows/github-mcp-tools-report.lock.yml index f89fd10af84..4b045634424 100644 --- a/.github/workflows/github-mcp-tools-report.lock.yml +++ b/.github/workflows/github-mcp-tools-report.lock.yml @@ -1925,7 +1925,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/go-logger.lock.yml b/.github/workflows/go-logger.lock.yml index c843be7c6a3..2601c6cb14e 100644 --- a/.github/workflows/go-logger.lock.yml +++ b/.github/workflows/go-logger.lock.yml @@ -1705,7 +1705,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/go-pattern-detector.lock.yml b/.github/workflows/go-pattern-detector.lock.yml index 4d078534c87..47167bbdfa7 100644 --- a/.github/workflows/go-pattern-detector.lock.yml +++ b/.github/workflows/go-pattern-detector.lock.yml @@ -1600,7 +1600,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/instructions-janitor.lock.yml b/.github/workflows/instructions-janitor.lock.yml index 0cf73fac618..691e562d9a8 100644 --- a/.github/workflows/instructions-janitor.lock.yml +++ b/.github/workflows/instructions-janitor.lock.yml @@ -1656,7 +1656,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/issue-classifier.lock.yml b/.github/workflows/issue-classifier.lock.yml index fa2af899f7e..c44f863f6d0 100644 --- a/.github/workflows/issue-classifier.lock.yml +++ b/.github/workflows/issue-classifier.lock.yml @@ -2025,7 +2025,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/lockfile-stats.lock.yml b/.github/workflows/lockfile-stats.lock.yml index bb1d50e49c1..aa24cf2a525 100644 --- a/.github/workflows/lockfile-stats.lock.yml +++ b/.github/workflows/lockfile-stats.lock.yml @@ -1868,7 +1868,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/mcp-inspector.lock.yml b/.github/workflows/mcp-inspector.lock.yml index a6fbf90d27f..efa35de3fc4 100644 --- a/.github/workflows/mcp-inspector.lock.yml +++ b/.github/workflows/mcp-inspector.lock.yml @@ -2286,7 +2286,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/notion-issue-summary.lock.yml b/.github/workflows/notion-issue-summary.lock.yml index de6963611c2..d068685a186 100644 --- a/.github/workflows/notion-issue-summary.lock.yml +++ b/.github/workflows/notion-issue-summary.lock.yml @@ -1307,7 +1307,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/pdf-summary.lock.yml b/.github/workflows/pdf-summary.lock.yml index 7b04ddf8936..680b9196e42 100644 --- a/.github/workflows/pdf-summary.lock.yml +++ b/.github/workflows/pdf-summary.lock.yml @@ -2432,7 +2432,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/plan.lock.yml b/.github/workflows/plan.lock.yml index c846c2f61e0..dd78217f153 100644 --- a/.github/workflows/plan.lock.yml +++ b/.github/workflows/plan.lock.yml @@ -1922,7 +1922,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/poem-bot.lock.yml b/.github/workflows/poem-bot.lock.yml index 3b0a3a0f819..6d33a9ac7bd 100644 --- a/.github/workflows/poem-bot.lock.yml +++ b/.github/workflows/poem-bot.lock.yml @@ -2676,7 +2676,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/q.lock.yml b/.github/workflows/q.lock.yml index f8017d7fa39..11e97cd288e 100644 --- a/.github/workflows/q.lock.yml +++ b/.github/workflows/q.lock.yml @@ -2734,7 +2734,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/repo-tree-map.lock.yml b/.github/workflows/repo-tree-map.lock.yml index 87fed77c646..67374dc8e44 100644 --- a/.github/workflows/repo-tree-map.lock.yml +++ b/.github/workflows/repo-tree-map.lock.yml @@ -1405,7 +1405,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/research.lock.yml b/.github/workflows/research.lock.yml index 5ef310c73e5..5cfe0372688 100644 --- a/.github/workflows/research.lock.yml +++ b/.github/workflows/research.lock.yml @@ -1327,7 +1327,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/schema-consistency-checker.lock.yml b/.github/workflows/schema-consistency-checker.lock.yml index e7f03062719..c142721c109 100644 --- a/.github/workflows/schema-consistency-checker.lock.yml +++ b/.github/workflows/schema-consistency-checker.lock.yml @@ -1835,7 +1835,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/scout.lock.yml b/.github/workflows/scout.lock.yml index 386c02fa626..255542319de 100644 --- a/.github/workflows/scout.lock.yml +++ b/.github/workflows/scout.lock.yml @@ -3059,7 +3059,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/security-fix-pr.lock.yml b/.github/workflows/security-fix-pr.lock.yml index ab33b598afb..6799427a10a 100644 --- a/.github/workflows/security-fix-pr.lock.yml +++ b/.github/workflows/security-fix-pr.lock.yml @@ -1602,7 +1602,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/semantic-function-refactor.lock.yml b/.github/workflows/semantic-function-refactor.lock.yml index 3f75376923a..b0251caa02b 100644 --- a/.github/workflows/semantic-function-refactor.lock.yml +++ b/.github/workflows/semantic-function-refactor.lock.yml @@ -1873,7 +1873,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/smoke-claude.lock.yml b/.github/workflows/smoke-claude.lock.yml index b438acb0939..f3a4845af50 100644 --- a/.github/workflows/smoke-claude.lock.yml +++ b/.github/workflows/smoke-claude.lock.yml @@ -1440,7 +1440,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/smoke-codex.lock.yml b/.github/workflows/smoke-codex.lock.yml index e9a3c7641bb..66af8e4fb86 100644 --- a/.github/workflows/smoke-codex.lock.yml +++ b/.github/workflows/smoke-codex.lock.yml @@ -1260,7 +1260,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/smoke-copilot.lock.yml b/.github/workflows/smoke-copilot.lock.yml index 6e1ddde4a4c..a10acee6525 100644 --- a/.github/workflows/smoke-copilot.lock.yml +++ b/.github/workflows/smoke-copilot.lock.yml @@ -1278,7 +1278,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/smoke-detector.lock.yml b/.github/workflows/smoke-detector.lock.yml index 648709ce224..607de7db191 100644 --- a/.github/workflows/smoke-detector.lock.yml +++ b/.github/workflows/smoke-detector.lock.yml @@ -2022,7 +2022,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/smoke-genaiscript.lock.yml b/.github/workflows/smoke-genaiscript.lock.yml index a9dc4917e0f..a8e06f9ceb3 100644 --- a/.github/workflows/smoke-genaiscript.lock.yml +++ b/.github/workflows/smoke-genaiscript.lock.yml @@ -1260,7 +1260,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/smoke-opencode.lock.yml b/.github/workflows/smoke-opencode.lock.yml index c2130e0ec4e..94407a4825f 100644 --- a/.github/workflows/smoke-opencode.lock.yml +++ b/.github/workflows/smoke-opencode.lock.yml @@ -1289,7 +1289,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/technical-doc-writer.lock.yml b/.github/workflows/technical-doc-writer.lock.yml index a425ee540fe..cb6a4e42367 100644 --- a/.github/workflows/technical-doc-writer.lock.yml +++ b/.github/workflows/technical-doc-writer.lock.yml @@ -2335,7 +2335,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/test-jqschema.lock.yml b/.github/workflows/test-jqschema.lock.yml index c0290131037..6ded2a4aa63 100644 --- a/.github/workflows/test-jqschema.lock.yml +++ b/.github/workflows/test-jqschema.lock.yml @@ -570,7 +570,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/test-post-steps.lock.yml b/.github/workflows/test-post-steps.lock.yml index d8faea94a95..98616f0e6d5 100644 --- a/.github/workflows/test-post-steps.lock.yml +++ b/.github/workflows/test-post-steps.lock.yml @@ -468,7 +468,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/test-svelte.lock.yml b/.github/workflows/test-svelte.lock.yml index 62f12537256..e9f038f88ab 100644 --- a/.github/workflows/test-svelte.lock.yml +++ b/.github/workflows/test-svelte.lock.yml @@ -505,7 +505,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/tidy.lock.yml b/.github/workflows/tidy.lock.yml index d198e74557b..c276f410c62 100644 --- a/.github/workflows/tidy.lock.yml +++ b/.github/workflows/tidy.lock.yml @@ -1809,7 +1809,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/unbloat-docs.lock.yml b/.github/workflows/unbloat-docs.lock.yml index 98344616b33..7970326c477 100644 --- a/.github/workflows/unbloat-docs.lock.yml +++ b/.github/workflows/unbloat-docs.lock.yml @@ -2573,7 +2573,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/video-analyzer.lock.yml b/.github/workflows/video-analyzer.lock.yml index 9c426d9d107..12dec30f558 100644 --- a/.github/workflows/video-analyzer.lock.yml +++ b/.github/workflows/video-analyzer.lock.yml @@ -1573,7 +1573,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; diff --git a/.github/workflows/weekly-issue-summary.lock.yml b/.github/workflows/weekly-issue-summary.lock.yml index 38036cce0bf..0ba24399ba5 100644 --- a/.github/workflows/weekly-issue-summary.lock.yml +++ b/.github/workflows/weekly-issue-summary.lock.yml @@ -1296,7 +1296,7 @@ jobs: return; } core.info(`Found ${secretValues.length} secret(s) to redact`); - const targetExtensions = [".txt", ".json", ".log"]; + const targetExtensions = [".txt", ".json", ".log", ".md", ".mdx", ".yml", ".jsonl"]; const files = findFiles("/tmp/gh-aw", targetExtensions); core.info(`Found ${files.length} file(s) to scan for secrets`); let totalRedactions = 0; From aa277357c006ea2632a79bc709aa87a6f7d4553f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 23 Oct 2025 19:57:36 +0000 Subject: [PATCH 3/4] Add max-turns limit detection for Claude engine Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .github/workflows/audit-workflows.lock.yml | 15 ++- .github/workflows/blog-auditor.lock.yml | 15 ++- .../workflows/changeset-generator.lock.yml | 15 ++- .../workflows/cli-version-checker.lock.yml | 15 ++- .../commit-changes-analyzer.lock.yml | 15 ++- .../workflows/copilot-agent-analysis.lock.yml | 15 ++- .github/workflows/daily-doc-updater.lock.yml | 15 ++- .../example-workflow-analyzer.lock.yml | 15 ++- .../github-mcp-tools-report.lock.yml | 15 ++- .github/workflows/go-logger.lock.yml | 15 ++- .../workflows/go-pattern-detector.lock.yml | 15 ++- .../workflows/instructions-janitor.lock.yml | 15 ++- .github/workflows/lockfile-stats.lock.yml | 15 ++- .../schema-consistency-checker.lock.yml | 15 ++- .github/workflows/scout.lock.yml | 15 ++- .github/workflows/security-fix-pr.lock.yml | 15 ++- .../semantic-function-refactor.lock.yml | 15 ++- .github/workflows/smoke-claude.lock.yml | 15 ++- .github/workflows/smoke-detector.lock.yml | 15 ++- .../workflows/technical-doc-writer.lock.yml | 15 ++- .github/workflows/unbloat-docs.lock.yml | 15 ++- pkg/workflow/js/parse_claude_log.cjs | 19 ++- pkg/workflow/js/parse_claude_log.test.cjs | 117 ++++++++++++++++++ 23 files changed, 428 insertions(+), 23 deletions(-) diff --git a/.github/workflows/audit-workflows.lock.yml b/.github/workflows/audit-workflows.lock.yml index f02bef3277f..0d8681dd050 100644 --- a/.github/workflows/audit-workflows.lock.yml +++ b/.github/workflows/audit-workflows.lock.yml @@ -2714,6 +2714,9 @@ jobs: const failedServers = result.mcpFailures.join(", "); core.setFailed(`MCP server(s) failed to launch: ${failedServers}`); } + if (result.maxTurnsHit) { + core.setFailed(`Agent execution stopped: max-turns limit reached. The agent did not complete its task successfully.`); + } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); core.setFailed(errorMessage); @@ -2761,6 +2764,7 @@ jobs: return { markdown: "## Agent Log Summary\n\nLog format not recognized as Claude JSON array or JSONL.\n", mcpFailures: [], + maxTurnsHit: false, }; } const toolUsePairs = new Map(); @@ -2868,12 +2872,21 @@ jobs: markdown += `**Permission Denials:** ${lastEntry.permission_denials.length}\n\n`; } } - return { markdown, mcpFailures }; + let maxTurnsHit = false; + const maxTurns = process.env.GH_AW_MAX_TURNS; + if (maxTurns && lastEntry && lastEntry.num_turns) { + const configuredMaxTurns = parseInt(maxTurns, 10); + if (!isNaN(configuredMaxTurns) && lastEntry.num_turns >= configuredMaxTurns) { + maxTurnsHit = true; + } + } + return { markdown, mcpFailures, maxTurnsHit }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); return { markdown: `## Agent Log Summary\n\nError parsing Claude log (tried both JSON array and JSONL formats): ${errorMessage}\n`, mcpFailures: [], + maxTurnsHit: false, }; } } diff --git a/.github/workflows/blog-auditor.lock.yml b/.github/workflows/blog-auditor.lock.yml index d79adbc5966..413ce186dc5 100644 --- a/.github/workflows/blog-auditor.lock.yml +++ b/.github/workflows/blog-auditor.lock.yml @@ -2640,6 +2640,9 @@ jobs: const failedServers = result.mcpFailures.join(", "); core.setFailed(`MCP server(s) failed to launch: ${failedServers}`); } + if (result.maxTurnsHit) { + core.setFailed(`Agent execution stopped: max-turns limit reached. The agent did not complete its task successfully.`); + } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); core.setFailed(errorMessage); @@ -2687,6 +2690,7 @@ jobs: return { markdown: "## Agent Log Summary\n\nLog format not recognized as Claude JSON array or JSONL.\n", mcpFailures: [], + maxTurnsHit: false, }; } const toolUsePairs = new Map(); @@ -2794,12 +2798,21 @@ jobs: markdown += `**Permission Denials:** ${lastEntry.permission_denials.length}\n\n`; } } - return { markdown, mcpFailures }; + let maxTurnsHit = false; + const maxTurns = process.env.GH_AW_MAX_TURNS; + if (maxTurns && lastEntry && lastEntry.num_turns) { + const configuredMaxTurns = parseInt(maxTurns, 10); + if (!isNaN(configuredMaxTurns) && lastEntry.num_turns >= configuredMaxTurns) { + maxTurnsHit = true; + } + } + return { markdown, mcpFailures, maxTurnsHit }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); return { markdown: `## Agent Log Summary\n\nError parsing Claude log (tried both JSON array and JSONL formats): ${errorMessage}\n`, mcpFailures: [], + maxTurnsHit: false, }; } } diff --git a/.github/workflows/changeset-generator.lock.yml b/.github/workflows/changeset-generator.lock.yml index 38231dc21dc..6b8a386e1ee 100644 --- a/.github/workflows/changeset-generator.lock.yml +++ b/.github/workflows/changeset-generator.lock.yml @@ -3007,6 +3007,9 @@ jobs: const failedServers = result.mcpFailures.join(", "); core.setFailed(`MCP server(s) failed to launch: ${failedServers}`); } + if (result.maxTurnsHit) { + core.setFailed(`Agent execution stopped: max-turns limit reached. The agent did not complete its task successfully.`); + } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); core.setFailed(errorMessage); @@ -3054,6 +3057,7 @@ jobs: return { markdown: "## Agent Log Summary\n\nLog format not recognized as Claude JSON array or JSONL.\n", mcpFailures: [], + maxTurnsHit: false, }; } const toolUsePairs = new Map(); @@ -3161,12 +3165,21 @@ jobs: markdown += `**Permission Denials:** ${lastEntry.permission_denials.length}\n\n`; } } - return { markdown, mcpFailures }; + let maxTurnsHit = false; + const maxTurns = process.env.GH_AW_MAX_TURNS; + if (maxTurns && lastEntry && lastEntry.num_turns) { + const configuredMaxTurns = parseInt(maxTurns, 10); + if (!isNaN(configuredMaxTurns) && lastEntry.num_turns >= configuredMaxTurns) { + maxTurnsHit = true; + } + } + return { markdown, mcpFailures, maxTurnsHit }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); return { markdown: `## Agent Log Summary\n\nError parsing Claude log (tried both JSON array and JSONL formats): ${errorMessage}\n`, mcpFailures: [], + maxTurnsHit: false, }; } } diff --git a/.github/workflows/cli-version-checker.lock.yml b/.github/workflows/cli-version-checker.lock.yml index 397d45138fd..b3d760279cb 100644 --- a/.github/workflows/cli-version-checker.lock.yml +++ b/.github/workflows/cli-version-checker.lock.yml @@ -2579,6 +2579,9 @@ jobs: const failedServers = result.mcpFailures.join(", "); core.setFailed(`MCP server(s) failed to launch: ${failedServers}`); } + if (result.maxTurnsHit) { + core.setFailed(`Agent execution stopped: max-turns limit reached. The agent did not complete its task successfully.`); + } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); core.setFailed(errorMessage); @@ -2626,6 +2629,7 @@ jobs: return { markdown: "## Agent Log Summary\n\nLog format not recognized as Claude JSON array or JSONL.\n", mcpFailures: [], + maxTurnsHit: false, }; } const toolUsePairs = new Map(); @@ -2733,12 +2737,21 @@ jobs: markdown += `**Permission Denials:** ${lastEntry.permission_denials.length}\n\n`; } } - return { markdown, mcpFailures }; + let maxTurnsHit = false; + const maxTurns = process.env.GH_AW_MAX_TURNS; + if (maxTurns && lastEntry && lastEntry.num_turns) { + const configuredMaxTurns = parseInt(maxTurns, 10); + if (!isNaN(configuredMaxTurns) && lastEntry.num_turns >= configuredMaxTurns) { + maxTurnsHit = true; + } + } + return { markdown, mcpFailures, maxTurnsHit }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); return { markdown: `## Agent Log Summary\n\nError parsing Claude log (tried both JSON array and JSONL formats): ${errorMessage}\n`, mcpFailures: [], + maxTurnsHit: false, }; } } diff --git a/.github/workflows/commit-changes-analyzer.lock.yml b/.github/workflows/commit-changes-analyzer.lock.yml index e6432d9feb4..0d083f06f1e 100644 --- a/.github/workflows/commit-changes-analyzer.lock.yml +++ b/.github/workflows/commit-changes-analyzer.lock.yml @@ -2532,6 +2532,9 @@ jobs: const failedServers = result.mcpFailures.join(", "); core.setFailed(`MCP server(s) failed to launch: ${failedServers}`); } + if (result.maxTurnsHit) { + core.setFailed(`Agent execution stopped: max-turns limit reached. The agent did not complete its task successfully.`); + } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); core.setFailed(errorMessage); @@ -2579,6 +2582,7 @@ jobs: return { markdown: "## Agent Log Summary\n\nLog format not recognized as Claude JSON array or JSONL.\n", mcpFailures: [], + maxTurnsHit: false, }; } const toolUsePairs = new Map(); @@ -2686,12 +2690,21 @@ jobs: markdown += `**Permission Denials:** ${lastEntry.permission_denials.length}\n\n`; } } - return { markdown, mcpFailures }; + let maxTurnsHit = false; + const maxTurns = process.env.GH_AW_MAX_TURNS; + if (maxTurns && lastEntry && lastEntry.num_turns) { + const configuredMaxTurns = parseInt(maxTurns, 10); + if (!isNaN(configuredMaxTurns) && lastEntry.num_turns >= configuredMaxTurns) { + maxTurnsHit = true; + } + } + return { markdown, mcpFailures, maxTurnsHit }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); return { markdown: `## Agent Log Summary\n\nError parsing Claude log (tried both JSON array and JSONL formats): ${errorMessage}\n`, mcpFailures: [], + maxTurnsHit: false, }; } } diff --git a/.github/workflows/copilot-agent-analysis.lock.yml b/.github/workflows/copilot-agent-analysis.lock.yml index 4d1eae89403..9b3009acc3b 100644 --- a/.github/workflows/copilot-agent-analysis.lock.yml +++ b/.github/workflows/copilot-agent-analysis.lock.yml @@ -2821,6 +2821,9 @@ jobs: const failedServers = result.mcpFailures.join(", "); core.setFailed(`MCP server(s) failed to launch: ${failedServers}`); } + if (result.maxTurnsHit) { + core.setFailed(`Agent execution stopped: max-turns limit reached. The agent did not complete its task successfully.`); + } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); core.setFailed(errorMessage); @@ -2868,6 +2871,7 @@ jobs: return { markdown: "## Agent Log Summary\n\nLog format not recognized as Claude JSON array or JSONL.\n", mcpFailures: [], + maxTurnsHit: false, }; } const toolUsePairs = new Map(); @@ -2975,12 +2979,21 @@ jobs: markdown += `**Permission Denials:** ${lastEntry.permission_denials.length}\n\n`; } } - return { markdown, mcpFailures }; + let maxTurnsHit = false; + const maxTurns = process.env.GH_AW_MAX_TURNS; + if (maxTurns && lastEntry && lastEntry.num_turns) { + const configuredMaxTurns = parseInt(maxTurns, 10); + if (!isNaN(configuredMaxTurns) && lastEntry.num_turns >= configuredMaxTurns) { + maxTurnsHit = true; + } + } + return { markdown, mcpFailures, maxTurnsHit }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); return { markdown: `## Agent Log Summary\n\nError parsing Claude log (tried both JSON array and JSONL formats): ${errorMessage}\n`, mcpFailures: [], + maxTurnsHit: false, }; } } diff --git a/.github/workflows/daily-doc-updater.lock.yml b/.github/workflows/daily-doc-updater.lock.yml index 69630698d40..4924a155fbe 100644 --- a/.github/workflows/daily-doc-updater.lock.yml +++ b/.github/workflows/daily-doc-updater.lock.yml @@ -2495,6 +2495,9 @@ jobs: const failedServers = result.mcpFailures.join(", "); core.setFailed(`MCP server(s) failed to launch: ${failedServers}`); } + if (result.maxTurnsHit) { + core.setFailed(`Agent execution stopped: max-turns limit reached. The agent did not complete its task successfully.`); + } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); core.setFailed(errorMessage); @@ -2542,6 +2545,7 @@ jobs: return { markdown: "## Agent Log Summary\n\nLog format not recognized as Claude JSON array or JSONL.\n", mcpFailures: [], + maxTurnsHit: false, }; } const toolUsePairs = new Map(); @@ -2649,12 +2653,21 @@ jobs: markdown += `**Permission Denials:** ${lastEntry.permission_denials.length}\n\n`; } } - return { markdown, mcpFailures }; + let maxTurnsHit = false; + const maxTurns = process.env.GH_AW_MAX_TURNS; + if (maxTurns && lastEntry && lastEntry.num_turns) { + const configuredMaxTurns = parseInt(maxTurns, 10); + if (!isNaN(configuredMaxTurns) && lastEntry.num_turns >= configuredMaxTurns) { + maxTurnsHit = true; + } + } + return { markdown, mcpFailures, maxTurnsHit }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); return { markdown: `## Agent Log Summary\n\nError parsing Claude log (tried both JSON array and JSONL formats): ${errorMessage}\n`, mcpFailures: [], + maxTurnsHit: false, }; } } diff --git a/.github/workflows/example-workflow-analyzer.lock.yml b/.github/workflows/example-workflow-analyzer.lock.yml index e44d86960a9..6370dc8d729 100644 --- a/.github/workflows/example-workflow-analyzer.lock.yml +++ b/.github/workflows/example-workflow-analyzer.lock.yml @@ -2267,6 +2267,9 @@ jobs: const failedServers = result.mcpFailures.join(", "); core.setFailed(`MCP server(s) failed to launch: ${failedServers}`); } + if (result.maxTurnsHit) { + core.setFailed(`Agent execution stopped: max-turns limit reached. The agent did not complete its task successfully.`); + } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); core.setFailed(errorMessage); @@ -2314,6 +2317,7 @@ jobs: return { markdown: "## Agent Log Summary\n\nLog format not recognized as Claude JSON array or JSONL.\n", mcpFailures: [], + maxTurnsHit: false, }; } const toolUsePairs = new Map(); @@ -2421,12 +2425,21 @@ jobs: markdown += `**Permission Denials:** ${lastEntry.permission_denials.length}\n\n`; } } - return { markdown, mcpFailures }; + let maxTurnsHit = false; + const maxTurns = process.env.GH_AW_MAX_TURNS; + if (maxTurns && lastEntry && lastEntry.num_turns) { + const configuredMaxTurns = parseInt(maxTurns, 10); + if (!isNaN(configuredMaxTurns) && lastEntry.num_turns >= configuredMaxTurns) { + maxTurnsHit = true; + } + } + return { markdown, mcpFailures, maxTurnsHit }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); return { markdown: `## Agent Log Summary\n\nError parsing Claude log (tried both JSON array and JSONL formats): ${errorMessage}\n`, mcpFailures: [], + maxTurnsHit: false, }; } } diff --git a/.github/workflows/github-mcp-tools-report.lock.yml b/.github/workflows/github-mcp-tools-report.lock.yml index 4b045634424..c0d48fdd21c 100644 --- a/.github/workflows/github-mcp-tools-report.lock.yml +++ b/.github/workflows/github-mcp-tools-report.lock.yml @@ -2761,6 +2761,9 @@ jobs: const failedServers = result.mcpFailures.join(", "); core.setFailed(`MCP server(s) failed to launch: ${failedServers}`); } + if (result.maxTurnsHit) { + core.setFailed(`Agent execution stopped: max-turns limit reached. The agent did not complete its task successfully.`); + } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); core.setFailed(errorMessage); @@ -2808,6 +2811,7 @@ jobs: return { markdown: "## Agent Log Summary\n\nLog format not recognized as Claude JSON array or JSONL.\n", mcpFailures: [], + maxTurnsHit: false, }; } const toolUsePairs = new Map(); @@ -2915,12 +2919,21 @@ jobs: markdown += `**Permission Denials:** ${lastEntry.permission_denials.length}\n\n`; } } - return { markdown, mcpFailures }; + let maxTurnsHit = false; + const maxTurns = process.env.GH_AW_MAX_TURNS; + if (maxTurns && lastEntry && lastEntry.num_turns) { + const configuredMaxTurns = parseInt(maxTurns, 10); + if (!isNaN(configuredMaxTurns) && lastEntry.num_turns >= configuredMaxTurns) { + maxTurnsHit = true; + } + } + return { markdown, mcpFailures, maxTurnsHit }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); return { markdown: `## Agent Log Summary\n\nError parsing Claude log (tried both JSON array and JSONL formats): ${errorMessage}\n`, mcpFailures: [], + maxTurnsHit: false, }; } } diff --git a/.github/workflows/go-logger.lock.yml b/.github/workflows/go-logger.lock.yml index 2601c6cb14e..d5e5b1f06ed 100644 --- a/.github/workflows/go-logger.lock.yml +++ b/.github/workflows/go-logger.lock.yml @@ -2541,6 +2541,9 @@ jobs: const failedServers = result.mcpFailures.join(", "); core.setFailed(`MCP server(s) failed to launch: ${failedServers}`); } + if (result.maxTurnsHit) { + core.setFailed(`Agent execution stopped: max-turns limit reached. The agent did not complete its task successfully.`); + } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); core.setFailed(errorMessage); @@ -2588,6 +2591,7 @@ jobs: return { markdown: "## Agent Log Summary\n\nLog format not recognized as Claude JSON array or JSONL.\n", mcpFailures: [], + maxTurnsHit: false, }; } const toolUsePairs = new Map(); @@ -2695,12 +2699,21 @@ jobs: markdown += `**Permission Denials:** ${lastEntry.permission_denials.length}\n\n`; } } - return { markdown, mcpFailures }; + let maxTurnsHit = false; + const maxTurns = process.env.GH_AW_MAX_TURNS; + if (maxTurns && lastEntry && lastEntry.num_turns) { + const configuredMaxTurns = parseInt(maxTurns, 10); + if (!isNaN(configuredMaxTurns) && lastEntry.num_turns >= configuredMaxTurns) { + maxTurnsHit = true; + } + } + return { markdown, mcpFailures, maxTurnsHit }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); return { markdown: `## Agent Log Summary\n\nError parsing Claude log (tried both JSON array and JSONL formats): ${errorMessage}\n`, mcpFailures: [], + maxTurnsHit: false, }; } } diff --git a/.github/workflows/go-pattern-detector.lock.yml b/.github/workflows/go-pattern-detector.lock.yml index 47167bbdfa7..1932164e2cd 100644 --- a/.github/workflows/go-pattern-detector.lock.yml +++ b/.github/workflows/go-pattern-detector.lock.yml @@ -2436,6 +2436,9 @@ jobs: const failedServers = result.mcpFailures.join(", "); core.setFailed(`MCP server(s) failed to launch: ${failedServers}`); } + if (result.maxTurnsHit) { + core.setFailed(`Agent execution stopped: max-turns limit reached. The agent did not complete its task successfully.`); + } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); core.setFailed(errorMessage); @@ -2483,6 +2486,7 @@ jobs: return { markdown: "## Agent Log Summary\n\nLog format not recognized as Claude JSON array or JSONL.\n", mcpFailures: [], + maxTurnsHit: false, }; } const toolUsePairs = new Map(); @@ -2590,12 +2594,21 @@ jobs: markdown += `**Permission Denials:** ${lastEntry.permission_denials.length}\n\n`; } } - return { markdown, mcpFailures }; + let maxTurnsHit = false; + const maxTurns = process.env.GH_AW_MAX_TURNS; + if (maxTurns && lastEntry && lastEntry.num_turns) { + const configuredMaxTurns = parseInt(maxTurns, 10); + if (!isNaN(configuredMaxTurns) && lastEntry.num_turns >= configuredMaxTurns) { + maxTurnsHit = true; + } + } + return { markdown, mcpFailures, maxTurnsHit }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); return { markdown: `## Agent Log Summary\n\nError parsing Claude log (tried both JSON array and JSONL formats): ${errorMessage}\n`, mcpFailures: [], + maxTurnsHit: false, }; } } diff --git a/.github/workflows/instructions-janitor.lock.yml b/.github/workflows/instructions-janitor.lock.yml index 691e562d9a8..2363ff15363 100644 --- a/.github/workflows/instructions-janitor.lock.yml +++ b/.github/workflows/instructions-janitor.lock.yml @@ -2492,6 +2492,9 @@ jobs: const failedServers = result.mcpFailures.join(", "); core.setFailed(`MCP server(s) failed to launch: ${failedServers}`); } + if (result.maxTurnsHit) { + core.setFailed(`Agent execution stopped: max-turns limit reached. The agent did not complete its task successfully.`); + } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); core.setFailed(errorMessage); @@ -2539,6 +2542,7 @@ jobs: return { markdown: "## Agent Log Summary\n\nLog format not recognized as Claude JSON array or JSONL.\n", mcpFailures: [], + maxTurnsHit: false, }; } const toolUsePairs = new Map(); @@ -2646,12 +2650,21 @@ jobs: markdown += `**Permission Denials:** ${lastEntry.permission_denials.length}\n\n`; } } - return { markdown, mcpFailures }; + let maxTurnsHit = false; + const maxTurns = process.env.GH_AW_MAX_TURNS; + if (maxTurns && lastEntry && lastEntry.num_turns) { + const configuredMaxTurns = parseInt(maxTurns, 10); + if (!isNaN(configuredMaxTurns) && lastEntry.num_turns >= configuredMaxTurns) { + maxTurnsHit = true; + } + } + return { markdown, mcpFailures, maxTurnsHit }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); return { markdown: `## Agent Log Summary\n\nError parsing Claude log (tried both JSON array and JSONL formats): ${errorMessage}\n`, mcpFailures: [], + maxTurnsHit: false, }; } } diff --git a/.github/workflows/lockfile-stats.lock.yml b/.github/workflows/lockfile-stats.lock.yml index aa24cf2a525..6b11e586bcc 100644 --- a/.github/workflows/lockfile-stats.lock.yml +++ b/.github/workflows/lockfile-stats.lock.yml @@ -2704,6 +2704,9 @@ jobs: const failedServers = result.mcpFailures.join(", "); core.setFailed(`MCP server(s) failed to launch: ${failedServers}`); } + if (result.maxTurnsHit) { + core.setFailed(`Agent execution stopped: max-turns limit reached. The agent did not complete its task successfully.`); + } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); core.setFailed(errorMessage); @@ -2751,6 +2754,7 @@ jobs: return { markdown: "## Agent Log Summary\n\nLog format not recognized as Claude JSON array or JSONL.\n", mcpFailures: [], + maxTurnsHit: false, }; } const toolUsePairs = new Map(); @@ -2858,12 +2862,21 @@ jobs: markdown += `**Permission Denials:** ${lastEntry.permission_denials.length}\n\n`; } } - return { markdown, mcpFailures }; + let maxTurnsHit = false; + const maxTurns = process.env.GH_AW_MAX_TURNS; + if (maxTurns && lastEntry && lastEntry.num_turns) { + const configuredMaxTurns = parseInt(maxTurns, 10); + if (!isNaN(configuredMaxTurns) && lastEntry.num_turns >= configuredMaxTurns) { + maxTurnsHit = true; + } + } + return { markdown, mcpFailures, maxTurnsHit }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); return { markdown: `## Agent Log Summary\n\nError parsing Claude log (tried both JSON array and JSONL formats): ${errorMessage}\n`, mcpFailures: [], + maxTurnsHit: false, }; } } diff --git a/.github/workflows/schema-consistency-checker.lock.yml b/.github/workflows/schema-consistency-checker.lock.yml index c142721c109..204af5d6f81 100644 --- a/.github/workflows/schema-consistency-checker.lock.yml +++ b/.github/workflows/schema-consistency-checker.lock.yml @@ -2671,6 +2671,9 @@ jobs: const failedServers = result.mcpFailures.join(", "); core.setFailed(`MCP server(s) failed to launch: ${failedServers}`); } + if (result.maxTurnsHit) { + core.setFailed(`Agent execution stopped: max-turns limit reached. The agent did not complete its task successfully.`); + } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); core.setFailed(errorMessage); @@ -2718,6 +2721,7 @@ jobs: return { markdown: "## Agent Log Summary\n\nLog format not recognized as Claude JSON array or JSONL.\n", mcpFailures: [], + maxTurnsHit: false, }; } const toolUsePairs = new Map(); @@ -2825,12 +2829,21 @@ jobs: markdown += `**Permission Denials:** ${lastEntry.permission_denials.length}\n\n`; } } - return { markdown, mcpFailures }; + let maxTurnsHit = false; + const maxTurns = process.env.GH_AW_MAX_TURNS; + if (maxTurns && lastEntry && lastEntry.num_turns) { + const configuredMaxTurns = parseInt(maxTurns, 10); + if (!isNaN(configuredMaxTurns) && lastEntry.num_turns >= configuredMaxTurns) { + maxTurnsHit = true; + } + } + return { markdown, mcpFailures, maxTurnsHit }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); return { markdown: `## Agent Log Summary\n\nError parsing Claude log (tried both JSON array and JSONL formats): ${errorMessage}\n`, mcpFailures: [], + maxTurnsHit: false, }; } } diff --git a/.github/workflows/scout.lock.yml b/.github/workflows/scout.lock.yml index 255542319de..777dc608e55 100644 --- a/.github/workflows/scout.lock.yml +++ b/.github/workflows/scout.lock.yml @@ -3921,6 +3921,9 @@ jobs: const failedServers = result.mcpFailures.join(", "); core.setFailed(`MCP server(s) failed to launch: ${failedServers}`); } + if (result.maxTurnsHit) { + core.setFailed(`Agent execution stopped: max-turns limit reached. The agent did not complete its task successfully.`); + } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); core.setFailed(errorMessage); @@ -3968,6 +3971,7 @@ jobs: return { markdown: "## Agent Log Summary\n\nLog format not recognized as Claude JSON array or JSONL.\n", mcpFailures: [], + maxTurnsHit: false, }; } const toolUsePairs = new Map(); @@ -4075,12 +4079,21 @@ jobs: markdown += `**Permission Denials:** ${lastEntry.permission_denials.length}\n\n`; } } - return { markdown, mcpFailures }; + let maxTurnsHit = false; + const maxTurns = process.env.GH_AW_MAX_TURNS; + if (maxTurns && lastEntry && lastEntry.num_turns) { + const configuredMaxTurns = parseInt(maxTurns, 10); + if (!isNaN(configuredMaxTurns) && lastEntry.num_turns >= configuredMaxTurns) { + maxTurnsHit = true; + } + } + return { markdown, mcpFailures, maxTurnsHit }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); return { markdown: `## Agent Log Summary\n\nError parsing Claude log (tried both JSON array and JSONL formats): ${errorMessage}\n`, mcpFailures: [], + maxTurnsHit: false, }; } } diff --git a/.github/workflows/security-fix-pr.lock.yml b/.github/workflows/security-fix-pr.lock.yml index 6799427a10a..4c3cbb41efe 100644 --- a/.github/workflows/security-fix-pr.lock.yml +++ b/.github/workflows/security-fix-pr.lock.yml @@ -2438,6 +2438,9 @@ jobs: const failedServers = result.mcpFailures.join(", "); core.setFailed(`MCP server(s) failed to launch: ${failedServers}`); } + if (result.maxTurnsHit) { + core.setFailed(`Agent execution stopped: max-turns limit reached. The agent did not complete its task successfully.`); + } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); core.setFailed(errorMessage); @@ -2485,6 +2488,7 @@ jobs: return { markdown: "## Agent Log Summary\n\nLog format not recognized as Claude JSON array or JSONL.\n", mcpFailures: [], + maxTurnsHit: false, }; } const toolUsePairs = new Map(); @@ -2592,12 +2596,21 @@ jobs: markdown += `**Permission Denials:** ${lastEntry.permission_denials.length}\n\n`; } } - return { markdown, mcpFailures }; + let maxTurnsHit = false; + const maxTurns = process.env.GH_AW_MAX_TURNS; + if (maxTurns && lastEntry && lastEntry.num_turns) { + const configuredMaxTurns = parseInt(maxTurns, 10); + if (!isNaN(configuredMaxTurns) && lastEntry.num_turns >= configuredMaxTurns) { + maxTurnsHit = true; + } + } + return { markdown, mcpFailures, maxTurnsHit }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); return { markdown: `## Agent Log Summary\n\nError parsing Claude log (tried both JSON array and JSONL formats): ${errorMessage}\n`, mcpFailures: [], + maxTurnsHit: false, }; } } diff --git a/.github/workflows/semantic-function-refactor.lock.yml b/.github/workflows/semantic-function-refactor.lock.yml index b0251caa02b..7153c862c90 100644 --- a/.github/workflows/semantic-function-refactor.lock.yml +++ b/.github/workflows/semantic-function-refactor.lock.yml @@ -2709,6 +2709,9 @@ jobs: const failedServers = result.mcpFailures.join(", "); core.setFailed(`MCP server(s) failed to launch: ${failedServers}`); } + if (result.maxTurnsHit) { + core.setFailed(`Agent execution stopped: max-turns limit reached. The agent did not complete its task successfully.`); + } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); core.setFailed(errorMessage); @@ -2756,6 +2759,7 @@ jobs: return { markdown: "## Agent Log Summary\n\nLog format not recognized as Claude JSON array or JSONL.\n", mcpFailures: [], + maxTurnsHit: false, }; } const toolUsePairs = new Map(); @@ -2863,12 +2867,21 @@ jobs: markdown += `**Permission Denials:** ${lastEntry.permission_denials.length}\n\n`; } } - return { markdown, mcpFailures }; + let maxTurnsHit = false; + const maxTurns = process.env.GH_AW_MAX_TURNS; + if (maxTurns && lastEntry && lastEntry.num_turns) { + const configuredMaxTurns = parseInt(maxTurns, 10); + if (!isNaN(configuredMaxTurns) && lastEntry.num_turns >= configuredMaxTurns) { + maxTurnsHit = true; + } + } + return { markdown, mcpFailures, maxTurnsHit }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); return { markdown: `## Agent Log Summary\n\nError parsing Claude log (tried both JSON array and JSONL formats): ${errorMessage}\n`, mcpFailures: [], + maxTurnsHit: false, }; } } diff --git a/.github/workflows/smoke-claude.lock.yml b/.github/workflows/smoke-claude.lock.yml index f3a4845af50..5499ab7ddbd 100644 --- a/.github/workflows/smoke-claude.lock.yml +++ b/.github/workflows/smoke-claude.lock.yml @@ -2276,6 +2276,9 @@ jobs: const failedServers = result.mcpFailures.join(", "); core.setFailed(`MCP server(s) failed to launch: ${failedServers}`); } + if (result.maxTurnsHit) { + core.setFailed(`Agent execution stopped: max-turns limit reached. The agent did not complete its task successfully.`); + } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); core.setFailed(errorMessage); @@ -2323,6 +2326,7 @@ jobs: return { markdown: "## Agent Log Summary\n\nLog format not recognized as Claude JSON array or JSONL.\n", mcpFailures: [], + maxTurnsHit: false, }; } const toolUsePairs = new Map(); @@ -2430,12 +2434,21 @@ jobs: markdown += `**Permission Denials:** ${lastEntry.permission_denials.length}\n\n`; } } - return { markdown, mcpFailures }; + let maxTurnsHit = false; + const maxTurns = process.env.GH_AW_MAX_TURNS; + if (maxTurns && lastEntry && lastEntry.num_turns) { + const configuredMaxTurns = parseInt(maxTurns, 10); + if (!isNaN(configuredMaxTurns) && lastEntry.num_turns >= configuredMaxTurns) { + maxTurnsHit = true; + } + } + return { markdown, mcpFailures, maxTurnsHit }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); return { markdown: `## Agent Log Summary\n\nError parsing Claude log (tried both JSON array and JSONL formats): ${errorMessage}\n`, mcpFailures: [], + maxTurnsHit: false, }; } } diff --git a/.github/workflows/smoke-detector.lock.yml b/.github/workflows/smoke-detector.lock.yml index 607de7db191..3956b409f17 100644 --- a/.github/workflows/smoke-detector.lock.yml +++ b/.github/workflows/smoke-detector.lock.yml @@ -2858,6 +2858,9 @@ jobs: const failedServers = result.mcpFailures.join(", "); core.setFailed(`MCP server(s) failed to launch: ${failedServers}`); } + if (result.maxTurnsHit) { + core.setFailed(`Agent execution stopped: max-turns limit reached. The agent did not complete its task successfully.`); + } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); core.setFailed(errorMessage); @@ -2905,6 +2908,7 @@ jobs: return { markdown: "## Agent Log Summary\n\nLog format not recognized as Claude JSON array or JSONL.\n", mcpFailures: [], + maxTurnsHit: false, }; } const toolUsePairs = new Map(); @@ -3012,12 +3016,21 @@ jobs: markdown += `**Permission Denials:** ${lastEntry.permission_denials.length}\n\n`; } } - return { markdown, mcpFailures }; + let maxTurnsHit = false; + const maxTurns = process.env.GH_AW_MAX_TURNS; + if (maxTurns && lastEntry && lastEntry.num_turns) { + const configuredMaxTurns = parseInt(maxTurns, 10); + if (!isNaN(configuredMaxTurns) && lastEntry.num_turns >= configuredMaxTurns) { + maxTurnsHit = true; + } + } + return { markdown, mcpFailures, maxTurnsHit }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); return { markdown: `## Agent Log Summary\n\nError parsing Claude log (tried both JSON array and JSONL formats): ${errorMessage}\n`, mcpFailures: [], + maxTurnsHit: false, }; } } diff --git a/.github/workflows/technical-doc-writer.lock.yml b/.github/workflows/technical-doc-writer.lock.yml index cb6a4e42367..e84c2b6baf6 100644 --- a/.github/workflows/technical-doc-writer.lock.yml +++ b/.github/workflows/technical-doc-writer.lock.yml @@ -3171,6 +3171,9 @@ jobs: const failedServers = result.mcpFailures.join(", "); core.setFailed(`MCP server(s) failed to launch: ${failedServers}`); } + if (result.maxTurnsHit) { + core.setFailed(`Agent execution stopped: max-turns limit reached. The agent did not complete its task successfully.`); + } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); core.setFailed(errorMessage); @@ -3218,6 +3221,7 @@ jobs: return { markdown: "## Agent Log Summary\n\nLog format not recognized as Claude JSON array or JSONL.\n", mcpFailures: [], + maxTurnsHit: false, }; } const toolUsePairs = new Map(); @@ -3325,12 +3329,21 @@ jobs: markdown += `**Permission Denials:** ${lastEntry.permission_denials.length}\n\n`; } } - return { markdown, mcpFailures }; + let maxTurnsHit = false; + const maxTurns = process.env.GH_AW_MAX_TURNS; + if (maxTurns && lastEntry && lastEntry.num_turns) { + const configuredMaxTurns = parseInt(maxTurns, 10); + if (!isNaN(configuredMaxTurns) && lastEntry.num_turns >= configuredMaxTurns) { + maxTurnsHit = true; + } + } + return { markdown, mcpFailures, maxTurnsHit }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); return { markdown: `## Agent Log Summary\n\nError parsing Claude log (tried both JSON array and JSONL formats): ${errorMessage}\n`, mcpFailures: [], + maxTurnsHit: false, }; } } diff --git a/.github/workflows/unbloat-docs.lock.yml b/.github/workflows/unbloat-docs.lock.yml index 7970326c477..c5dfbf2ded6 100644 --- a/.github/workflows/unbloat-docs.lock.yml +++ b/.github/workflows/unbloat-docs.lock.yml @@ -3410,6 +3410,9 @@ jobs: const failedServers = result.mcpFailures.join(", "); core.setFailed(`MCP server(s) failed to launch: ${failedServers}`); } + if (result.maxTurnsHit) { + core.setFailed(`Agent execution stopped: max-turns limit reached. The agent did not complete its task successfully.`); + } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); core.setFailed(errorMessage); @@ -3457,6 +3460,7 @@ jobs: return { markdown: "## Agent Log Summary\n\nLog format not recognized as Claude JSON array or JSONL.\n", mcpFailures: [], + maxTurnsHit: false, }; } const toolUsePairs = new Map(); @@ -3564,12 +3568,21 @@ jobs: markdown += `**Permission Denials:** ${lastEntry.permission_denials.length}\n\n`; } } - return { markdown, mcpFailures }; + let maxTurnsHit = false; + const maxTurns = process.env.GH_AW_MAX_TURNS; + if (maxTurns && lastEntry && lastEntry.num_turns) { + const configuredMaxTurns = parseInt(maxTurns, 10); + if (!isNaN(configuredMaxTurns) && lastEntry.num_turns >= configuredMaxTurns) { + maxTurnsHit = true; + } + } + return { markdown, mcpFailures, maxTurnsHit }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); return { markdown: `## Agent Log Summary\n\nError parsing Claude log (tried both JSON array and JSONL formats): ${errorMessage}\n`, mcpFailures: [], + maxTurnsHit: false, }; } } diff --git a/pkg/workflow/js/parse_claude_log.cjs b/pkg/workflow/js/parse_claude_log.cjs index 9e58d99e9a5..a7cc72f125c 100644 --- a/pkg/workflow/js/parse_claude_log.cjs +++ b/pkg/workflow/js/parse_claude_log.cjs @@ -22,6 +22,9 @@ function main() { const failedServers = result.mcpFailures.join(", "); core.setFailed(`MCP server(s) failed to launch: ${failedServers}`); } + if (result.maxTurnsHit) { + core.setFailed(`Agent execution stopped: max-turns limit reached. The agent did not complete its task successfully.`); + } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); core.setFailed(errorMessage); @@ -31,7 +34,7 @@ function main() { /** * Parses Claude log content and converts it to markdown format * @param {string} logContent - The raw log content as a string - * @returns {{markdown: string, mcpFailures: string[]}} Result with formatted markdown content and MCP failure list + * @returns {{markdown: string, mcpFailures: string[], maxTurnsHit: boolean}} Result with formatted markdown content, MCP failure list, and max-turns status */ function parseClaudeLog(logContent) { try { @@ -89,6 +92,7 @@ function parseClaudeLog(logContent) { return { markdown: "## Agent Log Summary\n\nLog format not recognized as Claude JSON array or JSONL.\n", mcpFailures: [], + maxTurnsHit: false, }; } @@ -229,12 +233,23 @@ function parseClaudeLog(logContent) { } } - return { markdown, mcpFailures }; + // Check if max-turns limit was hit + let maxTurnsHit = false; + const maxTurns = process.env.GH_AW_MAX_TURNS; + if (maxTurns && lastEntry && lastEntry.num_turns) { + const configuredMaxTurns = parseInt(maxTurns, 10); + if (!isNaN(configuredMaxTurns) && lastEntry.num_turns >= configuredMaxTurns) { + maxTurnsHit = true; + } + } + + return { markdown, mcpFailures, maxTurnsHit }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); return { markdown: `## Agent Log Summary\n\nError parsing Claude log (tried both JSON array and JSONL formats): ${errorMessage}\n`, mcpFailures: [], + maxTurnsHit: false, }; } } diff --git a/pkg/workflow/js/parse_claude_log.test.cjs b/pkg/workflow/js/parse_claude_log.test.cjs index f0ff61193de..3d49b498011 100644 --- a/pkg/workflow/js/parse_claude_log.test.cjs +++ b/pkg/workflow/js/parse_claude_log.test.cjs @@ -294,6 +294,92 @@ npm warn exec The following package was not found expect(result.markdown).toContain("safe_outputs::missing-tool"); expect(result.mcpFailures).toEqual([]); }); + + it("should detect when max-turns limit is hit", () => { + // Set the environment variable for max-turns + process.env.GH_AW_MAX_TURNS = "5"; + + const logWithMaxTurns = JSON.stringify([ + { + type: "system", + subtype: "init", + session_id: "test-789", + tools: ["Bash"], + model: "claude-sonnet-4-20250514", + }, + { + type: "assistant", + message: { + content: [{ type: "text", text: "Task in progress" }], + }, + }, + { + type: "result", + total_cost_usd: 0.05, + usage: { input_tokens: 500, output_tokens: 200 }, + num_turns: 5, + }, + ]); + + const result = parseClaudeLog(logWithMaxTurns); + + expect(result.markdown).toContain("**Turns:** 5"); + expect(result.maxTurnsHit).toBe(true); + + // Clean up + delete process.env.GH_AW_MAX_TURNS; + }); + + it("should not flag max-turns when turns is less than limit", () => { + process.env.GH_AW_MAX_TURNS = "10"; + + const logBelowMaxTurns = JSON.stringify([ + { + type: "system", + subtype: "init", + session_id: "test-890", + tools: ["Bash"], + model: "claude-sonnet-4-20250514", + }, + { + type: "result", + total_cost_usd: 0.01, + usage: { input_tokens: 100, output_tokens: 50 }, + num_turns: 3, + }, + ]); + + const result = parseClaudeLog(logBelowMaxTurns); + + expect(result.markdown).toContain("**Turns:** 3"); + expect(result.maxTurnsHit).toBe(false); + + // Clean up + delete process.env.GH_AW_MAX_TURNS; + }); + + it("should not flag max-turns when environment variable is not set", () => { + const logWithoutMaxTurnsEnv = JSON.stringify([ + { + type: "system", + subtype: "init", + session_id: "test-901", + tools: ["Bash"], + model: "claude-sonnet-4-20250514", + }, + { + type: "result", + total_cost_usd: 0.01, + usage: { input_tokens: 100, output_tokens: 50 }, + num_turns: 10, + }, + ]); + + const result = parseClaudeLog(logWithoutMaxTurnsEnv); + + expect(result.markdown).toContain("**Turns:** 10"); + expect(result.maxTurnsHit).toBe(false); + }); }); describe("main function integration", () => { @@ -354,6 +440,37 @@ npm warn exec The following package was not found expect(mockCore.setFailed).toHaveBeenCalledWith("MCP server(s) failed to launch: broken_server"); }); + it("should call setFailed when max-turns limit is hit", async () => { + process.env.GH_AW_MAX_TURNS = "3"; + + const logHittingMaxTurns = JSON.stringify([ + { + type: "system", + subtype: "init", + session_id: "max-turns-test", + tools: ["Bash"], + model: "claude-sonnet-4-20250514", + }, + { + type: "result", + total_cost_usd: 0.02, + usage: { input_tokens: 200, output_tokens: 100 }, + num_turns: 3, + }, + ]); + + await runScript(logHittingMaxTurns); + + expect(mockCore.summary.addRaw).toHaveBeenCalled(); + expect(mockCore.summary.write).toHaveBeenCalled(); + expect(mockCore.setFailed).toHaveBeenCalledWith( + "Agent execution stopped: max-turns limit reached. The agent did not complete its task successfully." + ); + + // Clean up + delete process.env.GH_AW_MAX_TURNS; + }); + it("should handle missing log file", async () => { process.env.GH_AW_AGENT_OUTPUT = "/nonexistent/file.log"; From e83bce0201b9cb32a296de6d9181e3bec4e58876 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 23 Oct 2025 20:13:31 +0000 Subject: [PATCH 4/4] Add changeset for max-turns limit error fix --- .changeset/patch-fix-max-turns-limit-error.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/patch-fix-max-turns-limit-error.md diff --git a/.changeset/patch-fix-max-turns-limit-error.md b/.changeset/patch-fix-max-turns-limit-error.md new file mode 100644 index 00000000000..906df9a0eb6 --- /dev/null +++ b/.changeset/patch-fix-max-turns-limit-error.md @@ -0,0 +1,5 @@ +--- +"gh-aw": patch +--- + +Fixed silent failure when agentic workflow hits max-turns limit - now raises clear error message