Skip to content

Cache complete workflow run metadata in logs - #59257

Merged
pelikhan merged 3 commits into
mainfrom
copilot/collect-and-cache-gh-logs
Sep 7, 2026
Merged

Cache complete workflow run metadata in logs#59257
pelikhan merged 3 commits into
mainfrom
copilot/collect-and-cache-gh-logs

Conversation

Copilot AI commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

gh aw logs omitted workflow-run metadata that downstream consumers had to retrieve separately with gh api. This change collects that metadata during log processing and caches it for reuse.

Changes

  • Metadata collection

    • Fetch the complete GitHub Actions run response for each processed run.
    • Surface workflow path, repository, actor, run attempt, event, and commit metadata in JSON reports.
  • Caching

    • Store raw responses as run.json alongside each run’s artifacts.
    • Reuse valid cached responses and refresh malformed or mismatched entries.
    • Preserve run.json during storage pruning and exclude it from artifact inventories.
  • Metadata precedence

    • Use GitHub API metadata as the baseline.
    • Apply non-empty aw_info.json values as authoritative overrides.
    • Backfill existing cached summaries when metadata becomes available.
<output>/run-<run-id>/
├── run.json
├── run_summary.json
└── jobs.json

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copilot AI requested a review from pelikhan September 7, 2026 16:09
@pelikhan
pelikhan marked this pull request as ready for review September 7, 2026 16:10
Copilot AI balanced review requested due to automatic review settings September 7, 2026 16:10
@github-actions

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

🧠 Matt Pocock Skills Reviewer has completed the skills-based review. ✅

🧠 Reviewed using Matt Pocock's skills by Matt Pocock Skills Reviewer

@github-actions

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Design Decision Gate 🏗️ completed the design decision gate check. See the comment below for the result and any generated ADR draft.

🏗️ ADR gate enforced by Design Decision Gate 🏗️

@github-actions

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

PR Code Quality Reviewer completed the code quality review.

Warning

Firewall blocked 1 domain

The following domain was blocked by the firewall during workflow execution:

  • github.com

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "github.com"

See Network Configuration for more information.

🔎 Code quality review by PR Code Quality Reviewer

@github-actions

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Ponytail Reviewer completed successfully!

Lean already. Ship.

Warning

Firewall blocked 1 domain

The following domain was blocked by the firewall during workflow execution:

  • ab.chatgpt.com

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "ab.chatgpt.com"

See Network Configuration for more information.

Generated by Ponytail Reviewer for #59257

@github-actions

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Test Quality Sentinel completed test quality analysis.

Test Quality Sentinel skipped because pre-fetch PR data was unavailable: unable to fetch test file diff

Warning

Firewall blocked 1 domain

The following domain was blocked by the firewall during workflow execution:

  • github.com

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "github.com"

See Network Configuration for more information.

🧪 Test quality analysis by Test Quality Sentinel

@github-actions

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

ADR Required

This PR triggers the design-decision gate because it adds more than 100 lines in business-logic code (pkg/cli/; prefetch summary reported 271 additions).

I did not find an existing ADR in the PR body, and the latest ADR on the branch (docs/adr/58872-require-codex-capable-models-for-codex-workflows.md) does not cover this change.

Based on the PR description and diff, I generated a draft ADR at docs/adr/59257-cache-complete-workflow-run-metadata-in-logs.md covering the decision to fetch, cache, and reuse full GitHub Actions workflow-run metadata as run.json, with GitHub metadata as the baseline and non-empty aw_info.json fields as overrides.

Evidence used

  • PR title/body: Cache complete workflow run metadata in logs
  • Diff adds fetchAndCacheWorkflowRunMetadata, run.json cache handling, metadata precedence updates, and tests across pkg/cli/
  • Existing ADR scan: latest branch ADRs stop at docs/adr/58872-...

Next action

  • Review and refine docs/adr/59257-cache-complete-workflow-run-metadata-in-logs.md, then keep the PR aligned with that decision before merge.

