# Инфо-детекторы: алгоритмы активации, удержания и сброса

В этом документе перечислены все инфо-детекторы инфокартины, их числовые поля в `InfoPicture` и три группы условий для каждого:

- Активация — когда детектор становится активным (поле ≠ 0).
- Удержание — когда детектор продолжает оставаться активным.
- Сброс — когда детектор обязан вернуться в 0.

## Общие принципы

- Значения детекторов целочисленные (или числа с плавающей точкой для «уровней»). Ноль всегда означает «не активно / не обнаружено».
- Каждая функция `InfoDet_updateXxx(...)` в `info_detectors.js`:
  - принимает параметры из «места сбора информации» (виталы, контексты, эффекты ЭП, состояние ожидания и т.п.);
  - сама решает, поставить ненулевое значение или сбросить в 0, исходя из трёх условий.
- Вызывающий код обязан передавать детектору актуальные данные при каждом существенном изменении (пульс, ОР, закрытие кадра ЭП, запуск/завершение ожидания и т.д.), даже если событие «не случилось» — чтобы детектор мог сам себя сбросить.

Детекторы условно делятся на:

- Снимковые (состояния) — могут пересчитываться по текущему снимку состояния (BadNormWell, BasicContextsActived, семантика и т.п.).
- Событийные — фиксируют момент/факт события во времени (конец ожидания без ответа, скачок новизны и т.п.). Для них условия удержания и сброса важны особенно.

## 1. Режим осмысления, Тема, Ситуация

### 1.1. Целевой режим осмысления (главный цикл ФО + ячейка «Режим»)

- Источник: `thinkingMode` у главного цикла; UI — `Consciousness_getMainCycleThinkingMode()`.
- Активация:
  - При запуске реакции/автоматизма, который требует целевого осмысления (например, при OR с семантически значимым стимулом или при запуске цикла осмысления по `unsolved_problem`): вызывается `InfoDet_updateTargetMode(true)`.
- Удержание:
  - Пока идёт целевой цикл осмысления или активен процесс оценки последствий автоматизма (период ожидания).
- Сброс:
  - При завершении целевого цикла (проблема решена или признана неактуальной) и отсутствии условий для нового целевого осмысления → `InfoDet_updateTargetMode(false)`.

### 1.2. Текущая Тема (`InfoPicture.themeId`, ячейка «Тема»)

- Поле: `themeId`: `0` — нет темы, >0 — ID образа темы из дерева ситуаций.
- Активация:
  - При каждом вызове `SituationsTree_onPerceptionTreeActivated()` находящий best‑match готовый образ темы для текущего режима и `tree.BaseID/EmotionID/ActivityID`:
    - если найден готовый образ (ready и score>0) → `InfoDet_updateCurrentTheme(themeId)`.
- Удержание:
  - Пока текущая комбинация (Base, Emotion, Activity) остаётся ближе всего к тому же готовому образу темы.
- Сброс:
  - Если при очередной активации дерева ситуаций:
    - нет готовых образов (все count ≤ 3),
    - или ни один готовый образ не даёт ненулевого score,
      → `InfoDet_updateCurrentTheme(0)`.

### 1.3. Текущая Ситуация (`InfoPicture.situationId`, ячейка «Ситуация»)

- Поле: `situationId`: `0` — нет, >0 — ID образа ситуации из дерева ситуаций.
- Активация:
  - В `SituationsTree_onPerceptionTreeActivated()` из детекторных полей инфокартины формируется вектор компонент; среди готовых образов выбирается best‑match:
    - при score>0 и ready=true → `InfoDet_updateCurrentSituation(situationId)`.
- Удержание:
  - Пока текущий набор детекторов остаётся ближе всего к той же ситуации.
- Сброс:
  - При следующем вызове, если:
    - нет готовых ситуаций для текущего режима,
    - или score==0 для всех,
      → `InfoDet_updateCurrentSituation(0)`.

## 2. Виталы и базовые контексты

### 2.1. Критический витал (`InfoPicture.criticalVital`, ячейка «Крит. витал»)

- Поле: `criticalVital`:
  - `0` — нет критического витала;
  - `>0` — ID витала, значение которого >70 и максимально среди всех.
- Активация:
  - В `updateImportanceMetrics(badVitals)` или `getActiveBasicContexts(cpuls)`:
    - сканировать `VitalsArr` и найти витал с `value > 70` и максимальным значением;
    - если такой есть → `InfoPicture.criticalVital = vitalId`.
