---
name: skill-learning
description: MUST use AFTER цикла работы с ≥2 итерациями (написал → ошибка → исправил → успех). Provides процедуру ретроспективы и формат записи приём/антиприём в references/learned-patterns.md или {project}/.context/learned-patterns.md.
installable: true
alwaysApply: false
---

# Накопление знаний (Skill Learning) — процедура

> Тело вынесено из правила `skill-learning-policy`. Триггер «после цикла ≥2 итераций» остаётся в правиле; здесь — процедура ретроспективы, формат записи и критерий выбора уровня/файла.

> Агент учится на своих итерациях: что работает (приёмы) и что ломается (антиприёмы).
> Знания записываются в `references/learned-patterns.md` навыка-владельца.

## Два уровня знаний

| Уровень | Файл | Что хранит |
|---------|------|------------|
| Универсальный | `skill/references/learned-patterns.md` | Приёмы, работающие в любой конфигурации 1С |
| Проектный | `{project}/.context/learned-patterns.md` | Приёмы, привязанные к конкретной конфигурации / проекту |

**Критерий разделения:** если запись упоминает конкретный объект метаданных, имя формы, реквизит
или особенность конфигурации → проектный. Если описывает общий паттерн платформы/фреймворка → универсальный.

## Использование накопленных знаний

Триггер чтения («перед работой с навыком — прочитать его уроки») — в правиле `skill-learning-policy` (always-on). Здесь — раскладка по уровням:

- `references/learned-patterns.md` в каталоге навыка — универсальные приёмы;
- `{project}/.context/learned-patterns.md` — проектные приёмы.

Применяй `confirmed`-записи как дополнительные правила, `candidate` — как подсказки.

## Когда запускать

После завершения цикла работы, в котором было **≥2 итерации** (написал → ошибка → исправил → успех).
Если задача решена с первой попытки — ретроспектива не нужна.

## Процедура

1. **Восстановить цепочку итераций** — что сделал → что упало → корневая причина → как исправил → что прошло.

2. **Абстрагировать до класса.** Назвать КЛАСС ошибки на уровень выше инцидента, не сам инцидент:
   - плохо (инстанс): «упал `биг_Модуль.Метод:142` из-за пустого `ИдентификаторСтроки`»;
   - хорошо (класс): «обращение к полю набора записей без проверки заполненности перед записью».

   Анти-рецепт формулируется как обобщённый запрет/проверка, переносимый на ещё не встреченные частные случаи. Конкретные `file:line` идут в поле `источник`, НЕ в тело приёма/антиприёма.

3. **Тест абстракции.** Спросить: «к какой ещё ситуации, кроме породившей, применим этот анти-рецепт?». Нет ответа → это инстанс, не класс: переформулировать выше или отклонить запись.

4. **Сформулировать запись** (приём и антиприём — **одна запись**, две стороны одного открытия):

```
status: candidate | confirmed
класс: <именованный класс ошибки>
приём: <обобщённое правило — что делать, проверено успехом>
антиприём: <обобщённый запрет — что НЕ делать, проверено падением>
почему: <что происходит при нарушении>
шаги: <конкретные шаги/код, если применимо>
источник: <задача, итерация, file:line-пример>
```

5. **Отфильтровать** — НЕ урок:
   - опечатки и случайные синтаксические ошибки;
   - разовые сбои окружения без воспроизводимого класса;
   - инцидент, не прошедший тест абстракции (инстанс без класса).

6. **Определить уровень и навык-владелец:**
   - упоминает конкретный объект метаданных / конфигурацию → **проектный** → `{project}/.context/learned-patterns.md` (русский, без маппинга и синхронизации);
   - общий паттерн платформы / фреймворка → **универсальный** → `references/learned-patterns.md` навыка-владельца в **RU-источнике фреймворка**;
   - навык-владелец — тот, к которому относится класс по содержанию.

7. **Найти RU-каталог универсального урока** (по навыку `skill-editing-from-project`):
   `.install-session.json` → `component_map` → `skill/{имя-навыка-владельца}` → `ru_path` → его каталог → `references/learned-patterns.md`. Писать в `framework/` (RU), НЕ в установленный ENG-симлинк `framework_eng/` — он перезапишется синхронизацией.

8. **Сверка-каскад** (перед записью прочитать целевой файл):
   - аналогичный класс уже есть → НЕ дублировать; актуализировать существующую запись (расширить границы анти-рецепта, дописать источник), исход = `refined`;
   - есть `candidate` с тем же классом → повысить до `confirmed`, исход = `refined`;
   - класса нет → новая запись `candidate`, исход = `new`.

9. **Дописать** (append) в целевой файл; если файла нет — создать; существующие записи не перезаписывать. Для универсального урока после записи — **синхронизировать ENG-зеркало** через `sync_script` из `.install-session.json` (см. `skill-editing-from-project`).

## MUST

| Требование | Описание |
|------------|----------|
| Уровень выше инцидента | Запись про КЛАСС ошибки + анти-рецепт, не про конкретный инцидент; тест абстракции обязателен |
| Не менять тело навыка | Записи — только в `references/learned-patterns.md`, не в `SKILL.md` |
| Сверка-актуализация | Перед записью прочитать целевой файл; дубль не заводить, существующий класс актуализировать; исход `matched`/`refined`/`new` |
| RU-источник для универсального | Универсальный урок писать в `framework/` (RU) каталог навыка-владельца через `skill-editing-from-project`, НЕ в `framework_eng/`; после записи — синхронизация в ENG |
| Первый случай = candidate | Единичный случай получает `status: candidate` |
| Повторение = confirmed | При повторении аналогичной ситуации повысить до `confirmed` |

---
depends_on:
  - framework/skills/framework-meta/skill-editing-from-project/SKILL.md
---