🏗️ ADR gate enforced by Design Decision Gate 🏗️ · pi · gpt54 · 18.3 AIC · ⌖ 12.6 AIC · ⊞ 10.1K ·
Comment /review to run again

@github-actions

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Comment Memory

reviewed_at: 2026-09-07T16:13:48Z
review_event: REQUEST_CHANGES
top_themes:
  - cache validation too weak for persisted run metadata
files_reviewed:
  - pkg/cli/logs_download_artifacts.go
  - pkg/cli/logs_github_api.go
  - pkg/cli/logs_github_api_test.go
  - pkg/cli/logs_json_test.go
  - pkg/cli/logs_models.go
  - pkg/cli/logs_report.go
  - pkg/cli/logs_run_processor.go
  - pkg/cli/logs_storage_limit.go
  - pkg/cli/logs_summary_integration_test.go
  - pkg/cli/logs_summary_test.go
  - pkg/cli/workflow_run_metadata.go
comment_count: 1

Note

This comment is managed by comment memory.

It stores persistent context for this thread in the code block at the top of this comment.
Edit only the text inside the backtick fences; workflow metadata and the footer are regenerated automatically.

Learn more about comment memory

Warning

Firewall blocked 1 domain

The following domain was blocked by the firewall during workflow execution:

  • github.com

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "github.com"

See Network Configuration for more information.

🔎 Code quality review by PR Code Quality Reviewer · copilot · gpt54 · 56.1 AIC · ⌖ 7.43 AIC · ⊞ 21.8K ·
Comment /review to run again

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Request changes

The new metadata cache introduces at least one correctness bug: run.json is reused on run ID alone, so a stale or cross-repo cache entry can silently stamp the wrong repository/actor/branch metadata onto a report.

Blocking theme

The cache validation is too weak for persisted workflow-run metadata. Returning a parsed payload without verifying that it still belongs to the expected repository context turns cache pollution into a silent data-integrity problem instead of a harmless miss.

Warning

Firewall blocked 1 domain

The following domain was blocked by the firewall during workflow execution:

  • github.com

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "github.com"

See Network Configuration for more information.

🔎 Code quality review by PR Code Quality Reviewer · copilot · gpt54 · 56.1 AIC · ⌖ 7.43 AIC · ⊞ 21.8K
Comment /review to run again

