docs(mxl): убрать из спеки результаты исследования, привести правила в порядок

Продолжение чистки после перечитывания глазами модели, которая применяет навык.

- из раздела ограничений убраны доли по корпусу ERP. Это результат исследования, а не
  то, что помогает применять навык: модель работает с конкретным макетом, а не с
  популяцией, и числа стареют. Перечень того, что теряется при round-trip, остался
  списком; замеры живут в материалах кампании;

- фраза про ошибки короткой формы была вырвана из контекста: шла после списка
  ограничений, начиналась с символа в кавычках, и до самого конца было непонятно, что
  речь про отказ. Плюс в один ряд попало разнородное — три случая про сам шорткат и
  переполнение columns, которое к короткой форме не привязано. Переписано правилами:
  маркеру нужно, что продолжать; объектный элемент не несёт col; элементов не больше
  columns. Поведение при нарушении — одной фразой в конце;

- в SKILL.md ключевые правила шли вперемешку по уровням (страница, ячейка, строка,
  ячейка, область). Пересобраны сверху вниз: документ → область → строка → ячейка;

- буллет про namedAreas сокращён: обнаружимость ключа даёт карта структуры, а из
  правил там неочевидно только отсутствие ключа type.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-08-10 18:16:40 +03:00
co-authored by Claude Opus 5
parent e268fbd71f
commit 8cae947f4b
3 changed files with 33 additions and 41 deletions
+5 -5
View File
@@ -60,14 +60,14 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/mxl-compile.ps1" -J
Ключевые правила:
- `page` — формат страницы (`"A4-landscape"`, `"A4-portrait"` или число). Автоматически вычисляет `defaultWidth` из суммы пропорций `"Nx"`
- `col` — 1-based позиция колонки
- `name` у области в `areas` необязателен: область без имени — просто кусок сетки, именованной она не станет
- `namedAreas` — области, которые не описываются диапазоном подряд идущих строк: полоса колонок, прямоугольник, ячейка. Тип не указывается, он следует из того, какие оси заданы
- `rowStyle` — автозаполнение пустот стилем (рамки по всей ширине)
- Тип заполнения определяется автоматически: `param` → Parameter, `text` → Text, `template` → Template
- `rowspan` — объединение строк вниз (rowStyle учитывает занятые ячейки)
- `empty` в строке — шорткат для N подряд пустых строк (`{ "empty": 3 }` = три `{}`)
- `name` у области в `areas` необязателен: область без имени — просто кусок сетки, в макет как именованная она не попадёт
- `namedAreas` — области, которые не описываются диапазоном подряд идущих строк (полоса колонок, прямоугольник, ячейка). Тип не указывается: только `rows` → полоса строк, только `cols` → полоса колонок, обе оси → прямоугольник
- Строку можно писать массивом ячеек — позиция из порядка, `col` не нужен: `"текст"`, `"{Имя}"` — параметр, `">"` — продолжить ячейку слева, `"|"` — сверху, `null` — пропуск колонки
- `col` — 1-based позиция колонки
- `rowspan` — объединение строк вниз (rowStyle учитывает занятые ячейки)
- Тип заполнения определяется автоматически: `param` → Parameter, `text` → Text, `template` → Template
Двухуровневая шапка массивами:
```json
@@ -178,7 +178,7 @@
- не выразить текст, совпадающий с `">"`, `"|"` или с шаблоном `"{...}"`;
- `"|"` продолжает ячейку из предыдущей строки, только если её позиция известна явно (`col` задан или строка записана массивом).
`">"` без ячейки слева, `"|"` без ячейки сверху, объектный элемент с `col`, элементов больше `columns` → ненулевой код выхода и сообщение в stderr.
Маркеру нужно, что продолжать: `">"` требует ячейку слева в той же строке, `"|"` ячейку сверху. Объектный элемент не должен нести `col`: позиция уже задана порядком. Число элементов не может превышать `columns`. Нарушение любого из этих правил → ненулевой код выхода и сообщение в stderr.
## Ячейки (`cells[]`)
@@ -211,22 +211,18 @@
DSL описывает не все конструкции табличного документа. Перечисленное ниже **теряется при
round-trip** (`/mxl-decompile``/mxl-compile`): в JSON оно не попадает, в сгенерированный
XML не возвращается. Доля — по корпусу типовой ERP 8.3.24 (10 924 макета), где измерялась.
XML не возвращается.
| Конструкция | Доля макетов |
|-------------|--------------|
| Ячейки-поля ввода (`containsValue` / `valueType` / `controlType`) | 53% |
| Несколько наборов колонок (`columnsID`) — свои ширины у группы строк | 63% |
| Объединения, не привязанные к ячейке (по всей высоте или ширине) | 16% |
| Рисунки и картинки (в т.ч. штрихкоды) | 2% |
| Цвет текста, цвет фона ячейки, скрытые строки/колонки, отступ | — |
| Рамка с разным стилем у разных сторон; стили линий кроме сплошной | — |
| Группировки строк и колонок | — |
| Колонтитулы, параметры печати, область печати | — |
- ячейки-поля ввода (`containsValue` / `valueType` / `controlType`);
- несколько наборов колонок (`columnsID`) — свои ширины у группы строк;
- объединения, не привязанные к ячейке (по всей высоте или ширине документа);
- рисунки и картинки, в том числе штрихкоды;
- цвет текста, цвет фона ячейки, скрытые строки и колонки, отступ;
- рамка с разным стилем у разных сторон; стили линий кроме сплошной;
- группировки строк и колонок;
- колонтитулы, параметры печати, область печати;
- многоязычные надписи: при разборе берётся первый вариант текста, при генерации язык
всегда `ru`, остальные теряются.
**Многоязычные надписи не поддерживаются:** при разборе берётся первый вариант текста,
при генерации язык всегда `ru`. Для двуязычных макетов (в ERP это почти весь корпус)
надписи на остальных языках теряются.
Отдельно: пересборка макета из DSL — это полная перегенерация, а не точечная правка XML,
поэтому diff после round-trip обычно шире фактической доработки.
Пересборка макета из DSL — это полная перегенерация, а не точечная правка XML, поэтому
diff после round-trip обычно шире фактической доработки.
+14 -18
View File
@@ -178,7 +178,7 @@
- не выразить текст, совпадающий с `">"`, `"|"` или с шаблоном `"{...}"`;
- `"|"` продолжает ячейку из предыдущей строки, только если её позиция известна явно (`col` задан или строка записана массивом).
`">"` без ячейки слева, `"|"` без ячейки сверху, объектный элемент с `col`, элементов больше `columns` → ненулевой код выхода и сообщение в stderr.
Маркеру нужно, что продолжать: `">"` требует ячейку слева в той же строке, `"|"` ячейку сверху. Объектный элемент не должен нести `col`: позиция уже задана порядком. Число элементов не может превышать `columns`. Нарушение любого из этих правил → ненулевой код выхода и сообщение в stderr.
## Ячейки (`cells[]`)
@@ -211,22 +211,18 @@
DSL описывает не все конструкции табличного документа. Перечисленное ниже **теряется при
round-trip** (`/mxl-decompile``/mxl-compile`): в JSON оно не попадает, в сгенерированный
XML не возвращается. Доля — по корпусу типовой ERP 8.3.24 (10 924 макета), где измерялась.
XML не возвращается.
| Конструкция | Доля макетов |
|-------------|--------------|
| Ячейки-поля ввода (`containsValue` / `valueType` / `controlType`) | 53% |
| Несколько наборов колонок (`columnsID`) — свои ширины у группы строк | 63% |
| Объединения, не привязанные к ячейке (по всей высоте или ширине) | 16% |
| Рисунки и картинки (в т.ч. штрихкоды) | 2% |
| Цвет текста, цвет фона ячейки, скрытые строки/колонки, отступ | — |
| Рамка с разным стилем у разных сторон; стили линий кроме сплошной | — |
| Группировки строк и колонок | — |
| Колонтитулы, параметры печати, область печати | — |
- ячейки-поля ввода (`containsValue` / `valueType` / `controlType`);
- несколько наборов колонок (`columnsID`) — свои ширины у группы строк;
- объединения, не привязанные к ячейке (по всей высоте или ширине документа);
- рисунки и картинки, в том числе штрихкоды;
- цвет текста, цвет фона ячейки, скрытые строки и колонки, отступ;
- рамка с разным стилем у разных сторон; стили линий кроме сплошной;
- группировки строк и колонок;
- колонтитулы, параметры печати, область печати;
- многоязычные надписи: при разборе берётся первый вариант текста, при генерации язык
всегда `ru`, остальные теряются.
**Многоязычные надписи не поддерживаются:** при разборе берётся первый вариант текста,
при генерации язык всегда `ru`. Для двуязычных макетов (в ERP это почти весь корпус)
надписи на остальных языках теряются.
Отдельно: пересборка макета из DSL — это полная перегенерация, а не точечная правка XML,
поэтому diff после round-trip обычно шире фактической доработки.
Пересборка макета из DSL — это полная перегенерация, а не точечная правка XML, поэтому
diff после round-trip обычно шире фактической доработки.