Каждая неоднозначность в спецификации
это токен, который сжигает ваш агент.

Потом уточняющий вопрос посреди разработки. Потом исправление после релиза. Потом контекст, который вы объясняете снова и снова.

SpecScore — открытый, линтуемый файловый формат для спецификаций, как JSON для данных. С CLI, через который ваши агенты запрашивают и редактируют их — как jq для JSON.

Формат для спецификаций, которые вы и так пишете.

SpecScore — это формат на основе Markdown + YAML для фич, требований и критериев приёмки. Он задаёт структуру, понятную и вашей команде, и вашим ИИ-агентам — и это просто файлы в вашем репозитории.

Проект SpecScore состоит из трёх типов артефактов в едином жизненном цикле: Идея фиксирует полусформированное направление;Фича замораживает согласованное поведение;План раскладывает фичу на упорядоченные задачи, каждая из которых ссылается на критерии приёмки, которые она удовлетворяет.

Зачем это вашему агенту. Поскольку структура машиночитаема, ИИ-агенты могут запрашивать спецификацию через CLI, а не читать каждый файл. Спросите «над чем мне работать дальше?» — и CLI вернёт открытые фичи и нерешённые вопросы. Та же форма, которую читает ваша команда; куда меньше контекста, который агенту нужно загружать.

Feature → Requirements → Acceptance Criteria → Scenarios.
ПРИМЕРideas/apply-discount.md
# Idea: Discount codes at checkout

**Status:** Approved
**Date:** 2026-05-19
**Owner:** cart-team
**Promotes To:** features/apply-discount

## Problem Statement

How might we let returning customers redeem a
single promo code at checkout without breaking
the existing cart math or the site-wide promotion
engine?

## Recommended Direction

A registered user can apply **one** valid code per cart.
Codes are time-bounded and replaceable. Stacking
with site-wide promotions follows a deterministic
tiebreak rule (higher discount wins; site-wide
wins on tie).
ПРИМЕРfeatures/checkout/apply-discount.md
---
status: approved
owners: [cart-team]
---

# Feature: Apply Discount

A registered user can apply one valid discount code to their cart at checkout.

## Requirements

### R1 — Single-code limit

- **AC-1** The cart accepts at most one discount code at a time.
- **AC-2** Applying a second code replaces the first, with a visible confirmation.
- **AC-3** Removing the code restores the original cart total.

### R2 — Code validity

- **AC-1** A code is valid only if `valid_from` ≤ now ≤ `valid_until`.
- **AC-2** Invalid codes show a specific error message.

### R3 — Discount application

- **AC-1** Percentage discounts apply to subtotal, not shipping.
- **AC-2** Discount totals round down to the nearest cent.
- **AC-3** Stacking with site-wide promotions follows the higher-of rule.

## Scenario: Apply a valid percent-off code

**GIVEN** a cart with subtotal $50.00 and shipping $10.00
**WHEN** the user applies code `SAVE20` (20% off)
**THEN** the cart shows subtotal $40.00, shipping $10.00, total $50.00
ПРИМЕРplans/apply-discount/README.md
# Plan: Apply Discount

**Status:** approved
**Features:**
  - [apply-discount](../../features/apply-discount.md)
**Author:** cart-team
**Effort:** M
**Impact:** high

## Context

The apply-discount Feature is Approved. This plan
breaks it into ordered tasks; each task cites the
acceptance criteria it satisfies.

## Tasks

### T1 — Accept a `code` field on the cart
Cites: R1.AC-1, R1.AC-2, R1.AC-3

### T2 — Validate code time-window
Cites: R2.AC-1, R2.AC-2

### T3 — Apply percentage to subtotal, round down
Cites: R3.AC-1, R3.AC-2

### T4 — Higher-of tiebreak vs site-wide promo
Cites: R3.AC-3

### T5 — Confirmation toast on apply / replace
Cites: R1.AC-2

Спецификации иерархичны. И ваше дерево спецификаций — тоже.

