Skip to content

review: move to gh-aw v0.83.4; retire the firewall pin and restore sub-agent retries - #296

Merged
jwbron merged 2 commits into
mainfrom
jwies/gh-aw-v0.83.4
Jul 30, 2026
Merged

review: move to gh-aw v0.83.4; retire the firewall pin and restore sub-agent retries#296
jwbron merged 2 commits into
mainfrom
jwies/gh-aw-v0.83.4

Conversation

@jwbron

@jwbron jwbron commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Moves the reviewer onto gh-aw v0.83.4 (from v0.81.6) and retires the two frontmatter workarounds the new default firewall makes obsolete. Stacked on #288; #289 is restacked on top of this.

Why this is its own PR

#289 graduates scripted dispatch to the only mode, and the next step after it (replacing the LLM orchestrator with a behavior-defined engine, which only exists in gh-aw >= 0.82) needs this bump. Landing the bump separately keeps the bisect honest: if the reviewer misbehaves after this, the cause is the toolchain, not the pipeline change on top of it.

The bump is not cosmetic. Two execution-model changes ride along:

  • The awf sandbox now runs rootless. sudo -E awf … becomes awf …, and the binary installs with --rootless. The --proxy-logs-dir/--audit-dir flags move into the awf config's logging block, and --enable-host-access --allow-host-ports 80,443,8080 is gone.
  • The MCP gateway moves off host networking. The gateway container runs on a bridge network with a published port, MCP_GATEWAY_DOMAIN becomes awmg-mcpg, and the sandbox config gains "isolation": true with "topologyAttach": ["awmg-mcpg"].

Neither can be verified by compiling. The live run of this workflow on this PR is the acceptance test (pull_request runs the workflow from the PR head, so this PR reviews itself with the new lock).

What changed

Toolchain (recompiled review.lock.yml + actions-lock.json). Setup action v0.81.6 → v0.83.4, MCP gateway v0.3.30 → v0.4.6, GitHub MCP server v1.4.0 → v1.7.0, Claude Code CLI 2.1.191 → 2.1.220, actions/cache v5.0.5 → v6.1.0, actions/checkout v7.0.0 → v7.0.1, actions/setup-node v6.4.0 → v7.0.0. New steps: an activation-job OAuth-token check, automatic GitHub-MCP lockdown-mode determination (sink-visibility), and a safe-outputs manifest download in the conclusion job. The agent job now also surfaces http_400_response_error and invocation_cap_exceeded outputs, which is exactly the class of failure the fable pricing incident produced.

The firewall pin and the models: pricing override are removed from the shared frontmatter and from this repo's installed copy (the latter as a marked KHAN/ACTIONS LOCAL OVERRIDE, since the install stays on review-v1.7.0 until its next bump). This turned out to be required, not a cleanup — see the live finding below. On its own terms the removal is also right: both existed only because claude-fable-5 was absent from the AI-credits pricing table of the firewall gh-aw <= 0.81.x defaulted to (v0.27.11), and the api-proxy rejects an un-priced model with a 400; the pin held v0.27.27, the release that added Claude 5 pricing. v0.83.4 defaults to v0.27.42, which prices claude-fable-5 (verified in containers/api-proxy/ai-credits-pricing.js at that tag) and pins every firewall container by digest. sandbox.agent.id: awf stays declared, since the api-proxy is what meters AI credits and caps a runaway fan-out.

Live finding: the pin and a v0.83.4 lock disagree about how to reach the MCP gateway. v0.83.4 compiles the agent to reach it over a bridge network (MCP_GATEWAY_DOMAIN: awmg-mcpg, network.isolation, network.topologyAttach). Firewall v0.27.27 implements none of those keys — they are absent from its awf-resolved-config.json — and its squid allowlist consequently carries .host.docker.internal with no route to awmg-mcpg. Both runs of this PR measure the difference:

with the pin (run 30290472047) without it (run 30292838824, firewall v0.27.42)
firewall denials 3 × TCP_DENIED on POST awmg-mcpg:8080/mcp/github and /mcp/safeoutputs none
MCP tools/call 10 (GitHub reads only) 16, including create_pull_request_review_comment, submit_pull_request_review, upload_artifact
outcome failed on the 20-minute step timeout, nothing posted execute step 18m31s, APPROVE review + guidance comment posted, $12.19

