# Правила и условия формирования кадров эпизодической памяти (ЭП)

## 1. Общая схема эпизодической памяти

ЭП — массив кадров в строгой исторической последовательности. Порядок не перемешивается; допускаются только изменение и удаление без нарушения порядка.

Правило (кадр эпизода):
Стимул (образ FinalImage) → ответное действие (образ действия, ОД) → эффект (Effect) → ответный стимул оператора (при наличии).

Содержимое кадра:

- `perceptionNodeId` — ID конечной ветки дерева восприятия (условия);
- `stimulusImageId` — ID образа стимулов (FinalImage), вызвавшего реакцию;
- `actionImageId` — ID образа ответного действия (ОД);
- `effect` — разность `getDiffImportance()` «после» минус «до» (до активации стимула);
- `responseStimulusImageId` — ID образа ответного стимула оператора (если появился в период ожидания).

Ответное действие + ответный стимул образуют «учительское» правило: как оператор отвечает на действие Beast.

Время ожидания ответа — `response_waiting_period` в пульсах (по умолчанию 15). Закрытие по таймауту в `EpisodicMemory_onPulse`. Кадры с незаполненным `effect` остаются на оптимизацию.

## 2. Условия запуска формирования кадра ЭП

Формирование кадра ЭП запускается только через ориентировочный рефлекс (ОР). Кадр создаётся когда: ОР сработал, выполнены условия ОР (порог OR_well_known и др.), не идёт период ожидания (иначе стимул трактуется как ответный). Вызов `save_episodic_memory` выполняется из ОР; кадр и прогресс-бар создаются при каждом таком срабатывании ОР (не только в тестовом режиме).

## 3. Жизненный цикл кадра

1. Создание (при срабатывании ОР):

   - Закрывается предыдущий незакрытый кадр (если есть и не истёк период ожидания — текущий стимул записывается как ответный; иначе кадр закрывается без ответного стимула).
   - В массив ЭП добавляется «пустой» кадр: заданы `perceptionNodeId`, `stimulusImageId`, `diffBefore` (значение `getDiffImportance()` до активации стимула, из `PrevDiffForEpisode`), `actionImageId = null`, `effect = null`, `responseStimulusImageId = null`.
   - Устанавливаются счётчик пульсов и `EpisodicMemory_waitingStartedAt`; закрытие по пульсам в `EpisodicMemory_onPulse`. Прогресс-бар виден только при активном ожидании в этой сессии.

2. Заполнение ответным действием:
   Когда Beast выполняет реакцию (генетическую или условную), в последний кадр записывается `actionImageId` (образ действия) через `EpisodicMemory_setLastFrameActionFromActionId(actionId)`. Используется `stimulusImageId` уже записанный в кадре (чтобы кадр заполнялся и при отложенной реакции или снятых стимулах).

3. Завершение кадра:

   - Ответный стимул в период ожидания: ОР сначала проверяет `isInWaitingPeriod()`. Если истинно — стимул считается ответом оператора, вызывается `closeLastFrameWithResponse(winnerId)`. Порог OR_well_known для ответного стимула не проверяется.
   - Истечение периода без ответного стимула: в `EpisodicMemory_onPulse` кадр закрывается. Если `actionImageId === null`, кадр удаляется; иначе остаётся с вычисленным `effect`.

Во время периода ожидания любой стимул трактуется только как ответ оператора (без проверки samplesCount).

## 4. Ориентировочный рефлекс (ОР) и условия для ЭП

Порядок проверок: (1) Нет активных стимулов — выход без сообщения (деактивация). (2) Нет ветки / нет победителя — выход. (3) Регистрация в СЗ. (4) Сначала `isInWaitingPeriod()` — если true, закрытие кадра с ответом, порог OR_well_known не применяется. (5) Затем проверка `samplesCount >= OR_well_known` для начала нового процесса. (6) Иначе — `save_episodic_memory`, кадр и прогресс-бар создаются всегда. Период ожидания только при `waitingStartedAt != null` (загруженный незакрытый кадр не даёт «в ожидании»).

## 5. Режим тестирования формирования ЭП

Включается кнопкой «т» в блоке «Активная ветка дерева восприятия». Флаг: `global.EpisodicMemory_testMode`.

В тестовом режиме:

- При деактивации (нет активных стимулов) сообщение не показывается.
- При отказе в создании нового кадра (когда период ожидания не активен) выводятся причины; ответный стимул в период ожидания не проверяется на OR_well_known.
  - нет функций дерева или образов; не найдена ветка; не выявлен победитель; слабый опыт (samplesCount < OR_well_known) — только для начала нового процесса.
- При начале формирования кадра — «Начат процесс формирования кадра ЭП. Стимул: (детализация). Ожидание ответа или реакции.»
- При фиксации ответного действия (реакция Beast) — «Активирован образ стимула: (детализация). Вызвавшая реакция: (детализация). Период ожидания ответа начат.»
- При появлении ответного стимула в период ожидания — «Стимул в периоде ожидания: (детализация). Кадр эпизода завершен и записан.»
- При истечении периода без реакции — кадр удаляется и выводится: «На стимул (детализация) реакция не возникла. Эпизод памяти не формируется.»

В тестовом режиме кадр ЭП создаётся и при наличии семантической значимости (`runEpisodic = !hasSignificance || EpisodicMemory_testMode`), чтобы можно было пошагово наблюдать процесс.

## 6. Условные рефлексы в контексте ориентировочного рефлекса

Правило: если стимул привлёк ориентировочный рефлекс, по нему не запускается процесс образования условного рефлекса.

Механизм:

1. ОР при срабатывании блокирует выполнение генетического (или условного) рефлекса на 2 пульса (`OR_BLOCK_PULSES`). Рефлекс не выполняется сразу, а помещается в очередь отложенных рефлексов (`delayedReflexes`).
2. При постановке в очередь и при последующем выполнении отложенного рефлекса в событие записывается флаг `noConditionalReflex: true`.
3. Когда отложенный рефлекс выполняется, в `startAction` передаётся опция `noConditionalReflex: true`. При этой опции не вызывается `synonyms_onGeneticActionFired` — подсистема условных (синонимических) рефлексов не получает сигнал для формирования или усиления условного рефлекса по данному стимулу.

Таким образом, стимул, который привлёк ОР (т.е. по которому рефлекс был задержан), не участвует в образовании условного рефлекса; условные рефлексы формируются только по стимулам, по которым рефлекс сработал без блокировки ОР.

## 7. Сводка ключевых констант и флагов

Параметр | Описание | Значение по умолчанию
--- | --- | ---
`response_waiting_period` | Длительность периода ожидания ответа (в пульсах) | 15
`OR_well_known` | Порог для начала нового процесса ОР/ЭП (не для ответного стимула) | 10
`EpisodicMemory_testMode` | Режим пошаговых сообщений по формированию ЭП | false
`OR_BLOCK_PULSES` | Число пульсов блокировки рефлекса после ОР | 2

Файлы реализации: `_10_Episodic_memory/episodic_memory.js`, `_8_Hippocampus/orientation_reflex.js`, `_5_Genetic__reflexes/genetic_reflexes_engine.js`.