Blog

Ecosystem Spotlight: githubnext/evergreen

githubnext/evergreen is a GitHub Agentic Workflow that keeps selected pull requests green and mergeable. It fixes CI failures and keeps PR branches current with their base. It is aimed at teams that want an agent to repair pull requests they have explicitly opted in, without giving that agent the power to merge or to write to the default branch.

The trigger is deliberately not pull_request. The workflow runs on a 15-minute schedule and on workflow_dispatch. The comment at the top of workflows/evergreen.md explains that generated pre-activation runs can trip confused-deputy guards for bot-authored or indirect PR events. Teams that need immediate handling are told to use a separate deterministic controller that never checks out or runs PR code.

A deterministic gate runs before any agent. A preflight job confirms that the PR is open, carries the opt-in evergreen label and the evergreen_active lease, and still has the head SHA that was selected. A pre-agent step then fetches refs/pull/<n>/head and refuses to continue if the fetched SHA differs from the expected one. A stale checkout fails closed.

A lease prevents two runs on one PR. The workflow creates the evergreen_active label, and it refuses to dispatch the agent if the label cannot be added. A separate cleanup job removes the lease. Runs are queued with cancel-in-progress: false, so a second run waits rather than cancelling the first.

Write rules are operating rules. safe-output-policy.md requires the agent to reload GitHub state after every safe output and to report the operation as blocked if the expected change is not visible. It also forbids direct merges, base-branch writes and branch updates that merge or rebase the base. The workflow enforces the last rule too: a git wrapper placed on the agent’s path exits with status 64 for merge and rebase.

Quota and stop states are explicit. quota-policy.md counts quota per PR, continuing across runs for as long as the label stays. When it runs out, the agent stops, asks for the opt-in label to be removed, adds an exhausted label and leaves one terse comment. Every run ends in one of five named stop states, such as awaiting-controller-recheck or quota-exhausted.

Fail-closed defaults. The workflow ships REQUIRED_CHECKS_JSON as '[]', and a comment labels it a fail-closed placeholder that installers must replace by naming their gates or choosing all-observed mode.

  1. The cron wakes the preflight job, which selects an eligible PR and evaluates the gates.
  2. For an eligible PR, the job adds the lease label and dispatches the agent. The agent job checks out the verified head and runs the Copilot engine with network: defaults.
  3. The agent runs evergreen-diagnose before it edits anything, then evergreen-repair if diagnosis says repair is needed. Both skills are pinned to a commit SHA and installed at runtime, so the prompt does not carry their full text.
  4. Writes are safe outputs: comments, labels, PR-branch pushes limited to PRs with the evergreen label, and at most one review. Each write is verified after the fact, and the run finishes by removing the lease.

Evergreen is installed by an agent, following INSTALL.md. The installer reads the target repository’s guidance and its last 50 closed PRs, proposes a mergeability policy for you to confirm, copies workflows/evergreen.md and workflows/shared/evergreen/ into .github/workflows/, runs gh aw compile and opens an installation PR. After that, apply the evergreen label to any PR you want it to work on.

Before you adopt it, check a few things:

  • The preflight job has contents, issues and pull-requests: write permissions, so review its gate logic whenever you change it.
  • The required-checks list ships empty, so you must name your gates before the agent can clear anything.
  • Public or fork PRs should require trusted approval before any code runs, as the README says.
  • It is early-stage: 13 stars, and its latest commit is from late July 2026.

Even if you never install it, Evergreen is a useful reference. Its gate, lease and verification patterns apply to any agent that writes to pull requests.

Explore githubnext/evergreen, and learn more about building your own workflows at github/gh-aw.

Ecosystem Spotlight: svennijhuis/agentic-workflows

Most agentic workflow examples stop at one trigger and one comment. svennijhuis/agentic-workflows goes further. It is a catalog of eleven installable workflows that take an issue to a reviewed pull request, with a reviewer that can send work back a limited number of times before handing it to a human. It is aimed at teams that want a working, opinionated build loop they can install with gh aw add and adapt, rather than designing one from scratch.

