Skip to content
Back to skills

Spec Change

ASecurity

Change a Fishhawk canonical schema or API contract end to end — `docs/spec/*.schema.json` (workflow, plan, operator overlay), the embedded mirrors, the generated site reference, version advertising, and `docs/api/v0.openapi.yaml`. Use when adding/changing a field in the workflow spec or plan schema, standing up a new workflow major, or changing the REST API surface.

  • 9 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 7, 2026
ai-agentsgoapibackend

Works with

  • cli
  • api
  • mcp

Security analysis

A100/100

Scanned October 7, 2026

npx -y skills add kuhlman-labs/fishhawk --skill spec-change --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Spec Change?

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

Security grade badge for Spec Change
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/kuhlman-labs-spec-change/badge)](https://www.skillsdirectory.com/skills/kuhlman-labs-spec-change)

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: spec-change
description: Change a Fishhawk canonical schema or API contract end to end — `docs/spec/*.schema.json` (workflow, plan, operator overlay), the embedded mirrors, the generated site reference, version advertising, and `docs/api/v0.openapi.yaml`. Use when adding/changing a field in the workflow spec or plan schema, standing up a new workflow major, or changing the REST API surface.
---

# Change a schema or API contract

Canonical sources live in `docs/spec/` (schemas + reference docs) and `docs/api/` (OpenAPI). Each is mirrored or rendered into several places, and CI fails on every one that's missed.

## 1. Classify the change first

- **Additive.** A new *optional* field within the current major. Proceed.
- **Breaking.** A new *required* field, a removed field, or a narrowed type, in an existing major. Don't do it in place: bump the major (`workflow-vN+1`, `standard_v2`).
  - For a field meant to become required later, add it optional and annotate it with `"x-intended-required": true`.
  - Declare the soak window in the PR body under `## Notes`.

State the classification to the user before editing.

## 2. Edit and propagate (workflow / plan schemas)

1. Edit the canonical `docs/spec/<name>.schema.json` **and** its reference doc `docs/spec/<name>.md`. For the workflow spec, `docs/spec/workflow-v2.md` is the complete reference for the live major.
2. `scripts/sync-schemas` mirrors the change into `backend/internal/spec/schemas/` and `cli/internal/spec/schemas/` (and the plan mirrors). Commit the mirrors with it.
3. `scripts/gen-site-reference` re-renders the generated regions of `site/src/content/docs/reference/*.md`. Edit only outside the `BEGIN/END GENERATED` markers.
4. Validate the examples:
   - `check-jsonschema --schemafile docs/spec/<schema> <example.yaml>`
   - A workflow-v2 doc using `defaults`/`extends` must go through the product validator:
     `fishhawk validate --emit-resolved <yaml> | check-jsonschema --schemafile docs/spec/workflow-v2.schema.json --default-filetype yaml -`
     Treat `fishhawk validate` (without the flag) as the authority.
5. **Version advertising.** For a new version string:
   - add it to the plan validator's recognized set (`backend/internal/plan/`)
   - add it to the runner `/healthz` schema-versions list **once #466 lands**. That endpoint does not exist yet: check for it first, and don't create it as part of a schema change.

### A NEW workflow major (also)

- Add `docs/spec/workflow-vN.schema.json`, then run `scripts/sync-schemas`. The `workflow-v*` glob routes it; no script edit is needed.
- Append `{Major: N, Path: …}` to `embeddedSchemas` in **both** `backend/internal/spec/parse.go` and `cli/internal/spec/spec.go`. Without it, the validator fails closed on the new major.
- Add `EmbeddedSchemaHashVN()` plus the `workflow-vN` entry in the `/healthz` `schemas` map (`backend/internal/server/handlers.go`).
- Register the mirror set as a surface-sweep pattern in `backend/internal/server/surface_sweep.go`.
- Bumping `.fishhawk/workflows.yaml`'s `version:` major makes `scripts/dev up/reload` print the schema-major MCP banner. Expect it.

## 3. REST API changes

- **Source of truth:** `docs/api/v0.openapi.yaml`. Update the human companion `docs/api/v0.md` with it.
- **Lint with the pinned version:** `npx -y @redocly/cli@2.31.5 lint --config docs/api/redocly.yaml docs/api/v0.openapi.yaml`
- Re-run `scripts/gen-site-reference`; `reference/api.md` is generated from it.
- A tightened auth check also needs the PR-body Auth change checklist (`fishhawkd token migrate` dry-run inventory). See `AGENTS.md`.

## 4. Gate

Run the `verify-gate` skill. Its schema-sync step catches a missed mirror, and the site-reference drift test catches a missed regeneration.

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…