Commit Graph

328 Commits

Author SHA1 Message Date
zuevav d975957335 Безопасность: fail-closed auth (H1), доверенный прокси для IP (H2), CSRF на /order (M2)
По результатам security-аудита (docs, run-1). Три верифицированные находки.

H1 (HIGH) — fail-open аутентификация. loadUsers() при ошибке чтения/парсинга
users.json молча возвращал пустой стор → authOpen() считал это первичной
настройкой → после удаления first-run файла весь /admin отдавался без входа.
Теперь: постоянный маркер configured (пишется при создании первого админа и
бэкфиллится при загрузке валидного стора); authOpen() открыт только на реально
свежей системе; при пустом/битом сторе на настроенной системе — 503 и блокировка
до восстановления файла (authLockedOut). Тест TestAuthFailClosed (4 сценария).

H2 (HIGH) — интернет-слой доверял клиентскому X-Forwarded-For/X-Real-IP, что
позволяло обойти лимит входа по IP и травить аудит. Теперь заголовкам доверяем
только от доверенного прокси (по умолчанию loopback; расширяется
BJ_TRUSTED_PROXIES), из XFF берём правый элемент. Исправлено и в Go-модуле
(modules/lk/security.go), и в PHP-ретрансляторе. Тесты TestClientIPTrust (Go) и
прогон логики PHP.

M2 (MEDIUM) — POST /order (поручение на списание бумаг) не проверял CSRF, в
отличие от /login и /impersonate. Добавлен csrfOK (форма уже несла токен).
Тест TestOrderCSRF.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 21:25:35 +03:00
zuevav 9273fc492c Уведомление об авторизации анализа (честный барьер-намерение, не техзащита)
По просьбе о «запрете анализа с кодом». Технического замка от анализа не бывает
(анализ — чтение, не запуск; секрет в коде читаем; встроенные инструкции ИИ
считают недоверенными данными). Поэтому вместо placebo-заглушки — честное
уведомление: NOTICE-AI-ANALYSIS.md, машиночитаемая метка .ai-analysis-policy,
баннер в cmd/bj-server/main.go. Кооперативные ИИ-инструменты его уважают и
останавливаются; юридически фиксирует осознанное нарушение. Прямо помечено, что
это НЕ техническая преграда — стойкость дают garble (fsql), build-tag
internaldocs и договор.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 20:57:13 +03:00
zuevav cdbeb15730 Аудит: пункт 2 решён селективным garble (пакет fsql)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 20:30:00 +03:00
zuevav 7ce4c2c79f Защита рецептов: SQL DEPO/SPECTRE/QUIK вынесен в пакет fsql под garble
Реализация варианта B из аудита защиты знаний. Прямой garble всего bj-server
ломает html/template (он обращается к полям структур по имени, garble их
переименовывает). Решение — селективная обфускация: GOGARBLE обфусцирует ТОЛЬКО
пакет с секретами, шаблоны и обработчики не затрагиваются.

95 SQL-запросов к DEPO/SPECTRE/QUIK и трансферным таблицам FTV_M2M вынесены из
lkgateway в отдельный пакет internal/lkgateway/fsql как переменные (именно var,
не const: const компилятор вставил бы обратно в необфусцируемый пакет, и
шифрование бы не сработало — проверено). Сами обработчики, типы и параметры
sql.Named остались на месте; пакет держит только строки запросов.

build-release.sh собирает bj-server с `GOGARBLE=.../fsql garble -literals`
(нужен отдельный SDK go1.26 — модуль-кэшный тулчейн garble не подходит); если
garble/go1.26 не найдены — обычная сборка с предупреждением.

Проверено на реальном garble-бинаре (запускается, /admin и страницы на
структурах работают): рецепт чтения чужих систем из бинаря исчез —
OD_RESTS 13→0, OD_WIRING 5→0, OD_TURNS 1→0, OD_BALANCES 3→0, D_B_CONTRACTS 1→0,
OD_CLIENTS_PORTS 10→0, DepoLimits/MoneyLimits →0. Остаток FTV_M2M — упоминания
имён таблиц в операторских embed-шаблонах и логах, не сам рецепт.