Comment thread pkg/cli/logs_github_api.go Outdated
func fetchAndCacheWorkflowRunMetadata(ctx context.Context, runID int64, outputDir, owner, repo, hostname string, verbose bool) (WorkflowRun, error) {
responsePath := filepath.Join(outputDir, runAPIResponseFileName)
if output, err := os.ReadFile(responsePath); err == nil {
if run, parseErr := parseWorkflowRunAPIResponse(output); parseErr == nil && run.DatabaseID == runID {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This metadata cache trusts any run.json whose numeric run ID matches, but it never verifies that the cached payload still belongs to the expected repository. If a stale or polluted cache directory is reused, gh aw logs can silently attach the wrong repository, actor, branch, and event to the report.

💡 Tighten the cache key, not just the parser

The new cache read path in fetchAndCacheWorkflowRunMetadata only checks run.DatabaseID == runID before returning the cached payload. That is not enough once the same logs directory can be copied, restored from another repo, or reused across contexts.

A safer check is to reject cached metadata unless it also matches the expected repository context when owner/repo are known, or at least unless the cached html_url / repository.full_name points at the same run namespace you are about to process.

if run.Repository != "" && owner != "" && repo != "" && !strings.EqualFold(run.Repository, owner+"/"+repo) {
    // treat as cache miss
}

Without that guard, this cache can produce structurally valid but semantically wrong reports, which is worse than a cache miss because downstream consumers will trust the bad metadata.

@github-actions

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Test Quality Sentinel 🧪

PR #59257 — "Cache complete workflow run metadata in logs"

Analysis Summary

Test Coverage Overview

  • Test files modified: 4 files
  • New test cases: ~11 behavioral tests added/modified
  • Lines added to tests: 69 lines (36 + 31 + 2 + 0 in test files)
  • Lines added to production: ~200 lines
  • Test Inflation Ratio: 34.5% (healthy, <2:1 threshold)

Quality Metrics

Metric Result Status
Build Tags ✅ All (go/redacted):build !integration present Pass
Forbidden Mocks ✅ None detected (testutil shell scripts only) Pass
Assertions ✅ 76 total assertions across 11 tests Pass
Error Coverage ✅ 24 error/require assertions Pass
Table-Driven Tests ✅ 3 parameterized test tables Pass
Design Contracts ✅ Caching, metadata extraction, edge cases Pass
Goroutine Leaks goleak.VerifyTestMain() in place Pass

New & Modified Tests

Behavioral Test Coverage (11 tests)

logs_github_api_test.go (36 lines added)

  • TestWorkflowRunUnmarshal — Validates deserialization without "path" field
  • TestFetchAndCacheWorkflowRunMetadata — Validates caching behavior, metadata extraction, cache hit on reload ✅ High-value design test
  • TestBuildCreatedFilter — Table-driven: 8 scenarios for date-range filter edge cases ✅ Parameterized edge cases
  • TestBuildCreatedFilterStartDateAlwaysEnforced — Regression test for missing lower-bound enforcement ✅ Design contract
  • TestListWorkflowRunsErrorHandling — Table-driven error classification (7 scenarios) ✅ Error path coverage
  • TestFetchJobDetailsWithCountsIncludesSteps — Full API response caching & parsing ✅ Behavioral contract
  • TestFetchJobDetailsWithCountsReturnsJobsWhenCacheWriteFails — Error resilience when cache unavailable ✅ Edge case
  • TestFetchJobDetailsWithCountsSkipsMalformedJobs — Graceful handling of corrupt data ✅ Error recovery
  • TestFetchJobDetailsWithCountsSkipsMalformedPages — Multi-page API resilience ✅ Pagination edge case
  • TestFetchJobDetailsWithCountsNullConclusion — Null conclusion handling (in-progress jobs) ✅ Real-world edge case
  • TestWorkflowRunsSpinnerMessage — Table-driven: 5 message formatting scenarios ✅ UX contract

logs_json_test.go (31 lines added)

  • TestBuildLogsDataUsesGitHubRunMetadataWithoutAwInfo — Metadata precedence logic ✅ Design contract
  • TestBuildLogsDataInfersWorkflowPathFromAwInfo — Workflow path inference fallback ✅ Feature coverage
  • TestBuildLogsDataPreservesExplicitWorkflowPath — Explicit path never overwritten ✅ Regression guard
  • TestCompactLogsDataEpisodesEmptySliceNotNull — JSON marshaling correctness (nil → [] contract) ✅ Serialization contract

logs_summary_test.go (2 line change)

  • Minor test maintenance (no new behavioral test functions)

logs_summary_integration_test.go (2 line change)

  • Minor test maintenance (no new behavioral test functions)

Red Flag Assessment

No red flags detected:

  • No assertion-only patterns (each assertion tied to observable behavior)
  • No mock-heavy anti-patterns (shell script mocks for external I/O are acceptable)
  • No test inflation (ratio well below 2:1)
  • No duplicated assertion patterns (unique scenarios per test)
  • All edge cases explicitly labeled with comment intent
  • Error-case assertions present in 10+ tests
  • Design contracts are explicit and testable

Quality Score Calculation

Design Tests (11/11):        100% → 40 pts
Edge Cases (6/11 explicit):   54% → 16 pts  
Duplicates (0 clusters):       0% → 20 pts
Inflation Ratio (0.345 < 2:1):      10 pts
─────────────────────────────────────
Total Score: 86/100 ✅ Excellent

Verdict

APPROVE — Test Quality Sentinel: 86/100

Rationale:

  • Strong design contract coverage (metadata caching, JSON serialization, edge case handling)
  • Excellent error path coverage (24 error assertions, 7 edge-case scenarios)
  • Healthy test-to-code ratio (34.5%, well below 2:1 inflation threshold)
  • All mandatory build tags present; no forbidden mocking libraries
  • Goroutine-leak guards (goleak.VerifyTestMain) protect against resource leaks
  • Table-driven tests provide parameter coverage for error classifications and message formatting
  • No implementation-test ratio concerns (16% implementation detail vs. 84% behavioral contracts)

Implementation Test Ratio: 16% (threshold: ≤30%) ✅ Pass

Warning

Firewall blocked 1 domain

The following domain was blocked by the firewall during workflow execution:

  • github.com

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "github.com"

See Network Configuration for more information.

🧪 Test quality analysis by Test Quality Sentinel · copilot · haiku45 · 27.8 AIC · ⌖ 11.1 AIC · ⊞ 8.3K ·
Comment /review to run again

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Test Quality Sentinel: 86/100. Implementation test ratio: 16% (threshold: ≤30%). All behavioral tests verified with strong design contract coverage, comprehensive error paths, and proper goroutine-leak guards via goleak.VerifyTestMain().

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Skills-Based Review 🧠

Applied /diagnosing-bugs and /tdd — requesting changes on one rate-limit gap before merge.

📋 Key Themes & Highlights

Key Themes

  • Missing rate-limit guard on cache-refresh path: tryLoadCachedRunResult calls fetchAndCacheWorkflowRunMetadata (a real gh api call on first cache-miss for run.json) without the waitForConfiguredRateLimit throttle used on the fresh-download path. This could cause a rate-limit burst when backfilling metadata across many pre-existing cached runs.
  • Fragile change-detection via struct equality: metadataApplied := result.Run != runBeforeMetadata depends on WorkflowRun staying comparable (==). Returning a bool from the merge function would be more robust as the struct grows.

Positive Highlights

  • ✅ Clean cache-then-fetch pattern in fetchAndCacheWorkflowRunMetadata, with sensible fallback on stale/mismatched cache entries.
  • ✅ Good test coverage added for the new metadata fetch/cache round-trip (TestFetchAndCacheWorkflowRunMetadata) and for the buildLogsData GitHub-metadata-without-aw_info path.
  • ✅ Consistent handling of run.json in storage-pruning and artifact-listing exclusions across all touched call sites.

🧠 Reviewed using Matt Pocock's skills by Matt Pocock Skills Reviewer · copilot · sonnet50 · 67.9 AIC · ⌖ 14.7 AIC · ⊞ 10.3K
Comment /matt to run again

Comment thread pkg/cli/logs_run_processor.go Outdated
Cached: true,
}
runBeforeMetadata := result.Run
if metadata, err := fetchAndCacheWorkflowRunMetadata(ctx, run.DatabaseID, runOutputDir, params.dlOwner, params.dlRepo, params.dlHost, params.verbose); err != nil {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[/diagnosing-bugs] The cache-hit path now makes an unthrottled gh api call via fetchAndCacheWorkflowRunMetadata, unlike the fresh-download path which calls waitForConfiguredRateLimit first (line 251). This silently bypasses --max-github-api-rate-limit on tryLoadCachedRunResult.

💡 Why this matters

On first run after upgrading, every pre-existing cached run (no run.json yet) will trigger a real network call here with zero throttling. For a bulk gh aw logs invocation over months of history this can burst far past the configured rate-limit ceiling that the rest of the pipeline carefully respects (see logsRunPreflightAPIReserve and the reserve-budget comment above processSingleRunDownload). Recommend calling waitForConfiguredRateLimit(ctx, params.verbose, params.maxGitHubAPIRateLimit, 1) before this fetch, mirroring the fresh-download path.

@copilot please address this.

Comment thread pkg/cli/logs_run_processor.go Outdated
} else {
applyWorkflowRunMetadata(&result.Run, metadata)
}
metadataApplied := result.Run != runBeforeMetadata

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[/tdd] metadataApplied := result.Run != runBeforeMetadata relies on WorkflowRun being comparable with ==. That works today, but it's a fragile invariant — any future field addition of a slice/map to WorkflowRun (quite plausible given this PR just added three scalar fields) will break compilation with a cryptic error far from this line, or worse, silently change semantics if someone works around it with reflect.DeepEqual inconsistently elsewhere.

💡 Suggestion

Consider having applyWorkflowRunMetadata return a bool indicating whether any field changed, instead of relying on struct equality of the whole WorkflowRun. That keeps the change-detection logic colocated with the merge logic and removes the comparability constraint on the struct.

@copilot please address this.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Cache freshness and artifact-detection regressions can produce stale or empty run reports.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Pull request overview

Caches complete workflow-run API responses and uses them to enrich log reports.

Changes:

  • Adds run.json fetching, parsing, caching, and pruning protection.
  • Enriches reports with repository, actor, attempt, event, and commit metadata.
  • Adds coverage for caching and artifact-inventory exclusions.
File summaries
File Description
pkg/cli/workflow_run_metadata.go Shares raw run API argument construction.
pkg/cli/logs_summary_test.go Tests excluding run.json from inventories.
pkg/cli/logs_summary_integration_test.go Extends integration coverage for exclusions.
pkg/cli/logs_storage_limit.go Preserves run.json during pruning.
pkg/cli/logs_run_processor.go Fetches and applies metadata to fresh and cached runs.
pkg/cli/logs_report.go Adds API metadata baselines and artifact overrides.
pkg/cli/logs_models.go Defines cached filename and metadata fields.
pkg/cli/logs_json_test.go Tests report metadata enrichment.
pkg/cli/logs_github_api.go Implements run-response parsing and caching.
pkg/cli/logs_github_api_test.go Tests metadata fetching and cache reuse.
pkg/cli/logs_download_artifacts.go Excludes the metadata cache from inventories.
Review details

Suppressed comments (1)

pkg/cli/logs_github_api.go:306

  • A matching run ID does not make this cache current: GitHub reruns reuse the same run ID while incrementing run_attempt, and queued/in-progress runs continue changing status and timestamps. This can indefinitely overwrite fresher gh run list data with an old attempt/status/conclusion. Validate the cache against the current run's attempt or updated_at, and refresh mutable runs.
	if output, err := os.ReadFile(responsePath); err == nil {
		if run, parseErr := parseWorkflowRunAPIResponse(output); parseErr == nil && run.DatabaseID == runID {
			return run, nil
  • Files reviewed: 12/12 changed files
  • Comments generated: 4
  • Review effort level: Balanced

💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.

Comment thread pkg/cli/logs_run_processor.go Outdated
Comment on lines +254 to +257
if err := os.MkdirAll(runOutputDir, constants.DirPermSensitive); err != nil {
return fmt.Errorf("failed to create run output directory: %w", err)
}
if metadata, err := fetchAndCacheWorkflowRunMetadata(ctx, run.DatabaseID, runOutputDir, perRunParams.dlOwner, perRunParams.dlRepo, perRunParams.dlHost, params.verbose); err != nil {
Comment thread pkg/cli/logs_download_artifacts.go Outdated

// Skip directories and synthesized cache/summary files
if info.IsDir() || filepath.Base(path) == runSummaryFileName || filepath.Base(path) == jobsAPIResponseFileName {
if info.IsDir() || filepath.Base(path) == runSummaryFileName || filepath.Base(path) == jobsAPIResponseFileName || filepath.Base(path) == runAPIResponseFileName {
Comment thread pkg/cli/logs_github_api.go Outdated
Comment on lines +264 to +266
if metadata.WorkflowName != "" {
run.WorkflowName = metadata.WorkflowName
}
Comment thread pkg/cli/logs_run_processor.go Outdated
Comment on lines +360 to +362
runBeforeMetadata := result.Run
if metadata, err := fetchAndCacheWorkflowRunMetadata(ctx, run.DatabaseID, runOutputDir, params.dlOwner, params.dlRepo, params.dlHost, params.verbose); err != nil {
logsOrchestratorLog.Printf("Failed to refresh cached workflow run metadata for run %d: %v", run.DatabaseID, err)

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the workflow-run metadata caching change (Go backend, no UI — Impeccable modes not applicable; performed a standard correctness/reliability review instead).

Overall the implementation is solid: WorkflowRun/RunData merging is mostly guarded against empty-value clobbering, caching/staleness handling (run.DatabaseID == runID check) is correct, and the artifact-listing/storage-pruning exclusions were updated consistently across all three related test files.

Two non-blocking observations left as inline comments:

  1. logsRunPreflightAPIReserve comment now claims to account for the new metadata fetch, but the constant value is unchanged — worth double-checking headroom.
  2. applyGitHubMetadataToRunData assigns fields unconditionally (unlike its sibling merge functions), which is currently safe due to call order but is a latent risk if reused/reordered.

No blocking issues found.

Warning

Firewall blocked 1 domain

The following domain was blocked by the firewall during workflow execution:

  • github.com

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "github.com"

See Network Configuration for more information.

🧵 Reviewed using Impeccable skills by Impeccable Skills Reviewer · copilot · sonnet50 · 109 AIC · ⌖ 13.5 AIC · ⊞ 8.3K

Comments that could not be inline-anchored

pkg/cli/logs_run_processor.go:223

The comment now says the preflight reserve accounts for the workflow-run metadata fetch in addition to the existing calls, but logsRunPreflightAPIReserve is left at 8 (unchanged). If this constant was already tightly sized for the prior call count, adding a new mandatory gh api call (fetchAndCacheWorkflowRunMetadata) inside the same runDownloadDeferred closure without increasing the reserve could let rate-limit usage exceed the configured ceiling before the next check, since `waitFo…

pkg/cli/logs_report.go:398

applyGitHubMetadataToRunData unconditionally assigns runData.Repository, runData.SHA, runData.Actor, and runData.EventName from run.Repository/run.HeadSha/run.Actor/run.Event even when those are empty strings. Contrast this with applyAwInfoToRunData just above (guarded by if awInfo.X != &quot;&quot;) and applyWorkflowRunMetadata in logs_github_api.go (also guarded). For older cached runs where the new run.json metadata fetch fails or the run predates this feature, `run.Repositor…

@gh-aw-bot

Copy link
Copy Markdown
Collaborator
pr-sous-chef

@copilot Please take the next forward-progress pass on PR #59257.

  • Address the open review feedback on current HEAD, especially the cache-freshness and metadata-validation concerns raised by review.
  • Re-check current checks and refresh the branch if needed after fixes.
  • Then run the pr-finisher skill and provide a concise maintainer-facing handoff summarizing what changed and any remaining blocker.

Generated by PR Sous Chef: https://github.com/github/gh-aw/actions/runs/34145431122

Generated by 👨‍🍳 PR Sous Chef · pi · gpt54 · 23.2 AIC · ⌖ 8.63 AIC · ⊞ 9.2K ·
Comment /souschef to run again

Co-authored-by: gh-aw-bot <259018956+gh-aw-bot@users.noreply.github.com>

Copilot AI commented Sep 7, 2026

Copy link
Copy Markdown
Contributor Author
pr-sous-chef
```...

Addressed the cache freshness, repository validation, artifact detection, display-name, and rate-limit concerns in df9a68a. Local validation and security scanning passed; the PR-finisher handoff is ready.

Copilot AI requested a review from gh-aw-bot September 7, 2026 17:24
@pelikhan
pelikhan merged commit 640b266 into main Sep 7, 2026
32 checks passed
@pelikhan
pelikhan deleted the copilot/collect-and-cache-gh-logs branch September 7, 2026 17:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants