# Анализ системы адаптивности: УР — ОР — СЗ — ЭП

Оценка взаимной функциональности, непротиворечивости, логичности и эффективности цепочки: **условные рефлексы (УР)** — **ориентировочный рефлекс (ОР)** — **семантическая память (СЗ)** — **эпизодическая память (ЭП)**.

---

## 1. Взаимная функциональность

### 1.1 Поток данных

- **Стимул (клик)** → обновление `Active*Stimuls` → `setTimeout(ОР, 0)` → в следующем тике вызывается ОР.
- **ОР** использует: дерево восприятия (путь), СЗ (значимость/новизна), порог `OR_well_known`; при прохождении условий — блокировка рефлекса на 2 пульса, гиппокамп, осознание, **регистрация в СЗ** (один раз за активацию), **создание/закрытие кадра ЭП**.
- **Пульс** → `processGeneticReflexes`: сначала `tryRunSynonymReflexes` (УР), при совпадении — `runGeneticActionFromSynonymReflex` (с проверкой блокировки ОР); иначе генетические карты; при блокировке ОР рефлекс уходит в `delayedReflexes` с `noConditionalReflex: true`.
- **СЗ** ключи: `(BadNormWell, emotionId, finalImageId)`. Регистрация только из ОР — один вызов `registerSemanticSample` на активацию, двойной учёт исключён.
- **ЭП**: кадр создаётся в ОР при каждом срабатывании ОР (после прохождения OR_well_known); ответный стимул в период ожидания не проверяется на порог известности; период ожидания только при `waitingStartedAt != null` (загруженный незакрытый кадр не даёт «в ожидании»); прогресс-бар виден только при активном ожидании в этой сессии; деактивация стимулов — без сообщения. Действие в кадр пишется из `startAction` через `EpisodicMemory_setLastFrameActionFromActionId`; закрытие по ответному стимулу — при активации в период ожидания (проверка isInWaitingPeriod() до проверки OR_well_known); по таймауту — в `EpisodicMemory_onPulse` по пульсам.

**Итог:** Роли разделены: ОР решает «что сейчас важнее» и запускает СЗ/ЭП; УР и генетические рефлексы исполняются на пульсе с учётом блокировки ОР; СЗ и ЭП не дублируют друг друга (СЗ — значимость образа, ЭП — последовательность правил).

### 1.2 Согласование контекста

- **УР:** контекст = `getCurrentContextKey()` → строка `"well:id1,id2,..."` по `BadNormWell` и ID из `BasicContextsActived`.
- **ОР, СЗ, ЭП:** контекст = `BadNormWell` + `Emotions_getOrCreateEmotionId(BasicContextsActived)` (тот же набор контекстов, другой вид — числовой id).
- Источник один и тот же (`BadNormWell`, `BasicContextsActived`), представления согласованы.

---

## 2. Непротиворечивость

### 2.1 Что согласовано

- **Блокировка по FinalImageId:** в ОР блок ставится по `winnerId` (FinalImageId); в `processGeneticReflexes` проверка по `fullFinalImageId`; в `runGeneticActionFromSynonymReflex` передаётся `finalImageId` — ключ один и тот же, блокировка для генетического и условного рефлекса согласована.
- **Один учёт семантики:** регистрация только в ОР; в `startAction` вызов `registerSemanticExperience` убран (заглушка), повторного увеличения `samplesCount` нет.
- **УР не создаётся при ОР:** при отложенном рефлексе в `delayedReflexes` передаётся `noConditionalReflex: true`, в `startAction` не вызывается `synonyms_onGeneticActionFired` — условный рефлекс по стимулу, вызвавшему ОР, не формируется.
- **Период ожидания ЭП:** во время него новый стимул только закрывает текущий кадр с ответом, новый кадр и новый ОР не создаются; счётчик пульсов и один обработчик `EpisodicMemory_onPulse` исключают гонки таймеров.

### 2.2 Возможные расхождения

- **Порог OR_well_known (10):** при `samplesCount < 10` ОР и кадр ЭП не создаются, но семантика уже регистрируется (вызов `registerSemanticSample` до проверки). Логика «сначала учёт, потом решение» выдержана, но сам порог 10 — эвристика; при ином значении поведение изменится (больше/меньше кадров ЭП и срабатываний ОР).
- **ЭП:** кадр и прогресс-бар создаются при каждом срабатывании ОР (после прохождения порога известности). Ответный стимул в период ожидания не проверяется на OR_well_known. Подробности — в about_episodic_memory.md и about_episodic_memory_rules.md.

---

## 3. Логичность

### 3.1 Последовательность решений

1. Активация стимула → ОР решает, есть ли «достаточно новое/значимое» и не идёт ли уже период ожидания ЭП.
2. Если период ожидания — закрытие кадра с ответным стимулом, без нового кадра и без нового ОР.
3. Если нет — регистрация в СЗ, при выполнении порога новизны/значимости — блокировка рефлекса, гиппокамп, осознание, при необходимости — создание кадра ЭП.
4. На пульсе: при блокировке ОР рефлекс откладывается без формирования УР; при срабатывании (сразу или после задержки) действие попадает в ОД и в последний кадр ЭП.

Цепочка «стимул → внимание (ОР) → память (СЗ/ЭП) → действие (ген/УР)» выдержана.