Стенд собран обычной сборкой (без garble) — трассировки остаются читаемыми.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 20:29:47 +03:00
zuevav 47f5015c3f Аудит: результаты п.1 (справка вынесена) и п.2 (garble ломает html/template)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 20:14:37 +03:00
zuevav fcded5fe17 Справка: технические страницы только в нашей сборке (build-tag internaldocs)
Из клиентской сборки убрана проектная документация, читавшаяся прямым `strings`:
архитектура обмена с НРД, протокол событий bj↔bj2depo (FTV_M2M, 41 КБ), схема
базы, криптография, QUIK МНП. Это самая крупная и самая дешёвая утечка знаний —
её не нужно было даже декомпилировать.

Файлы перенесены в web/templates/internal/ (выпадают из общего embed-глоба) и
встраиваются только при `go build -tags internaldocs` (internaldocs_on.go).
По умолчанию (клиентский релиз, build-release.sh) страницы заменяются заглушкой
«доступно на портале» (internaldocs_off.go); ссылки на них в индексе справки
показываются под {{if internalDocs}}. Операторские страницы (ручной ввод, робот,
внешние системы, API ЛК) остаются — они нужны на месте.

Клиентская сборка: -27 тыс. символов внутренней документации, «Согласовано
10.09», «Для программиста Fancy», «как устроен обмен» → 0 совпадений.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 20:05:06 +03:00
zuevav e186ff7e76 Аудит: что из дистрибутива читается и как защищать знания
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 19:52:16 +03:00
zuevav 560c39da18 Обновления: кнопка «Обновить» показывает настоящий результат, устаревшие данные не предлагаются
Жалоба со стенда: в «Обновлениях» висит ЛК 0.2.0, нажимаешь «Обновить» —
ничего не происходит. На деле обновление уходило в фон и падало («манифест
HTTP 404: релизов в канале нет» — стенд на канале stable, релизы выкладываются
в beta), а отказ оседал в незаметной строке «Последняя проверка».

- Модули обновляются на месте и во flash показывается фактический результат;
  в фон уходит только обновление ядра, где ответа установщика всё равно не
  дождаться (bj-server перезапускается раньше).
- Строка результата при отказе показывается предупреждением, а не серым текстом.
- Если последняя проверка не удалась, кнопки установки скрыты, у версии —
  пояснение «нажмите „Проверить обновления“»: предлагать установку по данным
  неудачной проверки нельзя.
- Версии запоминаются вместе с каналом (components_channel); при смене канала
  прошлые данные забываются — они относились к другому каналу.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 19:39:09 +03:00
zuevav 55f523e1ed Документация: что проверено в образе установки и что проверить на ВМ
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 19:31:38 +03:00
zuevav 414227796b Настройка: состояние служб ядра и модулей с перезапуском из админки
Модули работают отдельными службами (bj-npr, bj-quikexport, bj-lk), и когда
служба лежит, раздел модуля отвечает ошибкой связи, а администратору
предлагалось идти в консоль за systemctl status. Теперь в разделе «Обновления»
карточка «Службы»: состояние каждой службы, с какого времени, причина отказа
и кнопка «Перезапустить».

Состояние читаем обычным systemctl show — прав не требует. Перезапуск делает
root-демон bj-keymedia (тот же канал, что у установки обновлений) по закрытому
списку служб: чужую службу и сам демон отсюда не тронуть.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 19:28:58 +03:00
zuevav 510a34b7bc Кабинет: курсы ЦБ, история стоимости портфеля, быстрые операции, контакты в профиле
Курсы валют. Оценивать замещающие и еврооблигации по курсу из копии учётной
системы было нельзя: в DEPO он от 31.05.2026, в SPECTRE — от 18.07.2026.
Берём официальный курс Банка России (открытый XML, без ключа — тем же каналом
пользуется Инвест-хаб) и складываем по дням в lk.fx_rates: без интернета
кабинет считает по последнему известному курсу, а не отказывается оценивать.
Источник переключается в настройках («Данные кабинета»), там же кнопка
«Обновить курсы сейчас». Портфель БР-719: 560,3 млн ₽ против 522 млн по
старому курсу.