- Удержание:
  - Пока при очередных вызовах остаётся витал с `value > 70`; при смене «лидера» детектор обновляется на новый ID.
- Сброс:
  - Если при следующем вызове ни один витал не превышает 70 → `criticalVital = 0`.

### 2.2. Состояние Плохо (`InfoPicture.badState`, ячейка «Плохо»)

- Поле: `badState`: `0` — не Плохо, `1` — Плохо (BadNormWell=1).
- Активация:
  - В `InfoDet_updateBadState(lastBadNormWell, badNormWell)`:
    - при `badNormWell === 1` → `badState = 1`.
- Удержание:
  - Пока `BadNormWell` остаётся равным 1.
- Сброс:
  - При любом значении `BadNormWell != 1` в следующем вызове → `badState = 0`.

### 2.3. Резкое ухудшение состояния (`InfoPicture.suddenChange`, ячейка «Резк. изм.»)

- Поле: `suddenChange`:
  - `0` — нет;
  - `1` — момент смены на Плохо (по PDF); можно хранить и более детальный уровень.
- Активация:
  - В `InfoDet_updateBadState(lastBadNormWell, badNormWell)`:
    - если `lastBadNormWell !== 1` и `badNormWell === 1` → `suddenChange = 1`.
- Удержание:
  - Это событийный детектор: можно держать `1` в течение одного шага цикла осмысления или одного/нескольких пульсов (на ваше усмотрение), если нужно «увидеть» событие.
- Сброс:
  - При следующем вызове без повторной смены в Плохо → `suddenChange = 0`.

### 2.4. Игровой режим (`InfoPicture.playMode`, ячейка «Игра»)

- Поле: `playMode`: `0` — нет, `1` — активен базовый контекст Игра.
- Активация:
  - В `getActiveBasicContexts` после получения `BasicContextsActived`:
    - если `BasicContextsActived` содержит контекст с `id == 11` → `playMode = 1`.
- Удержание:
  - Пока Игра остаётся в `BasicContextsActived`.
- Сброс:
  - При следующем вызове, если контекст Игра не активен → `playMode = 0`.

### 2.5. Режим обучения (`InfoPicture.learningMode`, ячейка «Обучение»)

- Поле: `learningMode`: `0` — нет, `1` — активен режим обучения.
- Активация:
  - В `InfoDet_updateLearningAndSearch(BasicContextsActived, VitalsArr)`:
    - если активен базовый контекст Любопытство (id=12) или витал «Интерес» имеет `value > 70` → `learningMode = 1`.
- Удержание:
  - Пока сохраняется хотя бы одно из условий (Любопытство или высокий Интерес).
- Сброс:
  - При отсутствии Любопытства и Интерес≤70 → `learningMode = 0`.

### 2.6. Поисковый интерес (`InfoPicture.searchInterest`, ячейка «Поиск»)

- Поле: `searchInterest`: `0` — нет, `1` — витал Интерес>70.
- Активация:
  - В `InfoDet_updateLearningAndSearch`:
    - если витал с Id «Интерес» (договорённый Id, например 10) имеет `value > 70` → `searchInterest = 1`.
- Удержание:
  - Пока Интерес>70.
- Сброс:
  - При следующем вызове при Интерес≤70 → `searchInterest = 0`.

### 2.7. Страх (`InfoPicture.fear`, ячейка «Страх»)

- Поле: `fear`: `0` — нет, `1` — активен базовый контекст Страх.
- Активация:
  - В `getActiveBasicContexts`:
    - если `BasicContextsActived` содержит контекст id=6 (Страх) → `fear = 1`.
- Удержание:
  - Пока контекст Страх остаётся активным.
- Сброс:
  - При следующем вызове без id=6 → `fear = 0`.

### 2.8. Агрессия (`InfoPicture.aggression`, ячейка «Агрессия»)

- Поле: `aggression`: `0` — нет, `1` — активен базовый контекст Агрессия.
- Активация:
  - Если `BasicContextsActived` содержит контекст id=7 (Агрессия) → `aggression = 1`.
- Удержание:
  - Пока контекст Агрессия активен.
- Сброс:
  - При следующем вызове без id=7 → `aggression = 0`.

### 2.9. Защита (`InfoPicture.defense`, ячейка «Защита»)

