{
    "project": "EE DataCollector Esoteric API v2.3.0",
    "generated_at": "2026-05-10T01:10:43+00:00",
    "export_type": "ai_single_file",
    "source": "doc/index.php?download=ai",
    "toc_meta": {
        "project": "API V2.3 Beta",
        "version": "2.3.0",
        "updated_at": "2026-03-18",
        "author": "Евгений Ефимченко",
        "description": "Актуальная техническая документация по асинхронному API портрета, прогноза, Synthesis++ и новому синхронному почасовому geocentric-прогнозу Луны."
    },
    "sections": [
        {
            "id": "01_introduction",
            "title": "1. Введение и архитектура",
            "description": "Общая модель API, очередь задач, разделение SubjectContext/TemporalContext и синхронный hourly-endpoint.",
            "file_name": "doc_01_intro.json",
            "content": {
                "title": "1. Введение",
                "version": "2.3.0",
                "last_updated": "2026-03-18",
                "description": "EE DataCollector API сочетает асинхронный контур расчётов портрета/прогноза и новый синхронный hourly-endpoint для geocentric-прогноза Луны. Архитектура по-прежнему разделяет SubjectContext и TemporalContext, а hourly-метод работает поверх отдельного серверного кэша эфемерид.",
                "key_changes": [
                    "Сохранён асинхронный контур `create_task -> worker -> get_result` для тяжёлых составных расчётов.",
                    "Добавлен новый синхронный `GET /get_hourly_forecast` для почасового прогноза Луны и планет на локальные сутки.",
                    "Hourly-endpoint возвращает geocentric-позиции Луны/планет, текущие аспекты Луны, окно `void of course`, лунный день и флаг «сатанинского» дня.",
                    "Для hourly-endpoint добавлен двухуровневый кэш: batch-cache эфемерид NASA и result-cache по `date + lat + lng + timezone`.",
                    "Канонический слой Synthesis++ и export_result продолжают работать без изменения контракта."
                ],
                "info_block": {
                    "base_url": "https://digihash.ru/datacollector/api.php",
                    "version": "2.3.0",
                    "protocol": "HTTPS / JSON"
                },
                "features": [
                    "Асинхронная очередь задач для портрета, периодического прогноза и Synthesis++.",
                    "Синхронный hourly-endpoint для UI и сервисов, которым нужен готовый почасовой результат сразу.",
                    "Разделение SubjectContext/TemporalContext во всех вычислениях.",
                    "Серверное кэширование портретов, дневных прогнозов и нового почасового geocentric-прогноза.",
                    "Режим критического отказа для внешних источников: при проблемах NASA JPL Horizons API не отдаёт фальшивый частичный успех."
                ],
                "architecture": {
                    "title": "Как работает API",
                    "description": "В системе теперь два рабочих контура: асинхронный и синхронный.",
                    "lifecycle_steps": [
                        {
                            "step": 1,
                            "actor": "Клиент",
                            "action": "POST create_task",
                            "description": "Запускает тяжёлую составную задачу для портрета/прогноза/Synthesis++."
                        },
                        {
                            "step": 2,
                            "actor": "Worker",
                            "action": "Асинхронный расчёт",
                            "description": "Собирает итоговый payload и сохраняет его для последующего `get_result`."
                        },
                        {
                            "step": 3,
                            "actor": "Клиент",
                            "action": "GET get_result",
                            "description": "Опрос статуса или получение итогового async-результата."
                        },
                        {
                            "step": 4,
                            "actor": "Клиент",
                            "action": "GET get_hourly_forecast",
                            "description": "Синхронный запрос почасового прогноза на local-день с отдельным result-cache."
                        }
                    ]
                },
                "caching_policy": {
                    "title": "Модель хранения и кэширования",
                    "description": "Кэш разделён по доменам данных. В публичных ответах файловые пути никогда не раскрываются.",
                    "strategies": [
                        {
                            "data_type": "Портретные данные",
                            "ttl": "Постоянно",
                            "icon": "database",
                            "desc": "Immutable SubjectContext и производные portrait-расчёты."
                        },
                        {
                            "data_type": "Периодические forecast-данные",
                            "ttl": "По temporal-контексту",
                            "icon": "clock",
                            "desc": "Классический дневной/недельный/месячный forecast."
                        },
                        {
                            "data_type": "Hourly geocentric forecast",
                            "ttl": "По `date + lat + lng + timezone`",
                            "icon": "bolt",
                            "desc": "Отдельный JSON-cache для нового почасового метода."
                        }
                    ]
                },
                "technical_requirements": {
                    "title": "Технические требования",
                    "list": [
                        "Формат обмена: JSON",
                        "Кодировка: UTF-8",
                        "Дата: YYYY-MM-DD",
                        "Время: HH:MM или HH:MM:SS",
                        "Все запросы выполняются по HTTPS"
                    ]
                }
            }
        },
        {
            "id": "02_authentication",
            "title": "2. Аутентификация и доступ",
            "description": "Правила api_key, заголовки, лимиты и доступ к sync/async методам.",
            "file_name": "doc_02_auth.json",
            "content": {
                "title": "2. Аутентификация и доступ",
                "description": "Для create_task обязателен api_key в JSON. Для get_result/export_result доступ зависит от ключа, которым создана задача: публичные ключи дают открытый доступ по request_id, приватные требуют тот же API-ключ через X-API-Key или query api_key.",
                "security_card": {
                    "type": "API key",
                    "in": "Тело запроса (JSON), заголовок X-API-Key или query api_key",
                    "name": "api_key",
                    "example": "655351024"
                },
                "headers_table": [
                    {
                        "header": "Content-Type",
                        "value": "application/json",
                        "desc": "Обязателен для POST /api.php?action=create_task"
                    },
                    {
                        "header": "X-Calc-Profile",
                        "value": "A | B",
                        "desc": "Опциональный выбор профиля расчёта. Приоритет: header > query > body > default(A)."
                    },
                    {
                        "header": "X-API-Key",
                        "value": "<your_key>",
                        "desc": "Опционален для публичных задач и обязателен для приватных request_id в get_result/export_result."
                    },
                    {
                        "header": "Accept",
                        "value": "application/json",
                        "desc": "Рекомендуется для API-запросов."
                    }
                ],
                "auth_methods": [
                    {
                        "method": "POST",
                        "endpoint": "/api.php?action=create_task",
                        "badge": "Требуется авторизация",
                        "desc": "Всегда требуется валидный api_key в JSON-теле.",
                        "snippet": "{\n  \"api_key\": \"655351024\",\n  \"user\": { ... }\n}"
                    },
                    {
                        "method": "GET",
                        "endpoint": "/api.php?action=get_result&request_id=...",
                        "badge": "Условно публичный",
                        "desc": "Если задача создана публичным ключом (public_result_access=true), достаточно request_id. Для приватных ключей нужен X-API-Key или query api_key.",
                        "snippet": "GET /api.php?action=get_result&request_id=task_...&view=summary&api_key=<private_key>"
                    },
                    {
                        "method": "GET",
                        "endpoint": "/api.php?action=export_result&request_id=...&format=ndjson",
                        "badge": "Условно публичный",
                        "desc": "Правило такое же, как у get_result: для приватных ключей обязателен тот же ключ доступа.",
                        "snippet": "GET /api.php?action=export_result&request_id=task_...&format=ndjson&api_key=<private_key>"
                    }
                ],
                "ranking_system": {
                    "title": "Система ранжирования API-ключей",
                    "description": "Ранг API-ключа определяет почасовую квоту и доступный профиль нагрузки. Базовые значения хранятся в config/ranks.php. Для публичного тестового ключа 655351024 используется ранг adept.",
                    "rank_table": [
                        {
                            "name": "demiurge",
                            "type": "безлимит",
                            "description": "Флаг is_god=true. limit_per_hour = -1 (без ограничения)."
                        },
                        {
                            "name": "magus",
                            "type": "квота",
                            "description": "limit_per_hour = 1000 условных единиц в час."
                        },
                        {
                            "name": "master",
                            "type": "квота",
                            "description": "limit_per_hour = 500 условных единиц в час."
                        },
                        {
                            "name": "adept",
                            "type": "квота",
                            "description": "limit_per_hour = 100 условных единиц в час. Ранг тестового ключа."
                        }
                    ],
                    "limits_block": [
                        "Стоимость новой задачи учитывается коэффициентом cost_new (по умолчанию 3).",
                        "Стоимость повторного/кэшированного обращения может учитываться коэффициентом cost_cached (по умолчанию 1).",
                        "Дополнительно действует лимит per_minute из реестра ключей (config/api_keys.php)."
                    ]
                },
                "limits_block": {
                    "title": "Ограничения и поведение",
                    "list": [
                        "Глобальный лимит API: 360 запросов за 60 секунд по IP (429 + Retry-After: 60).",
                        "Дополнительный лимит по ключу: per_minute из реестра API-ключей.",
                        "Почасовая квота по рангу/ключу учитывает стоимость новой задачи (cost_new).",
                        "Тестовый ключ 655351024 остаётся публичным и предназначен для интеграционных проверок.",
                        "run_worker защищён: доступ только с localhost или с валидным X-Worker-Token."
                    ]
                },
                "error_table": {
                    "401": "Unauthorized: ключ отсутствует/невалиден или не передан для приватного request_id.",
                    "403": "Forbidden: передан неверный ключ для приватного request_id или запрещён доступ к run_worker.",
                    "405": "Метод не разрешён для выбранного HTTP-метода.",
                    "429": "Превышен лимит запросов (глобальный или ключевой)."
                }
            }
        },
        {
            "id": "03_methods_create",
            "title": "3. Создание задачи (POST /create_task)",
            "description": "Структура запроса, параметры forecast/response, calc_profile.",
            "file_name": "doc_03_create_task.json",
            "content": {
                "title": "3. Создание задачи (POST /create_task)",
                "description": "Метод ставит задачу в очередь и возвращает request_id. Фактический расчёт выполняется worker-процессом асинхронно.",
                "endpoint": {
                    "method": "POST",
                    "url": "/api.php?action=create_task",
                    "content_type": "application/json"
                },
                "request_body_schema": {
                    "root_parameters": [
                        {
                            "name": "api_key",
                            "type": "string | number",
                            "required": true,
                            "description": "Ключ доступа API (публичный тестовый: 655351024)."
                        },
                        {
                            "name": "calc_profile",
                            "type": "enum",
                            "required": false,
                            "values": [
                                "A",
                                "B"
                            ],
                            "default": "A",
                            "description": "Профиль расчёта весов для synthesis. Приоритет источников: X-Calc-Profile > query > body > default."
                        },
                        {
                            "name": "user",
                            "type": "object",
                            "required": true,
                            "description": "Натальные данные пользователя (SubjectContext)."
                        },
                        {
                            "name": "systems",
                            "type": "array[string]",
                            "required": false,
                            "description": "Список модулей: numerology, astrology, bodygraph, transits, forecast, synthesis."
                        },
                        {
                            "name": "current_location",
                            "type": "object",
                            "required": false,
                            "description": "Текущая локация для TemporalContext (прогнозы/транзиты/дневные ветки)."
                        },
                        {
                            "name": "forecast",
                            "type": "object",
                            "required": false,
                            "description": "Параметры периода прогноза и режим качества space_weather."
                        },
                        {
                            "name": "response",
                            "type": "object",
                            "required": false,
                            "description": "Опции проекции ответа (например, omit_portrait_payload)."
                        }
                    ],
                    "user_object": [
                        {
                            "name": "first_name",
                            "type": "string",
                            "required": true,
                            "example": "Евгений"
                        },
                        {
                            "name": "last_name",
                            "type": "string",
                            "required": true,
                            "example": "Ефимченко"
                        },
                        {
                            "name": "middle_name",
                            "type": "string",
                            "required": false,
                            "example": "Владимирович"
                        },
                        {
                            "name": "birth_date",
                            "type": "string (date)",
                            "required": true,
                            "format": "YYYY-MM-DD",
                            "example": "1981-10-27"
                        },
                        {
                            "name": "birth_time",
                            "type": "string (time)",
                            "required": true,
                            "format": "HH:MM или HH:MM:SS",
                            "example": "04:13"
                        },
                        {
                            "name": "birth_city",
                            "type": "string",
                            "required": true,
                            "example": "Норильск"
                        },
                        {
                            "name": "birth_country",
                            "type": "string",
                            "required": false,
                            "example": "Россия"
                        }
                    ],
                    "forecast_object": [
                        {
                            "name": "period_type",
                            "type": "enum",
                            "required": false,
                            "values": [
                                "day",
                                "week",
                                "month"
                            ],
                            "default": "day",
                            "description": "Тип периода прогноза."
                        },
                        {
                            "name": "period_start_date",
                            "type": "string (date)",
                            "required": false,
                            "description": "Дата начала периода (алиас target_date).",
                            "example": "2026-02-14"
                        },
                        {
                            "name": "target_time",
                            "type": "string (time)",
                            "required": false,
                            "description": "Время якоря расчёта для TemporalContext.",
                            "example": "12:00:00"
                        },
                        {
                            "name": "space_weather_mode",
                            "type": "enum",
                            "required": false,
                            "values": [
                                "allow_simulated",
                                "observed_or_estimated",
                                "observed_only"
                            ],
                            "default": "allow_simulated",
                            "description": "Режим качества Kp-данных."
                        }
                    ],
                    "response_object": [
                        {
                            "name": "omit_portrait_payload",
                            "type": "boolean",
                            "required": false,
                            "default": false,
                            "description": "Если true, в итоговом payload скрываются тяжёлые портретные ветки systems.numerology/astrology/bodygraph."
                        }
                    ]
                },
                "feature_guidelines": {
                    "title": "Связка с Synthesis++",
                    "list": [
                        "Чтобы получить канонический слой, добавьте \"synthesis\" в systems.",
                        "Подробный разбор режимов summary/explain/raw вынесен в раздел «5. Работа с Synthesis++ (IPSM v2)».",
                        "Если нужен компактный ответ, передавайте response.omit_portrait_payload=true."
                    ]
                },
                "examples": {
                    "full_request": {
                        "description": "Запрос с synthesis и компактным режимом ответа.",
                        "payload": {
                            "api_key": "655351024",
                            "calc_profile": "B",
                            "user": {
                                "first_name": "Евгений",
                                "middle_name": "Владимирович",
                                "last_name": "Ефимченко",
                                "birth_date": "1981-10-27",
                                "birth_time": "04:13",
                                "birth_city": "Норильск",
                                "birth_country": "Россия"
                            },
                            "systems": [
                                "numerology",
                                "astrology",
                                "bodygraph",
                                "transits",
                                "forecast",
                                "synthesis"
                            ],
                            "current_location": {
                                "city": "Орел",
                                "country": "Россия"
                            },
                            "forecast": {
                                "period_type": "day",
                                "period_start_date": "2026-02-14",
                                "target_time": "12:00:00",
                                "space_weather_mode": "observed_or_estimated"
                            },
                            "response": {
                                "omit_portrait_payload": true
                            }
                        }
                    },
                    "success_response": {
                        "status": 202,
                        "description": "Задача поставлена в очередь.",
                        "payload": {
                            "status": "queued",
                            "message": "Task accepted",
                            "request_id": "task_698cdc670473d"
                        }
                    },
                    "error_response": {
                        "status": 400,
                        "description": "Ошибка валидации обязательных полей user.",
                        "payload": {
                            "status": "error",
                            "errors": [
                                "Field 'last_name' is required"
                            ]
                        }
                    }
                }
            }
        },
        {
            "id": "04_methods_hourly",
            "title": "4. Почасовой лунный прогноз (GET /get_hourly_forecast)",
            "description": "Синхронный geocentric endpoint: почасовые позиции Луны/планет, аспекты Луны, void of course и лунный день.",
            "file_name": "doc_04_hourly_forecast.json",
            "content": {
                "title": "4. Почасовой лунный прогноз (GET /get_hourly_forecast)",
                "description": "Метод возвращает синхронный geocentric-прогноз на локальные сутки. В ответе есть почасовые положения Луны и основных планет, текущие аспекты Луны, окно `void of course`, лунный день и отметка «сатанинского» дня.",
                "endpoint": {
                    "method": "GET",
                    "url": "/api.php?action=get_hourly_forecast",
                    "content_type": "application/json"
                },
                "query_parameters": [
                    {
                        "name": "date",
                        "type": "string (YYYY-MM-DD)",
                        "required": true,
                        "description": "Локальная дата, для которой строится hourly-массив.",
                        "example": "2026-03-18"
                    },
                    {
                        "name": "city",
                        "type": "string",
                        "required": false,
                        "description": "Город для server-side геокодинга. Можно использовать вместо ручных координат.",
                        "example": "Москва"
                    },
                    {
                        "name": "country",
                        "type": "string",
                        "required": false,
                        "description": "Опциональное уточнение для `city`.",
                        "example": "Россия"
                    },
                    {
                        "name": "lat",
                        "type": "float",
                        "required": false,
                        "description": "Широта. Используется вместе с `lng` и `timezone`.",
                        "example": "55.7558"
                    },
                    {
                        "name": "lng",
                        "type": "float",
                        "required": false,
                        "description": "Долгота.",
                        "example": "37.6176"
                    },
                    {
                        "name": "timezone",
                        "type": "string",
                        "required": false,
                        "description": "IANA timezone. Обязательна при ручных координатах без `city`.",
                        "example": "Europe/Moscow"
                    },
                    {
                        "name": "api_key / X-API-Key",
                        "type": "string",
                        "required": true,
                        "description": "API-ключ для авторизации sync-endpoint."
                    }
                ],
                "feature_guidelines": [
                    "Диапазон ответа: от local `00:00` запрошенного дня до local `00:00` следующего дня включительно.",
                    "Астрономическая рамка: `geocentric`.",
                    "Если timezone содержит DST-переход, число точек может отличаться от 25, потому что сохраняются локальные календарные часы.",
                    "Повторный запрос по тем же `date + lat + lng + timezone` возвращается из JSON-cache без нового обращения к NASA JPL Horizons."
                ],
                "response_model": [
                    {
                        "name": "status",
                        "type": "string",
                        "description": "Статус синхронного ответа.",
                        "example": "success"
                    },
                    {
                        "name": "cached",
                        "type": "boolean",
                        "description": "Признак попадания в result-cache."
                    },
                    {
                        "name": "data.meta",
                        "type": "object",
                        "description": "Метаданные диапазона, локации, шага и источника эфемерид."
                    },
                    {
                        "name": "data.hours[]",
                        "type": "array<object>",
                        "description": "Почасовой массив результата."
                    }
                ],
                "hour_fields": [
                    {
                        "name": "hour_index",
                        "type": "integer",
                        "description": "Индекс точки внутри local-day массива."
                    },
                    {
                        "name": "local_datetime / utc_datetime",
                        "type": "ISO-8601 datetime",
                        "description": "Локальная и UTC-временные отметки часа."
                    },
                    {
                        "name": "moon",
                        "type": "object",
                        "description": "Положение Луны: longitude, latitude, sign, sign_degree, speed, is_retro."
                    },
                    {
                        "name": "planets",
                        "type": "object",
                        "description": "Geocentric-положения Солнца, Меркурия, Венеры, Марса, Юпитера, Сатурна, Урана, Нептуна и Плутона."
                    },
                    {
                        "name": "moon_aspects[]",
                        "type": "array<object>",
                        "description": "Текущие мажорные аспекты Луны к планетам: conjunction, sextile, square, trine, opposition."
                    },
                    {
                        "name": "lunar",
                        "type": "object",
                        "description": "Фаза Луны, возраст, лунный день, moonrise-коррекция, флаг `is_satanic`, `void_of_course`."
                    }
                ],
                "void_of_course_fields": [
                    {
                        "name": "is_void_now",
                        "type": "boolean",
                        "description": "Находится ли Луна без курса в текущей точке."
                    },
                    {
                        "name": "starts_at_local / ends_at_local",
                        "type": "ISO-8601 datetime",
                        "description": "Границы текущего или ближайшего окна void of course в локальном времени."
                    },
                    {
                        "name": "next_sign",
                        "type": "string",
                        "description": "Следующий знак Луны после выхода из текущего окна."
                    },
                    {
                        "name": "last_aspect / next_aspect_before_sign_change",
                        "type": "object|null",
                        "description": "Последний и ближайший мажорный аспект до смены знака."
                    }
                ],
                "caching_policy": {
                    "title": "Кэширование",
                    "description": "Метод использует двухуровневый кэш.",
                    "strategies": [
                        {
                            "data_type": "Результат hourly-forecast",
                            "ttl": "До инвалидирования входными параметрами",
                            "icon": "clock",
                            "desc": "JSON-cache по `date + lat + lng + timezone`."
                        },
                        {
                            "data_type": "Geocentric hourly ephemeris",
                            "ttl": "До повторного использования того же диапазона",
                            "icon": "database",
                            "desc": "Пакетный cache рядов NASA для всего диапазона и lookahead-окна."
                        }
                    ]
                },
                "examples": [
                    {
                        "language": "Bash (cURL)",
                        "description": "Запрос по координатам и timezone.",
                        "code": "curl -s \"https://digihash.ru/datacollector/api.php?action=get_hourly_forecast&date=2026-03-18&lat=55.7558&lng=37.6176&timezone=Europe/Moscow&api_key=655351024\""
                    },
                    {
                        "language": "Bash (cURL)",
                        "description": "Запрос по названию города с server-side геокодингом.",
                        "code": "curl -s \"https://digihash.ru/datacollector/api.php?action=get_hourly_forecast&date=2026-03-18&city=%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0&country=%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D1%8F&api_key=655351024\""
                    }
                ]
            }
        },
        {
            "id": "04_methods_get",
            "title": "5. Получение результата (GET /get_result)",
            "description": "Модель опроса, статусы, view=summary|explain|raw для synthesis-задач.",
            "file_name": "doc_04_get_result.json",
            "content": {
                "title": "4. Получение результата (GET /get_result)",
                "description": "Метод возвращает статус задачи или финальные данные. Для synthesis-задач поддерживаются режимы view=summary|explain|raw.",
                "endpoint": {
                    "method": "GET",
                    "url": "/api.php?action=get_result",
                    "parameters": [
                        {
                            "name": "request_id",
                            "in": "query",
                            "required": true,
                            "type": "string",
                            "description": "ID задачи, полученный при create_task."
                        },
                        {
                            "name": "view",
                            "in": "query",
                            "required": false,
                            "type": "enum",
                            "values": [
                                "summary",
                                "explain",
                                "raw"
                            ],
                            "default": "summary",
                            "description": "Режим выдачи для synthesis-задач. Для legacy-ответа параметр игнорируется."
                        },
                        {
                            "name": "api_key",
                            "in": "query",
                            "required": false,
                            "type": "string",
                            "description": "Для приватных ключей обязателен (альтернатива: заголовок X-API-Key). Для публичного ключа 655351024 не требуется."
                        }
                    ]
                },
                "synthesis_views": [
                    {
                        "name": "summary",
                        "type": "режим",
                        "description": "Режим по умолчанию. Возвращает стабильный компактный слой: versioning, summary.scales, superpower, quality_score, health."
                    },
                    {
                        "name": "explain",
                        "type": "режим",
                        "description": "Расширенный слой объяснимости: domain_components, breakdown_short, conflicts, reliability_summary, model_health."
                    },
                    {
                        "name": "raw",
                        "type": "режим",
                        "description": "Отладочный режим. Возвращает полный raw_profile synthesis вместе с versioning и health."
                    }
                ],
                "feature_guidelines": {
                    "title": "Практика использования",
                    "list": [
                        "В прод-интеграциях по умолчанию используйте view=summary.",
                        "view=explain запрашивайте по требованию, когда нужно объяснить причины результата.",
                        "view=raw используйте только для диагностики и внутренней разработки.",
                        "Для подробного практического сценария см. раздел «5. Работа с Synthesis++ (IPSM v2)»."
                    ]
                },
                "polling_strategy": {
                    "recommendation": "Опрос каждые 2-3 секунды.",
                    "timeout": "Если задача долго не переходит в success/error, проверьте логи worker и/или создайте новую задачу.",
                    "flow_diagram": "Клиент -> GET get_result -> статус очереди -> success/error"
                },
                "statuses": [
                    {
                        "code": "pending",
                        "meaning": "Задача в очереди, ещё не взята worker-процессом."
                    },
                    {
                        "code": "processing",
                        "meaning": "Задача выполняется worker-процессом."
                    },
                    {
                        "code": "success",
                        "meaning": "Расчёт завершён, доступен финальный payload."
                    },
                    {
                        "code": "error",
                        "meaning": "Расчёт завершился ошибкой; поле error содержит текст или объект ошибки."
                    }
                ],
                "examples": {
                    "processing_response": {
                        "description": "Задача ещё не завершена.",
                        "payload": {
                            "status": "processing",
                            "message": "Calculation in progress..."
                        }
                    },
                    "success_response": {
                        "description": "Пример synthesis-ответа в режиме view=summary.",
                        "payload": {
                            "status": "success",
                            "view": "summary",
                            "schema_version": "export-1.0.0",
                            "calculation_version": "ipsm-2.0.0",
                            "weights_hash": "b7c5...",
                            "conflict_rules_version": "conflict-rules-2.0.0",
                            "normalization_version": "normalization-2.0.0",
                            "calc_profile_id": "A",
                            "request_id": "task_698cdc670473d",
                            "date": "2026-02-14",
                            "summary": {
                                "scales": {
                                    "control": -11.1,
                                    "cognition": 24.5,
                                    "dynamics": 8.3,
                                    "focus": 31.9,
                                    "social": -4.2
                                },
                                "superpower": "focus",
                                "quality_score": 87.4,
                                "conflicts_count": 0
                            },
                            "health": {
                                "analysis_time_ms": 148,
                                "memory_peak_mb": 18.25,
                                "observations_used": 126,
                                "observations_total": 151,
                                "aggregation_drift_detected": false
                            }
                        }
                    },
                    "error_response": {
                        "description": "Ошибка исполнения задачи.",
                        "payload": {
                            "status": "error",
                            "error": "[CRITICAL_EXTERNAL] Ephemeris NASA data unavailable"
                        }
                    }
                }
            }
        },
        {
            "id": "05_synthesis_usage",
            "title": "6. Работа с Synthesis++ (IPSM v2)",
            "description": "Практическая интеграция с каноническим слоем: выбор view, интерпретация шкал, конфликтов и экспорт в BI.",
            "file_name": "doc_05_synthesis_usage.json",
            "content": {
                "title": "5. Работа с Synthesis++ (IPSM v2)",
                "description": "Synthesis++ — канонический интерпретационный слой поверх numerology/astrology/bodygraph/forecast, включая MatrixDestiny22 как отдельный домен MATRIX_DESTINY. Он нужен, чтобы интеграции работали со стабильным контрактом (summary/explain/export), а не парсили сырой профиль модулей.",
                "synthesis_usage": {
                    "title": "Когда и зачем включать Synthesis++",
                    "list": [
                        "Добавляйте \"synthesis\" в systems, если нужен устойчивый слой аналитики для UI, BI и внешних моделей.",
                        "Используйте view=summary как основной прод-контракт: это минимальный, стабильный и дешёвый по объёму ответ.",
                        "Используйте view=explain только там, где нужно объяснение причин результата: доменные вклады, конфликты и топ-факторы.",
                        "Используйте view=raw только для диагностики, аудита и проверки изменений модели.",
                        "Для BI/витрин не парсите raw_profile вручную — используйте export_result с row_type."
                    ]
                },
                "lifecycle_steps": [
                    {
                        "step": 1,
                        "actor": "Клиент",
                        "action": "POST create_task",
                        "description": "Передайте api_key, user и systems с \"synthesis\". При необходимости добавьте forecast/current_location/response."
                    },
                    {
                        "step": 2,
                        "actor": "Клиент",
                        "action": "GET get_result&view=summary",
                        "description": "Получите стабильный результат: scales, superpower, quality_score, conflicts_count и health."
                    },
                    {
                        "step": 3,
                        "actor": "Клиент",
                        "action": "GET get_result&view=explain",
                        "description": "При запросе объяснимости получите domain_components, breakdown_short, conflicts, reliability_summary и model_health."
                    },
                    {
                        "step": 4,
                        "actor": "Клиент",
                        "action": "GET export_result",
                        "description": "Для BI-слоя выгружайте NDJSON/CSV: summary, domain_component и breakdown_item без дополнительного парсинга."
                    }
                ],
                "synthesis_views": [
                    {
                        "name": "summary",
                        "type": "режим",
                        "description": "Режим по умолчанию. Канонический слой: schema/calculation/weights версии, summary.scales, summary.superpower, summary.quality_score, summary.conflicts_count, health."
                    },
                    {
                        "name": "explain",
                        "type": "режим",
                        "description": "Расширенный слой причин: domain_components по шкалам, breakdown_short (top 3+/3-), conflicts с evidence, reliability_summary, model_health."
                    },
                    {
                        "name": "raw",
                        "type": "режим",
                        "description": "Отладочный режим. Возвращает полный raw_profile synthesis для внутренних проверок. Не использовать как внешний стабильный контракт."
                    }
                ],
                "root_parameters": [
                    {
                        "name": "summary.scales",
                        "type": "object",
                        "description": "Пять шкал IPSM v2 в диапазоне около -100..100: dynamics/control/cognition/focus/social."
                    },
                    {
                        "name": "summary.superpower",
                        "type": "string",
                        "description": "Ведущая шкала по формальному правилу max|score|; при конфликте HIGH возможен формат dual_mode_<scale>."
                    },
                    {
                        "name": "summary.quality_score",
                        "type": "number",
                        "description": "Интегральная оценка качества данных 0..100."
                    },
                    {
                        "name": "domain_components",
                        "type": "object",
                        "description": "Нормализованные вклады доменов по шкалам в том же пространстве, что и финальные score. Возможные домены: NUM, MATRIX_DESTINY, ASTRO, HD, TRANSITS, LUNAR, SPACE_WEATHER, RAZIEL."
                    },
                    {
                        "name": "breakdown_short",
                        "type": "object",
                        "description": "Короткое объяснение: топ-положительные и топ-отрицательные факторы по каждой шкале."
                    },
                    {
                        "name": "conflicts",
                        "type": "array",
                        "description": "Доменные конфликты с severity и доказательствами (evidence)."
                    },
                    {
                        "name": "reliability_summary",
                        "type": "object",
                        "description": "Метрики надёжности: simulated/status/missing, канонизация полей, удалённые дубли наблюдений, drift-флаги."
                    },
                    {
                        "name": "model_health",
                        "type": "object",
                        "description": "Диагностика консистентности модели и инвариантов агрегации."
                    }
                ],
                "feature_guidelines": {
                    "title": "Рекомендации по интеграции",
                    "list": [
                        "Всегда храните и проверяйте schema_version, calculation_version и weights_hash: это защита от тихих изменений логики.",
                        "Считайте summary единственным стабильным источником для ранжирования/фильтрации в интерфейсах.",
                        "Показывайте explain по требованию пользователя: это снижает объём трафика и сложность клиента.",
                        "Для матрицы судьбы используйте domain_components.*.MATRIX_DESTINY и breakdown_short с source MATRIX_DESTINY:*; не извлекайте выводы из картинки или порядка узлов.",
                        "Если quality_score низкий, учитывайте reliability_summary перед выводом жёстких рекомендаций.",
                        "Если нужно только темпоральное обновление, используйте response.omit_portrait_payload=true."
                    ]
                },
                "examples": [
                    {
                        "language": "Bash (cURL)",
                        "description": "Полный цикл: create_task с Synthesis++, затем чтение summary и explain.",
                        "code": "# 1) Создание задачи\nTASK=$(curl -s -X POST \"https://digihash.ru/datacollector/api.php?action=create_task\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"X-Calc-Profile: A\" \\\n  -d '{\n    \"api_key\": \"655351024\",\n    \"user\": {\n      \"first_name\": \"Иван\",\n      \"last_name\": \"Иванов\",\n      \"birth_date\": \"1990-01-01\",\n      \"birth_time\": \"12:00\",\n      \"birth_city\": \"Москва\"\n    },\n    \"systems\": [\"forecast\", \"transits\", \"synthesis\"],\n    \"forecast\": {\n      \"period_type\": \"day\",\n      \"period_start_date\": \"2026-02-14\"\n    },\n    \"response\": {\n      \"omit_portrait_payload\": true\n    }\n  }')\n\nREQUEST_ID=$(echo \"$TASK\" | jq -r '.request_id')\n\n# 2) Канонический слой summary\ncurl -s \"https://digihash.ru/datacollector/api.php?action=get_result&request_id=$REQUEST_ID&view=summary\"\n\n# 3) Слой объяснимости explain\ncurl -s \"https://digihash.ru/datacollector/api.php?action=get_result&request_id=$REQUEST_ID&view=explain\""
                    },
                    {
                        "language": "PHP",
                        "description": "Пример опроса до success и безопасного переключения между view=summary и view=explain.",
                        "code": "<?php\n$api = 'https://digihash.ru/datacollector/api.php';\n$requestId = 'task_xxx';\n\nfor ($i = 0; $i < 60; $i++) {\n    sleep(2);\n    $summary = json_decode(file_get_contents($api . '?action=get_result&view=summary&request_id=' . urlencode($requestId)), true);\n\n    if (($summary['status'] ?? '') === 'success') {\n        $scales = $summary['summary']['scales'] ?? [];\n        $superpower = $summary['summary']['superpower'] ?? null;\n\n        // Explain запрашиваем только по требованию\n        $explain = json_decode(file_get_contents($api . '?action=get_result&view=explain&request_id=' . urlencode($requestId)), true);\n        $conflicts = $explain['conflicts'] ?? [];\n\n        print_r(['scales' => $scales, 'superpower' => $superpower, 'conflicts' => count($conflicts)]);\n        exit;\n    }\n\n    if (($summary['status'] ?? '') === 'error') {\n        throw new RuntimeException('Ошибка расчёта: ' . json_encode($summary['error'] ?? null, JSON_UNESCAPED_UNICODE));\n    }\n}\n\nthrow new RuntimeException('Таймаут ожидания результата');\n?>"
                    },
                    {
                        "language": "JavaScript (Fetch)",
                        "description": "Экспорт NDJSON в BI и разбор row_type без привязки к raw_profile.",
                        "code": "async function exportSynthesisNdjson(requestId) {\n  const url = `https://digihash.ru/datacollector/api.php?action=export_result&request_id=${encodeURIComponent(requestId)}&format=ndjson`;\n  const response = await fetch(url);\n  const text = await response.text();\n\n  const rows = text.trim().split('\\n').map(line => JSON.parse(line));\n  const summary = rows.find(r => r.row_type === 'summary');\n  const domainRows = rows.filter(r => r.row_type === 'domain_component');\n  const breakdownRows = rows.filter(r => r.row_type === 'breakdown_item');\n\n  return { summary, domainRows, breakdownRows };\n}"
                    }
                ]
            }
        },
        {
            "id": "05_response_models_1",
            "title": "7. Модели данных: астрология и транзиты",
            "description": "Ключевые структуры astrology/transits и базовые объекты планет/аспектов.",
            "file_name": "doc_05_models_astro.json",
            "content": {
                "title": "6. Модели данных: астрология и транзиты",
                "description": "Раздел описывает ключевые структуры для натальных и транзитных астрологических данных.",
                "common_models": {
                    "title": "Базовые объекты (Models)",
                    "PlanetObject": [
                        {
                            "name": "ecliptic_longitude_deg",
                            "type": "float",
                            "example": "322.6370",
                            "description": "Эклиптическая долгота (0..360)."
                        },
                        {
                            "name": "sign",
                            "type": "string",
                            "example": "aquarius",
                            "description": "Ключ знака зодиака."
                        },
                        {
                            "name": "sign_degree",
                            "type": "integer",
                            "example": "22",
                            "description": "Позиция внутри знака (0..29)."
                        },
                        {
                            "name": "is_retro",
                            "type": "boolean",
                            "example": "false",
                            "description": "Признак ретроградности."
                        },
                        {
                            "name": "hd",
                            "type": "object",
                            "description": "Маппинг Human Design (ворота/линия)."
                        }
                    ]
                },
                "systems_structure": {
                    "title": "Структура модулей astrology/transits",
                    "root": {
                        "schema_version": "string (например 2.2.1)",
                        "description": "Версия схемы верхнего блока systems для legacy-ветки."
                    },
                    "astrology": {
                        "description": "Натальная карта. Источник локации: SubjectContext (данные рождения).",
                        "structure_example": {
                            "status": "ok",
                            "data": {
                                "source": {
                                    "name": "NASA JPL Horizons",
                                    "type": "ephemeris"
                                },
                                "meta": {
                                    "calculated_for": "1981-10-27 04:13:00",
                                    "timezone": "Asia/Krasnoyarsk",
                                    "location_used": {
                                        "context": "subject"
                                    }
                                },
                                "planets": {
                                    "sun": {
                                        "$ref": "PlanetObject"
                                    },
                                    "north_node": {
                                        "$ref": "PlanetObject"
                                    },
                                    "south_node": {
                                        "$ref": "PlanetObject"
                                    }
                                },
                                "aspects": [
                                    {
                                        "p1": "sun",
                                        "p2": "moon",
                                        "aspect": "conjunction",
                                        "actual_angle_deg": 10.66,
                                        "quality_tone": "neutral"
                                    }
                                ]
                            }
                        }
                    },
                    "transits": {
                        "description": "Транзитная карта. Источник локации: TemporalContext (current_location/target_date).",
                        "structure_example": {
                            "status": "ok",
                            "data": {
                                "date": "2026-02-14 09:00:00",
                                "source": {
                                    "name": "NASA JPL Horizons",
                                    "type": "ephemeris"
                                },
                                "planets": {
                                    "sun": {
                                        "$ref": "PlanetObject"
                                    }
                                },
                                "aspects": [
                                    {
                                        "p1": "sun",
                                        "p2": "moon",
                                        "aspect": "sextile"
                                    }
                                ],
                                "meta": {
                                    "location_used": {
                                        "city": "Орел",
                                        "timezone": "Europe/Moscow"
                                    },
                                    "calculated_at_utc": "2026-02-14 09:00:00"
                                }
                            }
                        }
                    }
                },
                "dictionaries": {
                    "title": "Справочники",
                    "planet_keys": [
                        {
                            "key": "sun",
                            "label": "Солнце",
                            "desc": "Сознание, воля, самопрезентация"
                        },
                        {
                            "key": "moon",
                            "label": "Луна",
                            "desc": "Эмоции, реакции, внутренние состояния"
                        },
                        {
                            "key": "north_node",
                            "label": "Северный узел",
                            "desc": "Вектор развития"
                        },
                        {
                            "key": "south_node",
                            "label": "Южный узел",
                            "desc": "Накопленный опыт"
                        }
                    ]
                }
            }
        },
        {
            "id": "06_models_forecast",
            "title": "8. Модели данных: нумерология и прогноз",
            "description": "Структуры numerology/forecast и модель нового hourly-forecast ответа.",
            "file_name": "doc_06_models_forecast.json",
            "content": {
                "title": "7. Р В РЎС™Р В РЎвЂўР В РўвЂР В Р’ВµР В Р’В»Р В РЎвЂ Р В РўвЂР В Р’В°Р В Р вЂ¦Р В Р вЂ¦Р РЋРІР‚в„–Р РЋРІР‚В¦: Р В Р вЂ¦Р РЋРЎвЂњР В РЎВР В Р’ВµР РЋР вЂљР В РЎвЂўР В Р’В»Р В РЎвЂўР В РЎвЂ“Р В РЎвЂР РЋР РЏ Р В РЎвЂ Р В РЎвЂ”Р РЋР вЂљР В РЎвЂўР В РЎвЂ“Р В Р вЂ¦Р В РЎвЂўР В Р’В·",
                "description": "Р В Р’В Р В Р’В°Р В Р’В·Р В РўвЂР В Р’ВµР В Р’В» Р В РЎвЂўР В РЎвЂ”Р В РЎвЂР РЋР С“Р РЋРІР‚в„–Р В Р вЂ Р В Р’В°Р В Р’ВµР РЋРІР‚С™ Р РЋР С“Р РЋРІР‚С™Р РЋР вЂљР РЋРЎвЂњР В РЎвЂќР РЋРІР‚С™Р РЋРЎвЂњР РЋР вЂљР РЋРІР‚в„– Р В РЎВР В РЎвЂўР В РўвЂР РЋРЎвЂњР В Р’В»Р В Р’ВµР В РІвЂћвЂ“ numerology Р В РЎвЂ forecast Р РЋР С“ Р РЋРЎвЂњР РЋРІР‚РЋР В Р’ВµР РЋРІР‚С™Р В РЎвЂўР В РЎВ Р РЋР вЂљР В Р’В°Р В Р’В·Р В РўвЂР В Р’ВµР В Р’В»Р В Р’ВµР В Р вЂ¦Р В РЎвЂР РЋР РЏ Р В РЎвЂ”Р В РЎвЂўР РЋР вЂљР РЋРІР‚С™Р РЋР вЂљР В Р’ВµР РЋРІР‚С™Р В Р вЂ¦Р В РЎвЂўР В РЎвЂ“Р В РЎвЂў Р В РЎвЂ Р В Р вЂ Р РЋР вЂљР В Р’ВµР В РЎВР В Р’ВµР В Р вЂ¦Р В Р вЂ¦Р В РЎвЂўР В РЎвЂ“Р В РЎвЂў Р В РЎвЂќР В РЎвЂўР В Р вЂ¦Р РЋРІР‚С™Р В Р’ВµР В РЎвЂќР РЋР С“Р РЋРІР‚С™Р В Р’В°.",
                "numerology_model": {
                    "description": "Р В РІР‚ВР В Р’В»Р В РЎвЂўР В РЎвЂќ response.systems.numerology.data Р В РЎВР В РЎвЂўР В Р’В¶Р В Р’ВµР РЋРІР‚С™ Р РЋР С“Р В РЎвЂўР В РўвЂР В Р’ВµР РЋР вЂљР В Р’В¶Р В Р’В°Р РЋРІР‚С™Р РЋР Р‰ Р В РЎвЂ”Р В РЎвЂўР РЋР вЂљР РЋРІР‚С™Р РЋР вЂљР В Р’ВµР РЋРІР‚С™Р В Р вЂ¦Р РЋРІР‚в„–Р В Р’Вµ Р В РЎвЂ/Р В РЎвЂР В Р’В»Р В РЎвЂ Р В Р вЂ Р РЋР вЂљР В Р’ВµР В РЎВР В Р’ВµР В Р вЂ¦Р В Р вЂ¦Р РЋРІР‚в„–Р В Р’Вµ Р В Р’В·Р В Р вЂ¦Р В Р’В°Р РЋРІР‚РЋР В Р’ВµР В Р вЂ¦Р В РЎвЂР РЋР РЏ Р В Р вЂ  Р В Р’В·Р В Р’В°Р В Р вЂ Р В РЎвЂР РЋР С“Р В РЎвЂР В РЎВР В РЎвЂўР РЋР С“Р РЋРІР‚С™Р В РЎвЂ Р В РЎвЂўР РЋРІР‚С™ systems Р В РЎвЂ response.omit_portrait_payload.",
                    "fields": [
                        {
                            "name": "life_path",
                            "type": "integer",
                            "example": "2",
                            "desc": "Р В Р’В§Р В РЎвЂР РЋР С“Р В Р’В»Р В РЎвЂў Р В Р’В¶Р В РЎвЂР В Р’В·Р В Р вЂ¦Р В Р’ВµР В Р вЂ¦Р В Р вЂ¦Р В РЎвЂўР В РЎвЂ“Р В РЎвЂў Р В РЎвЂ”Р РЋРЎвЂњР РЋРІР‚С™Р В РЎвЂ (Р В РЎвЂ”Р В РЎвЂўР РЋР вЂљР РЋРІР‚С™Р РЋР вЂљР В Р’ВµР РЋРІР‚С™Р В Р вЂ¦Р В РЎвЂўР В Р’Вµ)."
                        },
                        {
                            "name": "destiny",
                            "type": "integer",
                            "example": "7",
                            "desc": "Р В Р’В§Р В РЎвЂР РЋР С“Р В Р’В»Р В РЎвЂў Р РЋР С“Р РЋРЎвЂњР В РўвЂР РЋР Р‰Р В Р’В±Р РЋРІР‚в„– (Р В РЎвЂ”Р В РЎвЂўР РЋР вЂљР РЋРІР‚С™Р РЋР вЂљР В Р’ВµР РЋРІР‚С™Р В Р вЂ¦Р В РЎвЂўР В Р’Вµ)."
                        },
                        {
                            "name": "personal_year",
                            "type": "integer",
                            "example": "3",
                            "desc": "Р В РЎСџР В Р’ВµР РЋР вЂљР РЋР С“Р В РЎвЂўР В Р вЂ¦Р В Р’В°Р В Р’В»Р РЋР Р‰Р В Р вЂ¦Р РЋРІР‚в„–Р В РІвЂћвЂ“ Р В РЎвЂ“Р В РЎвЂўР В РўвЂ Р В РўвЂР В Р’В»Р РЋР РЏ target_date."
                        },
                        {
                            "name": "personal_month",
                            "type": "integer",
                            "example": "8",
                            "desc": "Р В РЎСџР В Р’ВµР РЋР вЂљР РЋР С“Р В РЎвЂўР В Р вЂ¦Р В Р’В°Р В Р’В»Р РЋР Р‰Р В Р вЂ¦Р РЋРІР‚в„–Р В РІвЂћвЂ“ Р В РЎВР В Р’ВµР РЋР С“Р РЋР РЏР РЋРІР‚В  Р В РўвЂР В Р’В»Р РЋР РЏ target_date."
                        },
                        {
                            "name": "personal_day",
                            "type": "integer",
                            "example": "5",
                            "desc": "Р В РЎСџР В Р’ВµР РЋР вЂљР РЋР С“Р В РЎвЂўР В Р вЂ¦Р В Р’В°Р В Р’В»Р РЋР Р‰Р В Р вЂ¦Р РЋРІР‚в„–Р В РІвЂћвЂ“ Р В РўвЂР В Р’ВµР В Р вЂ¦Р РЋР Р‰ Р В РўвЂР В Р’В»Р РЋР РЏ target_date."
                        },
                        {
                            "name": "chaldean",
                            "type": "object",
                            "desc": "Р В РІР‚СњР В Р вЂ¦Р В Р’ВµР В Р вЂ Р В Р вЂ¦Р В Р’В°Р РЋР РЏ Р В Р вЂ Р В Р’ВµР РЋРІР‚С™Р В РЎвЂќР В Р’В° Р В РўС’Р В Р’В°Р В Р’В»Р В РўвЂР В Р’ВµР В РІвЂћвЂ“Р РЋР С“Р В РЎвЂќР В РЎвЂўР В РІвЂћвЂ“ Р РЋР С“Р В РЎвЂР РЋР С“Р РЋРІР‚С™Р В Р’ВµР В РЎВР РЋРІР‚в„– (Р РЋРІР‚С™Р В Р’ВµР В РЎвЂќР РЋРЎвЂњР РЋРІР‚В°Р В Р’В°Р РЋР РЏ Р В Р’В»Р В РЎвЂўР В РЎвЂќР В Р’В°Р РЋРІР‚В Р В РЎвЂР РЋР РЏ + Р РЋР вЂљР В Р’В°Р РЋР С“Р РЋР С“Р В Р вЂ Р В Р’ВµР РЋРІР‚С™)."
                        },
                        {
                            "name": "vedic",
                            "type": "object",
                            "desc": "Р В РІР‚СњР В Р вЂ¦Р В Р’ВµР В Р вЂ Р В Р вЂ¦Р В Р’В°Р РЋР РЏ Р В Р вЂ Р В Р’ВµР РЋРІР‚С™Р В РЎвЂќР В Р’В° Р В РІР‚в„ўР В Р’ВµР В РўвЂР В РЎвЂР РЋРІР‚РЋР В Р’ВµР РЋР С“Р В РЎвЂќР В РЎвЂўР В РІвЂћвЂ“ Р РЋР С“Р В РЎвЂР РЋР С“Р РЋРІР‚С™Р В Р’ВµР В РЎВР РЋРІР‚в„– (Р РЋРІР‚С™Р В Р’ВµР В РЎвЂќР РЋРЎвЂњР РЋРІР‚В°Р В Р’В°Р РЋР РЏ Р В Р’В»Р В РЎвЂўР В РЎвЂќР В Р’В°Р РЋРІР‚В Р В РЎвЂР РЋР РЏ + Р РЋР вЂљР В Р’В°Р РЋР С“Р РЋР С“Р В Р вЂ Р В Р’ВµР РЋРІР‚С™)."
                        },
                        {
                            "name": "matrix_destiny",
                            "type": "object",
                            "desc": "Р В Р Р‹Р РЋРІР‚С™Р В Р’В°Р РЋР вЂљР РЋРІР‚в„–Р В РІвЂћвЂ“ Р В РЎвЂќР В РЎвЂўР В РЎВР В РЎвЂ”Р В Р’В°Р В РЎвЂќР РЋРІР‚С™Р В Р вЂ¦Р РЋРІР‚в„–Р В РІвЂћвЂ“ Р В Р’В±Р В Р’В»Р В РЎвЂўР В РЎвЂќ Р В РЎВР В Р’В°Р РЋРІР‚С™Р РЋР вЂљР В РЎвЂР РЋРІР‚В Р РЋРІР‚в„– Р РЋР С“Р РЋРЎвЂњР В РўвЂР РЋР Р‰Р В Р’В±Р РЋРІР‚в„–. Р В РЎвЂєР РЋР С“Р РЋРІР‚С™Р В Р’В°Р В Р вЂ Р В Р’В»Р В Р’ВµР В Р вЂ¦ Р В Р’В±Р В Р’ВµР В Р’В· Р В РЎвЂР В Р’В·Р В РЎВР В Р’ВµР В Р вЂ¦Р В Р’ВµР В Р вЂ¦Р В РЎвЂР В РІвЂћвЂ“ Р В РўвЂР В Р’В»Р РЋР РЏ Р В РЎвЂўР В Р’В±Р РЋР вЂљР В Р’В°Р РЋРІР‚С™Р В Р вЂ¦Р В РЎвЂўР В РІвЂћвЂ“ Р РЋР С“Р В РЎвЂўР В Р вЂ Р В РЎВР В Р’ВµР РЋР С“Р РЋРІР‚С™Р В РЎвЂР В РЎВР В РЎвЂўР РЋР С“Р РЋРІР‚С™Р В РЎвЂ."
                        },
                        {
                            "name": "matrix_destiny_v2",
                            "type": "object",
                            "desc": "MatrixDestiny22 v2.1.0: basis, canonical, derived_experimental, meta. РљРѕСЂРЅРµРІС‹Рµ РґСѓР±Р»Рё core/nodes/lines/sectors/age_cycle/activation СѓРґР°Р»РµРЅС‹; canonical вЂ” РѕСЃРЅРѕРІРЅРѕР№ РєРѕРЅС‚СЂР°РєС‚, derived_experimental вЂ” explain-СЃР»РѕР№."
                        }
                    ]
                },
                "matrix_destiny_v2_model": {
                    "description": "matrix_destiny_v2 вЂ” РїРѕСЂС‚СЂРµС‚РЅС‹Р№ API-Р±Р»РѕРє MatrixDestiny22 v2.1.0. РЎС‚Р°СЂС‹Р№ matrix_destiny РЅРµ СѓРґР°Р»СЏРµС‚СЃСЏ. РќРѕРІС‹Р№ РєРѕРЅС‚СЂР°РєС‚ РѕС‡РёС‰РµРЅ РѕС‚ РєРѕСЂРЅРµРІС‹С… РґСѓР±Р»РµР№: РёСЃРїРѕР»СЊР·СѓР№С‚Рµ canonical РґР»СЏ СЃС‚Р°Р±РёР»СЊРЅС‹С… РёРЅС‚РµРіСЂР°С†РёР№ Рё derived_experimental РґР»СЏ РѕР±СЉСЏСЃРЅРµРЅРёР№/Synthesis++.",
                    "contract": {
                        "system_name": "MatrixDestiny22",
                        "version": "2.1.0",
                        "reduction_rule": "ladini_digit_sum_22",
                        "zero_maps_to": 22
                    },
                    "blocks": [
                        {
                            "name": "basis",
                            "description": "РСЃС…РѕРґРЅС‹Рµ РґР°РЅРЅС‹Рµ Рё РїСЂР°РІРёР»Рѕ СЂР°СЃС‡РµС‚Р°: birth_date, birth_time, calendar, arcana_range, reduction_rule=ladini_digit_sum_22, zero_maps_to=22."
                        },
                        {
                            "name": "canonical",
                            "description": "РћС„РёС†РёР°Р»СЊРЅС‹Р№ СЃС‚Р°Р±РёР»СЊРЅС‹Р№ СЃР»РѕР№ v2.1.0. РЎРѕРґРµСЂР¶РёС‚ canonical.core, canonical.age_nodes, canonical.generic_programs, canonical.channels Рё canonical.health_map. Р­С‚Рѕ РѕСЃРЅРѕРІРЅРѕР№ СЃР»РѕР№ РґР»СЏ РІРЅРµС€РЅРёС… РёРЅС‚РµРіСЂР°С†РёР№."
                        },
                        {
                            "name": "canonical.core",
                            "description": "Р‘Р°Р·РѕРІС‹Рµ СЏРєРѕСЂСЏ РјР°С‚СЂРёС†С‹, СЃРѕРІРјРµСЃС‚РёРјС‹Рµ СЃРѕ СЃС‚Р°СЂС‹Рј matrix_destiny: day_arcana, month_arcana, year_arcana, karma_tail_base, center_comfort, sky_line, earth_line. РљР°Р¶РґС‹Р№ СЌР»РµРјРµРЅС‚ СЃРѕРґРµСЂР¶РёС‚ source_formula."
                        },
                        {
                            "name": "canonical.age_nodes",
                            "description": "Р’РѕР·СЂР°СЃС‚РЅС‹Рµ РІРЅРµС€РЅРёРµ СѓР·Р»С‹. РљР°Р¶РґС‹Р№ СѓР·РµР» РёРјРµРµС‚ val Рё source_formula."
                        },
                        {
                            "name": "canonical.generic_programs",
                            "description": "Р РѕРґРѕРІС‹Рµ Р»РёРЅРёРё male_line Рё female_line. РљР°Р¶РґР°СЏ Р»РёРЅРёСЏ СЃРѕРґРµСЂР¶РёС‚ values Рё source_formula."
                        },
                        {
                            "name": "canonical.channels",
                            "description": "РљР°РЅР°Р»С‹ self_search, socialization Рё spiritual_exam. РљР°Р¶РґС‹Р№ РєР°РЅР°Р» СЃРѕРґРµСЂР¶РёС‚ РёС‚РѕРіРѕРІС‹Рµ Р·РЅР°С‡РµРЅРёСЏ Рё source_formula."
                        },
                        {
                            "name": "canonical.health_map",
                            "description": "РљР°СЂС‚Р° Р·РґРѕСЂРѕРІСЊСЏ РїРѕ РѕС‚РґРµР»СЊРЅРѕР№ С„РѕСЂРјСѓР»Рµ canonical-health-map-1.0.0. РљР°Р¶РґР°СЏ СЃС‚СЂРѕРєР°, РІРєР»СЋС‡Р°СЏ total, СЃРѕРґРµСЂР¶РёС‚ source_formula."
                        },
                        {
                            "name": "derived_experimental",
                            "description": "РџСЂРѕРёР·РІРѕРґРЅС‹Р№ СЃР»РѕР№ РґР»СЏ explain Рё Synthesis++: nodes, lines, sectors, age_cycle, interpretation, activation. РћРЅ РЅРµ СЏРІР»СЏРµС‚СЃСЏ РєР°РЅРѕРЅРѕРј."
                        },
                        {
                            "name": "meta",
                            "description": "РњРµС‚Р°РґР°РЅРЅС‹Рµ СЂР°СЃС‡РµС‚Р°: canonical_mode, derived_experimental_mode, experimental_blocks, canonical_blocks, root_aliases_removed, source_mapping, health_map_formula_version."
                        }
                    ],
                    "example": {
                        "system_name": "MatrixDestiny22",
                        "version": "2.1.0",
                        "basis": {
                            "birth_date": "1981-10-27",
                            "birth_time": "04:13:00",
                            "calculation_mode": "portrait",
                            "calendar": "gregorian",
                            "arcana_range": "1..22",
                            "reduction_rule": "ladini_digit_sum_22",
                            "zero_maps_to": 22
                        },
                        "canonical": {
                            "core": {
                                "day_arcana": {
                                    "val": 9,
                                    "source_formula": "day(27) => 2+7=9"
                                },
                                "karma_tail_base": {
                                    "val": 11,
                                    "source_formula": "legacy-compatible karma_tail_base"
                                },
                                "center_comfort": {
                                    "val": 13,
                                    "source_formula": "day_arcana + month_arcana + year_arcana + karma_tail_base => 13"
                                },
                                "sky_line": {
                                    "val": 10
                                },
                                "earth_line": {
                                    "val": 21
                                }
                            },
                            "age_nodes": {
                                "upper_left_outer": {
                                    "val": 19,
                                    "source_formula": {
                                        "raw_expression": "day_arcana + month_arcana",
                                        "operands": [
                                            9,
                                            10
                                        ],
                                        "raw_result": 19,
                                        "normalized_result": 19,
                                        "rule": "ladini_digit_sum_22"
                                    }
                                },
                                "upper_right_outer": {
                                    "val": 11,
                                    "source_formula": {
                                        "raw_expression": "month_arcana + year_arcana",
                                        "operands": [
                                            10,
                                            19
                                        ],
                                        "raw_result": 29,
                                        "normalized_result": 11,
                                        "rule": "ladini_digit_sum_22"
                                    }
                                },
                                "lower_right_outer": {
                                    "val": 3,
                                    "source_formula": {
                                        "raw_expression": "year_arcana + karma_tail_base",
                                        "operands": [
                                            19,
                                            11
                                        ],
                                        "raw_result": 30,
                                        "normalized_result": 3,
                                        "rule": "ladini_digit_sum_22"
                                    }
                                },
                                "lower_left_outer": {
                                    "val": 20,
                                    "source_formula": {
                                        "raw_expression": "karma_tail_base + day_arcana",
                                        "operands": [
                                            11,
                                            9
                                        ],
                                        "raw_result": 20,
                                        "normalized_result": 20,
                                        "rule": "ladini_digit_sum_22"
                                    }
                                }
                            },
                            "generic_programs": {
                                "male_line": {
                                    "values": [
                                        19,
                                        3,
                                        22
                                    ],
                                    "source_formula": {
                                        "raw_expression": "upper_left_outer + lower_right_outer",
                                        "operands": [
                                            19,
                                            3
                                        ],
                                        "raw_result": 22,
                                        "normalized_result": 22,
                                        "rule": "ladini_digit_sum_22"
                                    }
                                },
                                "female_line": {
                                    "values": [
                                        11,
                                        20,
                                        4
                                    ],
                                    "source_formula": {
                                        "raw_expression": "upper_right_outer + lower_left_outer",
                                        "operands": [
                                            11,
                                            20
                                        ],
                                        "raw_result": 31,
                                        "normalized_result": 4,
                                        "rule": "ladini_digit_sum_22"
                                    }
                                }
                            },
                            "channels": {
                                "self_search": {
                                    "sky": 21,
                                    "earth": 10,
                                    "result": 4,
                                    "source_formula": {
                                        "raw_expression": "earth_line + sky_line",
                                        "operands": [
                                            21,
                                            10
                                        ],
                                        "raw_result": 31,
                                        "normalized_result": 4,
                                        "rule": "ladini_digit_sum_22"
                                    }
                                },
                                "socialization": {
                                    "male": 22,
                                    "female": 4,
                                    "result": 8
                                },
                                "spiritual_exam": {
                                    "value": 12
                                }
                            },
                            "health_map": {
                                "sahasrara": {
                                    "physics": 9,
                                    "energy": 10,
                                    "emotions": 19
                                },
                                "total": {
                                    "physics": 8,
                                    "energy": 15,
                                    "emotions": 14,
                                    "source_formula": {
                                        "physics": {
                                            "raw_expression": "sum(health_map.*.physics)",
                                            "operands": [
                                                9,
                                                4,
                                                22,
                                                8,
                                                13,
                                                5,
                                                19
                                            ],
                                            "raw_result": 80,
                                            "normalized_result": 8,
                                            "rule": "ladini_digit_sum_22"
                                        },
                                        "energy": {
                                            "raw_expression": "sum(health_map.*.energy)",
                                            "operands": [
                                                10,
                                                15,
                                                5,
                                                18,
                                                13,
                                                6,
                                                11
                                            ],
                                            "raw_result": 78,
                                            "normalized_result": 15,
                                            "rule": "ladini_digit_sum_22"
                                        },
                                        "emotions": {
                                            "raw_expression": "sum(health_map.*.emotions)",
                                            "operands": [
                                                19,
                                                19,
                                                9,
                                                8,
                                                8,
                                                11,
                                                3
                                            ],
                                            "raw_result": 77,
                                            "normalized_result": 14,
                                            "rule": "ladini_digit_sum_22"
                                        }
                                    }
                                }
                            }
                        },
                        "derived_experimental": {
                            "nodes": "...",
                            "lines": "...",
                            "sectors": "...",
                            "interpretation": "...",
                            "activation": "..."
                        },
                        "meta": {
                            "canonical_mode": "matrix_destiny_22_canonical",
                            "compatibility_goal": "common_calculator_consistency",
                            "health_map_formula_version": "canonical-health-map-1.0.0",
                            "root_aliases_removed": true,
                            "derived_experimental_mode": "non_canonical_explain_layer",
                            "experimental_blocks": [
                                "nodes",
                                "lines",
                                "sectors",
                                "age_cycle",
                                "interpretation",
                                "activation"
                            ],
                            "canonical_blocks": [
                                "core",
                                "age_nodes",
                                "generic_programs",
                                "channels",
                                "health_map"
                            ]
                        }
                    }
                },
                "forecast_model": {
                    "description": "Р В РІР‚ВР В Р’В»Р В РЎвЂўР В РЎвЂќ response.systems.forecast.data Р РЋР С“Р В РЎвЂўР В РўвЂР В Р’ВµР РЋР вЂљР В Р’В¶Р В РЎвЂР РЋРІР‚С™ Р В РЎвЂўР В РЎвЂ”Р В РЎвЂР РЋР С“Р В Р’В°Р В Р вЂ¦Р В РЎвЂР В Р’Вµ Р В РЎвЂ”Р В Р’ВµР РЋР вЂљР В РЎвЂР В РЎвЂўР В РўвЂР В Р’В° Р В РЎвЂ Р В РЎВР В Р’В°Р РЋР С“Р РЋР С“Р В РЎвЂР В Р вЂ  Р В РўвЂР В Р вЂ¦Р В Р’ВµР В РІвЂћвЂ“ (days[]).",
                    "period_fields": [
                        {
                            "name": "type",
                            "type": "string",
                            "values": [
                                "day",
                                "week",
                                "month"
                            ],
                            "description": "Р В РЎС›Р В РЎвЂР В РЎвЂ” Р В Р’В·Р В Р’В°Р В РЎвЂ”Р РЋР вЂљР В РЎвЂўР РЋРІвЂљВ¬Р В Р’ВµР В Р вЂ¦Р В Р вЂ¦Р В РЎвЂўР В РЎвЂ“Р В РЎвЂў Р В РЎвЂ”Р В Р’ВµР РЋР вЂљР В РЎвЂР В РЎвЂўР В РўвЂР В Р’В°."
                        },
                        {
                            "name": "start_date",
                            "type": "string",
                            "example": "2026-02-14",
                            "description": "Р В РІР‚СњР В Р’В°Р РЋРІР‚С™Р В Р’В° Р В Р вЂ¦Р В Р’В°Р РЋРІР‚РЋР В Р’В°Р В Р’В»Р В Р’В° Р В РЎвЂ”Р В Р’ВµР РЋР вЂљР В РЎвЂР В РЎвЂўР В РўвЂР В Р’В° (Р В Р’В»Р В РЎвЂўР В РЎвЂќР В Р’В°Р В Р’В»Р РЋР Р‰Р В Р вЂ¦Р В Р’В°Р РЋР РЏ Р В РўвЂР В Р’В°Р РЋРІР‚С™Р В Р’В° temporal timezone)."
                        },
                        {
                            "name": "end_date",
                            "type": "string",
                            "example": "2026-02-20",
                            "description": "Р В РІР‚СњР В Р’В°Р РЋРІР‚С™Р В Р’В° Р В РЎвЂўР В РЎвЂќР В РЎвЂўР В Р вЂ¦Р РЋРІР‚РЋР В Р’В°Р В Р вЂ¦Р В РЎвЂР РЋР РЏ Р В РЎвЂ”Р В Р’ВµР РЋР вЂљР В РЎвЂР В РЎвЂўР В РўвЂР В Р’В° (Р В Р вЂ Р В РЎвЂќР В Р’В»Р РЋР вЂ№Р РЋРІР‚РЋР В РЎвЂР РЋРІР‚С™Р В Р’ВµР В Р’В»Р РЋР Р‰Р В Р вЂ¦Р В РЎвЂў)."
                        },
                        {
                            "name": "anchor_datetime",
                            "type": "string (ISO-8601)",
                            "example": "2026-02-14T12:00:00+03:00",
                            "description": "Р В РЎвЂєР В РЎвЂ”Р В РЎвЂўР РЋР вЂљР В Р вЂ¦Р РЋРІР‚в„–Р В РІвЂћвЂ“ Р В РЎВР В РЎвЂўР В РЎВР В Р’ВµР В Р вЂ¦Р РЋРІР‚С™ Р РЋР вЂљР В Р’В°Р РЋР С“Р РЋРІР‚РЋР В Р’ВµР РЋРІР‚С™Р В Р’В° Р В Р вЂ  temporal timezone."
                        }
                    ],
                    "day_fields": [
                        {
                            "name": "date",
                            "type": "string (YYYY-MM-DD)",
                            "description": "Р В РІР‚СњР В Р’В°Р РЋРІР‚С™Р В Р’В° Р В РЎвЂќР В РЎвЂўР В Р вЂ¦Р В РЎвЂќР РЋР вЂљР В Р’ВµР РЋРІР‚С™Р В Р вЂ¦Р В РЎвЂўР В РЎвЂ“Р В РЎвЂў Р В РўвЂР В Р вЂ¦Р РЋР РЏ Р В РЎвЂ”Р РЋР вЂљР В РЎвЂўР В РЎвЂ“Р В Р вЂ¦Р В РЎвЂўР В Р’В·Р В Р’В°."
                        },
                        {
                            "name": "numerology",
                            "type": "object",
                            "description": "Р В РІР‚СњР В Р вЂ¦Р В Р’ВµР В Р вЂ Р В Р вЂ¦Р В Р’В°Р РЋР РЏ Р В Р вЂ¦Р РЋРЎвЂњР В РЎВР В Р’ВµР РЋР вЂљР В РЎвЂўР В Р’В»Р В РЎвЂўР В РЎвЂ“Р В РЎвЂР РЋР РЏ, Р В РЎвЂ”Р В Р’ВµР РЋР вЂљР РЋР С“Р В РЎвЂўР В Р вЂ¦Р В Р’В°Р В Р’В»Р РЋР Р‰Р В Р вЂ¦Р РЋРІР‚в„–Р В Р’Вµ Р РЋРІР‚РЋР В РЎвЂР РЋР С“Р В Р’В»Р В Р’В° Р В РЎвЂ matrix_destiny_activation Р В РўвЂР В Р’В»Р РЋР РЏ Р В РўвЂР В Р’В°Р РЋРІР‚С™Р РЋРІР‚в„–."
                        },
                        {
                            "name": "biorhythms",
                            "type": "object",
                            "description": "Р В РІР‚ВР В РЎвЂР В РЎвЂўР РЋР вЂљР В РЎвЂР РЋРІР‚С™Р В РЎВР РЋРІР‚в„– Р В РўвЂР В Р вЂ¦Р РЋР РЏ Р В Р вЂ  Р В РўвЂР В РЎвЂР В Р’В°Р В РЎвЂ”Р В Р’В°Р В Р’В·Р В РЎвЂўР В Р вЂ¦Р В Р’Вµ -100..100."
                        },
                        {
                            "name": "lunar",
                            "type": "object",
                            "description": "Р В РІР‚С”Р РЋРЎвЂњР В Р вЂ¦Р В Р вЂ¦Р РЋРІР‚в„–Р В Р’Вµ Р В РЎвЂ”Р В Р’В°Р РЋР вЂљР В Р’В°Р В РЎВР В Р’ВµР РЋРІР‚С™Р РЋР вЂљР РЋРІР‚в„– Р В РўвЂР В Р вЂ¦Р РЋР РЏ."
                        },
                        {
                            "name": "transits",
                            "type": "object",
                            "description": "Р В РЎС›Р РЋР вЂљР В Р’В°Р В Р вЂ¦Р В Р’В·Р В РЎвЂР РЋРІР‚С™Р В Р вЂ¦Р РЋРІР‚в„–Р В Р’Вµ Р В РЎвЂ”Р В РЎвЂўР В Р’В»Р В РЎвЂўР В Р’В¶Р В Р’ВµР В Р вЂ¦Р В РЎвЂР РЋР РЏ/Р В Р’В°Р РЋР С“Р В РЎвЂ”Р В Р’ВµР В РЎвЂќР РЋРІР‚С™Р РЋРІР‚в„– Р В РўвЂР В Р’В»Р РЋР РЏ Р В РўвЂР В Р вЂ¦Р РЋР РЏ."
                        },
                        {
                            "name": "space_weather",
                            "type": "object",
                            "description": "Р В РЎв„ўР В РЎвЂўР РЋР С“Р В РЎВР В РЎвЂР РЋРІР‚РЋР В Р’ВµР РЋР С“Р В РЎвЂќР В Р’В°Р РЋР РЏ Р В РЎвЂ”Р В РЎвЂўР В РЎвЂ“Р В РЎвЂўР В РўвЂР В Р’В° (Kp Р В РЎвЂ Р В РЎвЂќР В Р’В°Р РЋРІР‚РЋР В Р’ВµР РЋР С“Р РЋРІР‚С™Р В Р вЂ Р В РЎвЂў Р В РўвЂР В Р’В°Р В Р вЂ¦Р В Р вЂ¦Р РЋРІР‚в„–Р РЋРІР‚В¦)."
                        },
                        {
                            "name": "extensions",
                            "type": "object",
                            "description": "Р В РІР‚СњР В РЎвЂўР В РЎвЂ”Р В РЎвЂўР В Р’В»Р В Р вЂ¦Р В РЎвЂР РЋРІР‚С™Р В Р’ВµР В Р’В»Р РЋР Р‰Р В Р вЂ¦Р РЋРІР‚в„–Р В Р’Вµ Р РЋР вЂљР В Р’В°Р РЋР С“Р РЋРІвЂљВ¬Р В РЎвЂР РЋР вЂљР В Р’ВµР В Р вЂ¦Р В РЎвЂР РЋР РЏ (Р В Р вЂ¦Р В Р’В°Р В РЎвЂ”Р РЋР вЂљР В РЎвЂР В РЎВР В Р’ВµР РЋР вЂљ, raziel_wisdom)."
                        },
                        {
                            "name": "meta",
                            "type": "object",
                            "description": "Р В Р Р‹Р В Р’В»Р РЋРЎвЂњР В Р’В¶Р В Р’ВµР В Р’В±Р В Р вЂ¦Р В Р’В°Р РЋР РЏ Р В РЎвЂР В Р вЂ¦Р РЋРІР‚С›Р В РЎвЂўР РЋР вЂљР В РЎВР В Р’В°Р РЋРІР‚В Р В РЎвЂР РЋР РЏ Р В РЎвЂў Р РЋРІР‚С›Р В Р’В°Р В РЎвЂќР РЋРІР‚С™Р В РЎвЂР РЋРІР‚РЋР В Р’ВµР РЋР С“Р В РЎвЂќР В РЎвЂ Р В РЎвЂР РЋР С“Р В РЎвЂ”Р В РЎвЂўР В Р’В»Р РЋР Р‰Р В Р’В·Р В РЎвЂўР В Р вЂ Р В Р’В°Р В Р вЂ¦Р В Р вЂ¦Р В РЎвЂўР В РІвЂћвЂ“ Р В Р’В»Р В РЎвЂўР В РЎвЂќР В Р’В°Р РЋРІР‚В Р В РЎвЂР В РЎвЂ Р В РЎвЂ Р В РЎвЂќР В Р’В°Р РЋРІР‚РЋР В Р’ВµР РЋР С“Р РЋРІР‚С™Р В Р вЂ Р В Р’Вµ Р РЋР вЂљР В Р’В°Р РЋР С“Р РЋРІР‚РЋР В Р’ВµР РЋРІР‚С™Р В Р вЂ¦Р В РЎвЂўР В РЎвЂ“Р В РЎвЂў Р В РўвЂР В Р вЂ¦Р РЋР РЏ."
                        }
                    ],
                    "day_space_weather_fields": [
                        {
                            "name": "status",
                            "type": "string",
                            "example": "ok",
                            "description": "Р В Р Р‹Р РЋРІР‚С™Р В Р’В°Р РЋРІР‚С™Р РЋРЎвЂњР РЋР С“ Р В Р’В±Р В Р’В»Р В РЎвЂўР В РЎвЂќР В Р’В° Р В РЎвЂќР В РЎвЂўР РЋР С“Р В РЎВР В РЎвЂР РЋРІР‚РЋР В Р’ВµР РЋР С“Р В РЎвЂќР В РЎвЂўР В РІвЂћвЂ“ Р В РЎвЂ”Р В РЎвЂўР В РЎвЂ“Р В РЎвЂўР В РўвЂР РЋРІР‚в„– (ok|degraded)."
                        },
                        {
                            "name": "data_quality",
                            "type": "string",
                            "example": "observed",
                            "description": "Р В РЎв„ўР В Р’В°Р РЋРІР‚РЋР В Р’ВµР РЋР С“Р РЋРІР‚С™Р В Р вЂ Р В РЎвЂў Р В РўвЂР В Р’В°Р В Р вЂ¦Р В Р вЂ¦Р РЋРІР‚в„–Р РЋРІР‚В¦: observed | estimated | simulated."
                        },
                        {
                            "name": "kp_index.value",
                            "type": "float",
                            "description": "Р В РЎС›Р В Р’ВµР В РЎвЂќР РЋРЎвЂњР РЋРІР‚В°Р В Р’ВµР В Р’Вµ Р В Р’В·Р В Р вЂ¦Р В Р’В°Р РЋРІР‚РЋР В Р’ВµР В Р вЂ¦Р В РЎвЂР В Р’Вµ Kp."
                        },
                        {
                            "name": "meta.is_simulated",
                            "type": "boolean",
                            "description": "Р В РЎСџР РЋР вЂљР В РЎвЂР В Р’В·Р В Р вЂ¦Р В Р’В°Р В РЎвЂќ fallback-Р В Р’В·Р В Р вЂ¦Р В Р’В°Р РЋРІР‚РЋР В Р’ВµР В Р вЂ¦Р В РЎвЂР РЋР РЏ. Р В РЎСџР РЋР вЂљР В РЎвЂ true Р В РўвЂР В Р’В°Р В Р вЂ¦Р В Р вЂ¦Р РЋРІР‚в„–Р В Р’Вµ Р РЋР С“Р РЋРІР‚РЋР В РЎвЂР РЋРІР‚С™Р В Р’В°Р РЋР вЂ№Р РЋРІР‚С™Р РЋР С“Р РЋР РЏ Р РЋР С“Р В РЎвЂР В РЎВР РЋРЎвЂњР В Р’В»Р В РЎвЂР РЋР вЂљР В РЎвЂўР В Р вЂ Р В Р’В°Р В Р вЂ¦Р В Р вЂ¦Р РЋРІР‚в„–Р В РЎВР В РЎвЂ."
                        },
                        {
                            "name": "meta.source_mode",
                            "type": "string",
                            "example": "observed_or_estimated",
                            "description": "Р В Р’В Р В Р’ВµР В Р’В¶Р В РЎвЂР В РЎВ, Р В Р’В·Р В Р’В°Р В РЎвЂ”Р РЋР вЂљР В РЎвЂўР РЋРІвЂљВ¬Р В Р’ВµР В Р вЂ¦Р В Р вЂ¦Р РЋРІР‚в„–Р В РІвЂћвЂ“ Р В РЎвЂќР В Р’В»Р В РЎвЂР В Р’ВµР В Р вЂ¦Р РЋРІР‚С™Р В РЎвЂўР В РЎВ: allow_simulated | observed_or_estimated | observed_only."
                        }
                    ],
                    "day_meta_fields": [
                        {
                            "name": "location_used.city",
                            "type": "string",
                            "description": "Р В Р’В¤Р В Р’В°Р В РЎвЂќР РЋРІР‚С™Р В РЎвЂР РЋРІР‚РЋР В Р’ВµР РЋР С“Р В РЎвЂќР В РЎвЂ Р В РЎвЂР РЋР С“Р В РЎвЂ”Р В РЎвЂўР В Р’В»Р РЋР Р‰Р В Р’В·Р В РЎвЂўР В Р вЂ Р В Р’В°Р В Р вЂ¦Р В Р вЂ¦Р РЋРІР‚в„–Р В РІвЂћвЂ“ Р В РЎвЂ“Р В РЎвЂўР РЋР вЂљР В РЎвЂўР В РўвЂ Р В РўвЂР В Р’В»Р РЋР РЏ daily-Р В Р вЂ Р РЋРІР‚в„–Р РЋРІР‚РЋР В РЎвЂР РЋР С“Р В Р’В»Р В Р’ВµР В Р вЂ¦Р В РЎвЂР В РІвЂћвЂ“."
                        },
                        {
                            "name": "location_used.lat",
                            "type": "float",
                            "description": "Р В Р РѓР В РЎвЂР РЋР вЂљР В РЎвЂўР РЋРІР‚С™Р В Р’В° Р РЋРІР‚С›Р В Р’В°Р В РЎвЂќР РЋРІР‚С™Р В РЎвЂР РЋРІР‚РЋР В Р’ВµР РЋР С“Р В РЎвЂќР В РЎвЂўР В РІвЂћвЂ“ Р В Р’В»Р В РЎвЂўР В РЎвЂќР В Р’В°Р РЋРІР‚В Р В РЎвЂР В РЎвЂ."
                        },
                        {
                            "name": "location_used.lng",
                            "type": "float",
                            "description": "Р В РІР‚СњР В РЎвЂўР В Р’В»Р В РЎвЂ“Р В РЎвЂўР РЋРІР‚С™Р В Р’В° Р РЋРІР‚С›Р В Р’В°Р В РЎвЂќР РЋРІР‚С™Р В РЎвЂР РЋРІР‚РЋР В Р’ВµР РЋР С“Р В РЎвЂќР В РЎвЂўР В РІвЂћвЂ“ Р В Р’В»Р В РЎвЂўР В РЎвЂќР В Р’В°Р РЋРІР‚В Р В РЎвЂР В РЎвЂ."
                        },
                        {
                            "name": "location_used.timezone",
                            "type": "string",
                            "description": "Р В Р’В¤Р В Р’В°Р В РЎвЂќР РЋРІР‚С™Р В РЎвЂР РЋРІР‚РЋР В Р’ВµР РЋР С“Р В РЎвЂќР В Р’В°Р РЋР РЏ Р РЋРІР‚С™Р В Р’В°Р В РІвЂћвЂ“Р В РЎВР В Р’В·Р В РЎвЂўР В Р вЂ¦Р В Р’В° Р В Р вЂ Р РЋРІР‚в„–Р РЋРІР‚РЋР В РЎвЂР РЋР С“Р В Р’В»Р В Р’ВµР В Р вЂ¦Р В РЎвЂР В РІвЂћвЂ“."
                        }
                    ],
                    "structure_example": {
                        "period": {
                            "type": "week",
                            "start_date": "2026-02-14",
                            "end_date": "2026-02-20",
                            "anchor_datetime": "2026-02-14T12:00:00+03:00"
                        },
                        "days": [
                            {
                                "date": "2026-02-14",
                                "numerology": {
                                    "personal_year": 3,
                                    "personal_month": 8,
                                    "personal_day": 5,
                                    "matrix_destiny_activation": {
                                        "date": "2026-02-14",
                                        "active_arcana": [
                                            5,
                                            8,
                                            14
                                        ],
                                        "matched_nodes": [
                                            "center"
                                        ],
                                        "matched_lines": [
                                            "vertical_line"
                                        ],
                                        "matched_sectors": [
                                            "purpose"
                                        ],
                                        "conflict_nodes": [],
                                        "resonance_score": 0.42,
                                        "state": "resonant"
                                    },
                                    "vedic": [],
                                    "chaldean": []
                                },
                                "biorhythms": {
                                    "physical": 17,
                                    "emotional": -24,
                                    "intellectual": 63
                                },
                                "space_weather": {
                                    "status": "ok",
                                    "data_quality": "estimated",
                                    "kp_index": {
                                        "value": 4,
                                        "unit": "Kp"
                                    },
                                    "meta": {
                                        "is_simulated": false,
                                        "source_mode": "observed_or_estimated"
                                    }
                                },
                                "meta": {
                                    "location_used": {
                                        "city": "Р В РЎвЂєР РЋР вЂљР В Р’ВµР В Р’В»",
                                        "lat": 52.9686,
                                        "lng": 36.0693,
                                        "timezone": "Europe/Moscow"
                                    }
                                }
                            }
                        ]
                    }
                }
            }
        },
        {
            "id": "07_errors_troubleshooting",
            "title": "9. Ошибки и диагностика",
            "description": "Http status codes, внутренние ошибки worker и практические рекомендации.",
            "file_name": "doc_07_errors.json",
            "content": {
                "title": "8. Коды ошибок и решение проблем",
                "description": "API использует HTTP-коды для синхронных ошибок и статусные поля в JSON для асинхронного жизненного цикла задач.",
                "http_status_codes": [
                    {
                        "code": 200,
                        "meaning": "OK",
                        "desc": "Успешный синхронный ответ (например, get_result/get_spec/get_reference)."
                    },
                    {
                        "code": 202,
                        "meaning": "Accepted",
                        "desc": "create_task: задача поставлена в очередь."
                    },
                    {
                        "code": 400,
                        "meaning": "Bad Request",
                        "desc": "Неверный JSON, отсутствует request_id или ошибка валидации обязательных полей."
                    },
                    {
                        "code": 401,
                        "meaning": "Unauthorized",
                        "desc": "api_key отсутствует/невалиден в create_task или не передан для приватного request_id в get_result/export_result."
                    },
                    {
                        "code": 403,
                        "meaning": "Forbidden",
                        "desc": "Передан неверный ключ для приватного request_id или нет доступа к run_worker (не localhost и нет валидного X-Worker-Token)."
                    },
                    {
                        "code": 404,
                        "meaning": "Not Found",
                        "desc": "Задача по request_id не найдена."
                    },
                    {
                        "code": 405,
                        "meaning": "Метод не разрешен",
                        "desc": "Использован неверный HTTP-метод."
                    },
                    {
                        "code": 409,
                        "meaning": "Conflict",
                        "desc": "export_result: задача еще не готова к экспорту."
                    },
                    {
                        "code": 429,
                        "meaning": "Too Many Requests",
                        "desc": "Сработал rate limiter (есть заголовок Retry-After)."
                    },
                    {
                        "code": 500,
                        "meaning": "Internal Server Error",
                        "desc": "Критическая ошибка API-обработчика."
                    }
                ],
                "task_internal_errors": {
                    "description": "Ошибки, которые worker записывает в результат задачи (status=error).",
                    "common_messages": [
                        {
                            "error": "[CRITICAL_EXTERNAL] Ephemeris NASA data unavailable",
                            "cause": "Внешний источник эфемерид недоступен или вернул невалидные данные.",
                            "solution": "Сервис выполняет до 5 попыток с паузами. Если неуспешно — задача завершается ошибкой без частичного результата."
                        },
                        {
                            "error": "[CRITICAL_EXTERNAL] GeoProvider timezone unavailable",
                            "cause": "Не удалось определить таймзону/координаты через внешние geo-сервисы.",
                            "solution": "Проверьте корректность current_location/birth_city и доступность внешних API."
                        },
                        {
                            "error": "Portrait context is missing",
                            "cause": "Поврежденный или неполный portrait-кеш.",
                            "solution": "Пересоздайте задачу; при повторе проверьте целостность portrait-данных на сервере."
                        }
                    ]
                },
                "troubleshooting_faq": [
                    {
                        "problem": "space_weather показывает simulated данные",
                        "diagnosis": "Использован fallback-режим или нет наблюдаемых данных для окна расчета.",
                        "action": "Проверяйте data_quality/meta.is_simulated. Для строгого режима используйте forecast.space_weather_mode=observed_only."
                    },
                    {
                        "problem": "run_worker возвращает 403",
                        "diagnosis": "Это ожидаемо для внешних клиентов без локального доступа/токена.",
                        "action": "Не используйте run_worker из публичного фронта; запуск worker выполняется инфраструктурой сервера."
                    },
                    {
                        "problem": "get_result/export_result возвращает 401 или 403",
                        "diagnosis": "Задача создана приватным ключом и для чтения не передан ключ, либо передан другой ключ.",
                        "action": "Передайте тот же API-ключ через X-API-Key или query api_key, которым создавалась задача."
                    },
                    {
                        "problem": "Задача долго в processing",
                        "diagnosis": "Ожидание внешних источников или тяжелый расчет большого периода.",
                        "action": "Проверьте app.log/worker.log и попробуйте уменьшить состав systems или период forecast."
                    },
                    {
                        "problem": "Экспорт возвращает 409",
                        "diagnosis": "Расчет еще не завершен статусом success.",
                        "action": "Продолжайте polling get_result до success, затем вызывайте export_result."
                    }
                ]
            }
        },
        {
            "id": "08_integration_examples",
            "title": "10. Примеры интеграции",
            "description": "Практические примеры create/get, hourly-forecast, view-режимов и export_result.",
            "file_name": "doc_08_examples.json",
            "content": {
                "title": "9. Примеры интеграции",
                "description": "Базовые примеры create_task, polling get_result, режимов view для synthesis и экспорта NDJSON/CSV. Подробные правила работы с синергией см. в разделе 5.",
                "examples": [
                    {
                        "language": "Bash (cURL)",
                        "description": "Базовый сценарий: create_task + get_result (view=summary).",
                        "code": "# 1) Создать задачу\nRESPONSE=$(curl -s -X POST \"https://digihash.ru/datacollector/api.php?action=create_task\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"X-Calc-Profile: B\" \\\n  -d '{\n    \"api_key\": \"655351024\",\n    \"user\": {\n      \"first_name\": \"Иван\",\n      \"last_name\": \"Иванов\",\n      \"birth_date\": \"1990-01-01\",\n      \"birth_time\": \"12:00\",\n      \"birth_city\": \"Москва\"\n    },\n    \"systems\": [\"forecast\", \"synthesis\"],\n    \"forecast\": {\n      \"period_type\": \"day\",\n      \"period_start_date\": \"2026-02-14\"\n    }\n  }')\n\necho \"$RESPONSE\"\nTASK_ID=$(echo \"$RESPONSE\" | jq -r '.request_id')\n\n# 2) Опрос результата\nsleep 3\ncurl -s \"https://digihash.ru/datacollector/api.php?action=get_result&request_id=$TASK_ID&view=summary\""
                    },
                    {
                        "language": "Bash (cURL)",
                        "description": "Получение explain-режима и экспорт NDJSON.",
                        "code": "# Explain-слой synthesis\ncurl -s \"https://digihash.ru/datacollector/api.php?action=get_result&request_id=task_123&view=explain\"\n\n# Экспорт NDJSON\ncurl -s \"https://digihash.ru/datacollector/api.php?action=export_result&request_id=task_123&format=ndjson\""
                    },
                    {
                        "language": "Bash (cURL)",
                        "description": "Доступ к приватному request_id через заголовок X-API-Key.",
                        "code": "# Приватный get_result\ncurl -s \"https://digihash.ru/datacollector/api.php?action=get_result&request_id=task_private_123&view=summary\" \\\n  -H \"X-API-Key: your_private_key\"\n\n# Приватный export_result\ncurl -s \"https://digihash.ru/datacollector/api.php?action=export_result&request_id=task_private_123&format=ndjson\" \\\n  -H \"X-API-Key: your_private_key\""
                    },
                    {
                        "language": "PHP",
                        "description": "Пример с опросом результата и переключением view.",
                        "code": "<?php\n$apiUrl = 'https://digihash.ru/datacollector/api.php';\n$requestId = 'task_123';\n\nfor ($i = 0; $i < 30; $i++) {\n    sleep(2);\n    $result = json_decode(file_get_contents($apiUrl . '?action=get_result&request_id=' . urlencode($requestId) . '&view=summary'), true);\n\n    if (($result['status'] ?? '') === 'success') {\n        // Для synthesis-задачи это канонический слой summary\n        print_r($result['summary'] ?? []);\n\n        // При необходимости запрашиваем расширенное объяснение\n        $explain = json_decode(file_get_contents($apiUrl . '?action=get_result&request_id=' . urlencode($requestId) . '&view=explain'), true);\n        print_r($explain['domain_components'] ?? []);\n        exit;\n    }\n\n    if (($result['status'] ?? '') === 'error') {\n        throw new RuntimeException('Ошибка worker: ' . json_encode($result['error'] ?? null, JSON_UNESCAPED_UNICODE));\n    }\n}\n\nthrow new RuntimeException('Превышено время ожидания результата');\n?>"
                    },
                    {
                        "language": "JavaScript (Fetch)",
                        "description": "Фронтенд-опрос с view=summary и последующим экспортом csv.",
                        "code": "async function getSynthesisAndExport(requestId) {\n  const base = 'https://digihash.ru/datacollector/api.php';\n\n  const summaryRes = await fetch(`${base}?action=get_result&request_id=${encodeURIComponent(requestId)}&view=summary`);\n  const summary = await summaryRes.json();\n\n  if (summary.status !== 'success') {\n    throw new Error(`Задача еще не готова: ${summary.status}`);\n  }\n\n  const csvRes = await fetch(`${base}?action=export_result&request_id=${encodeURIComponent(requestId)}&format=csv`);\n  const csvText = await csvRes.text();\n  return { summary, csvText };\n}"
                    }
                ]
            }
        },
        {
            "id": "09_response_map",
            "title": "11. Полная карта ответа",
            "description": "Карта полей для async-задач и ссылка на структуру hourly-forecast ответа.",
            "file_name": "doc_09_response_map.json",
            "content": {
                "title": "10. Р СџР С•Р В»Р Р…Р В°РЎРЏ Р С”Р В°РЎР‚РЎвЂљР В° Р С•РЎвЂљР Р†Р ВµРЎвЂљР В°",
                "description": "Р С™Р В°РЎР‚РЎвЂљР В° Р С—Р С•Р В»Р ВµР в„– Р Т‘Р В»РЎРЏ get_result Р С‘ export_result. Р вЂќР В»РЎРЏ synthesis-Р В·Р В°Р Т‘Р В°РЎвЂЎ Р С•РЎРѓР Р…Р С•Р Р†Р Р…Р С•Р в„– РЎР‚Р В°Р В±Р С•РЎвЂЎР С‘Р в„– Р С”Р С•Р Р…РЎвЂљРЎР‚Р В°Р С”РЎвЂљ: view=summary, РЎР‚Р В°РЎРѓРЎв‚¬Р С‘РЎР‚Р ВµР Р…Р С‘Р Вµ: view=explain, Р С•РЎвЂљР В»Р В°Р Т‘Р С”Р В°: view=raw.",
                "response_map_tree": {
                    "status": {
                        "type": "Р РЋРЎвЂљРЎР‚Р С•Р С”Р В°",
                        "desc": "Р РЋРЎвЂљР В°РЎвЂљРЎС“РЎРѓ Р В·Р В°Р Т‘Р В°РЎвЂЎР С‘: pending | processing | success | error"
                    },
                    "request_id": {
                        "type": "Р РЋРЎвЂљРЎР‚Р С•Р С”Р В°",
                        "desc": "ID Р В·Р В°Р Т‘Р В°РЎвЂЎР С‘."
                    },
                    "message": {
                        "type": "Р РЋРЎвЂљРЎР‚Р С•Р С”Р В°",
                        "desc": "Р РЋР С•Р С•Р В±РЎвЂ°Р ВµР Р…Р С‘Р Вµ Р С—РЎР‚Р С•Р С–РЎР‚Р ВµРЎРѓРЎРѓР В° Р Т‘Р В»РЎРЏ pending/processing."
                    },
                    "error": {
                        "type": "Р РЋРЎвЂљРЎР‚Р С•Р С”Р В° | Р С›Р В±РЎР‰Р ВµР С”РЎвЂљ",
                        "desc": "Р С›Р С—Р С‘РЎРѓР В°Р Р…Р С‘Р Вµ Р С•РЎв‚¬Р С‘Р В±Р С”Р С‘ Р Т‘Р В»РЎРЏ status=error."
                    },
                    "view": {
                        "type": "Р РЋРЎвЂљРЎР‚Р С•Р С”Р В°",
                        "desc": "Р В Р ВµР В¶Р С‘Р С synthesis-Р С•РЎвЂљР Р†Р ВµРЎвЂљР В°: summary | explain | raw."
                    },
                    "schema_version": {
                        "type": "Р РЋРЎвЂљРЎР‚Р С•Р С”Р В°",
                        "desc": "Р вЂ™Р ВµРЎР‚РЎРѓР С‘РЎРЏ РЎРЊР С”РЎРѓР С—Р С•РЎР‚РЎвЂљР Р…Р С•Р С–Р С• Р С”Р С•Р Р…РЎвЂљРЎР‚Р В°Р С”РЎвЂљР В° (Р Р…Р В°Р С—РЎР‚Р С‘Р СР ВµРЎР‚ export-1.0.0)."
                    },
                    "calculation_version": {
                        "type": "Р РЋРЎвЂљРЎР‚Р С•Р С”Р В°",
                        "desc": "Р вЂ™Р ВµРЎР‚РЎРѓР С‘РЎРЏ Р Р†РЎвЂ№РЎвЂЎР С‘РЎРѓР В»Р С‘РЎвЂљР ВµР В»РЎРЉР Р…Р С•Р в„– Р В»Р С•Р С–Р С‘Р С”Р С‘ synthesis."
                    },
                    "weights_hash": {
                        "type": "Р РЋРЎвЂљРЎР‚Р С•Р С”Р В°",
                        "desc": "SHA-256 РЎвЂ¦Р ВµРЎв‚¬ Р Р†Р ВµРЎРѓР С•Р Р†/Р С”Р С•Р Р…РЎвЂћР С‘Р С–Р С•Р Р† РЎР‚Р В°РЎРѓРЎвЂЎР ВµРЎвЂљР В°."
                    },
                    "conflict_rules_version": {
                        "type": "Р РЋРЎвЂљРЎР‚Р С•Р С”Р В°",
                        "desc": "Р вЂ™Р ВµРЎР‚РЎРѓР С‘РЎРЏ Р С—РЎР‚Р В°Р Р†Р С‘Р В» Р Т‘Р ВµРЎвЂљР ВµР С”РЎвЂ Р С‘Р С‘ Р С”Р С•Р Р…РЎвЂћР В»Р С‘Р С”РЎвЂљР С•Р Р†."
                    },
                    "normalization_version": {
                        "type": "Р РЋРЎвЂљРЎР‚Р С•Р С”Р В°",
                        "desc": "Р вЂ™Р ВµРЎР‚РЎРѓР С‘РЎРЏ Р С—РЎР‚Р В°Р Р†Р С‘Р В» Р Р…Р С•РЎР‚Р СР В°Р В»Р С‘Р В·Р В°РЎвЂ Р С‘Р С‘ Р С—РЎР‚Р С‘Р В·Р Р…Р В°Р С”Р С•Р Р†."
                    },
                    "calc_profile_id": {
                        "type": "Р РЋРЎвЂљРЎР‚Р С•Р С”Р В°",
                        "desc": "Р ВР Т‘Р ВµР Р…РЎвЂљР С‘РЎвЂћР С‘Р С”Р В°РЎвЂљР С•РЎР‚ calc profile: A Р С‘Р В»Р С‘ B."
                    },
                    "date": {
                        "type": "Р РЋРЎвЂљРЎР‚Р С•Р С”Р В° (YYYY-MM-DD)",
                        "desc": "Р вЂќР В°РЎвЂљР В° РЎР‚Р В°РЎРѓРЎвЂЎР ВµРЎвЂљР В°/РЎРЊР С”РЎРѓР С—Р С•РЎР‚РЎвЂљР В°."
                    },
                    "summary": {
                        "type": "Р С›Р В±РЎР‰Р ВµР С”РЎвЂљ",
                        "desc": "Р С™РЎР‚Р В°РЎвЂљР С”Р С‘Р в„– Р С”Р В°Р Р…Р С•Р Р…Р С‘РЎвЂЎР ВµРЎРѓР С”Р С‘Р в„– Р В±Р В»Р С•Р С” synthesis. Р вЂќР С•РЎРѓРЎвЂљРЎС“Р С—Р ВµР Р… Р Р† view=summary Р С‘ view=explain.",
                        "children": {
                            "scales": {
                                "type": "Р С›Р В±РЎР‰Р ВµР С”РЎвЂљ",
                                "desc": "Р СџРЎРЏРЎвЂљРЎРЉ РЎв‚¬Р С”Р В°Р В» synthesis (РЎвЂЎР С‘РЎРѓР В»Р В° Р Р† Р Т‘Р С‘Р В°Р С—Р В°Р В·Р С•Р Р…Р Вµ Р С—РЎР‚Р С‘Р СР ВµРЎР‚Р Р…Р С• -100..100)."
                            },
                            "superpower": {
                                "type": "Р РЋРЎвЂљРЎР‚Р С•Р С”Р В°",
                                "desc": "Р В¤Р С•РЎР‚Р СР В°Р В»РЎРЉР Р…Р С• Р С•Р С—РЎР‚Р ВµР Т‘Р ВµР В»Р ВµР Р…Р Р…Р В°РЎРЏ Р Р†Р ВµР Т‘РЎС“РЎвЂ°Р В°РЎРЏ РЎв‚¬Р С”Р В°Р В»Р В° (Р С‘Р В»Р С‘ dual_mode_*)."
                            },
                            "quality_score": {
                                "type": "Р В§Р С‘РЎРѓР В»Р С•",
                                "desc": "Р РЋР Р†Р С•Р Т‘Р Р…РЎвЂ№Р в„– Р С—Р С•Р С”Р В°Р В·Р В°РЎвЂљР ВµР В»РЎРЉ Р С”Р В°РЎвЂЎР ВµРЎРѓРЎвЂљР Р†Р В° Р Т‘Р В°Р Р…Р Р…РЎвЂ№РЎвЂ¦ 0..100."
                            },
                            "conflicts_count": {
                                "type": "Р В¦Р ВµР В»Р С•Р Вµ",
                                "desc": "Р С™Р С•Р В»Р С‘РЎвЂЎР ВµРЎРѓРЎвЂљР Р†Р С• Р Т‘Р ВµРЎвЂљР ВµР С”РЎвЂљР С‘РЎР‚Р С•Р Р†Р В°Р Р…Р Р…РЎвЂ№РЎвЂ¦ Р С”Р С•Р Р…РЎвЂћР В»Р С‘Р С”РЎвЂљР С•Р Р†."
                            }
                        }
                    },
                    "health": {
                        "type": "Р С›Р В±РЎР‰Р ВµР С”РЎвЂљ",
                        "desc": "Р С›Р С—Р ВµРЎР‚Р В°РЎвЂ Р С‘Р С•Р Р…Р Р…РЎвЂ№Р Вµ Р СР ВµРЎвЂљРЎР‚Р С‘Р С”Р С‘ РЎР‚Р В°РЎРѓРЎвЂЎР ВµРЎвЂљР В°.",
                        "children": {
                            "analysis_time_ms": {
                                "type": "Р В¦Р ВµР В»Р С•Р Вµ",
                                "desc": "Р вЂ™РЎР‚Р ВµР СРЎРЏ Р В°Р Р…Р В°Р В»Р С‘Р В·Р В° Р Р† Р СР С‘Р В»Р В»Р С‘РЎРѓР ВµР С”РЎС“Р Р…Р Т‘Р В°РЎвЂ¦."
                            },
                            "memory_peak_mb": {
                                "type": "Р В§Р С‘РЎРѓР В»Р С•",
                                "desc": "Р СџР С‘Р С”Р С•Р Р†Р С•Р Вµ Р С—Р С•РЎвЂљРЎР‚Р ВµР В±Р В»Р ВµР Р…Р С‘Р Вµ Р С—Р В°Р СРЎРЏРЎвЂљР С‘ Р Р† MB."
                            },
                            "observations_used": {
                                "type": "Р В¦Р ВµР В»Р С•Р Вµ",
                                "desc": "Р С™Р С•Р В»Р С‘РЎвЂЎР ВµРЎРѓРЎвЂљР Р†Р С• Р Р…Р В°Р В±Р В»РЎР‹Р Т‘Р ВµР Р…Р С‘Р в„–, РЎР‚Р ВµР В°Р В»РЎРЉР Р…Р С• Р Р†Р С•РЎв‚¬Р ВµР Т‘РЎв‚¬Р С‘РЎвЂ¦ Р Р† РЎР‚Р В°РЎРѓРЎвЂЎР ВµРЎвЂљРЎвЂ№."
                            },
                            "observations_total": {
                                "type": "Р В¦Р ВµР В»Р С•Р Вµ",
                                "desc": "Р С›Р В±РЎвЂ°Р ВµР Вµ РЎвЂЎР С‘РЎРѓР В»Р С• Р С‘Р В·Р Р†Р В»Р ВµРЎвЂЎР ВµР Р…Р Р…РЎвЂ№РЎвЂ¦ Р Р…Р В°Р В±Р В»РЎР‹Р Т‘Р ВµР Р…Р С‘Р в„–."
                            },
                            "aggregation_drift_detected": {
                                "type": "Р вЂРЎС“Р В»Р ВµР Р†Р С•",
                                "desc": "Р СџРЎР‚Р С‘Р В·Р Р…Р В°Р С” Р Т‘РЎР‚Р ВµР в„–РЎвЂћР В° Р СР ВµР В¶Р Т‘РЎС“ РЎвЂћР С‘Р Р…Р В°Р В»РЎРЉР Р…Р С•Р в„– РЎв‚¬Р С”Р В°Р В»Р С•Р в„– Р С‘ Р Т‘Р С•Р СР ВµР Р…Р Р…РЎвЂ№Р СР С‘ Р С”Р С•Р СР С—Р С•Р Р…Р ВµР Р…РЎвЂљР В°Р СР С‘."
                            }
                        }
                    },
                    "domain_components": {
                        "type": "Р С›Р В±РЎР‰Р ВµР С”РЎвЂљ",
                        "desc": "Р вЂќР С•РЎРѓРЎвЂљРЎС“Р С—Р Р…Р С• Р Р† view=explain: Р Р…Р С•РЎР‚Р СР В°Р В»Р С‘Р В·Р С•Р Р†Р В°Р Р…Р Р…РЎвЂ№Р Вµ Р Т‘Р С•Р СР ВµР Р…Р Р…РЎвЂ№Р Вµ Р С”Р С•Р СР С—Р С•Р Р…Р ВµР Р…РЎвЂљРЎвЂ№ Р С—Р С• РЎв‚¬Р С”Р В°Р В»Р В°Р С."
                    },
                    "breakdown_short": {
                        "type": "Р С›Р В±РЎР‰Р ВµР С”РЎвЂљ",
                        "desc": "Р вЂќР С•РЎРѓРЎвЂљРЎС“Р С—Р Р…Р С• Р Р† view=explain: РЎвЂљР С•Р С—-3 Р С—Р С•Р В»Р С•Р В¶Р С‘РЎвЂљР ВµР В»РЎРЉР Р…РЎвЂ№РЎвЂ¦ Р С‘ Р С•РЎвЂљРЎР‚Р С‘РЎвЂ Р В°РЎвЂљР ВµР В»РЎРЉР Р…РЎвЂ№РЎвЂ¦ РЎвЂћР В°Р С”РЎвЂљР С•РЎР‚Р С•Р Р† Р С—Р С• Р С”Р В°Р В¶Р Т‘Р С•Р в„– РЎв‚¬Р С”Р В°Р В»Р Вµ."
                    },
                    "conflicts": {
                        "type": "Р СљР В°РЎРѓРЎРѓР С‘Р Р†[Р С›Р В±РЎР‰Р ВµР С”РЎвЂљ]",
                        "desc": "Р вЂќР С•РЎРѓРЎвЂљРЎС“Р С—Р Р…Р С• Р Р† view=explain: Р С”Р С•Р Р…РЎвЂћР В»Р С‘Р С”РЎвЂљРЎвЂ№ РЎРѓ evidence."
                    },
                    "reliability_summary": {
                        "type": "Р С›Р В±РЎР‰Р ВµР С”РЎвЂљ",
                        "desc": "Р вЂќР С•РЎРѓРЎвЂљРЎС“Р С—Р Р…Р С• Р Р† view=explain: РЎР‚Р В°РЎРѓРЎв‚¬Р С‘РЎР‚Р ВµР Р…Р Р…РЎвЂ№Р в„– Р С•РЎвЂљРЎвЂЎР ВµРЎвЂљ Р С—Р С• Р Р…Р В°Р Т‘Р ВµР В¶Р Р…Р С•РЎРѓРЎвЂљР С‘ Р Т‘Р В°Р Р…Р Р…РЎвЂ№РЎвЂ¦."
                    },
                    "model_health": {
                        "type": "Р С›Р В±РЎР‰Р ВµР С”РЎвЂљ",
                        "desc": "Р вЂќР С•РЎРѓРЎвЂљРЎС“Р С—Р Р…Р С• Р Р† view=explain: Р С‘Р Р…Р Р†Р В°РЎР‚Р С‘Р В°Р Р…РЎвЂљРЎвЂ№/РЎРѓР С•Р С–Р В»Р В°РЎРѓР С•Р Р†Р В°Р Р…Р Р…Р С•РЎРѓРЎвЂљРЎРЉ Р СР С•Р Т‘Р ВµР В»Р С‘."
                    },
                    "raw_profile": {
                        "type": "Р С›Р В±РЎР‰Р ВµР С”РЎвЂљ",
                        "desc": "Р вЂќР С•РЎРѓРЎвЂљРЎС“Р С—Р Р…Р С• Р Р† view=raw: Р С—Р С•Р В»Р Р…РЎвЂ№Р в„– Р С—РЎР‚Р С•РЎвЂћР С‘Р В»РЎРЉ synthesis (Р Т‘Р В»РЎРЏ Р С•РЎвЂљР В»Р В°Р Т‘Р С”Р С‘)."
                    },
                    "systems": {
                        "type": "Р С›Р В±РЎР‰Р ВµР С”РЎвЂљ",
                        "desc": "Р вЂ™Р ВµРЎвЂљР С”Р В° Р Т‘Р В»РЎРЏ Р В·Р В°Р Т‘Р В°РЎвЂЎ Р В±Р ВµР В· synthesis."
                    },
                    "systems.numerology.data.matrix_destiny_v2": {
                        "type": "Р С›Р В±РЎР‰Р ВµР С”РЎвЂљ",
                        "desc": "MatrixDestiny22 v2.1.0: basis, canonical, derived_experimental, meta. Корневые дубли core/nodes/lines/sectors/age_cycle/activation удалены из контракта."
                    },
                    "systems.forecast.data.days[].numerology.matrix_destiny_activation": {
                        "type": "Р С›Р В±РЎР‰Р ВµР С”РЎвЂљ",
                        "desc": "Р вЂќР Р…Р ВµР Р†Р Р…Р В°РЎРЏ Р В°Р С”РЎвЂљР С‘Р Р†Р В°РЎвЂ Р С‘РЎРЏ Р СР В°РЎвЂљРЎР‚Р С‘РЎвЂ РЎвЂ№ РЎРѓРЎС“Р Т‘РЎРЉР В±РЎвЂ№ Р Р…Р В° target_date: active_arcana, matched_nodes, matched_lines, matched_sectors, conflict_nodes, resonance_score, state."
                    },
                    "domain_components.*.MATRIX_DESTINY": {
                        "type": "Р В§Р С‘РЎРѓР В»Р С•",
                        "desc": "Р вЂ™Р С”Р В»Р В°Р Т‘ Р СР В°РЎвЂљРЎР‚Р С‘РЎвЂ РЎвЂ№ РЎРѓРЎС“Р Т‘РЎРЉР В±РЎвЂ№ Р Р† Synthesis++ explain. Р вЂќР С•Р СР ВµР Р… Р Т‘Р С•Р В±Р В°Р Р†Р В»РЎРЏР ВµРЎвЂљРЎРѓРЎРЏ Р С•РЎвЂљР Т‘Р ВµР В»РЎРЉР Р…Р С• Р С•РЎвЂљ NUM."
                    },
                    "warnings": {
                        "type": "Р СљР В°РЎРѓРЎРѓР С‘Р Р†[Р РЋРЎвЂљРЎР‚Р С•Р С”Р В°]",
                        "desc": "Р вЂњР В»Р С•Р В±Р В°Р В»РЎРЉР Р…РЎвЂ№Р Вµ Р С—РЎР‚Р ВµР Т‘РЎС“Р С—РЎР‚Р ВµР В¶Р Т‘Р ВµР Р…Р С‘РЎРЏ worker-Р В° (Р ВµРЎРѓР В»Р С‘ Р ВµРЎРѓРЎвЂљРЎРЉ)."
                    },
                    "systems.numerology.data.matrix_destiny_v2.version": {
                        "type": "РЎС‚СЂРѕРєР°",
                        "desc": "Р’РµСЂСЃРёСЏ MatrixDestiny22. Р”Р»СЏ РЅРѕРІРѕРіРѕ РєР°РЅРѕРЅРёС‡РµСЃРєРѕРіРѕ РєРѕРЅС‚СЂР°РєС‚Р° Р·РЅР°С‡РµРЅРёРµ СЂР°РІРЅРѕ 2.1.0."
                    },
                    "systems.numerology.data.matrix_destiny_v2.canonical": {
                        "type": "РћР±СЉРµРєС‚",
                        "desc": "РћС„РёС†РёР°Р»СЊРЅС‹Р№ СЃС‚Р°Р±РёР»СЊРЅС‹Р№ СЃР»РѕР№ MatrixDestiny22 v2.1.0. РћСЃРЅРѕРІРЅРѕР№ РёСЃС‚РѕС‡РЅРёРє РґР»СЏ РІРЅРµС€РЅРёС… РёРЅС‚РµРіСЂР°С†РёР№ Рё Р°СѓРґРёС‚Р° Р·РЅР°С‡РµРЅРёР№."
                    },
                    "systems.numerology.data.matrix_destiny_v2.canonical.core": {
                        "type": "РћР±СЉРµРєС‚",
                        "desc": "Р‘Р°Р·РѕРІС‹Рµ СЏРєРѕСЂСЏ, СЃРѕРІРјРµСЃС‚РёРјС‹Рµ СЃ legacy matrix_destiny: day_arcana, month_arcana, year_arcana, karma_tail_base, center_comfort, sky_line, earth_line."
                    },
                    "systems.numerology.data.matrix_destiny_v2.canonical.age_nodes": {
                        "type": "РћР±СЉРµРєС‚",
                        "desc": "Р’РѕР·СЂР°СЃС‚РЅС‹Рµ РІРЅРµС€РЅРёРµ СѓР·Р»С‹ upper_left_outer, upper_right_outer, lower_right_outer, lower_left_outer."
                    },
                    "systems.numerology.data.matrix_destiny_v2.canonical.generic_programs": {
                        "type": "РћР±СЉРµРєС‚",
                        "desc": "Р РѕРґРѕРІС‹Рµ Р»РёРЅРёРё male_line Рё female_line СЃ РєР°РЅРѕРЅРёС‡РµСЃРєРёРјРё Р·РЅР°С‡РµРЅРёСЏРјРё Рё source_formula."
                    },
                    "systems.numerology.data.matrix_destiny_v2.canonical.channels": {
                        "type": "РћР±СЉРµРєС‚",
                        "desc": "РљР°РЅР°Р»С‹ self_search, socialization, spiritual_exam. Р’ self_search sky Р±РµСЂРµС‚СЃСЏ РёР· earth_line, earth Р±РµСЂРµС‚СЃСЏ РёР· sky_line."
                    },
                    "systems.numerology.data.matrix_destiny_v2.canonical.health_map": {
                        "type": "РћР±СЉРµРєС‚",
                        "desc": "РљР°СЂС‚Р° Р·РґРѕСЂРѕРІСЊСЏ РїРѕ РЅРµР·Р°РІРёСЃРёРјРѕР№ С„РѕСЂРјСѓР»Рµ canonical-health-map-1.0.0: sahasrara, ajna, vishuddha, anahata, manipura, svadhisthana, muladhara, total."
                    },
                    "systems.numerology.data.matrix_destiny_v2.derived_experimental": {
                        "type": "РћР±СЉРµРєС‚",
                        "desc": "РџСЂРѕРёР·РІРѕРґРЅС‹Р№ СЃР»РѕР№ РґР»СЏ explain Рё Synthesis++: nodes, lines, sectors, interpretation, activation. РќРµ СЏРІР»СЏРµС‚СЃСЏ РєР°РЅРѕРЅРёС‡РµСЃРєРёРј РёСЃС‚РѕС‡РЅРёРєРѕРј Р±Р°Р·РѕРІС‹С… Р·РЅР°С‡РµРЅРёР№."
                    },
                    "systems.numerology.data.matrix_destiny_v2.meta.canonical_mode": {
                        "type": "РЎС‚СЂРѕРєР°",
                        "desc": "Р РµР¶РёРј РєР°РЅРѕРЅРёС‡РµСЃРєРѕРіРѕ СЂР°СЃС‡РµС‚Р°. РћР¶РёРґР°РµРјРѕРµ Р·РЅР°С‡РµРЅРёРµ: matrix_destiny_22_canonical."
                    },
                    "systems.numerology.data.matrix_destiny_v2.meta.health_map_formula_version": {
                        "type": "РЎС‚СЂРѕРєР°",
                        "desc": "Р’РµСЂСЃРёСЏ С„РѕСЂРјСѓР»С‹ РєР°СЂС‚С‹ Р·РґРѕСЂРѕРІСЊСЏ. РўРµРєСѓС‰РµРµ Р·РЅР°С‡РµРЅРёРµ: canonical-health-map-1.0.0."
                    },
                    "systems.numerology.data.matrix_destiny_v2.canonical.age_nodes.*.source_formula": {
                        "type": "Объект",
                        "desc": "Формула расчета канонического возрастного узла."
                    },
                    "systems.numerology.data.matrix_destiny_v2.canonical.generic_programs.*.source_formula": {
                        "type": "Объект",
                        "desc": "Формула расчета канонической родовой линии."
                    },
                    "systems.numerology.data.matrix_destiny_v2.canonical.channels.*.source_formula": {
                        "type": "Объект",
                        "desc": "Формула расчета канонического канала."
                    },
                    "systems.numerology.data.matrix_destiny_v2.canonical.health_map.*.source_formula": {
                        "type": "Объект",
                        "desc": "Формула расчета строки карты здоровья. Есть и у total."
                    },
                    "systems.numerology.data.matrix_destiny_v2.derived_experimental.age_cycle": {
                        "type": "Объект",
                        "desc": "Возрастной контур в производном explain-слое."
                    },
                    "systems.numerology.data.matrix_destiny_v2.meta.derived_experimental_mode": {
                        "type": "Строка",
                        "desc": "Явный признак, что derived_experimental не является каноном. Ожидаемое значение: non_canonical_explain_layer."
                    },
                    "systems.numerology.data.matrix_destiny_v2.meta.experimental_blocks": {
                        "type": "Массив[Строка]",
                        "desc": "Список блоков derived_experimental."
                    },
                    "systems.numerology.data.matrix_destiny_v2.meta.canonical_blocks": {
                        "type": "Массив[Строка]",
                        "desc": "Список блоков canonical."
                    },
                    "systems.numerology.data.matrix_destiny_v2.meta.root_aliases_removed": {
                        "type": "Булево",
                        "desc": "true означает, что корневые дубли core/nodes/lines/sectors/age_cycle/activation удалены."
                    }
                },
                "synthesis_usage": {
                    "title": "Р С™Р В°Р С” РЎР‚Р В°Р В±Р С•РЎвЂљР В°РЎвЂљРЎРЉ РЎРѓ РЎРѓР С‘Р Р…РЎвЂљР ВµР В·Р С•Р С, Р В° Р Р…Р Вµ РЎРѓ РЎРѓРЎвЂ№РЎР‚РЎвЂ№Р СР С‘ Р Т‘Р В°Р Р…Р Р…РЎвЂ№Р СР С‘",
                    "list": [
                        "Р ВРЎРѓР С—Р С•Р В»РЎРЉР В·РЎС“Р в„–РЎвЂљР Вµ summary Р С”Р В°Р С” Р С•РЎРѓР Р…Р С•Р Р†Р Р…Р С•Р в„– Р С‘Р Р…РЎвЂљР ВµРЎР‚РЎвЂћР ВµР в„–РЎРѓ Р Т‘Р В»РЎРЏ UI Р С‘ Р В°Р Р†РЎвЂљР С•Р СР В°РЎвЂљР С‘РЎвЂЎР ВµРЎРѓР С”Р С‘РЎвЂ¦ Р С‘Р Р…РЎвЂљР ВµР С–РЎР‚Р В°РЎвЂ Р С‘Р в„–.",
                        "Р ВРЎРѓР С—Р С•Р В»РЎРЉР В·РЎС“Р в„–РЎвЂљР Вµ explain Р Т‘Р В»РЎРЏ Р С•Р В±РЎР‰РЎРЏРЎРѓР Р…Р ВµР Р…Р С‘РЎРЏ Р С—РЎР‚Р С‘РЎвЂЎР С‘Р Р… РЎР‚Р ВµР В·РЎС“Р В»РЎРЉРЎвЂљР В°РЎвЂљР В° Р С‘ Р В°Р Р…Р В°Р В»Р С‘Р В·Р В° Р С”Р С•Р Р…РЎвЂћР В»Р С‘Р С”РЎвЂљР С•Р Р†.",
                        "Р СњР Вµ РЎРѓРЎвЂљРЎР‚Р С•Р в„–РЎвЂљР Вµ Р С—РЎР‚Р С•Р Т‘-Р С”Р С•Р Р…РЎвЂљРЎР‚Р В°Р С”РЎвЂљ Р Р…Р В° raw_profile: РЎРЊРЎвЂљР С• Р Р†Р Р…РЎС“РЎвЂљРЎР‚Р ВµР Р…Р Р…Р С‘Р в„– Р С•РЎвЂљР В»Р В°Р Т‘Р С•РЎвЂЎР Р…РЎвЂ№Р в„– РЎРѓР В»Р С•Р в„–.",
                        "Р вЂќР В»РЎРЏ BI Р С‘ Р С•РЎвЂљРЎвЂЎР ВµРЎвЂљР Р…Р С•РЎРѓРЎвЂљР С‘ Р С‘РЎРѓР С—Р С•Р В»РЎРЉР В·РЎС“Р в„–РЎвЂљР Вµ export_result (ndjson/csv) РЎРѓ row_type.",
                        "Р СџР С•РЎв‚¬Р В°Р С–Р С•Р Р†Р В°РЎРЏ Р С—РЎР‚Р В°Р С”РЎвЂљР С‘Р С”Р В° Р С‘Р Р…РЎвЂљР ВµР С–РЎР‚Р В°РЎвЂ Р С‘Р С‘ Р Р†РЎвЂ№Р Р…Р ВµРЎРѓР ВµР Р…Р В° Р Р† Р С•РЎвЂљР Т‘Р ВµР В»РЎРЉР Р…РЎвЂ№Р в„– РЎР‚Р В°Р В·Р Т‘Р ВµР В» Р’В«5. Р В Р В°Р В±Р С•РЎвЂљР В° РЎРѓ Synthesis++ (IPSM v2)Р’В»."
                    ]
                },
                "examples": {
                    "export_ndjson_rows": {
                        "description": "Р СћР С‘Р С—РЎвЂ№ РЎРѓРЎвЂљРЎР‚Р С•Р С” NDJSON Р Р† export_result.",
                        "payload": [
                            {
                                "row_type": "summary",
                                "request_id": "task_abc",
                                "date": "2026-02-14",
                                "calculation_version": "ipsm-2.0.0",
                                "weights_hash": "...",
                                "scales": {
                                    "focus": 31.9
                                },
                                "superpower": "focus",
                                "quality_score": 87.4
                            },
                            {
                                "row_type": "domain_component",
                                "request_id": "task_abc",
                                "date": "2026-02-14",
                                "scale": "social",
                                "domain": "ASTRO",
                                "component": 12.3
                            },
                            {
                                "row_type": "breakdown_item",
                                "request_id": "task_abc",
                                "date": "2026-02-14",
                                "scale": "cognition",
                                "sign": "positive",
                                "rank": 1,
                                "domain": "TRANSITS",
                                "source": "sun_aquarius",
                                "json_path": "systems.forecast.days[0].transits.planets.sun.sign",
                                "contribution": 18.4,
                                "weight": 0.84,
                                "reliability": 1
                            }
                        ]
                    }
                }
            }
        }
    ]
}