История стоимости. Ни QUIK, ни SPECTRE её не хранят, поэтому раз в день после
закрытия торгов считаем стоимость каждого портфеля по экспорту QUIK и пишем
строку в lk.portfolio_daily (257 портфелей за 14 секунд). Кабинет рисует по
ним график на странице портфеля — SVG собирается на сервере, скриптов в
кабинете по-прежнему нет. Режим по умолчанию — «автоматически»: ведём, если
настроен экспорт QUIK, потому что задним числом историю не восстановить.

Операции. Связка «JOIN OD_RESTS ON sr.ID = CASE WHEN w.D_REST IN (…)»
заставляла SQL Server разбирать список счетов на каждой строке журнала
проводок: год данных читался 6–7 секунд. Обе стороны проводки выбираются
заранее двумя ветвями UNION ALL, индексы IX_WIRING_D_REST_WIRDATE и
IX_WIRING_K_REST_WIRDATE отрабатывают поиском — 89 мс на тех же 64 строках.
Период по умолчанию вернули к году, ответ кэшируется на пять минут.

Профиль: почта, телефон и прошлый вход из анкеты — клиент видит, куда с ним
свяжется депозитарий, и заметит устаревшие данные. Правка только через
менеджера. Заказ документов из кабинета убран совсем (форма была убрана
раньше, теперь нет и обработчика).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 19:25:18 +03:00
zuevav 683f516d07 Кабинет: поиск клиентов с подсказками, чистая страница документов, ширина настроек
Поиск клиентов (режим сотрудника):
- поле поиска вынесено наверх страницы, рядом «Найти» и «Сбросить»;
- браузер сам подсказывает выпадающим списком по мере ввода — договоры
  депозитария отдаются страницей в <datalist> (скриптов в кабинете нет,
  CSP остаётся строгой), список кэшируется в ядре на 10 минут;
- по запросу фильтруются и учётки кабинета, и договоры депозитария,
  под формой показывается, сколько найдено;
- шаблон LIKE экранируется, чтобы % и _ в номере договора означали себя.

Документы: убраны пустое табло, «Мои заявки» и форма заказа документа —
остался список готовых документов депозитария и пояснение, куда обращаться.

Настройка: колонка сетки больше не растягивается широкой таблицей
(min-width:0), у страницы пропал горизонтальный ползунок.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 18:45:54 +03:00
zuevav 4b80d030ab Кабинет: номер договора в шапке, дата данных — в углу блока портфеля, ФИО и договор в профиле
- в верхней панели вместо названия организации — «Личный кабинет» и номер договора;
  справа остаётся только имя клиента
- строка «клиент / договор / данные на» из блока портфеля убрана; дата среза — мелкой
  строкой в правом верхнем углу блока
- в профиле под именем показан номер договора
- «Клиенты» в меню видны сотруднику, только пока он не открыл кабинет клиента: в кабинете
  для возврата есть баннер
- операции по умолчанию за три месяца, а не за год: запрос к учёту заметно легче

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 18:26:46 +03:00
zuevav 13b051106f Настройки: поля кабинета не разъезжаются — подпись, ввод и пояснение каждое со своей строки
На странице настроек label не блочный, поэтому подпись, поле и пояснение вставали в одну
строку и текст обтекал ввод. Добавлен класс поля .fld (сетка) и применён в карточках
«Кабинет клиента», «Кабинет на этом сервере» и «ЕСИА Финанс».

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 18:22:09 +03:00
zuevav 20f05f924b Кабинет: номер договора без ФИО, шапка — отдельные поля «клиент / договор / данные на»
В учётной системе номер договора хранится вместе с ФИО («БР-719 Аминов Вячеслав Маркович»),
из-за чего имя показывалось дважды. В кабинет отдаём номер отдельно от имени; в шапке
портфеля вместо строки через точки — подписанные поля.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 18:18:58 +03:00
zuevav 1136a1c46f Тест кабинета: блок денег не дублирует структуру для рублей
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 18:17:17 +03:00
zuevav 9712b4feda Кабинет: верная оценка валютных выпусков и читаемые числа
- prices.go: у выпуска берётся валюта номинала (FaceUnit); «замещающие» и еврооблигации
  котируются в процентах от валютного номинала, поэтому тело переводится в рубли по курсу,
  НКД экспорт отдаёт уже в рублях. Без курса оценка не выдумывается
