Spec Author logo

Spec Author

Community
llopresto87
spec-author

Write an executable specification under docs/graph/specs/ that turns a clear goal into testable contracts. Use whenever a feature, endpoint, job, significant function, or AI interaction needs a contract that the tester can encode and the implementer can satisfy. Coordinates product (§3, §9), architect (§4, §6, §7), and tester (§10 testability review) into a single signed-off document. Specs are the source of truth for behavior (`rule.spec`).

Overview

Publisherllopresto87
RepositoryCypress
Skill namespec-author
Stars
113
Forks
6
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by llopresto87 on GitHub. Read the source before you install it.

Installation

Install the Spec Author AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/llopresto87/Cypress/tree/main/skills/spec-author
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/llopresto87/Cypress.git /tmp/Cypress
mkdir -p .claude/skills
cp -r /tmp/Cypress/skills/spec-author .claude/skills/spec-author
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Spec Author in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Spec Author on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Spec Author is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

spec-author

This skill is the discipline of writing a spec that another agent can turn into failing tests and another into passing code. It is invoked from docs/graph/protocols/specify.md.

A spec is executable when every functional contract maps to at least one test in the suite and the test name names the contract. Specs that read like marketing or like implementations are not specs; implementation detail belongs in grill.md §8.

When to apply this skill

  • brainstorm has converged and the next step is to formalize the behavior.
  • An existing feature's contract is changing.
  • A bug investigation revealed a contract that was implicit and is now being made explicit.
  • An ADR introduces a new system behavior that needs a spec.

How to write each section

§1 Summary

One paragraph: what this spec covers and why, in the two sentences you would give the next agent on the team before they implement it.

§2 Scope

Two bullet lists: "in scope" and "out of scope". The out-of-scope bullets are equally important. Reading the spec a year later, the out-of-scope list is what tells the next agent "no, we considered that and excluded it deliberately."

§3 User-facing behavior (product)

Describe what the user experiences. Use the user's vocabulary, not the system's. If the spec is for an internal API or a job, the "user" might be another service or a developer: name them and describe their experience.

§4 Functional contracts (architect)

The heart of the spec. Each contract is one Given/When/Then, single- outcome, observable from outside.

Naming. Use UPPER_SNAKE_CASE slugs that read as sentences. Tester turns these into test names.

### Contract: SUBMIT_VALID_FORM_RETURNS_2XX
### Contract: SUBMIT_FORM_SCHEMA_INVALID
### Contract: SUBMIT_FORM_PERSISTS_RECORD
### Contract: GET_SUBMITTED_RECORD_RETURNS_BY_ID

The ### heading form is load-bearing: spec-lint.py only counts ### Contract: SLUG headings as live contracts, so a bare Contract: line is invisible to coverage.

One outcome per contract. "Returns 201 and sends an email" is two contracts: one for the response, one for the side effect. Many small, single-outcome contracts compose into the behavior.

Observable from outside. If the test has to inspect a private field, the contract is wrong. Move the observation to a public surface (a returned value, a queried record, an emitted event).

§5 Non-functional requirements

Only the constraints that bind this behavior; the template carries the category list and the bind-only rule at point of use.

§6 Data shapes (architect)

Schemas for inputs, outputs, persisted state. Use a language- agnostic notation (YAML-like) by default; cross-link to native schema files when they exist.

Required fields, types, allowed values, max sizes. These become test fixtures and validation rules.

§7 Failure modes (architect, with security)

For each contract, the named ways it can fail and what happens. This is what separates a spec from a description: a happy-path-only spec is half a spec.

Failure: SUBMIT_FORM_SCHEMA_INVALID
- Trigger: payload violates §6 schema
- Response: 422 with field-level error in body
- Side effects: audit log entry; nothing persisted
- Recovery: client may resubmit with corrections

Security adds adversarial cases here: prompt injection, tool hijacking, data exfiltration when AI is involved.

§8 Examples