Плоский список на пятидесяти фичах превращается в свалку. SpecScore сохраняет дерево навигируемым: родители держат объём, дети — детали, а форма директорий повторяет форму продукта, о которой ваша команда и так рассуждает.

Открытые вопросы всплывают наверх.Нерешённые вопросы на любой глубине показываются в индексе каждого родителя. Вы видите, что блокирует релиз, с вершины дерева — не приходится копать, чтобы их найти.

Большинство инструментов для спецификаций исходят из того, что плоский список работает. Работает — пока не перестаёт. SpecScore сделан ровно для того момента, когда вопрос «а где живёт эта фича?» начинает иметь значение.

Посмотреть вживую в specscore-cli →

ИЗspecscore-cli/spec/features/cli/
spec/features/cli/
├── agent/
│   └── setup/
├── feature/
│   ├── change-status/
│   ├── deps/
│   ├── info/
│   ├── list/
│   ├── new/
│   ├── refs/
│   └── tree/
├── idea/
│   ├── change-status/
│   ├── new/
│   └── relocate/
├── spec/
│   └── lint/
│       ├── issue-rules/     ← под-под-фича
│       └── plan-rules/
├── task/
│   ├── info/
│   ├── list/
│   └── new/
└── … ещё 10 фич верхнего уровня

Что идёт не так без него.

  • Спецификации устаревают.

    Спека в документе, тред в Slack и код в PR молча расходятся неделями. Никто не может найти, какая версия разговора каноническая.

    Решение

    Одна каноническая спека в репозитории, версионируется вместе с кодом. specscore lint запускается в CI на каждый push; git-история — это аудит-трейл. Спека, тред и PR не могут молча разойтись — это один и тот же файл под ревью.

  • Критерии расплываются.

    "Обрабатывает ошибки корректно" должно было означать "показать тост и откатить." Или"логировать и повторить?" Агенту приходится гадать.

    Решение

    Линтер ловит размытые критерии до того, как написана хоть строчка кода. Глагол не проходит линт, потому что у него нет конкретного объекта и условия. Чтобы убрать предупреждение, приходится сформулировать, что значит"обрабатывает".

  • Агенты делают не то.

    Люди интерполируют, уточняют, спрашивают. ИИ-агенты — нет. Они реализуют тот паттерн, который чаще всего встречался в их обучающих данных. Код проходит ревью, потому что делаетчто-то разумное. Просто не то, что вы имели в виду.

    Решение

    Структурированный вход. ИИ-агенты парсят REQ-ID, AC-ID и сценарииGIVEN / WHEN / THENдетерминированно — интерполировать нечего. Каждая задача Plan обязана сослаться на AC-ID, которые она удовлетворяет: сделанное всегда сверяемо со специфицированным.

  • За расплывчатую спецификацию вы платите дважды.

    Агент что-то собирает по нечёткому заданию, вы видите, что это не то, и переформулируете запрос — четырьмя разными способами. Каждая недоделанная функция и каждая повторная попытка оплачиваются токенами. Чем расплывчатее спецификация, тем больше кругов до результата.

    Решение

    Линтуйте спецификацию до запуска агента.specscore lint сразу отклоняет расплывчатые глаголы и недостающие критерии приёмки, поэтому агент реализует чёткое задание с первого раза, а не гадает между попытками. Самый дешёвый запуск агента — тот, который не приходится повторять.

  • Агенты платят за повторное чтение спецификаций.

    ИИ-агент, отвечающий на вопрос "что зависит от этой фичи?", читает весь README фичи. Потом каждый родительский индекс. Потом соседние фичи на всякий случай. Каждый запрос — новый парсинг. Токены сгорают; латентность растёт; счёт растёт вместе с ними.

    Решение

    Структурированные запросы вместо чтения файлов.specscore feature tree возвращает иерархию как YAML; feature deps обходит транзитивные зависимости; feature info показывает статус, владельца и открытые вопросы — каждая команда за один вызов. Агент навигирует по графу, а не по прозе.

  • Код забывает свою спецификацию.

    Спустя полгода ты дебажишь функцию, и никто не помнит, какую фичу она реализует. Связь между кодом и спекой жила в чьей-то голове, и этот человек уволился. PR, который её ввёл, ушёл в архив.

    Решение

    Аннотации в исходниках. Комментарии вида// specscore: features/checkout/apply-discount/R1.AC-2делают связь машиночитаемой и переживают любой рефакторинг.specscore code deps отвечает на вопрос"какую спеку реализует этот файл?" за один вызов; линтер помечает ссылки на удалённые спецификации.

  • Изменения статуса утекают.

    Ты переводишь фичу из Draft в Approvedв её README, но родительский features-index всё ещё показывает её как Draft. Через три недели агент, читающий индекс, думает, что фича всё ещё в работе. Статус живёт в двух местах, и они расходятся.

    Решение

    specscore feature change-status переписывает поле Status фичи и пересинхронизирует строку в features-index одной атомарной операцией — при сбое линта изменение откатывается. Статус существует в одном каноническом месте; индекс — это его сгенерированное представление.

  • Спецификации забывают то, чего не знают.

    Спека читается как готовая — пока ты не вспоминаешь, что вопрос "а что с часовыми поясами?" потерялся в треде Slack два месяца назад и так и не попал в документ. Теперь вы в реализации, и никто не может сказать, каким был ответ.

    Решение

    У каждой SpecScore-фичи обязательная секцияOutstanding Questions. Линтер отвергает фичи, в которых её нет — пусто можно ("None at this time."), но отсутствие — нельзя. Нерешённые вопросы видны в документе, доступны из CLI и их невозможно забыть.

