Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when designing GraphQL schemas, implementing Apollo Federation, or building real-time subscriptions. Invoke for schema design, resolvers with DataLoader, query optimization, federation directives.
.claude/skills/jeffallan-graphql-architect/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 24% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 87% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 71% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 40% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 48% | 0% |
Senior GraphQL architect specializing in schema design and distributed graph architectures with deep expertise in Apollo Federation 2.5+, GraphQL subscriptions, and performance optimization.
@key entities resolve correctly@key directives, check for missing or mismatched type definitions across subgraphs, resolve any @external field inconsistencies, then re-run compositionLoad detailed guidance based on context:
| Topic | Reference | Load When | |-------|-----------|-----------| | Schema Design | references/schema-design.md | Types, interfaces, unions, enums, input types | | Resolvers | references/resolvers.md | Resolver patterns, context, DataLoader, N+1 | | Federation | references/federation.md | Apollo Federation, subgraphs, entities, directives | | Subscriptions | references/subscriptions.md | Real-time updates, WebSocket, pub/sub patterns | | Security | references/security.md | Query depth, complexity analysis, authentication | | REST Migration | references/migration-from-rest.md | Migrating REST APIs to GraphQL |
graphql# products subgraph type Product @key(fields: "id") { id: ID! name: String! price: Float! inStock: Boolean! } # reviews subgraph — extends Product from products subgraph type Product @key(fields: "id") { id: ID! @external reviews: [Review!]! } type Review { id: ID! rating: Int! body: String author: User! @shareable } type User @shareable { id: ID! username: String! }
js// context setup — one DataLoader instance per request const context = ({ req }) => ({ loaders: { user: new DataLoader(async (userIds) => { const users = await db.users.findMany({ where: { id: { in: userIds } } }); // return results in same order as input keys return userIds.map((id) => users.find((u) => u.id === id) ?? null); }), }, }); // resolver — batches all user lookups in a single query const resolvers = { Review: { author: (review, _args, { loaders }) => loaders.user.load(review.authorId), }, };
jsimport { createComplexityRule } from 'graphql-query-complexity'; const server = new ApolloServer({ schema, validationRules: [ createComplexityRule({ maximumComplexity: 1000, onComplete: (complexity) => console.log('Query complexity:', complexity), }), ], });
When implementing GraphQL features, provide:
Apollo Server, Apollo Federation 2.5+, GraphQL SDL, DataLoader, GraphQL Subscriptions, WebSocket, Redis pub/sub, schema composition, query complexity, persisted queries, schema stitching, type generation
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 27,791 | 18,732 | -33% | 1 | 1 | 0% | 5,348 | 4,823 | -10% | 0 | 0 | — |
case-02 | fail→pass | 21,798 | 21,493 | -1% | 1 | 1 | 0% | 3,931 | 4,855 | +24% | 0 | 0 | — |
case-03 | fail→fail | 24,922 | 21,309 | -14% | 1 | 1 | 0% | 4,944 | 5,128 | +4% | 0 | 0 | — |
case-04 | fail→pass | 11,716 | 17,657 | +51% | 1 | 1 | 0% | 2,264 | 4,230 | +87% | 0 | 0 | — |
case-05 | pass→pass | 15,553 | 13,628 | -12% | 1 | 1 | 0% | 2,487 | 3,128 | +26% | 0 | 0 | — |
case-06 | fail→pass | 10,996 | 12,721 | +16% | 1 | 1 | 0% | 1,887 | 3,232 | +71% | 0 | 0 | — |
case-07 | pass→pass | 15,634 | 13,741 | -12% | 1 | 1 | 0% | 2,545 | 3,473 | +36% | 0 | 0 | — |
case-08 | pass→pass | 15,119 | 22,477 | +49% | 1 | 1 | 0% | 2,199 | 2,907 | +32% | 0 | 0 | — |
case-09 | pass→pass | 11,372 | 14,236 | +25% | 1 | 1 | 0% | 2,056 | 3,690 | +79% | 0 | 0 | — |
case-10 | pass→pass | 11,068 | 8,637 | -22% | 1 | 1 | 0% | 2,021 | 2,761 | +37% | 0 | 0 | — |
case-11 | fail→fail | 8,929 | 11,616 | +30% | 1 | 1 | 0% | 1,103 | 3,444 | +212% | 0 | 0 | — |
case-12 | pass→pass | 14,028 | 15,213 | +8% | 1 | 1 | 0% | 2,545 | 3,799 | +49% | 0 | 0 | — |
case-13 | fail→pass | 17,982 | 16,725 | -7% | 1 | 1 | 0% | 3,153 | 4,399 | +40% | 0 | 0 | — |
case-14 | pass→pass | 10,157 | 9,184 | -10% | 1 | 1 | 0% | 1,757 | 2,605 | +48% | 0 | 0 | — |
case-15 | pass→pass | 7,387 | 10,437 | +41% | 1 | 1 | 0% | 1,306 | 2,906 | +123% | 0 | 0 | — |
case-16 | fail→pass | 15,288 | 13,159 | -14% | 1 | 1 | 0% | 2,672 | 3,960 | +48% | 0 | 0 | — |
case-17 | pass→pass | 15,713 | 13,740 | -13% | 1 | 1 | 0% | 2,495 | 3,318 | +33% | 0 | 0 | — |
case-18 | pass→pass | 16,444 | 14,825 | -10% | 1 | 1 | 0% | 2,699 | 3,589 | +33% | 0 | 0 | — |
case-19 | pass→pass | 15,813 | 15,737 | -0% | 1 | 1 | 0% | 2,775 | 3,609 | +30% | 0 | 0 | — |
case-20 | pass→fail | 17,151 | 17,025 | -1% | 1 | 1 | 0% | 3,764 | 4,608 | +22% | 0 | 0 | — |
case-21 | pass→fail | 15,077 | 21,825 | +45% | 1 | 1 | 0% | 2,675 | 3,282 | +23% | 0 | 0 | — |
case-22 | pass→pass | 13,376 | 11,875 | -11% | 1 | 1 | 0% | 2,540 | 3,300 | +30% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +14 percentage points is the difference between those two pass rates over the 22 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.