So the pin does not disable MCP outright — traffic over the path that bypasses squid still worked — but it does have the sandbox rejecting a gateway path its own lock expects to use, on a firewall that silently discarded the topology config it was handed. That pairing should not ship, hence the removal in both the shared source and this repo's installed copy.

The timeout is pre-existing, not a bump regression. Three earlier runs on v0.81.6 (30279356940, 30026567946, 29952468664, three different branches) failed at the same 20-minute ceiling, and #285 is the open fix that raises it to 40. Even the clean run above finished with only 90 seconds of margin, so that fix is still the load-bearing one for large diffs.

Sub-agent retries are restored in code (dispatch-runner.ts). v0.83 sets ANTHROPIC_MAX_RETRIES=0 on the engine step, deliberately: it wants a terminal error (403 ai_credits_limit_exceeded) to reach the harness that owns retry/backoff for 429/529. That harness wraps the orchestrator process only. The dispatcher's sub-agents are spawned inside it with no such wrapper, so they would have inherited 0 and turned any transient overload into a shed lens on every scripted run. The runner now passes the SDK's env option with ANTHROPIC_MAX_RETRIES back at the SDK default for the sub-agent subprocesses alone, spreading process.env first because that option replaces the subprocess environment rather than merging it. Two tests cover both halves.

agentics-maintenance.yml is declined via .github/workflows/aw.json ({"maintenance": false}). v0.83.4 generates a 633-line daily-cron workflow that closes "expired" issues/PRs/discussions and prunes cache-memory entries with actions: write. The cache pruning looks benign (it keeps the newest entry per group), but adopting a scheduled agentic workflow as a side effect of a version bump is not this PR's business. Adopt it deliberately if wanted.

