suite check: закрыты пробелы в проверках шапки, иерархии и словаря

- документ без темы: ошибка, если такой не один или если он несёт ключи слоя —
  иначе конвенция, потерявшая topic, молча лишалась всех проверок распространения
- иерархия заголовков: один заголовок первого уровня, без перескоков через уровень
- имя темы: латиница и пригодность для имени файла — ошибкой, kebab-case —
  предупреждением
- сценарные связки чужого словаря ловятся в начале строки, где их ставит
  сценарный блок, а не в середине фразы, где это чаще SQL
This commit is contained in:
av
2026-07-27 10:16:15 +03:00
parent b2d07ae55d
commit 51d2050200
5 changed files with 230 additions and 0 deletions
+21
View File
@@ -222,6 +222,27 @@ func TestNoFalsePositives(t *testing.T) {
f["conventions/arch/time.md"] = archTime +
"\n### TIME-2. Ширина строки фиксируется\n\n**СНЯТО 2026-07-26.** Правило переехало в GTIM-1.\n"
},
}, {
name: "a scenario block in the suite's own vocabulary",
setup: func(f files) {
f["conventions/arch/time.md"] = archTime +
"\n## Стык правил\n\nКОГДА зависимость недоступна И ретраи исчерпаны\nТОГДА запись делается один раз (TIME-1)\n"
},
}, {
name: "an uppercase SQL connective mid-sentence outside a fence",
setup: func(f files) {
f["conventions/arch/time.md"] = strings.Replace(archTime,
"**ПОЧЕМУ.** Без явного смещения не видно, в какой зоне запись сделана.",
"**ПОЧЕМУ.** Условие `WHERE a AND b OR c` сортировку не спасает.", 1)
},
}, {
name: "the single document without a topic is the one the suite governs itself by",
setup: func(f files) {
f["suite.toml"] = strings.Replace(layeredManifest,
`SLOG = "conventions/arch/logging.md"`,
`SLOG = "conventions/arch/logging.md"`+"\nMETA = \"GUIDE.md\"", 1)
f["GUIDE.md"] = "---\nprefix: META\n---\n\n# Как мы ведём конвенции\n\n" + versionLine + "\n"
},
}}
for _, tc := range cases {