# Журнал изменений спецификации Ktav

**Languages:** [English](CHANGELOG.md) · **Русский** · [简体中文](CHANGELOG.zh.md)

История спецификации формата по всем версиям. Формат хранится в этом
репозитории в каталоге [`versions/`](versions/); каждая версия —
самодостаточная директория с собственным `spec.md` и `tests/`.

Версии следуют схеме `MAJOR.MINOR.PATCH`:

- `PATCH` — редакторские правки (исправление опечаток, уточнения).
- `MINOR` — обратно совместимые расширения.
- `MAJOR` — несовместимые изменения.

Текущие указатели `stable` и `latest` — в [`README.md`](README.ru.md)
репозитория; машиночитаемый индекс — в [`versions.ktav`](versions.ktav).

## [0.1.0] — 2026-04-22

Первый выпуск спецификации. Определяет лексическую структуру,
грамматику, семантику, категории ошибок, требования соответствия и
соображения безопасности для Ktav 0.1.0.

### Формат вкратце

- Неявный Object верхнего уровня.
- Пары `key: value`; точечные ключи (`a.b.c: 1`) разворачиваются во
  вложенные Object-ы.
- `key:: value` принудительно задаёт литеральную String.
- Типовые скалярные маркеры `:i` (Integer) и `:f` (Float) — как в
  pair-позиции, так и в качестве префиксов array-item.
- Value-типы Integer и Float — числовые строки, сохраняющие
  текстовую форму для round-trip и произвольной точности.
- Ключевые слова `null`, `true`, `false` (только нижний регистр).
- Многострочные составные значения `{ ... }` и `[ ... ]` с закрывающей
  скобкой на отдельной строке; пустые `{}` / `[]` — инлайн.
- Многострочные строки `( ... )` (со снятием общего отступа) и
  `(( ... ))` (побайтово).
- `:: value` — префикс элемента массива для литеральной String внутри
  массивов; `:i value` / `:f value` — для элементов Integer / Float.
- **Обязательный пробел после разделителя** (§ 5.3 / § 5.4): каждый
  разделитель пары (`:`, `::`, `:i`, `:f`) и каждый маркер элемента
  массива (`::`, `:i`, `:f`) должен сопровождаться хотя бы одним
  ASCII-пробельным байтом **либо** концом строки. Склеенные формы —
  разделитель приклеен к body без пробела — являются ошибкой
  `MissingSeparatorSpace` (§ 6.10); примеры ошибочных документов:
  `key:value`, `port:i42`, `ratio:f0.5`. Пустое значение в виде
  `key:` или `key::` (EOL сразу за разделителем) допустимо.
- `#` в начале строки — комментарий; инлайн-комментарии не
  поддерживаются.

### Категории ошибок (§ 6)

`UnbalancedBracket`, `MismatchedBracket`, `DuplicateName`,
`PathConflict`, `InvalidKey`, `EmptyKey`, `OrphanLine`,
`InlineNonEmptyCompound`, `InvalidTypedScalar`, `MissingSeparatorSpace`.

Каталог: [`versions/0.1/`](versions/0.1/).