- lkfx.go: официальные курсы валют из учётной системы (OD_VALUES_RATES, MARKET=0; DEPO,
  затем SPECTRE — берём свежее), кэш на час; дата курса показывается под таблицей
- БР-719 онлайн: было 17 млн ₽ (валютные считались рублёвыми), стало 522 млн ₽ — сходится
  с архивом брокерского учёта (НОВАТЭК 001Р-02: 162,65 млн против 162,32 млн на дату среза)
- вёрстка: отступ между числовыми колонками (числа больше не слипаются), больше воздуха
  между показателями в шапке, кнопка «Новое поручение» компактнее, цены от 10 — два знака
- структура портфеля: плитки с долей и суммой вместо строки в одну линию; блок денег
  показывается, только когда валют несколько

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 18:15:38 +03:00
zuevav e37d0839eb Кабинет: подписи структуры портфеля во множественном числе
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 16:04:02 +03:00
zuevav c757f2f977 Кабинет: купон с неопределённой ставкой — подпись
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 16:03:23 +03:00
zuevav c32f399acc Кабинет: структура портфеля и ближайшие выплаты за 90 дней (купоны, оферты, погашения, дивиденды)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 16:02:48 +03:00
zuevav c32df3752e Кабинет: операции — даты периода по-русски, свежие сверху
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 15:58:20 +03:00
zuevav 68e1153cb2 Кабинет: архив не старше копии учёта (с пометкой), карточка бумаги без депозитарных реквизитов
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 15:56:48 +03:00
zuevav e7344d8121 Вопросы программисту Fancy о частичном исполнении пакета M2M (события по строке)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 15:52:47 +03:00
zuevav 284c92dd0b Тесты кабинета: имя клиента в ответе портфеля
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 15:45:22 +03:00
zuevav 02fabb483d Кабинет клиента: портфель как у брокера — «Онлайн» по QUIK, «Архив» на дату и операции по SPECTRE
- lkclient.go: договор → код QUIK (БР-1545 → BR1545, +OUT), договор → D_B_CONTRACTS SPECTRE
- lkonline.go: позиции DepoLimits (T2, свежая строка на счёт), средняя цена покупки, деньги
  MoneyLimits по валютам, цены и P&L; стоимость, доли
- lkarchive.go: портфель на дату по остаткам OD_RESTS (REG_3 = договор, раздел 39, счета
  50/51/52/55 и 58.01/58.02; 58.05 НКД не показываем) с откатом по OD_TURNS после даты
  (индекс REST+WIRDATE, знак TYPE_ проверен: сумма оборотов = остаток); оценка по котировке
  OD_VALUES_RATES ≤ 90 дней (в рублях за бумагу), иначе балансовая; операции из OD_WIRING
  (покупка/продажа/ввод/вывод/погашение/конвертация, продажа — по счёту ВЫРУЧКА) и
  пополнения/выводы денег; рецепт — InvestControl Hub (build_portfolio_base, deals_report)
- API: /api/lk/portfolio2?view=online|archive&date=, /api/lk/ops (сделки + выплаты дохода);
  без клиента в QUIK онлайн падает на брокерский учёт за сегодня
- кабинет: разделы Портфель (вкладки Онлайн/Архив с датой), Операции, Поручения, Документы,
  Профиль; депозитарные реестр и доходы из клиентского вида убраны (/portfolio → /,
  /income → /operations); проверено на БР-704 и БР-1545
