Skip to content
Back to skills

Graphql Schema Regression

ASecurity

Diffs two GraphQL schemas with `graphql-inspector diff`, classifies each change as BREAKING / DANGEROUS / NON_BREAKING, and applies opt-in rules (suppress-removal-of-deprecated-field, consider-usage, ignore-description-changes) to gate CI on schema regressions. Use when reviewing GraphQL schema changes in a PR or evaluating Federation supergraph drift.

  • 10 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added October 12, 2026
testingbashnodegitapi

Works with

  • cli
  • api

Security analysis

A96/100
  • mediumInstalls packages at runtime which could introduce malicious dependencies

Pro scans all 2 files and shows the line behind each finding

Scanned October 12, 2026

npx -y skills add testland/qa --skill graphql-schema-regression --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Graphql Schema Regression?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Graphql Schema Regression
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/testland-graphql-schema-regression/badge)](https://www.skillsdirectory.com/skills/testland-graphql-schema-regression)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: graphql-schema-regression
description: "Diffs two GraphQL schemas with `graphql-inspector diff`, classifies each change as BREAKING / DANGEROUS / NON_BREAKING, and applies opt-in rules (suppress-removal-of-deprecated-field, consider-usage, ignore-description-changes) to gate CI on schema regressions. Use when reviewing GraphQL schema changes in a PR or evaluating Federation supergraph drift."
---

# graphql-schema-regression

## Overview

GraphQL Inspector is a schema-management CLI from The Guild that
validates GraphQL schemas and detects changes between two versions
([gqi-overview][overview]). It classifies every change into one of
three tiers ([gqi-diff][diff]):

| Classification | Meaning                                                            |
|----------------|--------------------------------------------------------------------|
| **Breaking**   | Will disrupt existing clients (removed fields, narrowed types).    |
| **Dangerous**  | Won't immediately break clients but may cause issues (e.g. union member added). |
| **Non-breaking** | Safe additions (new fields on existing types, new types).        |

[overview]: https://the-guild.dev/graphql/inspector
[diff]: https://the-guild.dev/graphql/inspector/docs/essentials/diff

The tool exits non-zero when breaking changes exist, exits zero
otherwise - the gate is the exit code.

This is the GraphQL-specific counterpart to
`openapi-contract-diff`. Use it
when the API surface is GraphQL (single schema or Apollo Federation
supergraph) instead of REST.

## When to use

- The repo defines a GraphQL schema (`schema.graphql`, an SDL string in
  code, or a Federation subgraph).
- The team wants a CI gate on schema regressions between the PR and
  the deployed schema.
- The team uses **deprecated field tracking** (`@deprecated`) and
  wants `suppressRemovalOfDeprecatedField` semantics - i.e. removing a
  field that has been marked `@deprecated` long enough is acceptable,
  removing a non-deprecated field is not.
- The schema is part of a Federation supergraph and you need to gate
  per-subgraph regressions.

## Install

```bash
npm install --global @graphql-inspector/cli
```

(Per [gqi-overview][overview].)

For ad-hoc CI use, prefer running it via `npx @graphql-inspector/cli`
without a global install.

## Running

### Local diff between two schema files

```bash
graphql-inspector diff schema.old.graphql schema.new.graphql
```

(Per [gqi-diff][diff].)

The command supports SDL files, introspection result JSON, GitHub
URLs, and live endpoints - when passing an endpoint use the `--header`
flag to attach an auth token.

### Comparing against the deployed schema

```bash
# Pull the production schema first
graphql-inspector introspect https://api.example.com/graphql > schema.prod.graphql

# Diff against the local SDL
graphql-inspector diff schema.prod.graphql schema.graphql
```

### Output

The default output is human-readable, grouped by classification. Find
breaking changes, dangerous changes, and non-breaking changes printed
under separate headings.

For machine consumption, the JSON-output GitHub Action
(`kamilkisiela/graphql-inspector` or
`@graphql-inspector/github-action`) produces a structured report; for
arbitrary CI, parse the human-readable output via grep on the
classification headings.

## Rules

`graphql-inspector diff` accepts `--rule` flags to customize the gate
([gqi-diff][diff]):

| Rule                                      | Effect |
|-------------------------------------------|--------|
| `dangerousBreaking`                       | Treat dangerous changes as breaking (stricter). |
| `suppressRemovalOfDeprecatedField`        | Removing a `@deprecated` field is non-breaking. |
| `ignoreDescriptionChanges`                | Don't flag pure description / docstring edits. |
| `safeUnreachable`                         | Treat changes to unreachable parts of the graph as safe. |
| `considerUsage`                           | Use real-client usage data (Apollo Studio, etc.) to grade severity. |

Custom rules live as JS modules:

```bash
graphql-inspector diff old.graphql new.graphql --rule './rules/our-custom.js'
```

A custom rule exports a function `({ changes }) => filteredChanges` - 
useful when the team has a project-specific severity policy
(e.g. "removing any field under `internalAdmin*` is non-breaking").

## CI integration

### GitHub Actions - minimal

```yaml
# .github/workflows/graphql-diff.yml
name: graphql-schema-diff

on:
  pull_request:
    paths:
      - 'schema.graphql'
      - '**/*.graphql'

jobs:
  inspector:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5
        with:
          fetch-depth: 0

      - uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Extract base schema
        run: |
          BASE_SHA=$(git merge-base origin/main HEAD)
          git show $BASE_SHA:schema.graphql > /tmp/schema-base.graphql

      - name: Diff
        run: |
          npx @graphql-inspector/cli diff \
            /tmp/schema-base.graphql \
            schema.graphql \
            --rule suppressRemovalOfDeprecatedField \
            --rule ignoreDescriptionChanges
```

The `--rule suppressRemovalOfDeprecatedField` is the canonical pattern
for projects that take deprecation seriously: removing a field with
`@deprecated` is allowed; removing a live field blocks the PR.

### Federation supergraphs

For Apollo Federation, run `graphql-inspector diff` once per subgraph,
not against the supergraph composite - the composite includes all
subgraph types and a single subgraph PR's "added type" would appear as
"already present" on the composite side.

```bash
# For each subgraph in the PR
for subgraph in subgraphs/*/schema.graphql; do
  echo "Checking $subgraph"
  graphql-inspector diff "/tmp/${subgraph#subgraphs/}-base" "$subgraph"
done
```

Pair the per-subgraph diff with `rover supergraph compose` (Apollo's
official CLI) to confirm the composition still produces a valid
supergraph after the PR's changes.

## Alternatives noted (out of scope)

- **`graphql-cli`** - older umbrella tool; superseded by `@graphql-inspector/cli`.
- **Apollo `rover graph check`** - Apollo Studio's hosted equivalent;
  use this when the project is on Apollo Studio for the usage-based
  `considerUsage` analog.

This skill stays focused on `graphql-inspector` because it's the
self-hosted, vendor-neutral default.

## References

- [gqi-overview][overview] - GraphQL Inspector landing page; install
  command.
- [gqi-diff][diff] - `diff` CLI semantics, change classifications,
  rule flags.
- `openapi-contract-diff` - REST
  counterpart for OpenAPI.
- `contract-compatibility-gate` - gate skill that aggregates this output with Pact / oasdiff verdicts.

Files in this skill

  • .tessl-plugin/plugin.json495 B
  • SKILL.md6.6 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.