Bump default gh-aw-firewall to v0.27.7 and refresh generated artifacts#40208
Conversation
Co-authored-by: lpcox <15877973+lpcox@users.noreply.github.com>
|
🚀 Smoke Antigravity MISSION COMPLETE! Antigravity has spoken. ✨ |
|
🧠 Matt Pocock Skills Reviewer has completed the skills-based review. ✅ |
|
✅ PR Code Quality Reviewer completed the code quality review. |
|
✅ Test Quality Sentinel completed test quality analysis. |
|
✨ The prophecy is fulfilled... Smoke Codex has completed its mystical journey. The stars align. 🌟 |
|
✅ All tools validated successfully! Agent Container Smoke Test confirms agent container is ready. |
|
✅ Design Decision Gate 🏗️ completed the design decision gate check. No ADR enforcement needed: PR #40208 does not have the 'implementation' label and has 0 new lines of code in business logic directories (≤100 threshold). |
|
🚀 Smoke Gemini MISSION COMPLETE! Gemini has spoken. ✨ |
|
🚀 Smoke Pi MISSION COMPLETE! Pi delivered. 🥧 |
|
🎬 THE END — Smoke Claude MISSION: ACCOMPLISHED! The hero saves the day! ✨ |
|
📰 BREAKING: Smoke Copilot is now investigating this pull request. Sources say the story is developing... |
|
📰 BREAKING: Smoke Copilot - AOAI (Entra) is now investigating this pull request. Sources say the story is developing... |
There was a problem hiding this comment.
Pull request overview
This pull request bumps gh-aw’s default gh-aw-firewall (AWF) dependency to v0.27.7, refreshes the embedded AWF config JSON schema to match the upstream surface, and regenerates version-pinned artifacts (workflow lock files + wasm golden fixtures) so compiled workflows reference the updated AWF release.
Changes:
- Bump
DefaultFirewallVersiontov0.27.7. - Sync
pkg/workflow/schemas/awf-config.schema.jsonwith upstream (adds fields likeapiProxy.maxCacheMisses, plus updated limit/error semantics and descriptions). - Refresh generated artifacts (workflow
.lock.ymloutputs and wasm golden fixtures) and add a focused schema-validation test formaxCacheMisses, plus release notes via changeset + changelog entry.
Show a summary per file
| File | Description |
|---|---|
| pkg/constants/version_constants.go | Bumps default AWF version to v0.27.7. |
| pkg/workflow/schemas/awf-config.schema.json | Updates embedded AWF config schema (new fields + updated descriptions/limit semantics). |
| pkg/workflow/awf_config_test.go | Adds test coverage for apiProxy.maxCacheMisses schema validation. |
| CHANGELOG.md | Adds an Unreleased entry summarizing the AWF bump + schema refresh. |
| .changeset/patch-bump-awf-v0-27-7.md | Adds patch changeset for the dependency/schema/artifact refresh. |
| pkg/workflow/testdata/TestWasmGolden_CompileFixtures/basic-copilot.golden | Updates golden fixture outputs for AWF v0.27.7 and image tags. |
| pkg/workflow/testdata/TestWasmGolden_CompileFixtures/playwright-cli-mode.golden | Updates golden fixture outputs for AWF v0.27.7 and image tags. |
| pkg/workflow/testdata/TestWasmGolden_CompileFixtures/smoke-copilot.golden | Updates golden fixture outputs for AWF v0.27.7 and image tags. |
| pkg/workflow/testdata/TestWasmGolden_CompileFixtures/with-imports.golden | Updates golden fixture outputs for AWF v0.27.7 and image tags. |
| pkg/workflow/testdata/TestWasmGolden_AllEngines/claude.golden | Updates all-engines golden output for AWF v0.27.7. |
| pkg/workflow/testdata/TestWasmGolden_AllEngines/codex.golden | Updates all-engines golden output for AWF v0.27.7. |
| pkg/workflow/testdata/TestWasmGolden_AllEngines/copilot.golden | Updates all-engines golden output for AWF v0.27.7. |
| pkg/workflow/testdata/TestWasmGolden_AllEngines/gemini.golden | Updates all-engines golden output for AWF v0.27.7. |
| pkg/workflow/testdata/TestWasmGolden_AllEngines/pi.golden | Updates all-engines golden output for AWF v0.27.7. |
| .github/workflows/test-workflow.lock.yml | Regenerates compiled lock workflow to reference AWF v0.27.7. |
| .github/workflows/example-permissions-warning.lock.yml | Regenerates compiled lock workflow to reference AWF v0.27.7. |
| .github/workflows/daily-malicious-code-scan.lock.yml | Regenerates compiled lock workflow to reference AWF v0.27.7. |
| .github/workflows/codex-github-remote-mcp-test.lock.yml | Regenerates compiled lock workflow to reference AWF v0.27.7. |
| .github/workflows/bot-detection.lock.yml | Regenerates compiled lock workflow to reference AWF v0.27.7. |
| .github/workflows/agentic-token-optimizer.lock.yml | Regenerates compiled lock workflow to reference AWF v0.27.7. |
Copilot's findings
Tip
Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
- Files reviewed: 41/264 changed files
- Comments generated: 1
| # gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"b3a8dc40f5df3ec0f118739c2539bcc5b6a6c49abf9a477ec5381041b627d50a","body_hash":"6026d24fd6e26edf7b13fa2e49f662cdc806e8157b3f23a618a036213eba1870","strict":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.63"}} | ||
| # gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_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":"27d5ce7f107fe9357f9df03efb73ab90386fccae","version":"v5.0.5"},{"repo":"actions/cache/save","sha":"27d5ce7f107fe9357f9df03efb73ab90386fccae","version":"v5.0.5"},{"repo":"actions/checkout","sha":"df4cb1c069e1874edd31b4311f1884172cec0e10","version":"v6.0.3"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.27.6","digest":"sha256:5b778c712a25397a38a47cee3467a9cbc726b16320cc133a0758c0592a6f0792","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.27.6@sha256:5b778c712a25397a38a47cee3467a9cbc726b16320cc133a0758c0592a6f0792"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.6","digest":"sha256:7b14e481f3a9898f1e9be50acc4e58541d9fcd85b49b1e4945b708f1bf1bf68e","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.6@sha256:7b14e481f3a9898f1e9be50acc4e58541d9fcd85b49b1e4945b708f1bf1bf68e"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.27.6","digest":"sha256:730985e67931b9774545bce76b3ac5a354aa1dc11f19ee8f2d9cbf3211d73c3a","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.27.6@sha256:730985e67931b9774545bce76b3ac5a354aa1dc11f19ee8f2d9cbf3211d73c3a"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.3.27","digest":"sha256:fe984bddde4ec05d756d9043edb0a32912e6b7b72f6a121b1082f29221421cc7","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.3.27@sha256:fe984bddde4ec05d756d9043edb0a32912e6b7b72f6a121b1082f29221421cc7"},{"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.3.0","digest":"sha256:5c83359327a0bacc3d34db730bea6557d39d341cee0bf6c58c9a896e33150e80","pinned_image":"ghcr.io/github/github-mcp-server:v1.3.0@sha256:5c83359327a0bacc3d34db730bea6557d39d341cee0bf6c58c9a896e33150e80"}]} | ||
| # gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_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":"27d5ce7f107fe9357f9df03efb73ab90386fccae","version":"v5.0.5"},{"repo":"actions/cache/save","sha":"27d5ce7f107fe9357f9df03efb73ab90386fccae","version":"v5.0.5"},{"repo":"actions/checkout","sha":"df4cb1c069e1874edd31b4311f1884172cec0e10","version":"v6.0.3"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.27.7"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.7"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.27.7"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.3.27","digest":"sha256:fe984bddde4ec05d756d9043edb0a32912e6b7b72f6a121b1082f29221421cc7","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.3.27@sha256:fe984bddde4ec05d756d9043edb0a32912e6b7b72f6a121b1082f29221421cc7"},{"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.3.0","digest":"sha256:5c83359327a0bacc3d34db730bea6557d39d341cee0bf6c58c9a896e33150e80","pinned_image":"ghcr.io/github/github-mcp-server:v1.3.0@sha256:5c83359327a0bacc3d34db730bea6557d39d341cee0bf6c58c9a896e33150e80"}]} |
|
📰 BREAKING: Smoke Copilot - AOAI (apikey) is now investigating this pull request. Sources say the story is developing... |
Agent Container Tool Check
Result: 12/12 tools available ✅ Overall Status: PASS
|
Smoke Test Results (Gemini)
Overall Status: FAIL Warning Firewall blocked 1 domainThe following domain was blocked by the firewall during workflow execution:
network:
allowed:
- defaults
- "localhost"See Network Configuration for more information.
|
Test Quality Sentinel 🧪 — Score: 70/100
|
| Metric | Value |
|---|---|
| New tests analyzed | 1 |
| Design tests (behavioral) | 1 (100%) |
| Implementation tests | 0 (0%) |
| Tests with edge-case coverage | 0 (0%) |
| Duplicate clusters | 0 |
| Test inflation | No (5 lines in test vs 63 in production schema, ratio 0.08) |
| Coding-guideline violations | None |
📋 Test Classification
| Test | File | Classification | Edge Cases | Notes |
|---|---|---|---|---|
TestValidateAWFConfigJSON_AllowsMaxCacheMisses |
pkg/workflow/awf_config_test.go |
✅ Design test | ❌ None | Positive-only schema validation test. Consistent with existing Allows* pattern in the file. Assertion message present. Build tag //go:build !integration present on line 1. |
Verdict: ✅ PASS — 0% implementation tests (threshold: 30%), no coding-guideline violations detected.
References: §27804618596
🧪 Test quality analysis by Test Quality Sentinel · 39.8 AIC · ⌖ 10.4 AIC · ⊞ 8.3K · ◷
|
Smoke Test: Codex - 27804624741 Warning Firewall blocked 6 domainsThe following domains were blocked by the firewall during workflow execution:
network:
allowed:
- defaults
- "accounts.google.com"
- "android.clients.google.com"
- "clients2.google.com"
- "contentautofill.googleapis.com"
- "safebrowsingohttpgateway.googleapis.com"
- "www.google.com"See Network Configuration for more information.
|
Comment MemoryNote This comment is managed by comment memory.It stores persistent context for this thread in the code block at the top of this comment. Warning Firewall blocked 6 domainsThe following domains were blocked by the firewall during workflow execution:
network:
allowed:
- defaults
- "accounts.google.com"
- "android.clients.google.com"
- "clients2.google.com"
- "contentautofill.googleapis.com"
- "safebrowsingohttpgateway.googleapis.com"
- "www.google.com"See Network Configuration for more information.
|
💥 Smoke Test: Claude — Run 27804624764Core #1-12: ✅ all passed Overall: PARTIAL (2 skipped, 0 failed) Warning Firewall blocked 6 domainsThe following domains were blocked by the firewall during workflow execution:
network:
allowed:
- defaults
- "accounts.google.com"
- "android.clients.google.com"
- "clients2.google.com"
- "contentautofill.googleapis.com"
- "safebrowsingohttpgateway.googleapis.com"
- "www.google.com"See Network Configuration for more information.
|
There was a problem hiding this comment.
💥 Automated smoke test review - all systems nominal!
Warning
Firewall blocked 6 domains
The following domains were blocked by the firewall during workflow execution:
accounts.google.comandroid.clients.google.comclients2.google.comcontentautofill.googleapis.comsafebrowsingohttpgateway.googleapis.comwww.google.com
To allow these domains, add them to the
network.allowedlist in your workflow frontmatter:
network:
allowed:
- defaults
- "accounts.google.com"
- "android.clients.google.com"
- "clients2.google.com"
- "contentautofill.googleapis.com"
- "safebrowsingohttpgateway.googleapis.com"
- "www.google.com"See Network Configuration for more information.
💥 [THE END] — Illustrated by Smoke Claude · 66.2 AIC · ⌖ 8.57 AIC · ⊞ 8.5K
| @@ -0,0 +1,5 @@ | |||
| --- | |||
| "gh-aw": patch | |||
There was a problem hiding this comment.
Nice — pinning this as a patch bump is appropriate for a firewall version refresh.
| "gh-aw": patch | ||
| --- | ||
|
|
||
| Bump the default gh-aw-firewall version to v0.27.7, sync the embedded AWF config schema, and regenerate pinned workflow artifacts. |
There was a problem hiding this comment.
Clear changeset description covering the firewall bump and regenerated artifacts. 👍
There was a problem hiding this comment.
Skills-Based Review 🧠
Applied /zoom-out and /tdd — leaving comments on 4 issues to clarify before merge.
📋 Key Themes & Highlights
Key Themes
- SHA pins absent from lock files: All 264 regenerated lock files carry only version tags (
0.27.7) without@sha256:digests. The previous v0.27.6 artifacts had per-component SHA pins. Theversion_constants.godoc-comment says two recompile passes are needed to resolve SHA pins — worth confirming whether v0.27.7 digests are available and whether the second pass was run. - Floating schema
$id: The embeddedawf-config.schema.jsonnow has amain-branch$idrather than a versioned release URL, decoupling the canonical identity from the pinned release. - Test coverage gaps on new schema surface:
allowedModels,disallowedModels, anddiagnosticsfields are added to the schema with zero tests;maxCacheMisseshas a happy-path test but no minimum-violation check.
Positive Highlights
- ✅ Well-structured PR description with clear scope (version bump, schema sync, artifact refresh, test, changelog)
- ✅
maxCacheMissesacceptance test follows the established pattern cleanly - ✅ CHANGELOG entry placed correctly in the Unreleased section
- ✅
AWF*MinVersiongates left unchanged — no compatibility risk introduced - ✅ HTTP 429 → 403 description updates in the schema correctly reflect upstream behavioral change
🧠 Reviewed using Matt Pocock's skills by Matt Pocock Skills Reviewer · 158.2 AIC · ⌖ 8.06 AIC · ⊞ 6.9K
| @@ -73,7 +73,7 @@ const DefaultGitHubMCPServerVersion Version = "v1.3.0" | |||
| // | |||
| // The first recompile regenerates all lock files using the new version; the second recompile | |||
| // refreshes the container SHA pins that were resolved during the first pass. | |||
| const DefaultFirewallVersion Version = "v0.27.6" | |||
| const DefaultFirewallVersion Version = "v0.27.7" | |||
There was a problem hiding this comment.
[/zoom-out] Container SHA pins appear to be missing from all regenerated lock files — this reduces supply chain security and reproducibility.
The comment above this constant says two recompile passes are needed (make build && make recompile && make recompile) with the second pass resolving per-component SHA digests. The generated lock files only carry 0.27.7 tags without @sha256: pins (previous v0.27.6 lock files had agent=sha256:5b778c... etc. embedded in imageTag). If v0.27.7 digests are not yet resolvable by the toolchain, please note that in the PR description so reviewers know this is intentional rather than a missed step.
💡 What the diff shows
Before (v0.27.6):
# ghcr.io/github/gh-aw-firewall/agent:0.27.6@sha256:5b778c712a25...
"imageTag":"0.27.6,squid=sha256:...,agent=sha256:..."
After (v0.27.7):
# ghcr.io/github/gh-aw-firewall/agent:0.27.7
"imageTag":"0.27.7"
Docker tags are mutable; without SHA pins, a compromised or accidentally overwritten tag could silently run different code.
| @@ -1,6 +1,6 @@ | |||
| { | |||
| "$schema": "https://json-schema.org/draft/2020-12/schema", | |||
| "$id": "https://github.com/github/gh-aw-firewall/releases/download/v0.27.0/awf-config.schema.json", | |||
| "$id": "https://raw.githubusercontent.com/github/gh-aw-firewall/main/docs/awf-config.schema.json", | |||
There was a problem hiding this comment.
[/zoom-out] The schema $id changed from a pinned release URL to a floating main branch reference — this decouples the schema identity from the versioned release.
Previously it was https://github.com/github/gh-aw-firewall/releases/download/v0.27.0/awf-config.schema.json (pinned). Now it is https://github.com/github/gh-aw-firewall/main/docs/awf-config.schema.json (floating). The $id is the canonical URI for this schema; using main means two different AWF releases will share the same $id, which can confuse validators and tooling that cache by URI.
💡 Suggestion
Consider using the v0.27.7 release URL instead:
"$id": "https://github.com/github/gh-aw-firewall/releases/download/v0.27.7/awf-config.schema.json"If upstream deliberately changed to a floating $id, consider whether gh-aw should rewrite this field at embed-time to the pinned version URL.
| func TestValidateAWFConfigJSON_AllowsMaxCacheMisses(t *testing.T) { | ||
| err := validateAWFConfigJSON(`{"apiProxy":{"enabled":true,"maxCacheMisses":3}}`) | ||
| require.NoError(t, err, "maxCacheMisses should pass compile-time schema validation") | ||
| } |
There was a problem hiding this comment.
[/tdd] Happy path only — the minimum: 1 constraint on maxCacheMisses is not verified by a rejection test.
Adding a test that confirms maxCacheMisses: 0 is rejected by the schema would guard against the constraint silently disappearing in a future schema refresh.
💡 Suggested test
func TestValidateAWFConfigJSON_RejectsMaxCacheMissesZero(t *testing.T) {
err := validateAWFConfigJSON(`{"apiProxy":{"enabled":true,"maxCacheMisses":0}}`)
require.Error(t, err, "maxCacheMisses: 0 should fail schema validation (minimum: 1)")
}This follows the pattern used by other schema-constraint tests in this file.
| func TestValidateAWFConfigJSON_AllowsMaxCacheMisses(t *testing.T) { | ||
| err := validateAWFConfigJSON(`{"apiProxy":{"enabled":true,"maxCacheMisses":3}}`) | ||
| require.NoError(t, err, "maxCacheMisses should pass compile-time schema validation") | ||
| } |
There was a problem hiding this comment.
[/tdd] Three new schema fields (allowedModels, disallowedModels, diagnostics) have no test coverage at all.
A future schema refresh could drop or change these fields and tests would not catch it. Given the existing pattern in this file, adding at least acceptance tests for each field would be low-effort.
💡 Suggested additions
func TestValidateAWFConfigJSON_AllowsAllowedModels(t *testing.T) {
err := validateAWFConfigJSON(`{"apiProxy":{"enabled":true,"allowedModels":["*sonnet*"]}}`)
require.NoError(t, err, "allowedModels should pass compile-time schema validation")
}
func TestValidateAWFConfigJSON_AllowsDisallowedModels(t *testing.T) {
err := validateAWFConfigJSON(`{"apiProxy":{"enabled":true,"disallowedModels":["*opus*"]}}`)
require.NoError(t, err, "disallowedModels should pass compile-time schema validation")
}
func TestValidateAWFConfigJSON_AllowsDiagnosticsCaptureBlockedRequests(t *testing.T) {
err := validateAWFConfigJSON(`{"apiProxy":{"enabled":true,"diagnostics":{"captureBlockedRequests":"summary"}}}`)
require.NoError(t, err, "diagnostics.captureBlockedRequests should pass compile-time schema validation")
}
SmokeBump default gh-aw-firewall to v0.27.7 and refresh generated artifacts Warning Firewall blocked 6 domainsThe following domains were blocked by the firewall during workflow execution:
network:
allowed:
- defaults
- "accounts.google.com"
- "android.clients.google.com"
- "clients2.google.com"
- "contentautofill.googleapis.com"
- "safebrowsingohttpgateway.googleapis.com"
- "www.google.com"See Network Configuration for more information.
|
Comment MemoryNote This comment is managed by comment memory.It stores persistent context for this thread in the code block at the top of this comment. Warning Firewall blocked 6 domainsThe following domains were blocked by the firewall during workflow execution:
network:
allowed:
- defaults
- "accounts.google.com"
- "android.clients.google.com"
- "clients2.google.com"
- "contentautofill.googleapis.com"
- "safebrowsingohttpgateway.googleapis.com"
- "www.google.com"See Network Configuration for more information.
|
There was a problem hiding this comment.
Smoke run done. Tools mostly bonk good. Two cave dents noted.
Warning
Firewall blocked 6 domains
The following domains were blocked by the firewall during workflow execution:
accounts.google.comandroid.clients.google.comclients2.google.comcontentautofill.googleapis.comsafebrowsingohttpgateway.googleapis.comwww.google.com
To allow these domains, add them to the
network.allowedlist in your workflow frontmatter:
network:
allowed:
- defaults
- "accounts.google.com"
- "android.clients.google.com"
- "clients2.google.com"
- "contentautofill.googleapis.com"
- "safebrowsingohttpgateway.googleapis.com"
- "www.google.com"See Network Configuration for more information.
📰 BREAKING: Report filed by Smoke Copilot · 158.7 AIC · ⌖ 16.7 AIC · ⊞ 19.9K
There was a problem hiding this comment.
REQUEST_CHANGES — Three issues need resolution before merge, on top of the already-flagged missing SHA digests.
### Blocking issues (3)
-
Schema
$idmismatch (awf-config.schema.jsonline 3) — The embedded schema's$idnow points to the mutablemainbranch whileawf_config.goregisters the schema under a versioned release URL and generates$schemapointers to that same versioned URL. These two identities disagree. External validators and IDE tooling will silently resolve against a different schema than the one embedded here, and the mismatch will grow with every future upstream commit. Fix: keep$idversioned to match the URL used inawf_config.go. -
HTTP 429 → 403 is a breaking behavioral change with no migration note (
awf-config.schema.jsonline 70) —maxEffectiveTokens,maxAiCredits, andmaxTurnsall switched from429 Too Many Requeststo403 Forbiddenfor their limit-exceeded responses. Retry logic, monitoring alerts, and SDK middleware keyed on 429 will silently break. The CHANGELOG entry only says "HTTP 403 behavior" without marking this as breaking or providing a migration path. -
enableTokenSteeringprerequisite change without migration guidance (awf-config.schema.jsonline 56) — The description quietly changed from "Requires maxAiCredits" to "Requires maxEffectiveTokens". Users withenableTokenSteering: true+maxAiCreditsget silent behavioral change after upgrading.
### Non-blocking (1)
- Thin test coverage for schema expansion (
awf_config_test.goline 997) — The only new test is one happy-path formaxCacheMisses. Theminimum: 1boundary is untested, and the four newly added schema sections (allowedModels,disallowedModels,diagnostics,platform) have no tests at all.
🔎 Code quality review by PR Code Quality Reviewer · 123.2 AIC · ⌖ 7.72 AIC · ⊞ 5.1K
| @@ -1,6 +1,6 @@ | |||
| { | |||
| "$schema": "https://json-schema.org/draft/2020-12/schema", | |||
| "$id": "https://github.com/github/gh-aw-firewall/releases/download/v0.27.0/awf-config.schema.json", | |||
| "$id": "https://raw.githubusercontent.com/github/gh-aw-firewall/main/docs/awf-config.schema.json", | |||
There was a problem hiding this comment.
Schema $id now points to the mutable main branch, creating an identity mismatch with generated configs.
💡 Details and suggested fix
awf_config.go (line 96) registers the embedded schema under the versioned release URL:
schemaURL := fmt.Sprintf("https://github.com/github/gh-aw-firewall/releases/download/%s/awf-config.schema.json", constants.DefaultFirewallVersion)
loader.AddResource(schemaURL, schemaDoc)Generated AWF configs will therefore emit $schema pointing to the versioned release URL, but the embedded schema now declares $id pointing to the mutable main branch. These two URLs disagree.
Consequences:
- AWF runtime — if the firewall validates incoming configs against the
$schemaURL, it may fetch a different schema than the embedded bytes. - IDE / external tooling — tools that resolve
$id(e.g., JSON Language Server) will silently fetch the livemainschema instead of the v0.27.7 snapshot, giving permanently mismatched autocomplete/validation once upstream drifts. - Reproducibility — the
mainURL is mutable; the schema identity will diverge from the embedded bytes on every future upstream commit.
Suggested fix: Keep the $id versioned, matching the URL that awf_config.go already uses for schema registration:
"$id": "https://github.com/github/gh-aw-firewall/releases/download/v0.27.7/awf-config.schema.json"Or update awf_config.go to register the schema under its actual $id so the two stay in sync.
| @@ -67,12 +67,12 @@ | |||
| "maxEffectiveTokens": { | |||
| "type": "integer", | |||
| "minimum": 1, | |||
| "description": "Maximum cumulative effective tokens allowed for a run. When reached, the API proxy rejects subsequent requests with HTTP 429 and error type 'effective_tokens_limit_exceeded'. Tokens are weighted: input ×1, cache-read ×0.1, output ×4, reasoning ×4. See spec §10." | |||
| "description": "Maximum cumulative effective tokens allowed for a run. When reached, the API proxy rejects subsequent requests with HTTP 403 and error type 'effective_tokens_limit_exceeded'. Tokens are weighted: input ×1, cache-read ×0.1, output ×4, reasoning ×4. See spec §10." | |||
There was a problem hiding this comment.
Breaking behavioral change: limit-exceeded responses moved from HTTP 429 (retriable) to HTTP 403 (non-retriable) — not flagged as breaking in the CHANGELOG.
💡 Details
Three guards changed their documented error status code from 429 Too Many Requests to 403 Forbidden in this diff: maxEffectiveTokens, maxAiCredits, and maxTurns (and the new maxCacheMisses uses 403 from the start).
429 and 403 carry fundamentally different retry semantics:
- 429 — standard "rate limited, back off and retry" signal. Clients, CI wrappers, and SDKs with retry logic will automatically retry these.
- 403 — "forbidden, do not retry". Those same clients will now treat a cap hit as a hard auth/permission failure and stop immediately.
Real-world impact:
- Any CI wrapper or script that retries on 429 will now silently swallow the error on 403 instead of retrying, breaking runs that previously recovered.
- Monitoring/alerting rules keyed on 429 to detect cap hits will stop firing.
- SDK-level retry middleware will interpret the cap hit as a permanent auth failure rather than a transient limit.
The CHANGELOG entry mentions "HTTP 403 behavior" but does not call this out as a breaking change for consumers that differentiate these status codes. The unreleased section should include an explicit migration note for anyone with retry or monitoring logic that keys on HTTP 429 for AWF-proxied requests.
| @@ -53,7 +53,7 @@ | |||
| }, | |||
| "enableTokenSteering": { | |||
| "type": "boolean", | |||
| "description": "Enable AI Credits budget steering. When true, the proxy injects budget-warning system messages at 80%, 90%, 95%, and 99% usage to nudge the agent to wrap up. Requires maxAiCredits. Default: false." | |||
| "description": "Enable effective token budget steering. When true, the proxy injects budget-warning system messages at 80%, 90%, 95%, and 99% usage to nudge the agent to wrap up. Requires maxEffectiveTokens. Default: false." | |||
There was a problem hiding this comment.
enableTokenSteering silently changes its prerequisite from maxAiCredits to maxEffectiveTokens with no migration guidance.
💡 Details
The description changed from:
Requires maxAiCredits. Default: false.
To:
Requires maxEffectiveTokens. Default: false.
Any user who upgraded to v0.27.7 with a config like:
{ "apiProxy": { "enableTokenSteering": true, "maxAiCredits": 500 } }will find that token steering silently stops working (or behaves differently) because the upstream firewall now keys off maxEffectiveTokens rather than maxAiCredits. There is no error, no warning, just different runtime behavior.
This needs an explicit migration note in the CHANGELOG (or at minimum in the unreleased section) along the lines of:
⚠️ If you useapiProxy.enableTokenSteering, replacemaxAiCreditswithmaxEffectiveTokensto retain budget-steering behaviour in v0.27.7.
| @@ -993,6 +993,11 @@ func TestValidateAWFConfigJSON_AllowsTemplatableModelFallbackEnabled(t *testing. | |||
| require.NoError(t, err, "modelFallback.enabled expressions should pass compile-time schema validation") | |||
| } | |||
|
|
|||
| func TestValidateAWFConfigJSON_AllowsMaxCacheMisses(t *testing.T) { | |||
| err := validateAWFConfigJSON(`{"apiProxy":{"enabled":true,"maxCacheMisses":3}}`) | |||
There was a problem hiding this comment.
Test covers only one happy-path for maxCacheMisses; minimum boundary and all other new schema fields are untested.
💡 Suggested additions
The schema declares "minimum": 1 for maxCacheMisses but there is no test asserting that maxCacheMisses: 0 is rejected:
func TestValidateAWFConfigJSON_RejectsMaxCacheMissesZero(t *testing.T) {
err := validateAWFConfigJSON(`{"apiProxy":{"enabled":true,"maxCacheMisses":0}}`)
require.Error(t, err, "maxCacheMisses of 0 should fail schema validation (minimum: 1)")
}This PR also adds allowedModels, disallowedModels, diagnostics, and platform to the schema but adds zero tests for any of them. At minimum the happy-path acceptance tests are easy to add and would catch a future regression where these fields are accidentally removed or renamed in the embedded schema.
|
Smoke Test 27804720368: FAIL Warning Firewall blocked 6 domainsThe following domains were blocked by the firewall during workflow execution:
network:
allowed:
- defaults
- "accounts.google.com"
- "android.clients.google.com"
- "clients2.google.com"
- "contentautofill.googleapis.com"
- "safebrowsingohttpgateway.googleapis.com"
- "www.google.com"See Network Configuration for more information.
|
This updates gh-aw’s default AWF dependency from
v0.27.6tov0.27.7and regenerates the version-pinned artifacts that embed the firewall release. It also syncs the embedded AWF config schema so gh-aw matches the upstream release behavior and schema surface.Version bump
pkg/constants/version_constants.go:AWF*MinVersiongates unchanged; this release does not introduce new version-gated flags.Schema sync
pkg/workflow/schemas/awf-config.schema.jsonfrom the upstreamv0.27.7release.403apiProxy.maxCacheMissesGenerated artifact refresh
v0.27.7.GH_AW_INFO_AWF_VERSION/ AWF image tag data.Coverage for the new schema surface
maxCacheMissesacceptance.Release metadata
CHANGELOG.mdunreleased entry summarizing the dependency/schema refresh.✨ PR Review Safe Output Test - Run 27804624764
Warning
Firewall blocked 6 domains
The following domains were blocked by the firewall during workflow execution:
accounts.google.comandroid.clients.google.comclients2.google.comcontentautofill.googleapis.comsafebrowsingohttpgateway.googleapis.comwww.google.comSee Network Configuration for more information.