- настройка Fancy.SpectreDatabase (по умолчанию BJ_SPECTRE_DATA)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 15:44:53 +03:00
zuevav 05d02f22e6 Кабинет: логотип ведёт на табло; сотрудник без открытого клиента с табло попадает в список клиентов
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 15:00:25 +03:00
zuevav ca1358b138 Тест кабинета для просмотра на порту ядра
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 14:50:48 +03:00
zuevav 3760c1f1dd Кабинет клиента на этом сервере для просмотра: включается в настройках, отдельный порт (:8098), куки без Secure только для этого слушателя
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 14:50:19 +03:00
zuevav e3e85fdf09 Инструкции: раздел настроек называется «Кабинет клиента»
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 14:46:45 +03:00
zuevav bdaef4dc39 Настройки: «Кабинет клиента» (наш модуль) и «ЕСИА Финанс» (внешняя платформа) — отдельные разделы
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 14:46:20 +03:00
zuevav 4f4f70c530 Входящий: наш отказ по переводу — красная плашка, а не зелёная
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 14:43:46 +03:00
zuevav ad13defee0 Справка по ручному вводу: без обязательных отметок, удаление черновика, предел по остатку
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 14:40:08 +03:00
zuevav d2024b44ca Ручной ввод: без обязательных галок, удаление черновика, запрет количества больше остатка; отказ НРД по поручению — красным
- ручных отметок перед отправкой нет: автор виден по учётной записи, клиент/счёт/остаток/
  бумага проверены сверкой с DEPO при сохранении; блокировка в QUIK — необязательно,
  по умолчанию не требуется (модуль неторговых поручений сейчас не используется)
- «Удалить черновик» в карточке (POST /admin/manual/{id}/delete), только для черновиков
- количество не больше остатка на торговом разделе: проверка в форме (по выбранной бумаге)
  и на сервере при сохранении (по счёту DEPO) — поручение с превышением не сохраняется
- отчёт MS010 с отказом: orderResponse.Rejected, OutgoingDeal.Rejected; шаг «Операция
  завершена отказом» и бейдж — красные в карточках исходящего и входящего; онлайн-статус
  «поручение 16 завершено отказом НРД»

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 14:39:24 +03:00
zuevav b9da2ca0ff Справка по ручному вводу: без номера поручения, одна кнопка сохранения со сверкой, выбор участника, онлайн-статус и ссылка в журнал
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 14:27:39 +03:00
zuevav 44eb10008c gofmt journal.go
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 14:23:30 +03:00
zuevav d4ed44ac2a Журнал: ответы НРД ищутся только по сделкам в работе; завершённые помечены «не проверяется»
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 14:23:14 +03:00
zuevav 05154898f7 Журнал: индекс пакетов-ответов ИШ одним проходом (кэш 3 с), поиск по номерам поручений в памяти
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 14:22:05 +03:00
zuevav 1c2ba3285a Журнал: кэш разбора пакетов ИШ и черновиков MF010 по времени изменения — обход каталога не перечитывает файлы
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 14:21:05 +03:00
zuevav ae491052e6 Журнал: черновики поручений 16 — одним обходом каталога с кэшем 5 с, а не по обходу на строку
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 14:18:34 +03:00
zuevav 46e55e1277 Журнал: онлайн-статус «чего ждёт заявка», ссылка из ручного ввода в журнал, правки формы
- livestatus.go: одна фраза состояния для исходящих (сделка M2M + черновик/подача/MS010
  поручения 16) и входящих (наше решение → поручение 16/1); признак «в работе»
- строки журналов и карточки показывают её и обновляют по /admin/journal/live каждые 8 с,
  пока заявка в работе; завершённые и отклонённые не опрашиваются
- ручной ввод: у отправленного поручения ссылка «в журнале →» и тот же онлайн-статус;
  вид документа занимает две колонки
- выбор участника: по ИНН и коду с кнопки, а не по номеру строки; Enter выбирает только
  при единственном совпадении

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 11:55:39 +03:00
zuevav 7ac41c0335 Ручной ввод M2M: без номера поручения (присваивает учётная система), одна кнопка «Сохранить и сверить с DEPO»
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 11:44:06 +03:00
zuevav f1c5cc0bda Ручной ввод M2M: короче подпись ИНН принимающего
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 11:42:39 +03:00
zuevav cf8776dfd1 Ручной ввод M2M: поля строки на одной линии, убран счёт клиента у принимающего
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 11:41:39 +03:00
zuevav 17d8ec3988 Обновления из файла для закрытого контура: пакет с портала → проверка подписи → ядро, потом модули
- release: пакет обновления (ExtractBundle/ReadStagedManifest/WriteBundle), Artifact.MinCore,
  план блокирует модуль, которому нужно ядро новее, чем будет после установки