### 3.2 Смысловое разделение

- **СЗ:** «насколько значим этот образ в этих условиях» (well, emotionId, finalImageId) — усреднённая оценка, растёт с числом экспозиций.
- **ЭП:** «что за чем следовало и какой эффект» — правила вида стимул → действие → эффект/ответ, порядок важен.
- **УР:** «в этом контексте этот образ ведёт к этому действию» — быстрое срабатывание без пересчёта значимости.
- **ОР:** выбор «главного» стимула по новизне и значимости, порог «достаточно известного» отсекает шум.

Роли не пересекаются по смыслу.

---

## 4. Эффективность

### 4.1 Что сделано хорошо

- Поиск в СЗ по индексу `SemanticMemoryIndex[well][emotionId][finalImageId]` — O(1).
- Сбор кадров СЗ для одного `finalImageId` через обход индекса, без полного скана `SemanticMemory`.
- Один обработчик ожидания ЭП по пульсам, без нескольких таймеров.
- Регистрация семантики в одном месте (ОР), без дублирования.

### 4.2 Узкие места и затраты

- **ОР при каждом клике:** полный пересчёт актуальности по всем кандидатам и путям дерева. При большом числе активных стимулов и глубоком дереве стоимость растёт, но для текущего масштаба приемлемо.
- **УР:** линейный перебор `SynonymReflexes` при каждом пульсе. При росте числа условных рефлексов можно ввести индекс по контексту и/или по множеству стимулов (например, по ключу `activeIdsKey`).
- **ЭП:** массив кадров, добавление/закрытие в конец O(1); при очень длинной истории возможна пагинация или ограничение длины при сериализации.

---

## 5. Замечания и предложения

### 5.1 Документация и явность

- **Рекомендация:** В одном месте (например, `about_global_variables.md` или отдельный `docs/adaptivity_flow.md`) кратко описать порядок: клик → ОР (семантика, блокировка, ЭП) → пульс (УР, генрефлексы, отложенные с `noConditionalReflex`). Это упростит онбординг и отладку.
- **Рекомендация:** В коде ОР явно пометить комментарием, что `registerSemanticSample` вызывается осознанно один раз на активацию и не должен дублироваться в других модулях.

### 5.2 Пороги и константы

- **OR_well_known = 10**, **OR_HYSTERESIS**, **OR_BLOCK_PULSES = 2**, **response_waiting_period = 15** (пульсов) — вынесены, но разбросаны по файлам. **Предложение:** вынести в один конфиг (например, `beast/config/adaptivity.js` или секция в начале `orientation_reflex.js` и `episodic_memory.js`) с короткими комментариями, чтобы проще подбирать при калибровке.
- **Предложение:** Если позже появятся «режимы обучения» (агрессивный/экономный ЭП), условие создания кадра ЭП (`!hasSignificance || testMode`) оформить как функцию или флаг, чтобы не размазывать логику по условиям.

### 5.3 Контекст УР и эмоция

- УР использует строковый ключ контекста, СЗ/ОР — числовой `emotionId`. При смене реализации эмоций (объединение, нормализация) нужно синхронно проверить `getCurrentContextKey` и `Emotions_getOrCreateEmotionId`, чтобы одно и то же состояние окружения давало согласованные ключи. **Рекомендация:** при изменении формата эмоций пройтись по УР, ОР и СЗ в одном ревью.

### 5.4 ЭП и «известные» стимулы

- Сейчас кадр ЭП не создаётся при наличии значимости в СЗ (в не‑тестовом режиме). Если потребуется строить эпизоды и для известных стимулов (например, для анализа последовательностей), нужно будет расширить условие `runEpisodic` без нарушения однократной регистрации в СЗ.

### 5.5 Масштабирование УР

- При большом числе условных рефлексов поиск по массиву при каждом пульсе может стать заметным. **Предложение:** индекс по `contextKey` и/или по хэшу/ключу множества стимулов (`activeIdsKey`) для быстрого отбора кандидатов, с сохранением текущей семантики (контекст + множество стимулов).

### 5.6 Тестовый режим ЭП

- Режим `EpisodicMemory_testMode` даёт пошаговые сообщения и создаёт кадры даже при наличии значимости — полезно для отладки. Имеет смысл в документации явно указать, что в тестовом режиме поведение ЭП намеренно «расширено» (больше кадров и сообщений), чтобы не путать с продакшеном.

---

## 6. Краткий вывод

- **Взаимная функциональность:** ОР, СЗ, ЭП и УР согласованы по потоку (клик → ОР → семантика/блокировка/эпизод; пульс → УР/ген с учётом блокировки и без двойного учёта СЗ).
- **Непротиворечивость:** блокировка по одному ключу (FinalImageId), один источник регистрации СЗ, период ожидания ЭП не создаёт новых кадров/ОР; мелкие нюансы — порог OR_well_known и политика «ЭП только при отсутствии значимости».
- **Логичность:** разделение ролей (внимание, значимость, последовательность, условное действие) и порядок принятия решений выдержаны.
- **Эффективность:** СЗ и ожидание ЭП оптимизированы; при росте числа УР имеет смысл ввести индекс по контексту/стимулам.

Система адаптивности в текущем виде согласована и пригодна для развития; предложения выше направлены на упрощение настройки, документирования и масштабирования.