Самый простой способ начать: SpecStudio Skills для ИИ-агентов.

SpecStudio Skills — плагин для Claude Code, который превращает жизненный цикл SpecScore в четыре slash-команды. Установите один раз, потом запускайте их по порядку — от сырой идеи к выполнимому плану.

$ /plugin marketplace add specscore/ai-marketplace
$ /plugin install specstudio@specscore
Claude Codeавтодополнение
> /specstudio:
   /specstudio:ideate     Превратить сырую идею в SpecScore Idea
   /specstudio:specify    Превратить одобренную Idea в Feature-спеку
   /specstudio:plan       Разложить Feature на Plan из задач
   /specstudio:implement  Выполнить следующую задачу из Plan
Claude Code/ideate
> /ideate Давай подумаем, как должен выглядеть экран корзины для процесса оформления заказа.
Claude Code/specify
> /specify Зафиксируй spec/ideas/checkout-basket.md
Claude Code/plan
> /plan Реализовать spec/features/checkout/basket/README.md
Claude Code/implement
> /implement Выполни spec/plans/checkout-basket/README.md

Бесплатно для публичных и open-source репозиториев. Исходники плагина —specscore/specstudio-skills, лицензия MIT.

Проверьте спецификацию в два прохода.

Сначала быстрый детерминированный линтер, затем более глубокая проверка ИИ — на той же спецификации, что вы только что видели. Два прохода — два вида уверенности.

Запустите линтер.

детерминированный

Одинаковый результат при каждом запуске. Бесплатно, быстро, на каждом коммите.

Проверка и оценка с помощью ИИ.

недетерминированный

Читает по смыслу, как живой рецензент.

Вот что он не поймает.

Линтер, который утверждает, что ловит всё, — лжёт. SpecScore — это многослойная система: детерминированный линтер, проверка ИИ и ваше собственное суждение, и у каждого слоя есть реальные границы. Мы описали их все: что ловит линтер, что ловит ИИ и что по-прежнему остаётся на вас, потому что ни один инструмент пока не может это сделать.

Что линтер не поймает →

Что в коробке.

Формат

Markdown + YAML. Работает в любом редакторе, открывающем текст. Никаких новых инструментов, чтобы начать писать.