A hard cap on the loop. Each workflow enforces its own limit in its if: condition, so the runner decides whether a run starts, not prompt text. issue-builder.md starts only for a new build or fix rounds 1 and 2. pr-reviewer.md runs review rounds 1 to 3 only, so the builder gets at most two send-backs. The reviewer also derives the round from its own history of Reviewer: changes needed reviews, so a wrong input cannot reset the count.

Review that never merges. The reviewer allows only COMMENT reviews. The workflow explains why: without a separate builder identity, builder PRs and reviews share github-actions[bot], and GitHub rejects REQUEST_CHANGES on your own PR. A maintainer stays the merge gate. The reviewer can add ready-to-merge or needs-help labels, but it never approves, merges or pushes.

Four axes plus a conditional security pass. The reviewer starts standards, spec, deslop and blast-radius sub-agents, each in a fresh context and each asked for path:line evidence. A security sub-agent runs only when the diff touches a trust boundary, such as endpoints, auth, permissions, .github/workflows/*, dependency manifests, secrets, shell calls, outbound network or deserialisation. Each axis keeps its own heading and is not reranked, so a reader can see which axis raised a concern.

Fail-closed defaults in shared fragments. shared/security.md closes the network except for gh-aw defaults, requires importers to name any extra host, and keeps threat detection on. shared/defaults.md pins the engine version. max-ai-credits and max-daily-ai-credits use the main workflow’s values when set, then fall back to the first usable imported value. Other limits such as max-turns and timeout-minutes stay in each workflow’s own frontmatter because the compiler ignores them in imports.

Vendored skills with provenance. The shared/skills/ folder holds local copies of eleven skills, mostly from mattpocock/skills. The shared README records the source path, commit SHA and licence for each one, along with the update procedure.

  1. aw.yml is the package manifest. It lists the eleven workflows under includes: and sets min-version: v0.93.4, so gh aw add knows what to install.
  2. An issue-builder run implements an issue and opens a builder/* pull request labeled builder.
  3. The builder then dispatches pr-reviewer for round 1. The reviewer posts a COMMENT review that starts with Reviewer: ready to merge. when clean. Otherwise it posts inline comments and dispatches the builder for a fix round.
  4. If round 3 still has findings, the reviewer adds needs-help and posts one summary of open points for a maintainer. It starts nothing further.

From the README, in a target repository:

Terminal window
gh aw add svennijhuis/agentic-workflows/workflows/issue-builder.md@<tag>
gh aw compile

Pin <tag> to a released version rather than a branch. Each workflow names the other in dispatch-workflow, so installing either one brings the other along. The builder also references a CI_TRIGGER_TOKEN secret for an extra empty commit that starts CI. It is a placeholder name, so rename it to match your setup. The install guide covers tokens, secrets and labels for an organisation.

Patterns worth borrowing even without the full loop:

  • Put the loop cap in the trigger if: so the runner enforces it.
  • Make the reviewer comment-only when the author and reviewer share an identity.
  • Gate expensive security review on a path-based trust-boundary check.

Explore svennijhuis/agentic-workflows, starting with its workflows README and the builder and reviewer pair. To build your own, start with GitHub Agentic Workflows.

Agent of the Day – November 13, 2026

Some workflows report on the code they touch. Today’s spotlight goes to one that reads its own codebase for patterns worth linting, then tries to turn what it finds into a fix. It is also the workflow that failed on its most recent scheduled run, which makes it a useful case study in how these systems break.

Agent of the Day: Actions and AW Linter Factory

Section titled “Agent of the Day: Actions and AW Linter Factory”

Actions and AW Linter Factory runs once a day. Each run picks one lint rule for the AST checks under pkg/workflow/lint/, looks for real evidence that the pattern matters, and proposes a rule with a fix. It skips a new run while a pull request with [actions-aw-linter] in its title is still open, so it does not stack up competing proposals.

This is the first time this workflow has been featured, so the rotation put it ahead of workflows that had been spotlighted before.

The last three scheduled runs tell three different stories.

RunDate (UTC)ConclusionDurationAudit signal
43267067168Nov 12failure3.4m“Agent reported that it could not complete the task”; threat detection failed
43066035425Nov 11success13.0mHigh token usage (about 995k tokens)
42862531335Nov 10success18.6mHigh token usage (about 1.36M tokens)

The November 12 failure is the one to read closely. The audit classes it as a critical workflow failure, with three errors. The agent stopped before it could finish. The threat detection job also failed, with the reason agent_failure. The audit calls that a tooling error, not a security finding. The failed steps were the “Install AWF binary” steps in both the agent job and the detection job. The run lasted only 3.4 minutes, so this was an early stop, not a timeout in the middle of analysis.

The two successful runs completed in one turn with no reported errors. Their audits still flag two things: high token usage and a “Resource Heavy For Domain” finding. For a daily job that reads a whole codebase, that cost is expected, but it is worth tracking as the rule set grows.

The workflow has already produced a steady stream of pull requests. Each one is titled with the [actions-aw-linter] prefix and is now closed:

  • #69972: Add the daily Actions and AW AST linter factory itself.
  • #71189: Fix workflow_run positive branch cancellation detection.
  • #71929: Add a step-reference lint rule.
  • #73253: Fix release cache lint for Python and Java setup actions.
  • #73832: Fix artifact execution detection for option-prefixed scripts.

The fixes are the clearest sign that the loop works. A lint rule that produces a false positive gets a follow-up pull request that narrows it, rather than a quiet ignore.

Combined workflow activity chart

A linter that writes its own rules is only as trustworthy as its validation. This workflow has a gate that stops it when a run cannot complete, which is what the November 12 failure shows. A stopped run is far better than a half-finished proposal that looks finished. The question for the next few weeks is whether the install step that failed on November 12 is a one-off or a pattern.

Read the workflow source to see how it selects rules and gates its runs. To build something similar, start at github/gh-aw.

Agent of the Day – November 12, 2026

Some workflows fail with a stack trace. Others fail on a schedule, every morning, with nothing to show for it. This week’s spotlight is a workflow that has now missed three daily runs in a row, and the audit of its latest run tells a more useful story than the red X does.

Agent of the Day: Daily A/B Testing Advisor

Section titled “Agent of the Day: Daily A/B Testing Advisor”

Daily A/B Testing Advisor runs on a daily schedule around 10:00 UTC on the Codex engine. It is built to produce A/B testing advice and to open pull requests with the [ab-advisor] title prefix, up to two per run. This is its first time in the spotlight.

Three scheduled runs have completed, and none succeeded:

RunStarted (UTC)DurationResult
43200335556Nov 12, 10:2627.7 minfailure
43003579140Nov 11, 10:2625.7 minfailure
42799062363Nov 10, 10:257.5 minfailure

Across the three runs, the log summary reports zero successful runs, zero safe outputs, about 366 AIC, roughly 19 million tokens, and 62 Actions minutes. Each failure was classified as a driver exit, and the failure cluster points at the conclusion job’s “Handle agent failure” step.

The structured audit of the November 12 run adds detail:

  • The agent reported its own failure. It called safeoutputs.report_incomplete at 10:49:52 UTC. The runner then recorded the error as Agent reported that it could not complete the task.
  • The firewall blocked no observed requests. It observed 292 requests with zero blocked. That rules out a recorded firewall-policy rejection, not other network failures such as TLS or DNS errors, timeouts, API errors, or rate limiting.
  • Token use was flagged. The audit marked the run for high token usage (about 7.4 million tokens) and for resource use heavy for its domain.
  • Two public issues were withheld. The GitHub MCP integrity filter kept github/gh-aw#77074 and github/gh-aw#77021 from the agent because their integrity level was below “approved”. The filter did what it is meant to do. We did not open either issue for this post, so we make no claim about whether they relate to this failure.

We can say with confidence that three consecutive scheduled runs failed and that the agent itself concluded it could not finish. The November 12 run logs give us a more specific lead: the campaign’s focused workflow compilation and both variant-rendering checks passed, but the required repository-wide make recompile gate failed when npm package validation hit DEPTH_ZERO_SELF_SIGNED_CERT for packages used by unrelated workflows. The agent stopped before opening a pull request.

That points to certificate trust during package-registry validation as the immediate blocker visible in the logs. It does not establish why the certificate was untrusted, nor does the firewall’s zero-blocked count rule out other network problems.

A daily workflow that fails quietly burns compute every morning and produces nothing. Here is the happy ending the evidence supports: the focused campaign checks passed, and the broader validation gate caught an environment-level certificate problem before an unvalidated change could be published. The workflow reported the blocker and left the repository unchanged. Once the package-feed certificate trust is repaired, a future run can repeat the full gate; until then, this is a safe stop, not a successful run.

If you maintain a scheduled agent, check whether its conclusion job reports failures somewhere a human will see them, and whether its token budget matches what the workflow actually needs.

Want to see how gh-aw turns a markdown file into a monitored, auditable workflow? Start at github/gh-aw.

Connectors: A Clear Integration Point for Services

Every service integration has to answer the same questions: where does the service live, how does authentication work, and what can a workflow do with it?

Without a clear integration point, those answers end up scattered across scripts, custom tools, and prompts. Each new service becomes another special case.

The new experimental connectors give services a shared integration point in GitHub Agentic Workflows. A declarative YAML definition describes the service contract. gh-aw’s compiler and runtime use that contract to expose selected capabilities to workflows.

The goal isn’t a different integration mechanism for every provider. It’s one place to define how a service fits into gh-aw.

A connector brings the pieces of an integration together: fixed endpoints, credential routes, resource grants, read capabilities, and safe outputs. It can describe bounded REST or GraphQL readers, read-only HTTP MCP tools, and typed mutations. Trigger declarations use the shared webhook gateway path rather than inventing a separate dispatch mechanism for each service.

The provider-specific details live in the declaration. The compiler and runtime supply the common machinery for validation, tool exposure, and safe-output execution. Adding a supported operation is a declaration change, not a reason to build a new provider-specific execution path.

That also makes the integration reviewable. A new endpoint, a different secret reference, or an added write operation is visible in a diff. The contract can be versioned and reused alongside the workflows that consume it.

In gh-aw, connector YAML lives in the frontmatter of an importable Markdown file under .github/workflows/connectors/. Here’s a short excerpt from the Linear declaration:

connectors:
linear:
experimental: true
endpoints:
api: https://api.linear.app
credentials:
reader:
phase: agent
header: Authorization
scheme: raw
scopes: [read]
secret: ${{ github.aw.import-inputs.reader-secret }}
resources:
issues: ${{ github.aw.import-inputs.issues }}

The shape matters more than the provider: a named endpoint, an explicit credential phase, and resource bindings supplied by the consuming workflow. Secret values stay in GitHub Actions secrets.

This isn’t a complete connector. The full declaration adds typed operation inputs, request mappings, response limits, resource checks, and import input definitions. Its commented documentation explains setup and provider-specific limits.

Linear, Jira, Azure DevOps, Slack, Teams, and other services already have declarations using this shared model. Their capabilities differ, but they have a common place to plug in.

The connector defines what’s available. The workflow selects what it needs. Importing alone enables no provider tools or writes.

Reads go under tools; mutations are selected separately under safe-outputs, outside the agent’s writer-credential boundary. Resource bindings constrain access, and IDs returned by the service don’t expand those grants.

For example, the Linear triage workflow selects two readers and one staged comment. Another workflow can consume the same declaration with different selections and approved resources. Staging previews the write without delivering it; reads remain live.

The service contract is reusable. The authority stays specific to the task.

Connectors are experimental, and they aren’t turnkey service installations. Declarations don’t provision credentials, install webhook receivers, or turn scope metadata into provider permissions. Start with a connector-capable compiler and matching runtime, a reviewed source revision, manual dispatch, and staged outputs.

If you’re bringing a service into gh-aw, start with the connector reference or the create-connector skill. The example catalog shows how workflows consume the contract.

Define the service once, in YAML. Let workflows choose the capabilities they need. Keep integration behavior in a clear, reviewable place.