Шаблоны документов BR / SR / TR / TC¶
Статус: informative. Это возможная реализация нормативных схем — организации могут дорабатывать заготовки под свой носитель и редакционные конвенции. Нормативный текст, который шаблоны лишь иллюстрируют:
standard/06(BR / SR / TR) иstandard/09(TC). При расхождении заготовки и главы стандарта главенствует глава.Закрытый список не затрагивается: приложение даёт заготовки для уже нормированных типов; новые типы артефактов или SPEC добавляются только через формальную процедуру изменения стандарта (глава 13).
12.1 Статус и как пользоваться¶
Каждый раздел ниже содержит две заготовки: блок yaml с frontmatter (с построчными комментариями об обязательности полей) и блок markdown со скелетом тела. Чтобы получить готовый файл артефакта, склейте обе части в один документ носителя: frontmatter сверху, тело — следом.
Соответствие заготовок нормативным схемам:
| Артефакт | frontmatter (норма) | Разделы тела (норма) |
|---|---|---|
| BR | §6.5.2 | §6.5.3 |
| SR | §6.6.2 | §6.6.3 |
| TR | §6.7.2 | §6.7.3 |
| TC | §9.3 | §9.4 |
Условные обозначения в заготовках: <...> — плейсхолдер для замены; NN — порядковый номер в рамках scope; комментарий # conditional помечает поле, обязательность которого зависит от условия (поясняется тут же); # auto — поле, которое ведёт носитель/runner, автор его не заполняет вручную.
12.2 Шаблон BR¶
BR фиксирует бизнес-потребность на уровне системы или подсистемы; технические детали в BR запрещены (§6.5.1). Frontmatter — по §6.5.2; тело — по §6.5.3.
---
id: BR-NN # неизменяемый; NN — порядковый в рамках scope
title: "<краткое описательное название>"
type: BR
slug: "<kebab-case>" # выводится автоматически
# === Scope (обязательно) ===
level: system | subsystem # BR на уровне модуля запрещён (§6.4)
scope:
system: "<system-id>"
subsystem: "<subsystem-id>" # null, если level=system
# === Жизненный цикл (обязательно) ===
status: draft | approved | verified | deprecated
owner: "<роль / ответственное лицо>"
# === Источник: происхождение (см. §7.4.1) ===
source:
tz-section: "§N.N" # обязательно всегда — первичное происхождение из TZ
adapt: ADAPT-NNN # conditional: присутствует, если ADAPT создавался
adapt-section: "Forward §N" # обязательно, если задано adapt
adversarial-review-ref: "<ссылка-носителя>" # conditional: при отсутствии adapt — свидетельство вердикта «нет находок» (§7.4.1.2)
# === Межуровневая связь BR подсистемы → BR системы (см. §6.8.2) ===
implements: # массив; не parent-edge, отдельный тип ребра
- id: BR-NN # ID BR родительской системы
scope:
system: "<system-id>"
rationale: "<кратко>" # опционально; ссылка на раздел ADAPT при наличии
# === Граф связей (ведётся носителем) ===
children: [] # auto: SR со ссылкой parent.id = этот BR
implemented-by: [] # auto: BR подсистем, ссылающиеся через implements[]
verified-by: [] # auto: TC, верифицирующие через SR
# === Происхождение от ИИ (обязательно на RENAR-4+; схема — §4.10.1) ===
ai-provenance:
generated-by: "<vendor>-<model>@<дата>"
generated-at: "<ISO-8601>"
human-edits: boolean
# === Замена (обязательно, если применимо) ===
replaces: "<old-id>"
replaced-by: "<new-id>"
deprecated-date: "<ISO-дата>"
---
## Потребность
Кто (роль), что (действие), зачем (бизнес-цель) — одно предложение.
## Критерии успеха
1. <Измеримый результат, поддающийся независимой проверке.>
2. <…> (всего 3–7 пунктов.)
## Контекст
Откуда взялось требование (со ссылкой на раздел ADAPT при наличии); какие
альтернативы рассматривались.
## Ограничения
<Опционально: бизнес-ограничения — бюджет, сроки, регуляторика. Технические
ограничения здесь не место — для них существуют типы SPEC и SR.>
Поле source.tz-section присутствует всегда; source.adapt опускается, когда состязательный обзор вынес вердикт «нет находок» — тогда обязателен source.adversarial-review-ref (§7.4.1).
Где в BR «требования». В шаблоне BR намеренно нет раздела с формулировками вида «система должна …»: в RENAR такие формулировки — это SR (§6.6), производные от данного BR. Смешение их с BR размывает границу «бизнес-потребность ↔ требование к системе» и порождает «технические BR», неотличимые от SR (§6.4, §6.5.1). Проверяемое, перечислимое содержание самого BR несёт раздел «Критерии успеха»: 3–7 измеримых, независимо проверяемых результатов — это и есть бизнес-требования в проверяемой форме. Декомпозиция BR → SR превращает каждый критерий в одно или несколько нормативных SR (форма «система должна …» по §6.6.3).
12.3 Шаблон SR¶
SR фиксирует, что делает система (наблюдаемое поведение и ограничения); имена таблиц, фреймворков и структур данных — ответственность SPEC (§6.6.1). Frontmatter — по §6.6.2; тело — по §6.6.3.
---
id: SR-NN # неизменяемый
title: "<краткое описательное название>"
type: SR
slug: "<kebab-case>"
# === Scope (обязательно) ===
level: system | subsystem | module
scope:
system: "<system-id>"
subsystem: "<subsystem-id>" # null, если level=system
module: "<module-id>" # null, если level ≠ module
# === Жизненный цикл (обязательно) ===
status: draft | approved | verified | deprecated
owner: "<роль / ответственное лицо>"
# === Родитель (обязательно) ===
parent:
id: BR-NN # единственный родитель
# === Источник: происхождение (см. §7.4.1; правила те же, что у BR) ===
source:
tz-section: "§N.N" # обязательно всегда
adapt: ADAPT-NNN # conditional
adapt-section: "Forward §N" # обязательно, если задано adapt
adversarial-review-ref: "<ссылка-носителя>" # обязательно, если adapt опущено
# === Граф связей ===
constrained-by: # типизированные рёбра к SPEC (глава 8)
- SPEC-UI-NN
- SPEC-API-NN
- SPEC-DATA-NN
children: [] # auto: TR со ссылкой parent.id = этот SR
verified-by: [] # auto: TC, верифицирующие SR
# === Происхождение от ИИ (обязательно на RENAR-4+) ===
ai-provenance:
generated-by: "<vendor>-<model>@<дата>"
human-edits: boolean
# === Замена (обязательно, если применимо) ===
replaces: "<old-id>"
replaced-by: "<new-id>"
deprecated-date: "<ISO-дата>"
---
## Требование
Одно предложение нормативной формы: «Система должна …» (модальность — по
конвенции §0.5).
## Поведение
Детальное описание наблюдаемого поведения; функциональные сценарии.
## Ограничения
<Обязательно, если применимо: нефункциональные ограничения — производительность,
безопасность. Полные ограничения выносятся в SPEC через constrained-by[].>
## Связь с SPEC
<Обязательно при наличии constrained-by[]: какие аспекты поведения нормированы
какими SPEC.>
parent.id — единственный BR (дерево родителей); constrained-by[] — граф ссылок на SPEC любого типа и в любом числе (§6.6.2).
12.4 Шаблон TR¶
TR — атомарная единица работы исполнителя: что именно реализовать в рамках одного SR (§6.7.1). Frontmatter — по §6.7.2; тело — по §6.7.3.
---
id: TR-NN # неизменяемый
title: "<краткое описательное название>"
type: TR
slug: "<kebab-case>"
# === Scope (обязательно) ===
level: system | subsystem | module # system — редко, кросс-подсистемные задачи
scope:
system: "<system-id>"
subsystem: "<subsystem-id>" # null, если level=system
module: "<module-id>" # null, если level ≠ module
# === Жизненный цикл (обязательно) ===
status: draft | approved | done | obsolete
owner: "<роль исполнителя / агент>"
# === Родитель (обязательно) ===
parent:
id: SR-NN # единственный родитель
# === Источник: цепочка прослеживаемости (наследуется от parent SR, §6.7.5) ===
source:
adapt: ADAPT-NNN # auto: наследуется от parent SR; может отсутствовать
sr-version: "<version-ref>" # фиксация к версии SR (возможность носителя V5)
# === Граф связей ===
implements-spec: # типизированные рёбра к SPEC
- SPEC-API-NN
- SPEC-UI-NN
verified-by: [] # auto: TC, верифицирующие через SR
# === Цель и критерии приёмки ===
goal: "<результат в одном предложении>"
acceptance-criteria:
- "<нумеруемое, опровержимое, без двусмысленности>"
- "<…>"
# === Происхождение от ИИ (обязательно на RENAR-4+) ===
ai-provenance:
generated-by: "<vendor>-<model>@<дата>"
human-edits: boolean
---
## Goal
Один параграф; результат, который TR делает наблюдаемым.
## Acceptance Criteria
1. <Опровержимый критерий; покрывает положительный сценарий.>
2. <Опровержимый критерий; покрывает отрицательный сценарий / границу.>
## Scope
Что входит и что **не** входит в TR (соответствует SENAR Rule 2).
## Ссылки
<Обязательно, если применимо: на SPEC из implements-spec[] и разделы
родительского SR.>
Имена секций Goal, Acceptance Criteria, Scope — канонические по §6.7.3. Исполнитель TR работает в рамках SR / SPEC и к ADAPT напрямую не обращается (§6.7.5).
12.5 Шаблон TC¶
TC верифицирует нормативное утверждение BR / SR / SPEC; общий frontmatter — по §9.3, тело — по §9.4. Type-specific поля (judge, baseline для ux / eval) добавляются поверх по §9.6.
---
# === Идентичность (обязательно) ===
id: TC-NN # неизменяемый; NN — порядковый в рамках scope
title: "<краткое описательное название>"
type: TC
slug: "<kebab-case>"
# === Классификация (обязательно) ===
tc-type: acceptance | ux | system | contract | eval | security
negative: boolean # true для парного негативного TC
# === Scope (обязательно) ===
level: system | subsystem | module
scope:
system: "<system-id>"
subsystem: "<subsystem-id>" # null, если level=system
module: "<module-id>" # null, если level ≠ module
# === Жизненный цикл (обязательно) ===
status: draft | ready | passing | failing | obsolete
# === Цель верификации (обязательно; хотя бы одна) ===
verifies:
- id: SR-NN | BR-NN | SPEC-<TYPE>-NN
requirement-version: "<version-ref>" # фиксация версии артефакта (V5)
# === Парная связь (обязательно, если negative=false и парный существует) ===
paired-with:
- TC-NN
# === Автоматизация (обязательно) ===
automation:
status: automated | manual-pending
location: "<ссылка-носителя на реализацию>" # обязательно, если automated
manual-pending-until: "<ISO-дата>" # обязательно, если manual-pending
manual-pending-reason: "<текст>" # обязательно, если manual-pending
# === Прогон (обязательно для tc-type: ux | eval) ===
judge:
vendor: "<provider>" # обязательно; изоляция судьи — P7
model: "<model-id>"
baseline: # обязательно для ux | eval
artifact: "<ссылка-носителя>"
perceptual-diff-threshold: float # для ux
metric-thresholds: {} # для eval
# === Последний прогон (ведёт runner; автор не заполняет) ===
last-run: # auto
date: "<ISO-datetime>"
result: pass | fail | skipped | n/a
runner-id: "<runner-name@version>"
# === Происхождение от ИИ (обязательно на RENAR-4+) ===
ai-provenance:
generated-by: "<vendor>-<model>@<дата>"
human-edits: boolean
---
## Контекст
На какой пункт верифицируемого артефакта ссылается TC; цитата или пересказ
утверждения.
## Предусловия
Состояние системы и данных, требуемое для прогона; обеспечивается
seed-механизмом.
## Шаги
Действия runner. Для tc-type: ux — намерения, не селекторы (§9.6.1).
## Pass-критерий
Бинарный, наблюдаемый, воспроизводимый (§9.11).
## Fail-критерий
Перечень наблюдаемых признаков нарушения (не отрицание Pass-критерия): утечки,
side-effects, состояния гонки.
## Постусловия
Какое состояние ожидается после прогона; cleanup-механизм.
## Out of scope
Что **намеренно** не проверяется, с указанием парного TC, где это покрыто.
Заголовки ## Pass-критерий и ## Fail-критерий фиксированы: их детектирует хук контроля смены критериев (§10.11.3) — локально переименовывать нельзя. Раздел «Out of scope» обязателен: его отсутствие блокирует переход TC в ready (§9.4).
12.6 SPEC-шаблоны — отложены¶
Заготовки для типов SPEC (глава 8) в это приложение намеренно не включены. Партнёрское ревью отметило вопрос SPEC-заготовок как открытый: набор обязательных полей у SPEC-типов (UI, API, DATA, AI, SEC, INT) различается сильнее, чем у BR / SR / TR / TC, и преждевременная фиксация заготовки рискует прочитаться как нормативная.
Черновые наброски SPEC-заготовок ведутся в репозитории — research/17-specification-schema-and-templates.md (§5; внутренний черновик, на сайт не публикуется) — до отдельного решения. Когда решение будет принято, SPEC-заготовки добавляются сюда новым разделом — без изменения закрытого списка типов SPEC, который уже нормирован в standard/08 §8.2.2 и §8.3.
12.7 Заполнение плейсхолдеров и частые ошибки¶
| Плейсхолдер | Чем заменить | Частая ошибка |
|---|---|---|
BR-NN / SR-NN / TR-NN / TC-NN |
Порядковый ID в рамках scope (носитель присваивает при создании) | Менять ID после публикации — он неизменяемый |
<system-id> / <subsystem-id> / <module-id> |
Идентификаторы из реестра систем проекта | Заполнять subsystem, когда level=system (должен быть null) |
source.tz-section |
Раздел исходного TZ — присутствует всегда | Опускать его, полагая, что хватит ссылки на ADAPT |
constrained-by[] / implements-spec[] |
ID существующих SPEC | Указывать тип SPEC вне закрытого списка |
Поля # auto (children, verified-by, last-run) |
Ничего — их ведёт носитель / runner | Заполнять вручную и расходиться с графом связей |
Плейсхолдеры вида BR-NN и пустые <...> — это незаполненная заготовка, а не валидный артефакт: пропускайте такие файлы через проверки только после подстановки реальных значений, иначе валидаторы носителя справедливо отклонят шаблонные ID.