Skill Validation

June 7, 2026 · View on GitHub

Skills must be tested against real library behavior. This page documents the validation discipline. Phase 4 has shipped the validation/ folder (templates, checklists, the baseline report) and the examples/skill-fixtures/ projects. The fixture projects now compile and run against GraphCompose 1.7.0 from Maven Central (io.github.demchaav:graph-compose:1.7.0; older pre-1.6.7 pins remain resolvable via JitPack as com.github.DemchaAV:GraphCompose:vX.Y.Z). The remaining validation work is the full render + preview + visual-diff loop that promotes skills out of needs-validation. See roadmap.md for the phase ordering.

Skill validation rule

A skill is valid only if:

  • it targets a specific GraphCompose version
  • its code examples compile
  • its examples render successfully where applicable
  • it does not reference removed APIs
  • it does not recommend deprecated patterns
  • it has at least one verified fixture when possible
  • it documents known limitations

The Skill Validator Agent owns this check. See agents.md#skill-validator-agent for inputs, outputs, and the core rule that the library — not the skill — is the source of truth.

validation/
  README.md
  skill-validation.md
  api-compatibility-checklist.md
  known-limitations.md
  verified-examples.md
  skill-fix-template.md
  validation-report-template.md

Fixture examples

Each fixture is a small standalone GraphCompose project that exercises one skill end-to-end.

examples/
  skill-fixtures/
    row-basic/
    section-basic/
    table-basic/
    table-repeated-header/
    invoice-layout/
    layer-stack-badge/
    shape-container-card/
    pagination-basic/

Each fixture should have:

README.md
pom.xml
src/test/java/...
expected-output/
  output.pdf
  output.png
  layout-snapshot.json

The fixture's expected output is what skill validation compares against when it re-renders the example with the current GraphCompose release.

Skill drift rule

If GraphCompose behavior differs from the skill documentation, the library is treated as the source of truth.

The skill must be updated.

The agent must not silently work around incorrect skills.

When drift is detected the Skill Validator Agent files a skill fix report rather than patching the template to dodge the broken skill.

Skill fix report template

File:

validation/skill-fix-template.md

Template:

# Skill Fix Report

## Affected skill

`skills/versions/graphcompose-1.6/tables.md`

## GraphCompose version

`1.6.0`

## Problem

The skill says that table headers repeat automatically, but the current API requires explicit configuration.

## Expected according to skill

```java
table.enableRepeatedHeader();

Actual library behavior

The method is not available / behavior is different.

Failing example

examples/skill-fixtures/table-basic

Required skill update

Document the correct API and update the example.

Status

FAILED / NEEDS UPDATE / FIXED


## Phase status

Phase 4 has shipped:

- [`validation/README.md`](../validation/README.md),
  [`validation/skill-validation.md`](../validation/skill-validation.md),
  [`validation/api-compatibility-checklist.md`](../validation/api-compatibility-checklist.md),
  [`validation/known-limitations.md`](../validation/known-limitations.md),
  [`validation/verified-examples.md`](../validation/verified-examples.md),
  [`validation/skill-fix-template.md`](../validation/skill-fix-template.md),
  [`validation/validation-report-template.md`](../validation/validation-report-template.md)
- [`validation/reports/phase-4-baseline.md`](../validation/reports/phase-4-baseline.md) —
  the historical baseline report from before fixture execution.
- [`validation/reports/fixture-smoke-2026-05-18.md`](../validation/reports/fixture-smoke-2026-05-18.md) —
  the first compile/run smoke report against GraphCompose 1.6.0 via
  JitPack (historical; the fixtures now resolve 1.7.0 from Maven Central).
- Five fixture projects under
  [`examples/skill-fixtures/`](../examples/skill-fixtures/):
  `row-basic`, `section-basic`, `table-basic`, `layer-stack-badge`,
  `shape-container-card`. The plan also lists `table-repeated-header`,
  `invoice-layout`, and `pagination-basic` as future fixtures; those
  are not part of the Phase 4 scope.

The fixture smoke proves the covered DSL calls compile and run against
the real 1.7.0 artifact. As of 2026-06-03 the render + visual-diff loop
is built too: `scripts/validate-skills.mjs` renders each fixture
through `tools/preview-renderer` (a no-arg `*FixtureDocument` adapter
per fixture) and compares the PNG against a committed
`expected-output/output.png` baseline via `tools/visual-diff`. All five
fixtures render and re-render `IDENTICAL` vs baseline locally — see
[`validation/reports/skill-render-validation-2026-06-03.md`](../validation/reports/skill-render-validation-2026-06-03.md).
CI runs the loop in `--render-only` mode because PNG baselines are
platform-specific (font rasterisation differs across OS/JDK).

Every skill in [`skill-manifest.json`](../skills/skill-manifest.json)
still reads `status: needs-validation`. Flipping the six
fixture-covered skills to `active` is a deliberate follow-up pending an
author review of the remaining criteria (no deprecated patterns;
documented limitations). See
[versioned-skills.md](versioned-skills.md) for the manifest, statuses,
and the no-invented-API rule that validation enforces.