- Поле: `defense`: `0` — нет, `1` — активен режим защиты.
- Активация:
  - Если `fear == 1` или `aggression == 1` → `defense = 1`.
- Удержание:
  - Пока страх или агрессия активны.
- Сброс:
  - При `fear == 0` и `aggression == 0` → `defense = 0`.

## 3. Семантика и ориентировочный рефлекс

### 3.1. Стимул с Пульта (`InfoPicture.consoleStimulus`, ячейка «С пульта»)

- Поле: `consoleStimulus`:
  - `0` — нет стимула;
  - `>0` — `FinalImageId` победившего образа стимула.
- Активация:
  - В `runOROnStimulusActivation` после выбора `winnerId`:
    - `InfoDet_updateConsoleStimulus(winnerId)`.
- Удержание:
  - Можно удерживать до следующего срабатывания ОР (последний актуальный стимул).
- Сброс:
  - При явном отсутствии активных стимулов (все сняты) или по решению при смене ветки:
    - вызывать `InfoDet_updateConsoleStimulus(0)`.

### 3.2. Высокая семантическая значимость (`InfoPicture.highSemanticImportance`)

- Поле: `highSemanticImportance`: `0` — нет; `>0` — средняя значимость `meanImportance` в текущих условиях.
- Активация:
  - В `orientation_reflex.js` после получения `semWinner`:
    - если `meanImportance > 0` → `highSemanticImportance = meanImportance`.
- Удержание:
  - Пока текущий актуальный стимул (`winnerId`) и условия (well, emotionId) не сменились.
- Сброс:
  - При смене стимула/контекста (новое срабатывание ОР) или отсутствии семантики → `highSemanticImportance = 0`.

### 3.3. Есть объект высокой значимости (`InfoPicture.highImportanceObject`)

- Поле: `highImportanceObject`: `0` — нет; `>0` — ID актуального образа (FinalImageId), имеющего |semantics|>5.
- Активация:
  - В `orientation_reflex.js`:
    - если `Math.abs(meanImportance) > 5` → `highImportanceObject = winnerId`.
- Удержание:
  - Пока текущий стимул тот же и условия близки.
- Сброс:
  - При смене стимула/контекста или при `|meanImportance| ≤ 5` → `highImportanceObject = 0`.

### 3.4. Новизна образа (`InfoPicture.imageNovelty`)

- Поле: `imageNovelty`: `0` — нет; `>0` — значение novelty, если выше порога.
- Активация:
  - В `orientation_reflex.js` после расчёта `novelty`:
    - если `novelty > threshold` (порог из кода) → `imageNovelty = novelty`.
- Удержание:
  - До следующего срабатывания ОР.
- Сброс:
  - При новом ОР, когда `novelty ≤ threshold` → `imageNovelty = 0`.

### 3.5. Противоречивая семантика (`InfoPicture.conflictingSemantics`)

- Поле: `conflictingSemantics`: `0` — нет; `1` — обнаружена противоречивая семантика.
- Активация:
  - Код анализа семантики (в модуле понимания) обнаруживает:
    - средняя значимость близка к 0 при большом `samplesCount`,
    - для разных условий есть как значительные положительные, так и значительные отрицательные значения.
  - В этом случае → `conflictingSemantics = 1`.
- Удержание:
  - Пока ситуация с противоречивой семантикой не разрешена.
- Сброс:
  - Если при следующем анализе не выполняются признаки конфликта → `conflictingSemantics = 0`.

## 4. Эффекты действий и автоматизмы

### 4.1. Положительный / Отрицательный эффект действия (`positiveActionEffect`, `negativeActionEffect`)

- Поля:
  - `positiveActionEffect`: `0` или >0 — величина последнего положительного эффекта;
  - `negativeActionEffect`: `0` или <0 — величина последнего отрицательного эффекта.
- Активация:
  - В `closeLastFrame` (`episodic_memory.js`) после вычисления `last.effect`:
    - если `effect > 0` → `positiveActionEffect = effect`, `negativeActionEffect = 0`;
    - если `effect < 0` → `negativeActionEffect = effect`, `positiveActionEffect = 0`;
    - если `effect == 0` → оба 0.
- Удержание:
  - Хранит значение последнего завершённого кадра ЭП.
- Сброс:
  - При новом кадре без эффекта или при явном сбросе истории → оба = 0.