Verification

  • gh aw compile on this repo's installed reviewer: 0 errors, 0 warnings.
  • gh aw compile on the shared source (workflows/review/review.md, which is what consumers get) in a scratch consumer layout: 0 errors. The compiled invariants the pipeline depends on were re-checked in that output:
    • the dispatch-conformance gate still compiles between "Ingest agent output" and "Upload agent artifacts" (the chokepoint the whole gate design rests on);
    • the engine.env Bash-timeout override still replaces the generated 60s defaults on the engine step (BASH_MAX_TIMEOUT_MS: 1200000, which the blocking dispatcher call needs);
    • inline sub-agents still extract to .claude/agents, the directory dispatch.ts reads;
    • the safe-output handler set and upload_artifact allowed-paths (out/**) are byte-identical;
    • no step was dropped anywhere in the workflow.
  • Runtime, from the run artifacts (what compiling cannot show): rootless awf starts and the sandbox runs (AWF_NETWORK_ISOLATION=1 in the agent env, sub-agents dispatched and returning tool results); the api-proxy meters every model, including claude-fable-5, with no 400 (run 30292838824: 1219 credits / $12.19 across opus-4-8, sonnet-4-6 and fable-5), which confirms token steering and the fable-pricing premise behind the pin removal; MCP works end to end through the new bridge-network gateway (16 tools/call, zero firewall denials); and the reviewer posted a real review, so the safe-output path survives the new networking too.
  • 1277 tests green, typecheck clean. pnpm run lint cannot run in a worktree nested under the main checkout (eslint loads both .eslintrc.js files and rejects the duplicate prettier plugin, and it ignores paths containing a dot-directory); the changed files were checked with prettier directly and CI lints from a normal checkout.

Security review of the compile diff

Required by v0.83.4's safe-update mode, which prompts for one on every compile that touches secrets or actions.

  • Secrets: none added or removed by intent. The generated manifest now also lists COPILOT_GITHUB_TOKEN, referenced by exactly one new gh-aw-authored step ("Check for OAuth tokens", check_oauth_tokens.sh) alongside the two GitHub tokens this workflow already passes. We do not set that secret; it resolves empty and the step is a token-shape check, not a network call. Compilation of this repo's reviewer reported no unapproved secret changes.
  • Actions: all bumps are to pinned SHAs of actions/* and github/gh-aw-actions/setup, resolved by the compiler from the release tags shown above; no new action publisher appears.
  • Containers: all five images are ghcr.io/github/*, and the firewall trio moves from a bare 0.27.27 tag to 0.27.42 with per-container digests, which is stricter than what it replaces.
  • Redirects/network: the egress allowlist gains patchdiff.githubusercontent.com (a gh-aw default) and the awf config gains isolation: true; no domain we rely on was removed.
  • Cannot fully verify: the rootless-awf and bridge-network changes are behavioral, not reviewable from the diff. That is what the live run on this PR exercises.

Follow-ups (not in this PR)

  • review: move the whole reviewer roster to Opus 5 #294 (Opus 5 roster) is likely blocked by the same 400 that fable-5 hit. claude-opus-5 appears in neither the curated pricing table nor the bundled models.dev.catalog.json at firewall v0.27.42. Worth confirming against a live dispatch before that PR lands, since the failure mode is a per-dispatch 400, not a compile error.
  • The engine.model field is deprecated in v0.83 in favour of a top-level model:; the compiler warns 6 times per compile. Mechanical, but it changes model resolution for consumers, so it deserves its own change.

@changeset-bot

changeset-bot Bot commented Jul 27, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 1a00c9f

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
review Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@khan-actions-bot
khan-actions-bot requested review from a team, jeresig and kevinb-khan and removed request for a team July 27, 2026 17:43
@github-actions

This comment has been minimized.

Comment thread workflows/review/review.md
Comment thread workflows/review/lib/dispatch-runner.ts
@jwbron
jwbron force-pushed the jwies/gh-aw-v0.83.4 branch from fd85215 to fe5a75d Compare July 27, 2026 18:37

@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.

Approved — no blocking issues found.

2 of 2 prior review threads are still unaddressed as of fe5a75d:

2 non-blocking threads still open
  • suggestion (non-blocking) workflows/review/lib/dispatch-runner.ts:77: SUBAGENT_MAX_RETRIES = "2" hardcodes a copy of the SDK's own default. If the SDK's default retry count ever changes, thi...
  • suggestion (non-blocking) workflows/review/review.md:197: Document the gh-aw >= v0.83.x floor this pin removal now requires. Removing sandbox.agent.version means a consumer that...

@github-actions

github-actions Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Review live A/B

Baseline: origin/main (review.md 4ed9b4887774); candidate: working tree (review.md ccece9056ede).

Ruler: matcher deterministic+arbiter; corpus cc11988c0918 (9 cases).

Metric Baseline Candidate Delta
Must-catch recall 100% 100% +0%
Verdict agreement 89% 89% +0%
Noise (unmatched posted) 61% 53% -8%
Clean false flags 0 0
Judge mean quality 0.86 0.90 +0.04
Cost $8.82 $8.43
Wall clock 1090s 963s
Cases run / skipped 9 / 0 9 / 0
Misses found-but-dropped 0 0
Findings anchor-snapped 0 0

Adversarial hard gate: PASSED on the candidate arm.

Single-run-stable rows: recall, verdict agreement, regressions, adversarial gate. Judge quality and noise are not: they jitter run-to-run at this corpus size, and a regressed reviewer can score HIGHER on judge quality (fewer, surer comments each read better). Recall against the labeled specs is the load-bearing metric.

Measured noise floor (identical arms, run 29069228968, 2026-07-10, 6 arm-samples, full corpus x3, pre-arbiter; budget skips left the samples on unequal case sets, so these v1 bands also carry case-mix variance): must-catch recall 54%-86% (sd 10%), verdict agreement 75%-100% (sd 9%), noise (unmatched posted) 50%-60% (sd 3%), judge mean quality 82%-86% (sd 2%). A single-run delta whose arms both sit inside a band is indistinguishable from run-to-run wobble; use --repeats to resolve smaller effects.

@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.

Approved — no blocking issues found.

2 of 2 prior review threads are still unaddressed as of a56d5ee:

2 non-blocking threads still open
  • suggestion (non-blocking) workflows/review/lib/dispatch-runner.ts:77: SUBAGENT_MAX_RETRIES = "2" hardcodes a copy of the SDK's own default (the comment calls it "the SDK default"). If the...
  • suggestion (non-blocking) workflows/review/review.md:197: Document the gh-aw >= v0.83.x floor this pin removal now requires. Removing sandbox.agent.version means a consumer tha...

@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.

1 of 2 prior review threads resolved; 1 still unaddressed as of 35b95cf:

1 non-blocking thread still open

Note: correctness not assessed this run (correctness-reviewer output unavailable).

# which prices claude-fable-5 and pins each container by digest, so both are
# retired: keeping the pin would freeze the firewall at the old floor (and give
# up those digests) while gh-aw moves on. Re-pin a version here only to hold a
# firewall release BACK, never to move one forward. Before pinning any sub-agent

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.

suggestion (non-blocking): This "hold a release BACK, never move one forward" guidance omits the version floor that makes a hold-back pin dangerous. The changeset documents that pinning sandbox.agent.version below v0.27.42 on gh-aw >= v0.83 reproduces the all-403 awmg-mcpg gateway breakage this PR fixes, but that warning lives only in the changeset while this comment is the enduring in-repo doc. Consider stating the floor here too, e.g. "never below the topology floor (>= v0.27.42 on gh-aw >= v0.83 — older firewalls cannot reach the awmg-mcpg bridge gateway)."

@jwbron
jwbron force-pushed the jwies/gh-aw-v0.83.4 branch from 35b95cf to af566c3 Compare July 29, 2026 21:05
@github-actions

This comment has been minimized.

@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.

Approved — no blocking issues found.

2 of 2 prior review threads are still unaddressed as of af566c3:

2 non-blocking threads still open
  • suggestion (non-blocking) workflows/review/lib/dispatch-runner.ts:77: SUBAGENT_MAX_RETRIES = "2" hardcodes a copy of the SDK's own default (the comment calls it "the SDK default"). If the...
  • suggestion (non-blocking) workflows/review/review.md:200: This "hold a release BACK, never move one forward" guidance omits the version floor that makes a hold-back pin dangerous...

@jwbron
jwbron force-pushed the jwies/gh-aw-v0.83.4 branch from af566c3 to cdafd50 Compare July 29, 2026 23:37
@jwbron
jwbron force-pushed the jwies/gh-aw-v0.83.4 branch from cdafd50 to 04faf38 Compare July 29, 2026 23:42

@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.

Approved — no blocking issues found.

2 of 2 prior review threads are still unaddressed as of 04faf38:

2 non-blocking threads still open
  • suggestion (non-blocking) workflows/review/lib/dispatch-runner.ts:77: SUBAGENT_MAX_RETRIES = "2" hardcodes a copy of the SDK's own default (the comment calls it "the SDK default"). If the...
  • suggestion (non-blocking) workflows/review/review.md:200: This "hold a release BACK, never move one forward" guidance omits the version floor that makes a hold-back pin dangerous...

@jwbron
jwbron force-pushed the jwies/gh-aw-v0.83.4 branch from 04faf38 to 1b176dd Compare July 30, 2026 17:39
@jwbron
jwbron force-pushed the jwies/gh-aw-v0.83.4 branch from 1b176dd to b322abd Compare July 30, 2026 17:47
@jwbron
jwbron force-pushed the jwies/gh-aw-v0.83.4 branch from b322abd to ed3becc Compare July 30, 2026 17:51
@github-actions

Copy link
Copy Markdown
Contributor

Risk & pattern guidance — advisory; points at where a human skim pays off, not a blocking review.

Reviewed 8 changed files (verdict: approve). Higher-risk files worth a closer look:

Owning team: github-actions

File Risk
.github/workflows/review.md High
workflows/review/review.md High
workflows/review/lib/dispatch-runner.ts High
.github/aw/actions-lock.json Medium

Common pattern

  • The firewall/version-pin removal touches both .github/workflows/review.md and workflows/review/review.md in lockstep — worth confirming the generated review.lock.yml reflects the same change and no stale pin was left behind in either.

Excluded from review

  • .github/workflows/review.lock.yml — generated artifact.

@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.

Approved — no blocking issues found.

1 of 2 prior review threads resolved; 1 still unaddressed as of ed3becc:

1 non-blocking thread still open
  • suggestion (non-blocking) workflows/review/review.md:200: This "hold a release BACK, never move one forward" guidance omits the version floor that makes a hold-back pin dangerous...

Base automatically changed from jwies/review-trial-followups to main July 30, 2026 18:25
jwbron added 2 commits July 30, 2026 11:30
…all pin and restore sub-agent retries

Recompiles this repo's installed reviewer with gh-aw v0.83.4 (from v0.81.6) and
drops the two frontmatter workarounds the new default firewall makes obsolete.

The toolchain bump carries two execution-model changes: the awf sandbox now runs
rootless (no sudo) and the MCP gateway moves to a bridge network the sandbox
attaches to. The compiled invariants the reviewer depends on were re-verified
under v0.83.4 on a scratch consumer layout: the dispatch-conformance gate still
lands between "Ingest agent output" and "Upload agent artifacts", the engine.env
Bash-timeout override still replaces the generated 60s defaults, inline
sub-agents still extract to .claude/agents, the safe-output handler set and
upload_artifact allowed-paths are unchanged, and no step was dropped.

The firewall version pin (v0.27.27) and the claude-fable-5 `models:` pricing
override both existed only to get an un-priced model past the api-proxy's 400;
v0.83.4 defaults to firewall v0.27.42, which prices it and pins each container
by digest, so the pin now only holds the firewall at the old floor.

v0.83 also sets ANTHROPIC_MAX_RETRIES=0 on the engine step so terminal errors
reach the harness that owns retry/backoff for the orchestrator process. The
dispatcher's sub-agents run inside that process without such a wrapper, so
dispatch-runner.ts now restores the SDK default for the sub-agent subprocesses
alone, spreading process.env because that SDK option replaces rather than merges.

Also opts out of gh-aw's newly generated agentics-maintenance.yml rather than
adopting a daily scheduled cleanup workflow as a side effect of a version bump.
…copy too; it mismatches the v0.83.4 lock

The v0.83.4 lock reaches the MCP gateway over a bridge network
(MCP_GATEWAY_DOMAIN: awmg-mcpg, network.isolation, network.topologyAttach).
Firewall v0.27.27 implements none of those keys: they are absent from its
awf-resolved-config.json, and its squid allowlist carries .host.docker.internal
with no route to awmg-mcpg.

Observed across two runs of this PR. With the pin (run 30290472047): 3
TCP_DENIED 403s on POST awmg-mcpg:8080/mcp/github and /mcp/safeoutputs, i.e. a
gateway path the lock expects to work being rejected; MCP itself still
functioned over the path that bypasses squid (10 tools/call), and the run failed
on the pre-existing 20-minute step timeout that three earlier v0.81.6 runs on
other branches also hit (#285 raises it). Without the pin (run 30292838824,
firewall v0.27.42): zero firewall denials, 16 tools/call including the
safe-output posts, execute step 18m31s, review posted.

The shared source dropped the pin in the previous commit; this drops it from
this repo's installed copy as a marked LOCAL OVERRIDE, since the install stays
on review-v1.7.0 until its next bump and would otherwise keep running a config
its own firewall silently discards. The gh-aw default (v0.27.42) implements the
topology keys, pins each container by digest, and prices claude-fable-5, which
is what makes the models: block redundant.
@jwbron
jwbron force-pushed the jwies/gh-aw-v0.83.4 branch from ed3becc to 1a00c9f Compare July 30, 2026 18:35
@jwbron
jwbron merged commit 98f686f into main Jul 30, 2026
6 checks passed
@jwbron
jwbron deleted the jwies/gh-aw-v0.83.4 branch July 30, 2026 18:36
jwbron added a commit that referenced this pull request Jul 30, 2026
Retargets the PR from the jwies/review-pre-agent-staging staging branch to
main, which now carries that branch's work squash-merged (#280, #282, #283,
#284, #288, #296) plus the later slices this branch never received.

The head branch carried pre-squash copies of the review stack, so every
conflict was a stale duplicate rather than a real divergence. All seven
resolve to main:

- .github/aw/actions-lock.json: main's superset. The autofix compile at
  v0.83.4 had pruned the setup-cli entry; main is at v0.83.4 too now, so the
  version skew the PR description flagged between autofix.lock.yml (0.83.4)
  and review.lock.yml (0.81.6) is gone.
- lib/dispatch-gate.ts, lib/dispatch-gate.test.ts, lib/stage-pr.ts,
  lib/stage-pr.test.ts: add/add against main's merged versions.
- review.md, README.md: main supersedes the head copies (timeout 40, the
  scripted-dispatch SDK install, code-owned disciplines extraction, the
  retired firewall pin, the lens payload seam).

No autofix commit ever touched workflows/review/, so nothing is lost taking
main wholesale there: the merged review stack is byte-identical to main and
the whole merge reduces to main plus the autofix package.
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.

2 participants