Кожна неоднозначність у специфікації
це токен, який спалює ваш агент.

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

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.

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

Швидкий детермінований лінтер, а потім глибша AI-рецензія — запущені на специфікації, яку ви щойно бачили. Два проходи, два види впевненості.

Запустіть лінтер.

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

Однаковий результат при кожному запуску. Безкоштовно, швидко, працює на кожному коміті.

Рецензія та оцінка від AI.

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

Читає за змістом, як живий рецензент.

Ось чого він не зловить.

Лінтер, який запевняє, що ловить усе, бреше. SpecScore — це шарувата система: детермінований лінтер, AI-рецензент і ваше власне судження — і в кожного шару є реальна межа. Ми всі їх записали: що ловить лінтер, що ловить AI і що досі залишається на вас, бо жоден інструмент поки що цього не вміє.

Чого лінтер не зловить →

Що в комплекті.

Формат

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.

Повна відповідь →
Де цифри щодо економії токенів?

Виміряне порівняння пліч-о-пліч готується до публікації перед постом на Habr. Структурно: CLI повертає невеликий структурований список; звичайний агент натомість читає N документів.

Повна відповідь →

Специфікації, що проходять лінтер.

або читати документацію

★ Поставте зірку на GitHub — це допомагає іншим знаходити проєкт.GitHub stars

Знайшли помилку в перекладі або маєте ідею як покращити цю сторінку? Повідомте нам.