- bj-release: модули получают min_core = версия релиза
- настройки → Обновления: «Обновить из файла» (zip до 2 ГБ), фон как у сетевого обновления,
  причина блокировки в таблице компонентов

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 11:27:23 +03:00
zuevav 5bafd60df6 Шапка: служебные разделы в меню пользователя, статус НРД и время друг над другом
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 11:20:51 +03:00
zuevav b4b4788035 Баннер режима разработки в шапке с личным выключателем
Пока лицензия разрешает режим разработки, в шапке висит баннер; нажатие выключает режим визуально для этого пользователя и включает обратно. В шаблонах .DevMode заменён на devOn.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 11:18:27 +03:00
zuevav 054222d154 Кабинет: страницы собирает ядро, на хостинге — ретранслятор (Go и PHP)
- modules/lk: конверт запроса/ответа (PageRequest/PageResponse), ServeEnvelope — тот же
  обработчик страниц внутри ядра; клиент к API внутри процесса (Config.Local/LocalKey);
  режим ретранслятора (Config.Relay, BJ_RENDER=core, выбор в установщике и lk.json)
- ядро: встроенный кабинет (lkcabinet.go), POST /api/lk/render для прямого режима,
  цикл режима ожидания выполняет конверты страниц; API через ретранслятор недостижимо
- PHP-ретранслятор для обычного хостинга (modules/lk/relay-php: index.php, .htaccess,
  README): установщик в браузере, прямой режим через curl, режим ожидания через очередь
  в SQLite (BEGIN IMMEDIATE, busy_timeout), конфиг в bj-lk-data рядом с сайтом или в
  data под .htaccess; архив со страницы настроек (/admin/setup/lk/relay-php.zip)
- настройки: карточка НПР/УДС перенесена из раздела «Лицензия» в «Экспорт QUIK»;
  кнопка «Обновить с сервера лицензий» видна при любом ключе
- инструкция /admin/help/lk: два варианта размещения, шаги для PHP-хостинга
- тесты: TestLKRelayRendersInCore (оба режима), TestLKPHPRelayAgentMode (настоящий PHP
  против цикла ядра, PHP_BIN), проверка безопасности через PHP-ретранслятор 34/34

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 11:15:29 +03:00
zuevav f51414269d Настройки: ключ кабинета показывается целиком — закрытый контур, нужен при переустановке кабинета
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-18 09:42:58 +03:00
zuevav 222d48e740 Кабинет: веб-установщик и управление пользователями в ядре
- установщик в самом кабинете: до настройки любая страница ведёт в /install; три шага —
  проверка сервера (каталог данных, https), связь с ядром (режим, адрес, ключ; связь
  проверяется до сохранения, в режиме ожидания страница ждёт подключения ядра),
  администратор кабинета (заводится в ядре через /api/lk/admin/bootstrap, только пока
  администраторов нет); настройки в data/lk.json 0600, окружение перекрывает файл;
  после установки установщик закрыт
- настройки кабинета можно менять на ходу: Server за мьютексом, один mux на всё время
- ключ модуля больше не кладётся в архив: его вводят в установщике; на странице настроек
  ключ показан целиком 10 минут после создания, потом маска
- ядро: карточка «Пользователи кабинета» в настройках — список, заведение, смена пароля
  (гасит сессии), блокировка, права сотрудника, разрешение поручений, удаление; письма
  не отправляются
- инструкция /admin/help/lk дополнена шагами установщика и разделом о подходящем хостинге
- тесты: TestInstaller, TestNotConfigured, TestSetupPageLKUsersAndLink; установщик
  проверен вживую вторым экземпляром против боевого ядра

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-18 09:30:47 +03:00
zuevav e1bf7c440f Отчёт по кабинету: безопасность, режим ожидания, покрытие данных и сверка с типовым набором брокеров
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-17 23:48:54 +03:00