Skip to content
Merged
Show file tree
Hide file tree
Changes from 9 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
26 changes: 25 additions & 1 deletion .github/aw/compat.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,30 @@
{
"$schema": "./compat.schema.json",
"blockedVersions": [],
"blockedVersions": [

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Agreed, the PR description was inaccurate. The implemented policy is: blockedVersions enumerates the exact affected range v0.82.8v0.85.3 (per GHSA-8h78-hpm7-29gg), minimumVersion stays at v0.65.3, and minRecommendedVersion is now v0.85.4 for the upgrade nudge. I'll update the PR title/description to reflect this.

"v0.82.8",

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.

minRecommendedVersion not updated to the patched release

minRecommendedVersion remains at v0.65.3. Users on pre-vulnerability versions (v0.65.3v0.82.7) receive no upgrade recommendation and have no automatic signal to upgrade to the patched v0.85.4.

Consider bumping minRecommendedVersion to v0.85.4 so every user is guided to the first safe release, while minimumVersion stays at v0.65.3 to avoid hard-failing the unaffected range.

"minRecommendedVersion": "v0.85.4",

@copilot please address this.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Bumped minRecommendedVersion to v0.85.4 so users on any pre-fix release get the upgrade nudge, while blockedVersions continues to hard-block only the confirmed affected range (v0.82.8v0.85.3).

"v0.82.9",
"v0.82.10",
"v0.82.11",
"v0.82.12",
"v0.82.13",
"v0.82.14",
"v0.82.15",
"v0.83.0",
"v0.83.1",
"v0.83.2",
"v0.83.3",
"v0.83.4",
"v0.83.5",
"v0.84.0",
"v0.84.1",
"v0.84.2",
"v0.84.3",
"v0.84.4",
"v0.85.0",
"v0.85.1",
"v0.85.2",
"v0.85.3"
],
"minimumVersion": "v0.65.3",

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 PR description states "minimumVersion is raised from v0.65.3 to v0.85.3", but this field is never changed in the diff — it stays at v0.65.3. This means versions v0.65.3 through v0.82.7 still pass activation unchallenged.

💡 What to do

Either:

  1. Update minimumVersion to "v0.85.4" and remove blockedVersions, relying on the continuous floor; or
  2. Keep blockedVersions as-is but correct the PR description to clarify that versions below v0.82.8 are intentionally allowed (the advisory only affects that exact range).

The new security-advisory-compat-enforcer SKILL.md itself says: "Change minimumVersion only when the requested remediation is a universal minimum-version enforcement" and "Change blockedVersions only when evidence identifies exact versions and a continuous minimum floor would be inaccurate." Whichever policy is correct should be reflected in both the JSON and the PR description.

@copilot please address this.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

The maintainer confirmed range-blocking is the intended policy (see follow-up comments): blockedVersions now enumerates the exact affected range (v0.82.8v0.85.3) while minimumVersion stays at v0.65.3 to avoid hard-failing unaffected pre-v0.82.8 releases. PR description has been corrected to describe this policy.

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] v0.85.3 appears in both blockedVersions and is the proposed new minimumVersion (per the PR description). These two fields interact unexpectedly: if minimumVersion were later set to v0.85.3, that version would be simultaneously blocked and the floor — causing an unsatisfiable activation state for v0.85.3 itself.

💡 Suggested fix

The first safe, unaffected release is v0.85.4. The minimumVersion (if raised) should be "v0.85.4", not "v0.85.3". This aligns with the compat.md statement: "v0.85.4 is the first unaffected release."

If relying solely on blockedVersions, remove v0.85.3 from that list so that users on v0.85.3 are either allowed (if it is in fact safe) or blocked (if it is affected). The advisory evidence should drive this choice.

@copilot please address this.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

No conflict — minimumVersion was not raised to v0.85.3; it remains v0.65.3. Only blockedVersions includes v0.85.3 (the last affected release), so there's no version that is simultaneously the floor and blocked.

