Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions .github/workflows/impeccable-skills-reviewer.lock.yml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .github/workflows/impeccable-skills-reviewer.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ sandbox:

engine:
id: copilot
model: claude-sonnet-4.6
model: claude-haiku-4.5
max-continuations: 6
imports:
- uses: shared/pr-review-base.md
Expand Down
10 changes: 5 additions & 5 deletions .github/workflows/mattpocock-skills-reviewer.lock.yml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .github/workflows/mattpocock-skills-reviewer.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ sandbox:

engine:
id: copilot
model: claude-sonnet-4.6
model: claude-haiku-4.5
max-continuations: 6
imports:
- uses: shared/pr-review-base.md
Expand Down
10 changes: 5 additions & 5 deletions .github/workflows/pr-description-caveman.lock.yml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 5 additions & 1 deletion .github/workflows/pr-description-caveman.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ sandbox:
agent:
sudo: false

engine:
id: copilot
model: claude-haiku-4.5

strict: true
tools:
github:
Expand Down Expand Up @@ -170,7 +174,7 @@ Do not read additional files or invoke shell tools. The chunk content is provide
## agent: `pr-description-synthesizer`
---
description: Combines per-chunk analysis results and diff metadata into a final structured PR description optimised for agentic analysis.
model: large
model: claude-haiku-4.5
---

You receive:
Expand Down
48 changes: 48 additions & 0 deletions pkg/cli/read_only_maintenance_workflow_models_contract_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
//go:build !integration

package cli

import (
"os"
"path/filepath"
"testing"

"github.com/github/gh-aw/pkg/gitutil"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

func TestReadOnlyMaintenanceWorkflowsUseHaikuModels(t *testing.T) {
repoRoot, err := gitutil.FindGitRoot()
if err != nil {
t.Skipf("Skipping test: not in a git repository: %v", err)
}

t.Run("pr-description-updater", func(t *testing.T) {
workflowPath := filepath.Join(repoRoot, ".github", "workflows", "pr-description-caveman.md")
content, err := os.ReadFile(workflowPath)
require.NoError(t, err, "Should read pr-description-caveman workflow")

text := string(content)
assert.Contains(t, text, "engine:\n id: copilot", "Workflow should declare a top-level Copilot engine block")
assert.Contains(t, text, "\n model: claude-haiku-4.5\n", "Workflow should pin a cheaper Haiku top-level model")
assert.Contains(t, text, "## agent: `pr-description-synthesizer`", "Workflow should keep the dedicated synthesizer sub-agent")
assert.Contains(t, text, "## agent: `pr-description-synthesizer`\n---\ndescription: Combines per-chunk analysis results and diff metadata into a final structured PR description optimised for agentic analysis.\nmodel: claude-haiku-4.5", "Workflow synthesizer should use a cheaper Haiku model")
assert.NotContains(t, text, "model: large", "Workflow should no longer use the expensive large alias for PR description synthesis")
})

for _, workflowName := range []string{
"impeccable-skills-reviewer.md",
"mattpocock-skills-reviewer.md",
} {
t.Run(workflowName, func(t *testing.T) {
workflowPath := filepath.Join(repoRoot, ".github", "workflows", workflowName)
content, err := os.ReadFile(workflowPath)
require.NoError(t, err, "Should read %s workflow", workflowName)

text := string(content)
assert.Contains(t, text, "model: claude-haiku-4.5", "Read-only maintenance workflow should pin a cheaper Haiku model")
assert.NotContains(t, text, "model: claude-sonnet-4.6", "Read-only maintenance workflow should no longer use a Sonnet frontier model")
})
}
}