diff --git a/.github/workflows/pr-sous-chef.lock.yml b/.github/workflows/pr-sous-chef.lock.yml
index 32fa58e545f..368310866cb 100644
--- a/.github/workflows/pr-sous-chef.lock.yml
+++ b/.github/workflows/pr-sous-chef.lock.yml
@@ -1,4 +1,4 @@
-# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"b333149840d79d1d58a2c70281eb407382b2b02e79d32fb4a5302c603876ffce","body_hash":"38aa359527a578c3b9d772db783746d644dba8786bae10580d2d4859ad8ef875","strict":true,"agent_id":"pi","agent_model":"copilot/gpt-5.4","engine_versions":{"pi":"0.80.3"}}
+# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"b333149840d79d1d58a2c70281eb407382b2b02e79d32fb4a5302c603876ffce","body_hash":"b1447c0923f6d8d4a154525879e363eccb229839c877241a5757097e7bdf1436","strict":true,"agent_id":"pi","agent_model":"copilot/gpt-5.4","engine_versions":{"pi":"0.80.3"}}
 # gh-aw-manifest: {"version":1,"secrets":["AWI_MAINTENANCE_TOKEN","GH_AW_CI_TRIGGER_TOKEN","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GH_AW_OTEL_GRAFANA_AUTHORIZATION","GH_AW_OTEL_GRAFANA_ENDPOINT","GH_AW_OTEL_SENTRY_AUTHORIZATION","GH_AW_OTEL_SENTRY_ENDPOINT","GITHUB_TOKEN"],"actions":[{"repo":"actions/cache/restore","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/cache/save","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/checkout","sha":"9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0","version":"v7.0.0"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-go","sha":"924ae3a1cded613372ab5595356fb5720e22ba16","version":"v6.5.0"},{"repo":"actions/setup-node","sha":"48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e","version":"v6.4.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.27.22","digest":"sha256:55f06588411008b7148eb64b8dfe28602a0cce3675b36c6b190b54aca138468e","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.27.22@sha256:55f06588411008b7148eb64b8dfe28602a0cce3675b36c6b190b54aca138468e"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.22","digest":"sha256:afb9ff9140b17d38871dfb9dbac5ff8689ea634c2f91c435da2825192d4881c1","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.22@sha256:afb9ff9140b17d38871dfb9dbac5ff8689ea634c2f91c435da2825192d4881c1"},{"image":"ghcr.io/github/gh-aw-firewall/cli-proxy:0.27.22","digest":"sha256:e23e1604241f579b418e6522d938285b57ada31bc27742a65c90ee2250b1755c","pinned_image":"ghcr.io/github/gh-aw-firewall/cli-proxy:0.27.22@sha256:e23e1604241f579b418e6522d938285b57ada31bc27742a65c90ee2250b1755c"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.27.22","digest":"sha256:3cdcc1e2b4b4fe602ba69fd3e21aac7ac512d5c1fce24df4ce69dc4f98164b59","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.27.22@sha256:3cdcc1e2b4b4fe602ba69fd3e21aac7ac512d5c1fce24df4ce69dc4f98164b59"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.3.33","digest":"sha256:f0e1f1d562f01e737f3ef125cb4d7057ff87a68a97927f5ea9fd6d3f5091da06","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.3.33@sha256:f0e1f1d562f01e737f3ef125cb4d7057ff87a68a97927f5ea9fd6d3f5091da06"},{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:529d02eb970b1161aa25c593a9c3df57fdfad5a8add328cb3b6eccef66f3183b","pinned_image":"ghcr.io/github/gh-aw-node@sha256:529d02eb970b1161aa25c593a9c3df57fdfad5a8add328cb3b6eccef66f3183b"},{"image":"ghcr.io/github/github-mcp-server:v1.5.0","digest":"sha256:e25564dccc9110a70a77b9df560cbde11aa392fcb5f08b9abe5c4ebc6d146ea4","pinned_image":"ghcr.io/github/github-mcp-server:v1.5.0@sha256:e25564dccc9110a70a77b9df560cbde11aa392fcb5f08b9abe5c4ebc6d146ea4"}]}
 # This file was automatically generated by gh-aw. DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md
 #
diff --git a/.github/workflows/pr-sous-chef.md b/.github/workflows/pr-sous-chef.md
index f3122cbb0f5..f726d3db6cc 100644
--- a/.github/workflows/pr-sous-chef.md
+++ b/.github/workflows/pr-sous-chef.md
@@ -255,7 +255,7 @@ When this workflow is triggered by the `/souschef` slash command on a PR comment
 1. Read `/tmp/gh-aw/agent/pr-sous-chef-candidates-compact.json` first.
 2. If `prs` is empty, create the run-report issue (see **Run summary** below) and stop. If `create_issue` is unavailable, fall back to `noop` with the message `"processed=0; nudged=0; no eligible PRs"` and stop.
 3. Process PRs in `updatedAt` descending order.