Concrete input/output pairs. Three minimum: one happy, one edge, one failure. Examples are the seed for test fixtures and turn abstract contracts into concrete tests, so make them real values, not <placeholders>.

§9 Acceptance criteria (product)

Measurable conditions for "done". Each criterion maps to one or more contracts in §4 and to one or more tests in §10.

Acceptance criteria include the non-functional ones (latency, accessibility). Write them now, beside the functional ones, so the tester can encode them.

§10 Test mapping (tester)

A table mapping each contract and each acceptance criterion to the tests that cover them. Update as tests are written. Status values: pending (no test yet), red (test exists, fails), green (test exists, passes), skipped (with reason).

§11 Open questions

Every "we'll decide later" with a named resolution path. A spec with open questions stays in draft.

The sign-off rule

A spec is signed when every sign-off below that applies is recorded; until then it is unsigned and nobody plans against it:

  • product ✓ confirms §3 and §9 reflect the user outcome.
  • architect ✓ confirms §4, §6, §7 are coherent.
  • tester ✓ confirms every contract in §4 is testable (the testability review).
  • security ✓ if the spec touches auth, secrets, payments, uploads, external integrations, or AI behaviors that act on data.

Sign-off goes in §0 (Metadata), and the signed spec stays draft. Sign-off says the contract is authoritative; active says it is under test. The signed spec moves to active in the change that lands its first RED tests (test-first's COMMIT; verify.status-evidence owns the moment), and to implemented when every contract is green. A live status over an empty assertion set is a false green: active with no test is a red gate until RED lands, and a false green once someone silences it.

A spec that grows by slice (specify.flow) is signed the same way, one slice at a time. The slice's contracts, their §10 rows (status pending) and a §12 changelog row naming its signers are written before the tester writes the slice's RED, and they land in the same commit as that RED, so a live spec never holds a contract with no test.

Before a spec is signed, its prose passes docs/graph/skills/humanizer.md in file mode and python3 docs/graph/prose-lint.py --file <spec> --against HEAD reports no strong tell and no dropped contract slug, number, or code span.

The sign-offs are judgment; the shape and the coverage are mechanical. python3 docs/graph/spec-lint.py (the kernel §3.1 gate in the gate table of docs/graph/protocols/verify.md) checks every spec's shape (unique slugs, a §10 row per contract, §9 criteria that map to real slugs, sign-offs present on anything past draft) and, for live specs, that every slug appears in at least one test. A draft is shape-checked and not counted for coverage, so a spec in authoring never reports uncovered.

Spec drift management

When the code and the spec disagree, decide deliberately which side is right (kernel §4 owns the boundary):

  • Code is right, spec is wrong: edit the spec deliberately, add a §12 changelog entry, get re-sign-off.
  • Spec is right, code is wrong: file a bug, add a regression test, fix the code.
  • Both partially right: the brainstorm needs to revisit the contract; back up to brainstorm or specify and write a new version.

Reference files

  • docs/graph/templates/spec.template.md : the template.
  • docs/graph/protocols/specify.md : the protocol.
  • docs/graph/protocols/test-first.md : what happens next.
  • docs/graph/agents/01-architect.md, docs/graph/agents/04-tester.md, docs/graph/agents/08-product.md : the three co-authors.

Frequently asked questions

What does the Spec Author AI skill do?

Write an executable specification under docs/graph/specs/ that turns a clear goal into testable contracts. Use whenever a feature, endpoint, job, significant function, or AI interaction needs a contract that the tester can encode and the implementer can satisfy. Coordinates product (§3, §9), architect (§4, §6, §7), and tester (§10 testability review) into a single signed-off document. Specs are the source of truth for behavior (`rule.spec`).

Why use Spec Author on TypingMind?

Because you install it once and use it with any model. Spec Author is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Spec Author in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/llopresto87/Cypress/tree/main/skills/spec-author. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Spec Author?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Spec Author?

As many as you like. As long as a model supports skills, you can use Spec Author with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Spec Author AI skill free?

Yes. It is published on GitHub by llopresto87 under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