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 a218ccd3ba..6f39dfc648 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 4bed58e600..f02bef3277 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 aea19a8daa..d79adbc596 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 de923408bd..adbfec8974 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 ab528642ca..38231dc21d 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 e49f633e11..d230d13485 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 168f0a46e1..397d45138f 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 6fd830ed82..e6432d9feb 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 eb0f73d806..4d1eae8940 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 ce7b0ba017..69630698d4 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 476f0de294..f7e111ede5 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 1e19285ce7..c538bb3bd2 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 2ceb941412..d7275e6f66 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 742ccd624f..0063fc899f 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 48518f36b3..8949ff4799 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 cdec08ce99..17888f2f75 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 2772f9622b..8218c28879 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 7208ccd9ce..6a19b841ec 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 b6c3ab1811..e44d86960a 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 f89fd10af8..4b04563442 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 c843be7c6a..2601c6cb14 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 4d078534c8..47167bbdfa 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 0cf73fac61..691e562d9a 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 fa2af899f7..c44f863f6d 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 bb1d50e49c..aa24cf2a52 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 a6fbf90d27..efa35de3fc 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 de6963611c..d068685a18 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 7b04ddf893..680b9196e4 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 c846c2f61e..dd78217f15 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 3b0a3a0f81..6d33a9ac7b 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 f8017d7fa3..11e97cd288 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 87fed77c64..67374dc8e4 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 5ef310c73e..5cfe037268 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 e7f0306271..c142721c10 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 386c02fa62..255542319d 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 ab33b598af..6799427a10 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 3f75376923..b0251caa02 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 b438acb093..f3a4845af5 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 e9a3c7641b..66af8e4fb8 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 6e1ddde4a4..a10acee652 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 648709ce22..607de7db19 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 a9dc4917e0..a8e06f9ceb 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 c2130e0ec4..94407a4825 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 a425ee540f..cb6a4e4236 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 c029013103..6ded2a4aa6 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 d8faea94a9..98616f0e6d 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 62f1253725..e9f038f88a 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 d198e74557..c276f410c6 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 98344616b3..7970326c47 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 9c426d9d10..12dec30f55 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 38036cce0b..0ba24399ba 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 f02bef3277..0d8681dd05 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 d79adbc596..413ce186dc 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 38231dc21d..6b8a386e1e 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 397d45138f..b3d760279c 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 e6432d9feb..0d083f06f1 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 4d1eae8940..9b3009acc3 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 69630698d4..4924a155fb 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 e44d86960a..6370dc8d72 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 4b04563442..c0d48fdd21 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 2601c6cb14..d5e5b1f06e 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 47167bbdfa..1932164e2c 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 691e562d9a..2363ff1536 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 aa24cf2a52..6b11e586bc 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 c142721c10..204af5d6f8 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 255542319d..777dc608e5 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 6799427a10..4c3cbb41ef 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 b0251caa02..7153c862c9 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 f3a4845af5..5499ab7ddb 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 607de7db19..3956b409f1 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 cb6a4e4236..e84c2b6baf 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 7970326c47..c5dfbf2ded 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 9e58d99e9a..a7cc72f125 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 f0ff61193d..3d49b49801 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 0000000000..906df9a0eb --- /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