-4. Process at most **5 PRs** per run.
+4. Process all eligible PRs per run.
 5. Use the `pr-processor` sub-agent for each PR; pass only the PR number and compact context.
 6. If a `pr-processor` call returns non-JSON or an error, record `{pr_number: <N>, skip_reason: "sub_agent_error"}` in the `skipped` array of the run-summary issue payload and move to the next PR without retrying.
 7. Do not fetch full PR diffs or large file lists unless absolutely required for a skip decision.
diff --git a/pkg/cli/audit.go b/pkg/cli/audit.go
index 8d77cde6240..73887e88600 100644
--- a/pkg/cli/audit.go
+++ b/pkg/cli/audit.go
@@ -498,6 +498,13 @@ func processedRunFromSummary(summary *RunSummary, runOutputDir string) Processed
 		GitHubRateLimitUsage:    summary.GitHubRateLimitUsage,
 		JobDetails:              summary.JobDetails,
 	}
+	// Run.Turns may be zero on cached-summary paths where the RunSummary was
+	// serialised before the run completed. Metrics.Turns is populated from log
+	// parsing and is authoritative; backfill here so that audit comparison deltas
+	// are computed from an accurate value.
+	if processedRun.Run.Turns == 0 && summary.Metrics.Turns > 0 {
+		processedRun.Run.Turns = summary.Metrics.Turns
+	}
 	processedRun.Run.LogsPath = runOutputDir
 	return processedRun
 }
diff --git a/pkg/cli/audit_diff.go b/pkg/cli/audit_diff.go
index 466d4996c07..da884a954c8 100644
--- a/pkg/cli/audit_diff.go
+++ b/pkg/cli/audit_diff.go
@@ -515,7 +515,11 @@ func computeRunMetricsDiff(summary1, summary2 *RunSummary) *RunMetricsDiff {
 	if summary1 != nil {
 		run1Tokens = summary1.Run.TokenUsage
 		run1Duration = summary1.Run.Duration
+		// Run.Turns may be zero on cached-summary paths; Metrics.Turns is authoritative.
 		run1Turns = summary1.Run.Turns
+		if run1Turns == 0 && summary1.Metrics.Turns > 0 {
+			run1Turns = summary1.Metrics.Turns
+		}
 		tu1 = summary1.TokenUsage
 		rl1 = summary1.GitHubRateLimitUsage
 		m1 = &summary1.Metrics
@@ -523,7 +527,11 @@ func computeRunMetricsDiff(summary1, summary2 *RunSummary) *RunMetricsDiff {
 	if summary2 != nil {
 		run2Tokens = summary2.Run.TokenUsage
 		run2Duration = summary2.Run.Duration
+		// Run.Turns may be zero on cached-summary paths; Metrics.Turns is authoritative.
 		run2Turns = summary2.Run.Turns
+		if run2Turns == 0 && summary2.Metrics.Turns > 0 {
+			run2Turns = summary2.Metrics.Turns
+		}
 		tu2 = summary2.TokenUsage
 		rl2 = summary2.GitHubRateLimitUsage
 		m2 = &summary2.Metrics
diff --git a/pkg/cli/audit_test.go b/pkg/cli/audit_test.go
index e41a5491dd5..033a3c79841 100644
--- a/pkg/cli/audit_test.go
+++ b/pkg/cli/audit_test.go
@@ -127,6 +127,40 @@ func TestIsPermissionErrorStr(t *testing.T) {
 	}
 }
 
+func TestProcessedRunFromSummaryBackfillsTurnsFromMetrics(t *testing.T) {
+	summary := &RunSummary{
+		Run:     WorkflowRun{DatabaseID: 123, Turns: 0},
+		Metrics: LogMetrics{Turns: 34},
+	}
+
+	processed := processedRunFromSummary(summary, "/tmp/run-output")
+
+	assert.Equal(t, 34, processed.Run.Turns, "run turns should backfill from summary metrics when run turns are missing")
+	assert.Equal(t, "/tmp/run-output", processed.Run.LogsPath, "logs path should be set from the current run output directory")
+}
+
+func TestProcessedRunFromSummaryPreservesExistingTurns(t *testing.T) {
+	summary := &RunSummary{
+		Run:     WorkflowRun{DatabaseID: 456, Turns: 7},
+		Metrics: LogMetrics{Turns: 34},
+	}
+
+	processed := processedRunFromSummary(summary, "/tmp/run-output")
+
+	assert.Equal(t, 7, processed.Run.Turns, "existing run turns should not be overwritten by summary metrics")
+}
+
+func TestProcessedRunFromSummaryBothTurnsZero(t *testing.T) {
+	summary := &RunSummary{
+		Run:     WorkflowRun{DatabaseID: 789, Turns: 0},
+		Metrics: LogMetrics{Turns: 0},
+	}
+
+	processed := processedRunFromSummary(summary, "/tmp/run-output")
+
+	assert.Equal(t, 0, processed.Run.Turns, "run turns should remain zero when neither Run.Turns nor Metrics.Turns is available")
+}
+
 func TestBuildAuditData(t *testing.T) {
 	// Create test data
 	run := WorkflowRun{