Линтер

CLI на Go. Проверяет структуру, ссылки и полноту. Выходит с ненулевым кодом при ошибке — работает в терминале и в CI.

Никаких обязательных инструментов.

SpecScore — это просто файлы в вашем репозитории. Не нужно регистрироваться в SaaS. Не нужен оркестратор. Используйте с Linear, Jira, GitHub Projects, сырыми Markdown-файлами в папке — или вообще без таск-трекера. Формату и линтеру всё равно, где живут ваши тикеты.

Предпочитаете CLI?

Не используете ИИ-агентов или нужна валидация спек в CI-пайплайне? Для этого есть CLI. Установка за 60 секунд — без аккаунта, без телеметрии, работает на любой папке с Markdown-спеками.

$ curl -fsSL https://specscore.md/install/get-cli | sh

Запустите линтер на примере спеки, которая идёт в комплекте:

$ specscore lint examples/checkout/apply-discount.md

Вывод:

  examples/checkout/apply-discount.md
    ✓ R1  has acceptance criteria
    ✓ R2  has acceptance criteria
    ✗ R3  no acceptance criteria
    ✗ link     "Related Feature: discount-tiers" not found
    ✗ section  "Open Questions" missing

  3 problems   exit 1

Читать полную документациюКонтрибьютить на GitHub

Сделано на SpecScore.

  • Codegrapher

    Движок графа кода для быстрого исследования кода и двусторонней связи между спецификациями и кодом.

    codegrapher.dev
  • DALgo

    Слой доступа к данным на Go, специфицированный с помощью SpecScore.

    dal-go.github.io
  • inGitDB

    Версионная база данных на основе Git, специфицированная с помощью SpecScore.

    ingitdb.com
  • Rehearse

    Слой доказательств приёмки — реально прогоняет критерии приёмки спецификации, с переиспользуемыми проверками и без связующего кода.

    rehearse.ink
  • SpecScore Studio

    Веб-интерфейс для просмотра и редактирования SpecScore-спецификаций.

    specscore.studio

Есть вопросы?

Вот вопросы, которые задают чаще всего. Каждый ведёт к полному ответу на странице FAQ.

Чем SpecScore отличается от spec-kit?

spec-kit — это методология; SpecScore — формат хранения для спецификаций, которые вы пишете, плюс CLI. Они сочетаются — расширение spec-kit, пишущее SpecScore, уже в работе.

Полный ответ →
Чем SpecStudio Skills отличаются от Superpowers и agent-skills?

По духу — похоже: все три ведут ИИ-агентов через ideate → specify → plan → implement. SpecStudio Skills пишут артефакты в формате SpecScore и вызывают CLIspecscore для запросов и смены статусов; остальные читают и пишут файлы напрямую. Берите SpecStudio, когда важен расход токенов.

Полный ответ →
Зачем CLI — нельзя просто поставить навыки?

Навыки не могут надёжно обеспечивать ссылочную целостность, возвращать отфильтрованные запросы без чтения каждого файла или менять нужное поле статуса в нужный момент. CLI делает каждое за один вызов. Навыкам, чтобы сделать то же, нужно прочитать каждый файл.

Полный ответ →
Почему «SpecScore» — что он оценивает?

Два прочтения, и оба намеренные. Партитура — структурированная запись требований. И буквальная оценка качества — CLI-линтер даёт детерминированную оценку, а навык /score — AI-оценку готовности от A до F.

Полный ответ →
Где цифры по экономии токенов?

Измеренное сравнение бок о бок готовится к публикации до поста на Хабре. Структурно: CLI возвращает небольшой структурированный список; обычный агент вместо этого читает N документов.

Полный ответ →

Спеки, которые проходят линтер.

или читать документацию

★ Поставьте звезду на GitHub — это помогает другим находить проект.GitHub stars

Нашли ошибку в переводе или знаете как улучшить эту страницу? Сообщите нам.