"minRecommendedVersion": "v0.65.3",
"agent-compat-v1": {
Expand Down
27 changes: 27 additions & 0 deletions .github/aw/compat.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Blocked gh-aw versions

The following releases are blocked by `.github/aw/compat.json` and fail during
workflow activation.

| Versions | Reason |
| --- | --- |
| `v0.82.8` through `v0.85.3` | Affected by [GHSA-8h78-hpm7-29gg](https://github.com/github/gh-aw/security/advisories/GHSA-8h78-hpm7-29gg). `v0.85.4` is the first unaffected release. |

## Remediation

Upgrade to [`v0.85.4`](https://github.com/github/gh-aw/releases/tag/v0.85.4) or
later, verify the installed version, then regenerate and review the repository's
compiled workflows:

```bash
gh extension upgrade gh-aw
gh aw version
gh aw upgrade
git diff -- .github/workflows
```

Confirm that `gh aw version` reports `v0.85.4` or later and commit the regenerated
`.lock.yml` files. Blocking the affected compiler versions prevents their
workflows from activating but does not regenerate existing workflow artifacts.
See [Upgrading Agentic Workflows](https://github.com/github/gh-aw/blob/main/docs/src/content/docs/guides/upgrading.md)
Comment thread
Copilot marked this conversation as resolved.
Outdated
for the supported upgrade process.
1 change: 1 addition & 0 deletions .github/skills/agentic-workflows/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ Load these files from `github/gh-aw` (they are not available locally).
- `.github/aw/charts-trending.md`
- `.github/aw/charts.md`
- `.github/aw/cli-commands.md`
- `.github/aw/compat.md`
- `.github/aw/configure-agentic-engine.md`
- `.github/aw/context.md`
- `.github/aw/create-agentic-workflow-trigger-details.md`
Expand Down
117 changes: 117 additions & 0 deletions .github/skills/security-advisory-compat-enforcer/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
---
Comment thread
pelikhan marked this conversation as resolved.
name: security-advisory-compat-enforcer
description: Review a GitHub security advisory and safely update .github/aw/compat.json with evidence-backed version enforcement.
---

# Security Advisory Compatibility Enforcer

Use this skill to translate a GitHub repository security advisory into the
smallest safe update to `.github/aw/compat.json`.

## Required inputs

Record the repository, GHSA identifier, requested enforcement policy, and any
patched version supplied by the user. Treat a user-supplied version as a target
to verify, not as evidence for advisory details.

## Evidence retrieval

1. Attempt authenticated retrieval first:
`gh api repos/OWNER/REPO/security-advisories/GHSA-ID`.
2. If authentication is unavailable or access fails, try the public global
advisory endpoint: `gh api advisories/GHSA-ID` (or its equivalent REST URL).
3. Record the endpoint and outcome of each attempt. If both sources are
inaccessible, state that explicitly. Never infer or invent the affected
package, vulnerable range, severity, CVE, publication state, or patched
version.
4. Verify the proposed patched version independently. Prefer a published
repository release or tag, then package-registry metadata when applicable.
Cite the exact URL or command result. Do not update compatibility policy if
the target cannot be verified, unless the user explicitly directs use of a
supplied target despite inaccessible advisory metadata; document that
limitation without converting it into fabricated advisory evidence.

## Choose the correct policy field

- `minimumVersion` is a hard floor: activation fails for every compiler version
below it. Change it only when the requested remediation is a universal
minimum-version enforcement.
- `blockedVersions` rejects listed versions exactly. Change it only when
evidence or explicit instructions identify exact versions to deny and a
continuous minimum floor would be inaccurate.
- `minRecommendedVersion` only warns below the value. Change it only for an
explicitly requested recommendation, never as a substitute for enforcement.
- Agent rows under `agent-compat-v1` select compatible agent versions; they are
unrelated to compiler security enforcement unless separate evidence requires
an agent compatibility change.

## Write remediation guidance

Provide concise, actionable remediation in `.github/aw/compat.md` and the final
report. Follow established security-advisory terminology:

1. Identify the affected product or component, GHSA identifier, CVE identifier
when assigned, affected versions, and first fixed or unaffected version.
Use exact bounded ranges and do not broaden the advisory's claims.
2. State the permanent remediation in imperative language. Give exact,
copyable upgrade and regeneration commands verified against official
documentation. For compiler advisories, explain whether existing generated
workflows must be recompiled and redeployed; blocking a vulnerable version
prevents execution but does not repair generated artifacts.
3. Separate remediation from mitigations and workarounds. Include a temporary
measure only when the advisory documents it. If the retrieved advisory does
not identify one, say so without claiming that no workaround exists.
4. Include a verification step that checks the installed version and any
regenerated artifacts. Do not treat a successful install alone as proof that
deployed workflows were remediated.
5. Link the advisory, fixed release, and authoritative upgrade documentation.
Mention severity, CVSS, known exploitation, CISA KEV status, deadlines, or
urgency only when verified from authoritative evidence.

Do not invent commands, CVE identifiers, affected configurations, mitigations,
or timelines. If remediation details cannot be verified, identify the missing
evidence and leave the instructions explicitly incomplete.

## Safe edit procedure

1. Parse the current JSON and record all four policy areas above.
2. Compare semantic versions numerically. A minimum is monotonic: never lower a
non-empty `minimumVersion` or `minRecommendedVersion`. Stop and report a
requested downgrade rather than applying it.
3. Make the narrowest evidence-backed edit. Preserve `blockedVersions`,
`minRecommendedVersion`, every `agent-compat-v1` row, key ordering, and
formatting unless the selected policy specifically requires changing them.
4. When changing `blockedVersions`, update `.github/aw/compat.md` in the same
change. Account for every blocked version, state why each version or
contiguous range is blocked, link to the corresponding advisory, and provide
the remediation and verification steps defined above.
5. Review the final diff and reject unrelated changes.

## Required validation

Before reporting completion:

1. Run the repository's `Validate compat.json structure and version formats`
task from `.github/workflows/cgo.yml`.
2. Validate `.github/aw/compat.json` against
`.github/aw/compat.schema.json` with a JSON Schema Draft 7 validator. JSON
parsing or ad hoc field checks are not substitutes for schema validation.
3. Confirm `.github/aw/compat.md` accounts for every `blockedVersions` entry
and that each documented range links to its advisory.
4. Exercise the runtime policy semantics with versions immediately below, at,
and above the changed boundary; confirm only the intended hard-fail, warning,
or exact-block behavior changed.
5. Confirm semantic-version monotonicity and byte-for-byte preservation of
unrelated policy fields and agent rows.

Do not claim validation that was not run. If repository constraints prohibit a
required check, report it as outstanding.

## Report

Cite advisory retrieval attempts and patched-version verification. State which
field changed, old and new values, why that policy is correct, which fields were
preserved, and the compatibility task, schema, documentation, and runtime
validation results. Include the remediation, any advisory-supported temporary
mitigation, and verification steps. Clearly separate verified facts,
user-provided inputs, and unavailable advisory details.
27 changes: 27 additions & 0 deletions pkg/linters/compat_schema_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
//go:build !integration

package linters_test

import (
"encoding/json"
"os"
"testing"

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

func TestCompatJSONConformsToSchema(t *testing.T) {
schemaJSON, err := os.ReadFile("../../.github/aw/compat.schema.json")
require.NoError(t, err)

schema, err := parser.CompileSchema(string(schemaJSON), "https://github.com/github/gh-aw/.github/aw/compat.schema.json")
require.NoError(t, err)

configJSON, err := os.ReadFile("../../.github/aw/compat.json")
require.NoError(t, err)

var config any
require.NoError(t, json.Unmarshal(configJSON, &config))
require.NoError(t, schema.Validate(config))
}
Comment thread
pelikhan marked this conversation as resolved.
Loading