### 4.2. Негативный эффект моторного автоматизма (`negativeMotorEffect`)

- Поле: `negativeMotorEffect`: `0` — нет; `<0` — негативный z в периоде ожидания моторного автоматизма.
- Активация:
  - При срабатывании моторного автоматизма и измерении `z = getDiffImportance()` в периоде ожидания:
    - если `z < 0` → `negativeMotorEffect = z`.
- Удержание:
  - Пока не произведена новая оценка `z` для другого моторного автоматизма.
- Сброс:
  - При следующем измерении `z >= 0` или завершении периода ожидания без негативного эффекта → `negativeMotorEffect = 0`.

### 4.3. Негативный эффект ментального автоматизма (`negativeMentalEffect`)

- Аналогично моторному, но для автоматизмов, запущенных из функции осмысления (ментальных):
  - при `z < 0` в периоде ожидания → `negativeMentalEffect = z`,
  - при отсутствии/завершении — → 0.

### 4.4. Низкая полезность автоматизма (`lowAutomatismUsefulness`)

- Поле: `lowAutomatismUsefulness`: `0` — нет; |value| ≤ 1 — низкая полезность.
- Активация:
  - При каждом новом сэмпле `effectSample`, записываемом в полезность автоматизма:
    - если `0 < |effectSample| ≤ 1` → `lowAutomatismUsefulness = effectSample`.
- Удержание:
  - Пока следующий сэмпл не показывает нормальный по модулю эффект (>1).
- Сброс:
  - При `|effectSample| > 1` или `effectSample == 0` → `lowAutomatismUsefulness = 0`.

### 4.5. Пока найден подходящий автоматизм (`foundSuitableAutomatism`)

- Поле: `foundSuitableAutomatism`: `0` — нет; `1` — цикл осмысления в целевом режиме нашёл и использует автоматизм.
- Активация:
  - При выборе и запуске подходящего автоматизма в целевом режиме → `foundSuitableAutomatism = 1`.
- Удержание:
  - Пока цикл осмысления продолжает использовать этот автоматизм.
- Сброс:
  - При завершении цикла или при отказе от автоматизма → `foundSuitableAutomatism = 0`.

## 5. Ожидание и ответы оператора

### 5.1. Нет реакции на стимул (`noReactionToStimulus`)

- Поле: `noReactionToStimulus`: `0` — нет; `1` — зафиксировано отсутствие реакции на стимул.
- Активация:
  - В `EpisodicMemory_onPulse`, когда `last.actionImageId === null` и период ожидания истёк без реакции → `noReactionToStimulus = 1`.
- Удержание:
  - До следующего запуска ожидания или явного сброса.
- Сброс:
  - При появлении реакции или при запуске нового ожидания → `noReactionToStimulus = 0`.

### 5.2. Игнорирование оператором (`operatorIgnoring`)

- Поле: `operatorIgnoring`: `0` — нет; `1` — оператор проигнорировал действие.
- Активация:
  - В `EpisodicMemory_onPulse`, якщо `last.actionImageId != null` (была реакция/автоматизм) и период ожидания закончился без ответного стимула → `operatorIgnoring = 1`.
- Удержание:
  - Пока не получен ответный стимул в новом периоде ожидания.
- Сброс:
  - В `orientation_reflex.js`, при ответном стимуле в период ожидания (`EpisodicMemory_isInWaitingPeriod`):
    - `operatorIgnoring = 0`.

### 5.3. Ответ оператора получен (`operatorAnswerReceived`)

- Поле: `operatorAnswerReceived`: `0` — нет; `1` — ответ оператора получен.
- Активация:
  - В `orientation_reflex.js`, при срабатывании ОР в период ожидания и закрытии кадра с ответным стимулом → `operatorAnswerReceived = 1`.
- Удержание:
  - До следующего кадра ожидания или явного сброса.
- Сброс:
  - При запуске нового периода ожидания или при обработке ответа → `operatorAnswerReceived = 0`.

### 5.4. Активное ожидание ответа (`activeWaitingAnswer`)

- Поле: `activeWaitingAnswer`: `0` — нет; `1` — период ожидания результата автоматизма активен.
- Активация:
  - При создании кадра ЭП, связанного с автоматизмом (особенно ментальным, запущенным из осмысления) → `activeWaitingAnswer = 1`.
- Удержание:
  - Пока период ожидания не завершён (ответ/таймаут).
- Сброс:
  - При закрытии кадра (с ответом или без) → `activeWaitingAnswer = 0`.

### 5.5. Серия эпизодов без эффекта (`seriesWithoutEffect`)

- Поле: `seriesWithoutEffect`: `0` — нет; >0 — длина последней серии кадров с `effect == 0`.
- Активация / удержание:
  - Логика в ЭП увеличивает счётчик при каждом закрываемом кадре с `effect == 0` и обнуляет при появлении ненулевого эффекта; при каждом изменении длины вызывается `InfoDet_updateSeriesWithoutEffect(length)`.
- Сброс:
- При появлении эффекта (`effect != 0`) или при явном сбросе ЭП → `seriesWithoutEffect = 0`.

## 6. Осмысление и трудные проблемы

Эти детекторы зависят от реализации цикла осмысления (`conscience_level_2`) и работы с `unsolved_problem`.

### 6.1. Обучение с учителем (`teacherLearning`)

- Поле: `teacherLearning`: `0` — нет; `1` — включён режим обучения с учителем.
- Активация:
  - Когда функция осмысления фиксирует, что по конкретному образу имеется нерешённая проблема, которая остаётся нерешённой в течение непрекращающегося цикла попыток решения (несколько шагов целевого осмысления подряд).
- Удержание:
  - Пока продолжается режим «передачи инициативы» оператору: система отслеживает его действия и провоцирует на ответы.
- Сброс:
  - При решении проблемы (ответ оператора или найдено внутреннее решение), либо по истечении заданного лимита шагов → `teacherLearning = 0`.

### 6.2. Неудовлетворённость существующим (`dissatisfaction`)

- Поле: `dissatisfaction`: `0` — нет; `1` — есть неудовлетворённость.
- Активация:
  - Когда базовый контекст Покой активен, нет актуальных стимулов и завершён цикл осмысления в пассивном режиме (дошёл до конца без новых идей/изменений).
- Удержание:
  - Пока внешние условия не изменятся или не появится новый стимул/интерес.
- Сброс:
  - При активизации новых стимулов, смене контекста или запуске целевого цикла → `dissatisfaction = 0`.

### 6.3. Непонимание (`misunderstanding`)

- Поле: `misunderstanding`: `0` — нет; `1` — состояние непонимания.
- Активация:
  - Если цикл осмысления дошёл до конца в целевом режиме или число шагов итерации превысило заданный предел (например, 10), и проблема не решена.
- Удержание:
  - Пока цикл не перезапущен с иными условиями или проблема не решена.
- Сброс:
  - При решении проблемы или перезапуске цикла с новой конфигурацией → `misunderstanding = 0`.

### 6.4. Сомнение в штатном автоматизме (`doubtInDefaultAutomatism`)

- Поле: `doubtInDefaultAutomatism`: `0` — нет; `1` — есть сомнение.
- Активация:
  - При старте второго уровня осмысления в целевом режиме для ветки, где штатный автоматизм даёт неоднозначные/неприемлемые результаты.
- Удержание:
  - Пока второй уровень рассматривает альтернативы штатному автоматизму.
- Сброс:
  - При выборе нового штатного автоматизма или подтверждении старого → `doubtInDefaultAutomatism = 0`.

### 6.5. Трудная проблема (`hardProblem`)

- Поле: `hardProblem`: `0` — нет; >0 — уровень/счётчик «трудности» проблемы по образу.
- Активация / удержание:
  - Для каждого образа (стимула/ситуации) ведётся счётчик случаев, когда:
    - есть `unsolved_problem` по этому образу,
    - целевой цикл доходит до конца без решения,
    - число шагов цикла осмысления превышает порог.
  - При каждом таком случае `hardProblem` для текущего образа увеличивается и передаётся в `InfoDet_updateHardProblem(level)`.
- Сброс:
  - При решении проблемы (образ помечается решённым) → уровень обнуляется, образ удаляется из массива «трудных проблем», `hardProblem = 0`.

Этот документ задаёт целевые алгоритмы для всех инфо-детекторов; реализации функций `InfoDet_update...` в `info_detectors.js` должны следовать этим правилам, а вызовы этих функций в коде (в prepare.js, orientation_reflex.js, episodic_memory.js, conscience_level_2.js и др.) должны подавать им нужные параметры при каждом изменении релевантного состояния. *** End Patch***

*** End Patch