О проекте
Команда: Ainalym
Кейс HackAlem.ai: Логистика — Электрокомплект · ekt.kz
Стадия: Доведённый продукт
Задача кейса: Автоматический расчёт заказов поставщикам для пополнения склада, с утверждением менеджером
Суть
«Финансовая ОС» для закупок: по 12 выгрузкам Электрокомплекта считает рекомендуемые заказы поставщикам IEK/System Electric с обоснованием, очередью утверждения менеджером, обязательствами 30/70 и экспортом в 1С.
Как устроено
Выгрузки xlsx партнёра ETL-ом грузятся в SQLite (3 909 артикулов, 248 915 строк продаж). Детерминированный движок computeNeed (decimal.js) по каждому артикулу: исключает разовые документы по порогу, восстанавливает спрос в месяцы дефицита, строит прогноз с сезонностью (своей или поставщика) и ростом на горизонте L+R, вычитает остаток и товар в пути, добавляет страховой запас и кратность. Агент-воркер пересчитывает только затронутые событиями ленты артикулы, пишет журнал; LLM (типизированные решения через Vercel AI Gateway/OpenAI/rules/replay) готовит черновики писем поставщику и сводки, есть голосовой помощник на Realtime-сессии. Заказ утверждается по версии, экспортируется в xlsx/csv и файл для 1С.
Ключевые решения
- сезонный индекс
- компенсация дефицита (stockout)
- исключение разовых документов по порогу
- страховой запас
- кратность/MOQ
- event-driven пересчёт агентом
- экспорт в 1С
- Realtime voice tools
Метрики
npm run check: passed=335 failed=0; scenario.mjs 11×PASS; ETL ≈7 с на 3 909 артикулов
Особенности
Огромный объём (636 коммитов) за счёт параллельных «линий» AI-агентов с файлами handoff/closeout; README честно маркирует каждую возможность как подтверждённую или «ожидается» со ссылкой на TASK_MAP. Интересна лента событий мира: ответ поставщика о частичной отгрузке превращается в предложение разделить/ускорить заказ, а утверждение создаёт денежные обязательства.
Стек
TypeScript · Next.js · SQLite · decimal.js · vitest · Docker
Модели
OpenAI · Vercel AI Gateway · OpenAI Realtime
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-d8ff09f7-ainalym.
README
README.mdAinalym — Автоматический расчёт заказов поставщикам для пополнения склада
Кейс HackAlem AI (трек «Логистика», партнёр ТОО «Электрокомплект», ekt.kz). Ниже — только то, что подтверждается текущим репозиторием. Статус каждой возможности с временем проверки (UTC) — в docs/TASK_MAP.md; README не утверждает ничего сверх этой таблицы.
Состояние README: v2.3 (финальная), основа
main@8d00ac4, наблюдение 2026-09-23 12:24Z; числа API в разделе 8 (шаги 4–9) — чистый клон230b038, 12:00Z; шаги разделов 7–8 пройдены на чистом клоне этого коммита без ключей. Разделы, помеченные «ожидается», описывают контракт (docs/CONTRACTS.md), а не работающий код; они обновляются по мере слияния веток.
1. Название
Ainalym — финансовая операционная система для торгового бизнеса. Агенты ведут коммерческий цикл. Вы принимаете решения. Ainalym is a financial operations OS for trading businesses. Agents run the commercial cycle. You decide.
«Ainalym» по-казахски — «полный круг». Первая вертикаль — кейс «Автоматический расчёт заказов поставщикам для пополнения склада»: агенты считают, что и сколько заказать у каждого поставщика, по всем источникам данных компании, объясняют каждое число, а утверждает заказ только менеджер по закупу.
2. Проблема и для кого
Для кого. Менеджер отдела закупок дистрибьютора электротехники (партнёр — ТОО «Электрокомплект», поставщики IEK и System Electric, склад Алматы). Второй пользователь — финансовый руководитель: ему важно, сколько денег заказ заморозит и когда они уйдут поставщику.
Проблема. Сейчас потребность считается вручную в Excel, редко и не в реальном времени. Итог — излишки по одним позициям и дефицит по другим одновременно, а разовые крупные продажи (в том числе одному клиенту) раздувают «среднее» и тянут закупку вверх. Пример на данных партнёра — docs/FINANCIAL_EXAMPLE.md (появляется вместе с документами соавтора).
Ценность. Меньше денег в лишнем запасе, меньше дефицита и упущенных продаж, регулярная закупка по объяснимому расчёту.
Почему сейчас. 10 февраля 2026 года на расширенном заседании правительства президент поставил задачу оптимизировать таможенные процедуры с помощью цифровых подходов и искусственного интеллекта без потери контроля. Ainalym не заменяет государственные системы - он готовит для них согласованные данные и делает официальный импорт понятным процессом для предпринимателя: от заказа поставщику до принятого на склад товара и итоговой себестоимости в учёте.
3. Что реализовано
Наблюдение: 2026-09-23 12:24Z, main @ 8d00ac4, чистый клон без ключей. Подтверждено кодом и проверками:
- данные: 12 выгрузок партнёра (
fixtures/partner/) → SQLite командойnpm run etl(≈ 7 с): 3 909 артикулов, 248 915 строк продаж, 313 строк товара в пути, 1 591 месяц дефицита; текущий остаток на 22.09.2026 (SE — «Свободный остаток», IEK — остаток на начало сентября минус отгрузки сентября); - расчёт M1–M5 на данных партнёра:
node scripts/scenario.mjs→ 11 строк[PASS](M1, M1-active, M1-source, M2, M2-peak, M3, M4, M5-full, M5, Money, World);POST /api/calc/runпо поставщику или категории → рекомендации по каждому артикулу с обоснованием (GET /api/recommendations), предложение «Заказ поставщику …» в очереди (GET /api/queue,/api/proposals/:id/approve|reject); - движок (
src/domain/engine.ts): сезонность и рост, компенсация дефицита, исключение разовых документов, страховой запас, кратность, срочность, обоснование с числами; параметры поставщиков (/api/params); - заказы и деньги: черновик заказа по поставщику, утверждение по версии, обязательства 30 % / 70 %, экспорт
GET /api/orders/:id/export.xlsx|csvи файл для 1С (/api/peers/onec-export/:po_id) с ключом «Номенклатура.Код» (код 1С); деньги по поставщикам без выдуманной себестоимости для IEK (GET /api/money); - агенты и лента: события (
/api/world/feed|play|compose, пресеты жюри) применяются один раз; воркер пересчитывает только затронутые артикулы и пишет журнал (/api/agent/ledger,/api/agent/runs); ответ поставщика о частичной отгрузке или задержке превращается в предложение разделить или ускорить заказ (раздел 4, «Ответ поставщика»); пульсGET /api/today, состояниеGET /api/state, меткиGET /api/modes; - AI: типизированные решения
jev(TypeSafe → Vercel AI Gateway) /openai/rules/ воспроизведение; черновики письма поставщику и сводки расчёта (/api/drafts); голос — Realtime-сессия и инструменты (/api/voice/*) и текстовый путь/api/assistant/message, работающий без ключа; - экраны: одна оболочка из девяти разделов — Сегодня, Закупки, Заказы, Документы, Поставщики, Товары, Деньги, События, Настройки, ИИ-Помощник (раздел «Экраны» ниже); корень
/ведёт на «Сегодня»; - хостинг-демо: код доступа, лимиты запросов и живых вызовов (
src/middleware.ts,src/server/demo_guard.ts), контейнер и скрипты развёртывания.
Проверки на 12:24Z (чистый клон 8d00ac4, без ключей, после npm run etl): npm run check → check: passed=335 failed=0 skipped=7 externally-unverified=7 — 7 UNVERIFIED: три живых провайдера, живой черновик письма и живой каталог ekt.kz (включаются AINALYM_LIVE_SMOKE=1 и ключами), две проверки живого голоса с микрофоном; node scripts/scenario.mjs → 11 × [PASS].
Не подтверждено (статус — docs/TASK_MAP.md): живой голос с микрофоном, снимки экранов части страниц, отправка поставщику (её нет по замыслу — только черновик).
4. Как это работает: от входных данных до результата
Основной сценарий как поток данных:
- Данные — выгрузки партнёра (история продаж по документам, помесячные продажи и остатки, товар в пути, кратность/MOQ, сезонность) → таблицы SQLite (
sales_line,sales_month,stock_month,in_transit,sku,season_index). - Расчёт — менеджер запускает расчёт по поставщику или категории (или новое событие ленты — день продаж, снимок остатков, изменение товара в пути — запускает пересчёт затронутых артикулов агентом). Движок по каждому артикулу: очищает ряд от разовых заказов (M4) → восстанавливает спрос в месяцы без товара (M3) → строит прогноз с сезонностью и ростом (M2) → считает потребность за вычетом остатка и товара в пути (M1).
- Рекомендации — список, сгруппированный по поставщикам, с количеством, срочностью и обоснованием по каждой строке (M5).
- Проверка и утверждение — менеджер корректирует количество (исходная рекомендация сохраняется), утверждает заказ поставщику в очереди решений; утверждение привязано к версии. Автоматической отправки поставщику нет.
- Записи — каждое действие агента и решение человека пишется в журнал (
agent_action,approval); утверждённый заказ создаёт обязательства (предоплата 30 % при утверждении, остаток к сроку поставки). - Результат — черновик заказа поставщику, файл для 1С в форме документа «Заказ поставщику» (xlsx/csv, ключ — «Номенклатура.Код», код 1С), подготовленное письмо поставщику (не отправляется), деньги: сколько заморожено по поставщикам и когда уйдут платежи.
Методика расчёта
Реализация — computeNeed в src/domain/engine.ts (детерминированно, количества и деньги — decimal.js); запуск по поставщику/категории — runCalculation в src/domain/apply.ts; параметры поставщика — src/domain/params.ts. Обозначения: L — срок поставки (IEK 40 дн, SE 50 дн), R — период пересмотра (30 дн).
- Источники (M1). По артикулу: помесячные продажи (
sales_month), строки документов продаж (sales_line, расходные накладные и события ленты), текущий остаток на 22.09.2026 (sku.on_hand_qty, если снимку не больше 31 дня; иначе последний известный остаток на начало месяца изstock_month— он обязателен), товар в пути со сроком прибытия в горизонте (in_transit), утверждённые ещё не полученные заказы в горизонте, сезонный индекс поставщика (season_index) и правило заказа. Товар в пути без даты считается доступным в горизонте. Товар в пути IEK с датой в заголовке колонки («поступление до dd.mm.yyyy») учитывается, только если приходит в пределах L + R. Если нет истории продаж у артикула, который продавался, или нет известного остатка, расчёт по этому артикулу не выполняется и называет причину («не рассчитано: …»), а остальные артикулы считаются дальше. Артикул без продаж за период получает потребность 0 с пометкой «Нет продаж за период». Категория — фильтр запуска (scope.category). - Регулярный ряд. Строки документов группируются по (номер документа, месяц); разовые документы исключаются по порогу, рассчитанному без проверяемого документа (алгоритм ниже). Месяц =
qty_regular, а если его нет — число из помесячного отчёта (qty_file) минус исключённые документы; события ленты (дни продаж, документы жюри) добавляются к своему месяцу. Средний уровень спроса считается только по завершённым месяцам, начиная сfirst_sale_ym: неполный текущий месяц и нули до начала продаж в среднее не входят. - Упущенный спрос (M3). Подтверждённый месяц дефицита (
stockout_kind=observed): известный остаток на начало равен 0, а в двух из трёх предыдущих месяцев были продажи. При неизвестном остатке и такой же истории продаж месяц помечаетсяstockout_kind=inferred: это предположение, а не наблюдаемый ноль. Оба вида помечаютсяstockout=1и не входят в базовый спрос; отрицательный известный остаток дефицитом не считается. Базовый спрос = среднее по месяцам без помеченного дефицита. Обоснование показывает фактический и скорректированный спрос одного артикула и различает подтверждённые и предполагаемые месяцы. - Сезонность (M2). Индекс календарного месяца: собственный (среднее продаж месяца / базовый спрос), если у артикула ≥ 12 месяцев с продажами без дефицита; иначе индекс поставщика (выручка 2024–2025, нормирована к среднему 1).
- Рост (M2). Продажи последних 6 месяцев / те же 6 месяцев год назад (месяцы дефицита заменены базовым спросом), в пределах ±50 %; если истории не хватает — 1.
- Прогноз. Сумма по дням горизонта L + R: базовый спрос × рост × индекс месяца / 30; разбивка по месяцам —
monthly_forecast. - Страховой запас. z × σ_мес / √30 × √L, σ_мес — стандартное отклонение месяцев без дефицита; z = 1,28 при уровне сервиса 90 % (1,645 — 95 %, 2,33 — 99 %).
- Потребность (M1). raw = max(0, прогноз + страховой запас − остаток − товар в пути − утверждённые заказы). Для IEK ненулевая рекомендация = max(ceil(raw), минимум); для SE — ceil(raw / кратность) × кратность.
- Срочность. Покрытие = (остаток + в пути + утверждённые заказы) / (базовый спрос × рост / 30) дней: < L — «критично», < L + R — «скоро», иначе «планово»; рекомендация 0 — «не требуется».
- Обоснование (M5).
rationale_ruпоказывает фактический и скорректированный спрос, прогноз, запас, остаток, датированный товар в пути, утверждённые заказы, потребность и правило заказа в единицеsku.unit, а также наблюдаемые и предполагаемые месяцы дефицита и исключённые разовые документы.componentsсохраняет числа и источники. - Деньги. Сумма заказа = Σ количество × себестоимость («СС реал», только SE); строки без себестоимости (IEK) не превращаются в 0 — считается их число («Себестоимость не задана»).
Пример (SE 300200745_, розетка 2-я IP54 Alas Profi 54 белая; расчёт 23.09.2026 на main @ 9b01fcb), обоснование дословно: «фактические продажи 75.906 шт/мес; спрос с учётом дефицита 75.906 шт/мес; сезонность артикула, рост ×0.789; прогноз на 80 дн 193.023 + запас 73.33 − остаток 23 − в пути 120 − утверждённый заказ 0 шт = потребность 126 шт (кратность 6 шт). Ожидаемые поставки: 120 шт прибудет до 11.11». Проверка: 193,023 + 73,33 − 23 − 120 = 123,353 → вверх до кратности 6 → 126; срочность «скоро». Разбор по шагам — docs/METHODOLOGY_RU.md.
Если провайдер AI недоступен или вернул ошибку, пограничные решения принимаются по правилам («Правила без LLM»), и это отмечено в результате; расчёт потребности от AI не зависит.
Ответ поставщика
Когда поставщик отвечает на заказ (например, «Отгрузим 60 %, остальное через 3 недели» — событие ленты WE-046, src/ai/supplier-reply.ts), агент распознаёт ответ как частичную отгрузку или задержку и готовит предложение: разделить заказ на две поставки (supplier_split) или ускорить (supplier_expedite). Предложение ждёт решения менеджера в «Проверке»; после утверждения обязательства 30 % / 70 % пересчитываются для каждой части. Всё остаётся черновиком — поставщику ничего не отправляется.
Алгоритм исключения выбросов
- Единица анализа — документ продажи в месяце: строки одного документа по артикулу суммируются.
- Порог каждого документа = max(20 единиц, min(3 × медиана месячных продаж, 5 × p95 количества в документе)). p95 считается по суммам документов без проверяемого документа (leave-one-out); при менее шести документах вместо p95 берётся медиана остальных документов.
npm run etlсохраняет справочный p95 по суммам документов, а расчёт порога использует текущие документы, включая новые события. - Документ с количеством > порога — разовый крупный заказ: он не входит в регулярный ряд, попадает в
components.outliers_excluded(номер, месяц, количество, порог) и в текст обоснования («исключены разовые документы: …»). - Решение по документу фиксируется в
outlier_doc:excluded— исключать,kept— вернуть в расчёт; пограничные документы воркер отправляет на типизированное решение (one_off_order) или менеджеру (outlier_review); в режиме «Правила без LLM» — детерминированное правило. - Крупные продажи одному клиенту: в выгрузках нет идентификатора клиента (только номера документов), поэтому такая продажа ловится на уровне документа.
- Пример (эталон
oneoff, IEK010500008_ВА47-29 25А): медиана месяца 14 502 шт, p95 документа 144 шт → порог max(20, min(43 506, 720)) = 720 шт; исключены 14 документов от 807 до 7 488 шт, в том числе20000099834на 7 488 шт; добавленный жюри документ на 5 000 шт тоже исключается, регулярный спрос меняется на 0,00 % (node scripts/scenario.mjs, строка M4). Если крупный документ — регулярный оптовый клиент, менеджер возвращает его в расчёт (kept).
5. Технологии
- Node.js ≥ 24, Next.js 16 (App Router, route handlers), React 19, TypeScript 5.
- SQLite через встроенный
node:sqlite(без внешнего сервера БД). - decimal.js — деньги без чисел с плавающей точкой; zod — схемы API.
- Vercel AI SDK (
ai,@ai-sdk/gateway,@ai-sdk/openai) — типизированные решения и черновики. - lucide-react — иконки. Vitest — тесты. ESLint. xlsx (SheetJS, dev) — чтение выгрузок партнёра в
npm run etl. - Провайдер типизированных решений:
AI_PROVIDER=jev (TypeSafe → Vercel AI Gateway) | openai | rules | offline. Без ключей —rules(«Правила без LLM»): весь расчёт детерминирован. - Шрифт Inter (SIL OFL) —
public/fonts/InterVariable.woff2, лицензияpublic/fonts/OFL.txt.
Модели
Задачи распределяются по классам. Рассуждения — разбор событий и ответов поставщиков, черновики писем и сводок расчёта — идут в модель OpenAI для рассуждений (OPENAI_REASONING_MODEL); быстрые задачи — метки намерения, короткие подсказки — в быструю модель (OPENAI_FAST_MODEL); голосовой помощник — в OpenAI Realtime (gpt-realtime-2.1). Хостинг-демо работает с моделью рассуждений gpt-5.5, быстрой моделью gpt-5.4-mini и gpt-realtime-2.1. Если переменные не заданы, код берёт gpt-5-mini и gpt-4o-mini. Без ключей всё работает в локальном режиме правил («Локальный режим»). Расчёт потребности (M1–M5) от моделей не зависит.
6. Архитектура
fixtures/partner/*.xlsx ──npm run etl──▶ SQLite (src/db/schema.sql)
│
лента событий (world_event) ──▶ воркер агентов (src/ai/worker.ts) ──▶ журнал (agent_run, agent_action)
│
расчётный движок (src/domain/engine.ts: M4 → M3 → M2 → M1)
│
рекомендации по поставщикам (M5) ──▶ очередь решений (proposal) ──▶ утверждение человека (approval)
│
заказ (purchase_order) ──▶ обязательства (obligation) ──▶ деньги (/api/money)
│
экспорт для 1С (файл) · письмо поставщику (черновик, не отправляется) · голос (те же инструменты)
По контракту все записи идут через API route handlers Next.js (src/app/api/**), ключи провайдеров — только на сервере. Стрелки описывают контракт; что уже работает — docs/TASK_MAP.md.
Ответ поставщика «Отгрузим 60 %, остальное через 3 недели» теперь становится решением агента: он выделяет долю, срок и затронутые позиции, создаёт в очереди предложение разделить заказ или ускорить поставку, а в ленте пишет понятное последствие. В демо это событие идёт после прежних 45; повтор по источнику не создаёт второе предложение. Только утверждение менеджера делит заказ и его платежи 30 % / 70 % на две части. Письма поставщику остаются черновиками и не отправляются автоматически.
7. Установка и запуск
Требуется Node.js ≥ 24 и npm. Проверено 09:48Z на чистом клоне 230b038 без ключей.
git clone https://github.com/BAITC-Hacks/hack-d8ff09f7-ainalym.git ainalym
cd ainalym
npm install
cp .env.example .env.local
npm run etl # 12 файлов партнёра → data/ainalym.db (≈ 7 с)
npm run dev # http://localhost:3000 → /today (порт занят — npm run dev -- -p 3111)
База: и npm run etl / npm run demo:reset, и приложение используют один путь — DATABASE_PATH из окружения, по умолчанию ./data/ainalym.db (как в .env.example). Если меняете DATABASE_PATH, меняйте его для всех команд.
Без ключей приложение работает в режиме «Правила без LLM»: GET /api/health → "ai_provider":"rules", "mode":"offline", провайдеры missing; в интерфейсе режим подписан «Локальный режим» (подсказка — «Правила без LLM»). Ключи (если есть) добавляются только в .env.local, никогда в репозиторий.
Команды: npm run etl — загрузка данных; npm run demo:reset — пересборка базы; npm run check — все проверки; node scripts/scenario.mjs — пять проверок ТЗ на данных партнёра; bash scripts/clean_clone_check.sh — проверка чистого клона.
7.1 Зависимости
next16.3.6 — веб-приложение и API.react,react-dom19.2.8 — интерфейс.ai— Vercel AI SDK, вызовы моделей.@ai-sdk/gateway— Vercel AI Gateway (резервный путь Jev).@ai-sdk/openai— OpenAI и совместимые API.zod— схемы запросов/ответов.decimal.js— денежная арифметика.lucide-react— иконки.- dev:
xlsx— чтение xlsx в ETL;typescript,@types/node(24),@types/react,@types/react-dom,vitest,eslint,eslint-config-next.
7.2 Параметры окружения
Все переменные — в .env.example; пустое значение = безопасное значение по умолчанию.
| Переменная | Назначение | По умолчанию / без значения |
|---|---|---|
AINALYM_MODE | режим приложения: live | offline (в .env.example также упомянут qualified_external) | авто: live при наличии ключей, иначе офлайн |
AI_PROVIDER | провайдер решений: jev | openai | rules | offline | авто: jev, если есть TYPESAFE_API_KEY или AI_GATEWAY_API_KEY; иначе openai, если есть OPENAI_API_KEY; иначе rules |
TYPESAFE_API_KEY | прямой ключ TypeSafe для Jev (основной путь) | нет — Jev пробует шлюз |
AI_GATEWAY_API_KEY | ключ Vercel AI Gateway (typesafe-ai/jev), резерв после TYPESAFE_API_KEY | нет — Jev недоступен |
OPENAI_API_KEY | OpenAI: одного этого ключа достаточно для живых решений, черновиков и голоса | нет — голос «Голос недоступен» |
OPENAI_MODEL | прежняя общая настройка модели | новые маршруты используют настройки по классам |
OPENAI_REASONING_MODEL | модель OpenAI для рассуждений (разбор событий, ответы поставщиков, черновики) | gpt-5-mini |
OPENAI_FAST_MODEL | быстрая модель OpenAI (метки, короткие подсказки) | gpt-4o-mini |
OPENAI_BASE_URL | совместимый с OpenAI провайдер; в .env.example строка закомментирована | api.openai.com (пустое значение = не задано) |
NVIDIA_API_KEY | необязательно: тот же OpenAI-совместимый адаптер через базовый URL | не используется |
DATABASE_PATH | файл SQLite; один путь для npm run etl, npm run demo:reset и приложения | ./data/ainalym.db; тесты — :memory: |
AINALYM_WORKER | фоновый воркер агентов; 0 отключает интервал | включён |
AINALYM_FEED_AUTOPLAY | 1 включает автовоспроизведение ленты событий | выключено |
DEMO_ACCESS_CODE | код доступа к хостинг-демо | без кода |
DEMO_DAILY_LIVE_CALLS | дневной лимит живых вызовов провайдера на демо | без ограничения |
EKT_API_USER, EKT_API_PASSWORD | доступ к тестовому API каталога ekt.kz (только чтение) | нет: поля каталога пусты или из датированного снимка |
Модели. Решения по событиям, документам и ответам поставщиков, а также черновики направляются модели рассуждений; распознавание коротких запросов — быстрой модели ради меньшей задержки. Голосовой разговор продолжает работать через OpenAI Realtime. Для текстовых задач используются настройки по классам, даже если сохранена прежняя общая настройка.
Без единого ключа весь сценарий идёт на «Правила без LLM» и помечается этой меткой; живой вызов, который не удался, показывается как «Провайдер недоступен», а не как успешный результат.
8. Как проверить
Без ключей, на данных партнёра, после шагов раздела 7. Ожидаемый вывод — наблюдение 12:24Z на чистом клоне 8d00ac4 (шаги 1–3); шаги 4–9 — 230b038.
Командами
npm run etl— строкиsku: 3909,sales_line: 248915,sales_month: 99634,stock_month: 117282,in_transit: 313,season_index: 24,stockout months: 1591.npm run etl && npm run check(проверки данных партнёра без базы не проходят) — итоговая строкаcheck: passed=335 failed=0 skipped=7 externally-unverified=7(UNVERIFIED— живые провайдеры и микрофон, раздел 3).node scripts/scenario.mjs— пять проверок ТЗ на эталонных артикулах:[PASS] M1 — Товар в пути +100 уменьшает чистую потребность …(IEK010500006_, Δ = 100),[PASS] M1-active — При дефиците +100 в пути снижает потребность до кратности на 100 (SKU=010300014_, Δ=100.000)и[PASS] M1-source — Отсутствующий обязательный источник назван;[PASS] M2 — Сезонный профиль SKU меняет прогноз по месяцам (max/min=10.38)и[PASS] M2-peak — … (peak quarter=3)(SE130300027_);[PASS] M3 — Компенсация дефицита повышает расчётную потребность (raw=886.204, adjusted=1056.676)(IEK130200032_);[PASS] M4 — Разовый документ 5000 шт исключён из регулярного спроса (change=0.00%, excluded=true)(IEK010500008_);[PASS] M5-full — Полный расчёт SE завершён,[PASS] M5 — Рекомендации SE сгруппированы по поставщику и обоснованы (rows=566)— 566 строк расчёта SE, из них с заказом больше нуля — 317;[PASS] Money — …30/70…,[PASS] World — … (applied=46/46, processed=46).
В приложении (npm run dev, http://localhost:3000). Шаги 4, 5 и 9 пройдены через API на чистом клоне; экранные переходы — по закрытиям L4a/L4b/L6 и снимкам в docs/evidence/.
- Расчёт: «Закупки»
/replenishment→ «Запустить расчёт» (илиPOST /api/calc/runс{"scope":{"supplier":"SE"}}) → ответskus: 724, recommended: 317; в очереди — «Заказ поставщику SE: 317 позиций» (GET /api/queue). - M1 — товар в пути виден: карточка
/skus/300200745_(розетка IP54 Alas Profi 54 белая, SE) → рекомендация 126 шт, «скоро»; обоснование: «… прогноз на 80 дн 193.023 + запас 73.33 − остаток 23 − в пути 120 − утверждённый заказ 0 шт = потребность 126 шт (кратность 6 шт). Ожидаемые поставки: 120 шт прибудет до 11.11 …». Затем «События»/world→ событие «Товар в пути +100» по коду300200745_(илиPOST /api/world/composeс{"kind":"judge_message","code_1c":"300200745_","text":"Товар в пути +100","payload":{"preset":"intransit","action":"adjust_in_transit","code_1c":"300200745_","delta_qty":100}}) → событие с меткой «Симулятор мира — синтетическое событие», агент пересчитывает только этот код → рекомендация 24 шт, «планово», «− в пути 220»; в журнале карточки — «Пересчитана потребность 300200745_: 24 шт». - M2 — сезонность:
/skus/130300027_(сжим У 733M) → прогноз по месяцам различается, в обосновании «сезонность артикула, рост ×0.927». - M3 — дефицит:
/skus/300200898_(рамка ARTGALLERY сталь, SE) — месяцы 2026-03 и 2026-04 помечены как дефицит (остаток неизвестен после продаж); обоснование: «фактические продажи 20.84 шт/мес; спрос с учётом дефицита 21.541 шт/мес …»; эталонный130200032_— строка M3 вscenario.mjs. - M4 — разовые документы: расчёт по IEK (
POST /api/calc/runс{"scope":{"supplier":"IEK"}}) →/skus/010500008_→ «исключены разовые документы: …, 20000099834, …» (порог 720 шт); кнопка «Разовый заказ» в «Событиях» (5 000 шт подставлено) → документ в списке исключённых, регулярный спрос почти не меняется. 8a. Правка количества менеджером:GET /api/recommendations?supplier=SE→ строка300200745_(id,version: 1, 126 шт) →POST /api/recommendations/:id/adjustс{"qty": 132, "reason": "объект клиента сдвинулся на октябрь", "version": 1}→qty_recommendedостаётся 126,qty_adjusted= 132, состояниеadjusted, версия 2; повтор с"version": 1→ 409{"ok":false,"code":"stale_version","current_version":2}— устаревшая версия не перезаписывает правку. - M5 — заказ по поставщикам. В интерфейсе: «Закупки» — вкладки IEK и SE, у каждой строки срочность и «почему так» → «Сегодня» → «Подготовить заказ» (или «Смотреть позиции» — список в «Закупках») у решения «Заказ поставщику SE: 317 позиций» → страница предложения: таблица позиций (артикул, заказать, срочность, стоимость, почему) → «Утвердить заказ» → итог «Утверждено · черновик заказа создан, поставщику ничего не отправлено» с суммами предоплаты 30 % и остатка 70 % и ссылками «Заказы», «Деньги» → «Заказы» → карточка заказа → «Утвердить заказ» → обязательства появляются в «Деньгах»; выгрузка для 1С и письмо поставщику (черновик, «не отправлен») доступны после утверждения. Те же шаги через API (проверено 11:59Z):
GET /api/queue→GET /api/proposals/:id(текущаяproposal.version) →POST /api/proposals/:id/approveс{"proposal_version": <версия>}→ черновикGET /api/orders/:id(SE, 108 563 шт, 73 897 006,01 KZT; себестоимость известна для 281 из 317 строк) →POST /api/orders/:id/approveс{"version": <версия заказа>}→GET /api/orders/:id/export.xlsx— «Заказ_поставщику_SE_2026-09-23.xlsx» в форме документа 1С «Заказ поставщику»: 317 строк, колонки «Номенклатура.Код», «Номенклатура», «Артикул», «Ед.», «Количество», «Цена», «Поставщик», «Дата поставки», «Срочность», «Обоснование»; срочность: критично 69, скоро 104, планово 144 →/supplier/:po_id— «Черновик заказа — не отправлен» →GET /api/money: предоплата 22 169 101,80 KZT сегодня и остаток 51 727 904,21 KZT к 12.11.2026.
Вывод проверки чистого клона (bash scripts/clean_clone_check.sh <remote> main: клон → npm install → .env.local из .env.example → npm run etl → npm run check):
# с GitHub, 11:58Z (git ls-remote origin main = 230b038)
CLEAN-CLONE: cloned main @ 230b038
CLEAN-CLONE: check: passed=325 failed=0 skipped=7 externally-unverified=7
CLEAN-CLONE: PASS @ 230b038
# финальный коммит, 12:24Z
CLEAN-CLONE: cloned main @ 8d00ac4
CLEAN-CLONE: npm install OK (node v24.18.0)
CLEAN-CLONE: check: passed=335 failed=0 skipped=7 externally-unverified=7
CLEAN-CLONE: PASS @ 8d00ac4
SHA финального main на GitHub — по git ls-remote origin main после последнего push корня.
9. Данные и интеграции
Вход: стандартные отчёты 1С УТ (динамика продаж, остатки, товар в пути, MOQ) загружаются как есть, без доработки конфигурации. Выход для 1С — файл в форме документа «Заказ поставщику» (раздел 8, шаг 9); GET /api/modes показывает внешний контур как «Экспорт для 1С (файл)».
Данные — обезличенные выгрузки партнёра ТОО «Электрокомплект», предоставленные организатором для кейса, без изменений (fixtures/partner/, раскрытие — DISCLOSURE.md; строки, периоды и загружаемые поля по каждому файлу — fixtures/PROVENANCE.md). Данных о клиентах нет — только номера документов.
| Поставщик | Файл | Содержание |
|---|---|---|
| IEK | Динамика продаж_2025-2026.xlsx | строки документов продаж (дата, документ, склад, количество) |
| IEK | Ежемесячные продажи в количественном выражении за последние 2 года.xlsx | продажи по месяцам |
| IEK | Ежемесячные остатки продукции за последние 2 года ИЭК.xlsx | остатки по месяцам |
| IEK | Путь ИЭК 22.09.2026.xlsx | товар в пути (открытые заказы) на 22.09.2026 |
| IEK | MOQ ИЭК.xlsx | минимальная партия («Мин. разр. к отгр.») |
| IEK | Сезонность ИЭК.xlsx | выручка поставщика по месяцам |
| SE | Динамика продаж_Syseme Electric_2025-2026.xlsx | строки документов продаж |
| SE | Ежемесячные продажи в кол-м выражении SystemElectric 2024-2026.xlsx | продажи по месяцам, кратность |
| SE | Ежемесячные остатки SystemElectric 2024-2026.xlsx | остатки по месяцам |
| SE | Товар в пути_SystemElectric на 22.09.2026.xlsx | остатки, товар в пути («СЭ в пути 24.09»), себестоимость «СС реал», «Категория 2026» |
| SE | MOQ SystemElectric.xlsx | кратность |
| SE | Сезонность SystemElectric 2024-2026.xlsx | выручка поставщика по месяцам 2024–2026 |
Объём: строки документов продаж — 171 604 (IEK) и 77 313 (SE) (пересчитано по файлам 08:52Z: непустые строки первого листа минус заголовок); продажи 2023-01 → 2026-09, помесячные остатки и продажи 2024-01 → 2026-09. Артикулов после загрузки — 3 909 (IEK 3 185, SE 724): это объединение кодов из всех 12 файлов; в строках продаж — IEK 2 151 и SE 565. Товар в пути — 313 строк (IEK 306, SE 7). Себестоимость — только SE; в файле товара в пути SE ненулевой «СЭ в пути 24.09» у 7 из 497 позиций.
Политики (заявлены, редактируемы): срок поставки IEK 40 дней, SE 50 дней; период пересмотра 30 дней; уровень сервиса 90 %; условия оплаты — предоплата 30 % при утверждении, остаток к сроку поставки; ожидаемая дата прихода товара в пути = 22.09.2026 + срок поставки (IEK 01.11.2026, SE 11.11.2026). Правила разбора: пустая ячейка продаж = 0; пустой остаток = неизвестен (не ноль); кратность/MOQ 0 или пусто = 1; себестоимость SE 0 = неизвестна. Это допущения команды, не данные партнёра.
Изображения товаров (image_url у артикулов и рекомендаций) — иллюстративные: миниатюры из официального каталога IEK и иллюстрации категорий; происхождение — fixtures/PROVENANCE.md. Каталог ekt.kz — интеграция только для чтения (src/peers/ekt.ts, GET /api/ekt/status, описание — docs/integrations/EKT_API.md): у артикулов и рекомендаций могут быть ссылка на товар, остаток и цена каталога (ekt_url, ekt_stock_total, ekt_price) с источником и датой (ekt_source, ekt_as_of): живой ответ API или датированный снимок (scripts/ekt/snapshot.mjs создаёт fixtures/ekt_snapshot.json; в репозиторий снимок не входит, поэтому в чистом клоне поля каталога пусты). Логин и пароль тестового API (EKT_API_USER, EKT_API_PASSWORD) задаются только в .env.local и в репозитории не хранятся. Живые запросы ограничены по времени и кэшируются, в проверках не выполняются (UNVERIFIED без AINALYM_LIVE_SMOKE=1); в расчёт потребности данные каталога не входят.
Три оси правды на каждом результате (docs/CONTRACTS.md §1, §5): происхождение («Данные партнёра · обезличены»), AI («Живой AI» / «Правила без LLM» / «Воспроизведение · записанное решение» / «Провайдер недоступен»), внешний контур («Экспорт для 1С (файл)»; канал поставщика — «Черновик заказа — не отправлен» / «Подтверждено (симулятор)»). События ленты, которые вводит пользователь, помечены «Симулятор мира — синтетическое событие».
10. Ограничения
1С: «Prior 1C sandbox access and live integration diagnostics completed; business connector unverified.» «The protected test application returned two authenticated EnterpriseData WSDLs; no SOAP or exchange operation was run.» (Ранее выполнены доступ к песочнице 1С и диагностика живой интеграции; бизнес-коннектор не проверен. Защищённое тестовое приложение вернуло два WSDL EnterpriseData с аутентификацией; ни одна операция SOAP или обмена не выполнялась.)
Прочее:
- экспорт для 1С — файл в форме документа «Заказ поставщику» (ключ «Номенклатура.Код»); приложение не пишет в учётную систему, загрузка — штатными средствами 1С;
- заказ поставщику никогда не отправляется автоматически — только черновик после утверждения человеком; ответ поставщика — симулятор;
- себестоимость есть только у SE; суммы по IEK не считаются;
- идентификатора клиента в данных нет — разовые продажи одному клиенту ловятся на уровне документа;
- сроки поставки и условия оплаты — заявленные политики, не данные партнёра.
11. Ссылка на деплой
https://65.109.172.188.sslip.io — код доступа передан через платформу (GET /api/health → 200, проверено 11:15Z). Код доступа и ключи в репозитории не хранятся.
Документы
Подробно — docs/DOCUMENTS_RU.md. Сервис принимает счёт поставщика (загрузка файла или демонстрационный пример), сверяет его с заказом по коду 1С, артикулу и названию, а после акта приёмки — трёхсторонне (заказ · счёт · приёмка). По маршруту поставщика (внутри РК, ЕАЭС, третьи страны) он показывает пакет документов: что есть, чего не хватает, где расхождение. IEK и Systeme Electric по умолчанию идут маршрутом ЕАЭС (уточняется у менеджера): заявление о ввозе (форма 328.00), НДС при импорте 12 % (форма 320.00), статистическая форма; декларация на товары для ЕАЭС не нужна. Черновики, которые готовит агент (например, форма 328.00), помечены «Черновик подготовлен агентом — не отправлен». Подключения к «Кеден», ЭСФ или 1С нет: сервис ничего не подаёт и не отправляет.
Проверка за минуту (после npm run demo:reset и npm run dev; наблюдение 12:02Z на main @ 4de3022, без ключей):
curl -sS -X POST http://localhost:3000/api/documents -H 'Content-Type: application/json' -d '{"fixture":"iek_invoice_demo.xlsx"}'
# в ответе .document.po_id — заказ, с которым сопоставлен счёт (дальше <po_id>)
curl -sS 'http://localhost:3000/api/documents?po_id=<po_id>'
curl -sS http://localhost:3000/api/orders/<po_id>/package
Демонстрационный счёт привязывается к заказу PO-DEMO-IEK-DOCUMENTS (10 строк; создаётся при первой загрузке), если нет заказа, который покрывает те же строки; GET /api/documents без po_id показывает весь входящий список. Ожидается: документ extraction_mode: deterministic, состояние discrepancy; сверка — 10 строк совпали, 2 расхождения (010300001_ — количество 60 против 100, 010300002_ — цена), сумма счёта 354 750,00 против заказа 392 500,00 KZT; пакет — маршрут eaeu («задан по умолчанию, уточните у менеджера»), счёт discrepancy, форма 328.00 draft, остальные пункты missing. Счёт демонстрационный: 10 реальных кодов каталога IEK, цены и количества условные (fixtures/PROVENANCE.md).
Экраны
Что менеджер по закупу делает на каждом экране (адреса — от корня приложения):
| Экран | Адрес | Что здесь делает менеджер |
|---|---|---|
| Сегодня | /today | Видит, что требует его решения, какие позиции под риском дефицита, сколько денег уже заморожено в заказах и что агенты сделали без него. |
| Закупки | /replenishment | Запускает расчёт по поставщику или категории, просматривает рекомендации по поставщикам с объяснением каждой цифры, правит количество с причиной, собирает корзину заказа и готовит заказ поставщику. |
| Корзина | боковая панель на «Закупках» (открыта по умолчанию, на широком экране закреплена справа) | Собирает позиции заказа по поставщику, правит количество, видит итог с предоплатой 30 % и сроком поставки и нажимает «Подготовить заказ поставщику». |
| Документы | /documents, /documents/:id; «Пакет документов · маршрут» на странице заказа | Загружает счёт поставщика (или «Загрузить пример»), видит список: документ, вид, поставщик, заказ, извлечено, расхождения, состояние; открывает документ рядом с заказом, принимает или отклоняет его; на странице заказа видит, каких документов не хватает по маршруту поставки. |
| Проверка | /review/:id (из «Сегодня» → «Подготовить заказ» или из корзины) | Смотрит предложение агента — позиции, срочность, стоимость, почему — и утверждает или отклоняет его. |
| Заказы | /orders, /orders/:id | Ведёт каждый заказ поставщику по этапам: черновик → утверждён → письмо подготовлено → ответ поставщика → в пути → получен; утверждает заказ («Утвердить заказ»), выгружает файл для 1С и смотрит черновик письма поставщику. |
| Поставщики | /suppliers | Смотрит карточки IEK и SE: срок поставки, условия оплаты 30/70, открытые заказы, товар в пути, замороженные деньги, последний ответ. |
| Товары | /skus, /skus/:code | Открывает карточку товара: история продаж, прогноз по месяцам, остаток, товар в пути, исключённые разовые продажи и объяснение рекомендации. |
| Деньги | /money | Видит, сколько денег заморожено по каждому поставщику и когда платить: предоплата сейчас, остаток к поставке. |
| События | /world | Видит события одной фразой — кто и что сделал и к чему это привело (продажи, остатки, поставки, ответы поставщиков) — и может добавить своё, например «товар в пути +100»; система пересчитает только то, что изменилось. |
| Настройки | /settings (адрес /connections ведёт сюда) | Проверяет, откуда пришли данные и куда уходит результат: отчёты 1С на входе, файл заказа для 1С на выходе; параметры поставщиков. |
| Лендинг | /landing (открыт без кода доступа) | Публичная страница с автоматически проигрываемыми роликами продукта: Сегодня, Закупки и корзина, заказ поставщику, Деньги, ИИ-Помощник. |
| ИИ-Помощник | /assistant (и боковая панель на любом экране) | Спрашивает текстом (голосом — при ключе OpenAI) — например, «что нужно заказать по категории 2?» — и получает ответ по тем же цифрам, что на экранах. |
Демо в интернете: https://65.109.172.188.sslip.io — код доступа передан через платформу.
Снимки экранов (1440 × 900): docs/evidence/shell/today_1440x900.png, orders_1440x900.png, suppliers_1440x900.png, skus_1440x900.png, sku_1440x900.png, orders_loading_ribbon_1440x900.png.
Соответствие ТЗ
| Критерий ТЗ | Экран / маршрут | Команда проверки | Доказательство | Статус (UTC) |
|---|---|---|---|---|
| M1 Базовая потребность по всем источникам | /skus/300200745_ + лента «Товар в пути +100» (126 → 24 шт); POST /api/calc/run, POST /api/world/compose | node scripts/scenario.mjs → M1, M1-source | scripts/scenario.mjs, tests/domain/a_engine.test.ts, tests/domain/a_partner.test.ts, tests/fixtures/eval/replenishment_expectations.json | PASS на данных партнёра · 09:48Z |
| M2 Сезонность и рост | /skus/130300027_; GET /api/skus/:code | node scripts/scenario.mjs → M2, M2-peak | то же | PASS на данных партнёра · 09:48Z |
| M3 Компенсация дефицита | /skus/300200898_; эталон 130200032_ | node scripts/scenario.mjs → M3 | то же | PASS на данных партнёра · 09:48Z |
| M4 Исключение разовых заказов | /skus/010500008_; «События» → «Разовый заказ» (5 000 шт уже подставлено) | node scripts/scenario.mjs → M4 | то же + tests/ai/partner_event.test.ts | PASS на данных партнёра · 09:48Z |
| M5 Заказы по поставщикам + обоснование + экспорт | /replenishment, /review, /orders/:id; GET /api/recommendations, GET /api/orders/:id/export.xlsx | node scripts/scenario.mjs → M5-full, M5 | то же + docs/evidence/peers/* | PASS на данных партнёра · 09:48Z |
| README: методика, алгоритм выбросов, запуск | этот файл, разделы 4, 7, 8 | чистый клон по разделам 7–8 | README.md | пройдено · 09:48Z |
| Без автоотправки поставщику | /supplier/:po_id («Черновик заказа — не отправлен»); утверждение по версии в /review | npm run check → purchase approvals and obligations … | tests/domain/b_money_orders.test.ts, docs/evidence/peers/supplier-draft.png | PASS · 09:48Z |
Режимы и метки
Единая таблица меток — docs/CONTRACTS.md §5 (её же отдаёт GET /api/modes). Основные: «Данные партнёра · обезличены», «Живой AI», «Правила без LLM», «Воспроизведение · записанное решение», «Провайдер недоступен», «Экспорт для 1С (файл)», «Черновик заказа — не отправлен», «Подтверждено (симулятор)», «Симулятор мира — синтетическое событие», «Голос: живой» / «Голос недоступен».
Демо-доступ
Локально: без ключей, режим «Правила без LLM» (раздел 7). Хостинг-демо: https://65.109.172.188.sslip.io; код доступа и, при необходимости, ограниченный ключ OpenAI передаются через форму платформы — не через этот репозиторий. Учётные записи команды для проверки не нужны.
Личный вклад участников
Адильхан (капитан): выбор кейса и разбор данных партнёра, продуктовая концепция «агенты ведут закупки, решения принимает человек», архитектура и контракты, постановка задач ИИ-агентам и приёмка результата (движок расчёта, интерфейс, голосовой помощник, документы), хостинг и безопасность демо, подача решения.
Маулен: документация продукта на языке менеджера по закупу - методика расчёта с разобранным примером, алгоритм выбросов, словарь терминов, FAQ, словарь данных, шаги проверки пяти требований ТЗ, инструкция по загрузке заказа в 1С, питч и журнал хода работы.
Раскрытие
Что подготовлено до старта, какие AI-инструменты и сторонние компоненты используются, происхождение данных — DISCLOSURE.md.
Безопасность
Правила по контракту (docs/CONTRACTS.md §1, §3); подтверждение в коде — docs/TASK_MAP.md.
- Ключи провайдеров хранятся только на сервере (
.env.localисключён из git через.gitignore); для голоса браузер получает только эфемерную сессию. - Операции ограничены списком API из
docs/CONTRACTS.md§3; агент готовит предложения, утверждает только человек. - Идемпотентность: события — по
(org_id, source_id), действия журнала — поidempotency_key, утверждения привязаны к версии (устаревшая версия → 409).
EN summary
Ainalym is a financial operations OS for trading businesses; agents run the commercial cycle, you decide. First vertical: automatic supplier replenishment orders for an electrical-components distributor (HackAlem AI, Logistics track, partner Elektrokomplekt LLP, anonymised exports). As of main @ 8d00ac4 (12:24Z): npm run etl loads the 12 partner files into SQLite; node scripts/scenario.mjs prints the five ТЗ checks M1–M5 plus Money and World as 11 [PASS] lines on partner data; the app (npm run dev) runs the calculation, shows recommendations with a numeric rationale per SKU, a decision queue, version-bound approval, 30/70 obligations, a 1C-compatible export and a supplier draft that is never sent. With no keys it runs in «Rules, no LLM» mode. Status per capability: docs/TASK_MAP.md.
Авторы коммитов
История коммитов
- 2026-09-23 17:54landing: transparent header over the hero with the reference button/text styles; h1 «Автоматизация закупок и белого импорта» (owner 12:53Z)Adilkhan
- 2026-09-23 17:51landing: hero h1 back to «Агенты ведут закупки и импорт. Вы принимаете решения.» (owner 12:52Z, revert of 6092f33)Adilkhan
- 2026-09-23 17:49landing: hero h1 «Белый импорт для любого бизнеса - без потерянных документов и лишних движений» (owner 12:49Z)Adilkhan
- 2026-09-23 17:46landing: hero h1 «Агенты ведут закупки и импорт. Вы принимаете решения.» (owner option 1)Adilkhan
- 2026-09-23 17:46landing: phone hero shade targets the shade layerAdilkhan
- 2026-09-23 17:46landing: darkened mountains hero shade as in the owner reference prototype (top scrim + left shade, phone bottom shade)Adilkhan
- 2026-09-23 17:44copy: customs wording - «Пакет для проверки и передачи таможенному представителю (оформление в «Кеден»)», DOCUMENTS_RU note, README «Почему сейчас», landing «Куда это ведёт» (D-H53 copy, owner)Adilkhan
- 2026-09-23 17:32docs: cash commitment note — refreshed order and payment numbersMaulen
Все коммиты (634)
- 2026-09-23 17:32docs: data requests to the partner (RU)Maulen
- 2026-09-23 17:31docs: SUBMISSION_RU v2.2 - screens «События», «Документы», «Настройки»; hyphens onlyAdilkhan
- 2026-09-23 17:30merge: TODAY-CHART closeout (lane version)Adilkhan
- 2026-09-23 17:30merge: final: landing white theme + reference hero loop + scroll-story clips + copy (D-H78/D-H79), today rings closeout, «Личный вклад участников» — lane/landing_lightAdilkhan
- 2026-09-23 17:29docs(landing): LANDING_LIGHT closeout for hero, tokens, scroll story and copyAdilkhan
- 2026-09-23 17:29feat(landing): hero brand loop and white design tokens from the owner reference prototypeAdilkhan
- 2026-09-23 17:27docs: README «Личный вклад участников» (owner-approved wording) + one-line note in SUBMISSION_RUAdilkhan
- 2026-09-23 17:27feat(landing): clips as a scroll story; owner copy additionsAdilkhan
- 2026-09-23 17:25feat(today): replace the empty 60-day outlook chart with two compact rings — stock at cost and cash coverage of 60-day supplier payouts (D-H77)adil
- 2026-09-23 17:25merge: TODAY-CHART — two compact rings (stock value by urgency, cash vs 60-day payouts) replace the sparse outlook chart (D-H77)Adilkhan
- 2026-09-23 17:25merge: L7 docs FINAL — README v2.3 (judge-sim P2 fixes, «События»/«Настройки»/Лендинг rows, Документы curl, §8 clean-clone blocks), TASK_MAP finalAdilkhan
- 2026-09-23 17:25fix(landing): darken warm accent for WCAG AA; add LANDING_LIGHT closeoutAdilkhan
- 2026-09-23 17:25merge: JUDGE-FIX — affected-only recompute carries the organisation scope (old SE proposal superseded), Today obligations read approved orders, «Смотреть позиции» link fixed (judge sims P0-1/P1)Adilkhan
- 2026-09-23 17:25docs: L7 closeout + final checkpointAdilkhan
- 2026-09-23 17:25docs: L7 closeout tip lineAdilkhan
- 2026-09-23 17:24docs: README final (v2.3) — clean clone PASS @8d00ac4 (335/0/7/7), screens renamed (События, Настройки, Документы, лендинг), judge-sim P2 copy fixesAdilkhan
- 2026-09-23 17:24docs: JUDGE-FIX closeout — check lineAdilkhan
- 2026-09-23 17:24feat(landing): relight to a light/white theme (D-H78)Adilkhan
- 2026-09-23 17:24feat(today): replace the empty 60-day outlook chart with two compact rings — stock at cost and cash coverage of 60-day supplier payouts (D-H77)adil
- 2026-09-23 17:24docs: JUDGE-FIX closeoutAdilkhan
- 2026-09-23 17:23fix(recompute): affected-only run carries the organisation scope (judge-sim P0)Adilkhan
- 2026-09-23 17:23fix(today): obligations read the same approved-order rows as /money; supplier link drops the trailing colonAdilkhan
- 2026-09-23 17:21fix(documents): GET /api/documents lists the whole inbox (no per-order fan-out → no 429 on first load); order inference ranks by share of the order matched so a 10-line invoice binds to the demo orderAdilkhan
- 2026-09-23 17:20docs(landing): record polish outcome and verificationAdilkhan
- 2026-09-23 17:18fix(landing): reserve caption controls to prevent lazy-load shiftsAdilkhan
- 2026-09-23 17:18Merge remote-tracking branch 'origin/main'Adilkhan
- 2026-09-23 17:17fix(landing): keep proof semantics and media failure fallback honestAdilkhan
- 2026-09-23 17:17merge: LANDING — autoplaying product clips gallery, purchasing narrative, three-step workflow, proof block (Astra, D-H73/D-H73b); landing page conflict resolved to the landing lane with the «ИИ-ПомощнAdilkhan
- 2026-09-23 17:16merge: final window: README v2.2 (L7 09c42ab), landing clips + interactive polish (Astra) — 09c42abAdilkhan
- 2026-09-23 17:16fix(landing): preserve clips-first flow and playback contractAdilkhan
- 2026-09-23 17:16merge: ROWS-1 — larger /skus thumbnails and rows, related values/buttons next to their text, header button by the headline, compact centred KPIs (D-H76); CSS conflicts with POLISH-2 resolved for the rAdilkhan
- 2026-09-23 17:16docs: pilot plan with the partner — what to measure (RU)Maulen
- 2026-09-23 17:16feat(landing): add hover playback, caption focus and restrained clip revealAdilkhan
- 2026-09-23 17:16merge: final window: «События» (WORLD-3), rows/thumbnails sweep (ROWS-1), landing clips + polish (Astra), README v2.2 (L7) — lane/world3Adilkhan
- 2026-09-23 17:15feat(landing): ground proof section in demo data and stated assumptionsAdilkhan
- 2026-09-23 17:15docs(handoffs): ROWS-1 closeoutAdilkhan
- 2026-09-23 17:15feat(landing): clarify purchasing narrative and three-step workflowAdilkhan
- 2026-09-23 17:15fix(v2): related values, badges and buttons sit next to their text instead of drifting to the far rightAdilkhan
- 2026-09-23 17:14WORLD-3: /world → «События» — plain-Russian one-sentence events, who-badge, consequence link, product image, grouped by day (D-H75)Adilkhan
- 2026-09-23 17:14docs: README — «Документы» screens row, cart docked by default, curl uses the returned po_idAdilkhan
- 2026-09-23 17:13merge: POLISH-2 — white priority-card fills across sections, unified pills/buttons, settings/money/world surface polish (Astra, D-H72)Adilkhan
- 2026-09-23 17:13feat(skus): larger thumbnails (56/64 px), 72 px rows, secondary lines under the name, numeric columns right-alignedAdilkhan
- 2026-09-23 17:13feat(landing): add lazy autoplay product gallery and verificationAdilkhan
- 2026-09-23 17:13docs(polish): save viewport evidence and final review closeoutAdilkhan
- 2026-09-23 17:10fix(money): «Заполнить» buttons sit next to their row text instead of the far right (owner 12:11Z)Adilkhan
- 2026-09-23 17:08fix: fixture ingest seeds the demo IEK order only when no existing order matches (keeps inference for real orders)Adilkhan
- 2026-09-23 17:08merge: DOCS-UI — «Документы» inbox + two-pane review, evidence rail with route chip on the order page, fixture fallback when the API is absent (D-H68)Adilkhan
- 2026-09-23 17:08feat(landing): record assistant question and structured answerAdilkhan
- 2026-09-23 17:07feat(landing): record sixty-day payments clipAdilkhan
- 2026-09-23 17:07feat(landing): record supplier order review clipAdilkhan
- 2026-09-23 17:06feat(landing): record replenishment and cart clipAdilkhan
- 2026-09-23 17:05merge: ASSIST-4 — green «Говорить с помощником» button right of send, «ИИ-Помощник», clarifying question + follow-up chips, typing reveal, proactive opener, product rows with images (D-H69–D-H71)Adilkhan
- 2026-09-23 17:05merge: L7 docs — README «Документы» section, «ИИ-Помощник» + «Корзина» screens, SUBMISSION_RU v2.1Adilkhan
- 2026-09-23 17:05fix: document uploads stored next to the database (writable on the demo host), fixture ingest self-seeds the demo IEK order; cart panel open by default and docked on wide screens (owner 12:06Z)Adilkhan
- 2026-09-23 17:05DOCS-UI: draft disclosure — underline only the «Открыть» affordance, not the meta line; evidence retakenAdilkhan
- 2026-09-23 17:04feat(landing): record Today product clipAdilkhan
- 2026-09-23 17:04DOCS-UI: «Документы» inbox + two-pane review + evidence rail on the order page (Fable language, fixture fallback)Adilkhan
- 2026-09-23 17:04docs: how to load the order file into 1C (RU)Maulen
- 2026-09-23 17:03docs: observation stampsAdilkhan
- 2026-09-23 17:03docs: submission text v2.1 — documents, cart, ИИ-ПомощникAdilkhan
- 2026-09-23 17:03docs: README — «Документы» section (intake, 3-way match, EAEU package, verified curl sequence), screens: ИИ-Помощник, КорзинаAdilkhan
- 2026-09-23 17:03docs(polish): record independent review scope and acceptanceAdilkhan
- 2026-09-23 17:02assistant: green «Говорить с помощником» button, «ИИ-Помощник», follow-up chips, typing reveal, product rows (ASSIST-4, D-H69/D-H70)Adilkhan
- 2026-09-23 17:02merge: L7 docs — README v2.1 (clean-clone PASS at 230b038, purchasing path step 9, «Проверка» screen row, numbers refreshed)Adilkhan
- 2026-09-23 17:02style(world): match feed typography and controls to the v2 shellAdilkhan
- 2026-09-23 17:01style(money): apply shared white surface to completion summaryAdilkhan
- 2026-09-23 17:01style(ui): unify pills buttons and priority-card hover feedbackAdilkhan
- 2026-09-23 17:01style(settings): elevate setup summary and improve narrow link spacingAdilkhan
- 2026-09-23 17:01style(skus): elevate catalog hero and stock recommendation cardsAdilkhan
- 2026-09-23 17:01style(world): elevate event controls and soften field bordersAdilkhan
- 2026-09-23 17:01style(replenishment): apply shared white hero surfaceAdilkhan
- 2026-09-23 17:01Require explicit route beyond named demo suppliersAdilkhan
- 2026-09-23 17:00style(orders): refine amounts and navigation feedbackAdilkhan
- 2026-09-23 17:00style(suppliers): align actions and emphasize tabular amountsAdilkhan
- 2026-09-23 17:00style(replenishment): lift purchase hero and align numeric headersAdilkhan
- 2026-09-23 17:00merge: DOCS-INTAKE — document intake (upload/fixture), deterministic + guarded model extraction, 3-way match with the order, route-based document package (domestic/eaeu/import) with agent drafts «не оAdilkhan
- 2026-09-23 17:00docs: task map — U1 stampAdilkhan
- 2026-09-23 17:00docs: task map — observation stamps at 12:00ZAdilkhan
- 2026-09-23 17:00docs: README v2.1 + task map — final numbers on GitHub clean clone of 230b038 (325/0/7/7), purchasing-language approval path, M3 showcaseAdilkhan
- 2026-09-23 16:59style(today): elevate hero metrics with shared white card surfaceAdilkhan
- 2026-09-23 16:59merge main @230b038 into lane/docsAdilkhan
- 2026-09-23 16:59Use webpack dev command in judge verificationAdilkhan
- 2026-09-23 16:58Persist document size and verify supplier route selectionAdilkhan
- 2026-09-23 16:57merge: UX-FIX-D — /today 60-day money outlook SVG chart, /skus hover image preview, /money centred hero metrics (D-H67)Adilkhan
- 2026-09-23 16:56Complete package key and replay image document flowsAdilkhan
- 2026-09-23 16:56ux(v2): UX-FIX-D — 60-day money outlook chart on /today, SKU image hover preview, centred hero metrics on /money (D-H67)Adilkhan
- 2026-09-23 16:56docs: methodology refresh — numbers and rules after the engine updateMaulen
- 2026-09-23 16:54merge: CART-1 — purchase-order cart side panel on /replenishment: per-supplier lines with thumbnails, editable qty, totals with 30/70 and lead time, insights, sort by urgency/sum, «Подготовить заказ пAdilkhan
- 2026-09-23 16:53feat(ui): CART-1 — purchase cart sheet on Закупки: proposal lines per supplier, editable qty, totals with 30/70 prepayment and lead time, insights, urgency/sum sort, «Подготовить заказ» → review, liveAdilkhan
- 2026-09-23 16:52merge: VOICE-FIX-2 — spoken structured summary after tool results, compact payload, render cards, no filler, RU transcription hint (D-H65)Adilkhan
- 2026-09-23 16:51voice: speak compact structured tool summariesAdilkhan
- 2026-09-23 16:51Document Russian route packages and judge verificationAdilkhan
- 2026-09-23 16:51Use valid IEK catalog SKUs in invoice fixtureAdilkhan
- 2026-09-23 16:50Verify document extraction matching drafts and acceptanceAdilkhan
- 2026-09-23 16:45Add synthetic IEK invoice and demo order fixtureAdilkhan
- 2026-09-23 16:44merge: ASSIST-3 — compact mic on/off toggle, voice tool results as structured cards, caption garbage filter (D-H65)Adilkhan
- 2026-09-23 16:44Expose document intake match acceptance and route packagesAdilkhan
- 2026-09-23 16:43merge: REVIEW-FIX-1 — proposal review page in the Fable language: plain header/state, sortable line table with stake formatting, «Утвердить заказ»/«Отклонить», receipt with 30/70 (judge sim #3)Adilkhan
- 2026-09-23 16:42Add guarded model and replay document extractionAdilkhan
- 2026-09-23 16:42REVIEW-FIX-1: /review/[id] rebuilt in the Fable language — Russian header + state pill, no PR-/REC-/qty in text, «Основание» as a real line table (thumb, артикул, заказать, срочность, стоимость KZT, пAdilkhan
- 2026-09-23 16:42Implement document packages extraction matching and draftsAdilkhan
- 2026-09-23 16:42fix(ui): replenishment chips wrap on phone (390 px overflow)Adilkhan
- 2026-09-23 16:42merge: UX-FIX-C — plain purchasing labels on Сегодня/SKU/Заказы/Лента, 1С export button with feedback, «Утвердить заказ» on order cards, demo events on an empty feed, phone widths (D-H64, deploy checkAdilkhan
- 2026-09-23 16:41ASSIST-3: compact mic on/off toggle (start in click, mute keeps the session), structured cards for voice tool results (defensive render hint, expander, next-step button), non-Cyrillic/Latin captions dFable
- 2026-09-23 16:41Add document table and supplier route migrationAdilkhan
- 2026-09-23 16:40fix(ux): UX-FIX-C — purchasing language on Today/SKU/Orders/Feed, 1С export download, demo-events empty state, approve from orders list, phone-width guardAdilkhan
- 2026-09-23 16:39merge: ADJUST-FIX-1 — manual adjustment survives event recompute (needs_review + ledger notice); M3 corrected ≥ raw (judge sim #3)Adilkhan
- 2026-09-23 16:39fix(engine): carry manual adjustment through event recompute (needs_review when above the new calc, ledger notice); M3 corrected demand ≥ raw on the same eligible months (ADJUST-FIX-1)Adilkhan
- 2026-09-23 16:37Merge remote-tracking branch 'origin/main'Adilkhan
- 2026-09-23 16:36merge: UX-FIX-B — «Настройки» page (opening cash, terms, lead times, cost gap) via PATCH /api/params; Money never empty (gaps → «Заполнить»); nav «Связи» → «Настройки», /connections redirect; no fieldAdilkhan
- 2026-09-23 16:36merge main @8198df8 into lane/docsAdilkhan
- 2026-09-23 16:36docs: progress log 16:36Maulen
- 2026-09-23 16:35feat(v2): Настройки page, Money gaps as fill buttons, Связи → Настройки (UX-FIX-B)Adilkhan
- 2026-09-23 16:35merge: UX-FIX-A — Закупки: «Добавить в корзину», supplier order/letter buttons on every tab, «Рассчитать заказы», sortable columns with URL state, stake formatting, plain-language ledger; Товары: thumAdilkhan
- 2026-09-23 16:34feat(ui): purchasing UX fixes — basket action, sortable columns, stake formatting, plain-Russian rationale, SKU thumbnails, calc controlAdilkhan
- 2026-09-23 16:31Merge remote-tracking branch 'origin/main'Adilkhan
- 2026-09-23 16:30merge: ASSIST-2 + VOICE-FIX-1 — full-width Помощник (transcript, inline cards, mic primary, live waveform), opaque chat sheet (shell tokens scoped), SKU code resolver, one reply per tool result, playbAdilkhan
- 2026-09-23 16:30ASSIST-2: dock is an unmistakable chat sheet — carries the .v2 token scope (was mounted outside it → transparent), opaque surface + shadow, user/assistant bubbles, typing indicator on dock and /assistFable
- 2026-09-23 16:29docs: cash commitment note — what an approved order does to money (RU)Maulen
- 2026-09-23 16:27feat(landing): public /landing — steppe-and-mountains loop (Higgsfield, 53 credits), poster, promise, sections, footer; middleware allowlist for /landing, /brand, /icon.svg (LANDING-1, D-H63)Adilkhan
- 2026-09-23 16:27ASSIST-2: phone screenshot from a real 390 px load (shared thread restored from storage)Fable
- 2026-09-23 16:26ASSIST-2: shell served at / — empty prefix valid in assistant answers, e2e waits on the shell nav, closeout GREENFable
- 2026-09-23 16:26feat(landing): visible-motion mountains loop, verified copy, LANDING-1 closeoutAdilkhan
- 2026-09-23 16:26docs: README «Модели» — reasoning / fast / realtime routing, env rowsAdilkhan
- 2026-09-23 16:26merge main @8f7a17d into lane/docsAdilkhan
- 2026-09-23 16:25fix(ui): contain mobile layouts and align Fable shell tokensAdilkhan
- 2026-09-23 16:24fix(ai): change-summary action subject matches the per-unit decision recordAdilkhan
- 2026-09-23 16:22feat(landing): public mountains landing at /landing (LANDING-1)Adilkhan
- 2026-09-23 16:22merge: ENGINE-FIX-1 — six review blockers fixed (approved supply deduplicated against transit, sparse outliers reviewed not excluded, file totals subtract file documents only, transit ETA retained, baAdilkhan
- 2026-09-23 16:21fix(ai): record rules fallback for supplier repliesAdilkhan
- 2026-09-23 16:20ASSIST-2: post-SHELL-1 — /assistant surface at /, «Помощник» naming, no dock trigger on the surface, 390 px overflow fix, assist spec on / routesFable
- 2026-09-23 16:20Merge lane/voicefix 376478d into lane/assist2 — keep localStream/remoteStream exposure inside the guarded ontrackFable
- 2026-09-23 16:20docs: close out ENGINE-FIX-1 gatesAdilkhan
- 2026-09-23 16:20fix(engine): report partial runs and clarify replenishment evidenceAdilkhan
- 2026-09-23 16:20merge: AI-ROUTE-1 — reasoning|fast task classes, OPENAI_REASONING_MODEL / OPENAI_FAST_MODEL, realtime voice unchanged (D-H62)Adilkhan
- 2026-09-23 16:19Merge origin/main (SHELL-1) into lane/assist2 — /assistant is the full-width surface at /, dock base ""Fable
- 2026-09-23 16:19feat(ai): task classes reasoning|fast with OPENAI_REASONING_MODEL / OPENAI_FAST_MODEL; realtime voice unchanged; class + model recorded internally; /api/modes plain-Russian routing line (AI-ROUTE-1, DAdilkhan
- 2026-09-23 16:18ASSIST-2: merge VOICE-FIX-1 — lane resolver in assistant answers, voice hook exposes localStream/remoteStream for the live wave, «Включить звук» wiredFable
- 2026-09-23 16:17fix(voice): finish audio unlock and canonical queue coverageAdilkhan
- 2026-09-23 16:16Merge remote-tracking branch 'origin/main'Adilkhan
- 2026-09-23 16:16docs: SUBMISSION_RU v2 mirrors the platform form text (no demo URL/code); TASK_MAP header → main 220d777 after ENGINE-1/WORLD-2/SHELL-1, U1 screens row → the nine-section Fable shellAdilkhan
- 2026-09-23 16:16merge: L7 README v2.0 + SUBMISSION_RU v2 — «Экраны» section, demo access wording, «Локальный режим» label (verified on a keyless clean clone of 220d777)Adilkhan
- 2026-09-23 16:16docs: purchasing manager FAQ (RU)Maulen
- 2026-09-23 16:15docs: L7 checkpointAdilkhan
- 2026-09-23 16:15docs: voice needs a key — say so in screens and submissionAdilkhan
- 2026-09-23 16:15docs: README v2.0 — screens section (nine sections), live demo URL, submission text v2; verified on a keyless clean clone of 220d777Adilkhan
- 2026-09-23 16:15merge: origin/main (SHELL-1 landed, L7 README v1.9) into lane/shellAdilkhan
- 2026-09-23 16:13fix(ui): show approved order deduction in need formulaAdilkhan
- 2026-09-23 16:13merge: SHELL-1 — the Fable shell is THE shell at / (nine sections: Сегодня, Закупки, Заказы, Поставщики, Товары, Деньги, Лента, Связи, Помощник); FABLE-UI-1 + ASSIST-1 + SUPPLIERS-1 + ORDERS-1 + SKU-1Adilkhan
- 2026-09-23 16:13fix(api): compose current basket across partial calculation runsAdilkhan
- 2026-09-23 16:13Merge branch 'lane/voicefix' into lane/assist2Adilkhan
- 2026-09-23 16:13ASSIST-2: /assistant full-width conversation surface — centred transcript, inline result cards, quick actions, mic-first control with live audio wave, shared thread with the dock, typed SKU resolver (Fable
- 2026-09-23 16:13fix(voice): SKU code resolver (trim → exact → underscore → prefix → article → name), one reply per tool result with a two-reply cap per turn, playback started in the click stack + «Включить звук» statAdilkhan
- 2026-09-23 16:12fix(events): retain transit ETA on quantity-only updateAdilkhan
- 2026-09-23 16:12fix(engine): subtract only file documents from file totalsAdilkhan
- 2026-09-23 16:12docs: SHELL-1 closeout final (check 287/0, routes 200/307, ribbon proof)Adilkhan
- 2026-09-23 16:11fix(engine): review sparse outliers instead of excluding demandAdilkhan
- 2026-09-23 16:11merge: L7 README v1.9 — worked example, isolation, dated transit, rules fallback, supplier reply paragraph (verified on a keyless clean clone of 9b01fcb)Adilkhan
- 2026-09-23 16:11fix(engine): deduplicate approved supply already in transitAdilkhan
- 2026-09-23 16:11docs: task map — supplier reply check namesAdilkhan
- 2026-09-23 16:10docs: README v1.9 — ENGINE-1/WORLD-2 verified on a keyless clean clone of 9b01fcb (worked example, isolation, supplier reply, 267/0/7/7)Adilkhan
- 2026-09-23 16:10merge: SKU-1 card at /skus/[code] (Opus A visual on the Fable structure); visible AI label reads «Локальный режим» (contract label kept as tooltip)Adilkhan
- 2026-09-23 16:08SKU-1: Товар (карточка) — Opus A visual on the Fable card structure, values and metricsAdilkhan
- 2026-09-23 16:08merge main @9b01fcb into lane/docsAdilkhan
- 2026-09-23 16:08merge: origin/main (WORLD-2) into lane/shell — supplier reply review lands at the re-homed /review/[id]Adilkhan
- 2026-09-23 16:08shell: loading ribbon under the header (route transitions + page-level requests > 300 ms) and circular Spinner/SectionLoading applied to every skeleton primitive; ORDERS-1 test import re-pointedAdilkhan
- 2026-09-23 16:06merge: lane/orders (ORDERS-1) into lane/shellAdilkhan
- 2026-09-23 16:06merge: ORDERS-1 page moved to /orders (replaces the interim list); links un-prefixedAdilkhan
- 2026-09-23 16:06shell: SHELL-1 closeout, shell evidence screenshots, dock trigger reads «Спросить помощника»Adilkhan
- 2026-09-23 16:05merge: WORLD-2 — supplier reply → typed partial/delay decision → split/expedite proposal; demo event WE-046; 30/70 obligations per split (D-H57 item 9; views.ts resolved: batched queue fields + new prAdilkhan
- 2026-09-23 16:04docs(opus-a): record final browser run failures preciselyAdilkhan
- 2026-09-23 16:04ORDERS-1: «Заказы» pipeline page in the Fable v2 language with truthful stage rail, evidence rail and read-only /api/sourcesAdilkhan
- 2026-09-23 16:03test(opus-a): capture Astra evidence and bounded acceptanceAdilkhan
- 2026-09-23 16:03tests: suppliers e2e spec targets /suppliersAdilkhan
- 2026-09-23 16:03merge: origin/main into lane/shell before closeoutAdilkhan
- 2026-09-23 16:03merge: lane/suppliers (SUPPLIERS-1) into lane/shellAdilkhan
- 2026-09-23 16:03merge: SUPPLIERS-1 page moved to /suppliers; links un-prefixedAdilkhan
- 2026-09-23 16:03shell: plain-Russian sweep — no state versions or raw-data links in the visible UIAdilkhan
- 2026-09-23 16:02SUPPLIERS-1: /v2/suppliers — IEK / SE cards (lead time, terms 30/70, open POs, in transit, committed money, last reply) + read-only /api/suppliersFable
- 2026-09-23 16:02shell: Помощник page mode at /assistant (moved from /v2/assistant)Adilkhan
- 2026-09-23 16:01merge: lane/assist (ASSIST-1 dock) into lane/shell — dock mounted in the (v2) layout, page mode at /assistantAdilkhan
- 2026-09-23 16:01shell: nine-item IA in the Fable rail; Товары, Заказы, Поставщики pages in the Fable language; Fable order page at /orders/[po_id] (the peers portal keeps /supplier/[po_id])Adilkhan
- 2026-09-23 16:01Handle supplier reply split and expedite proposalsAdilkhan
- 2026-09-23 15:59ASSIST-1: ИИ-ассистент dock for the v2 shell — page context, keyless data-backed answers, popup page modeAdil
- 2026-09-23 15:59feat(world): supplier reply → typed partial/delay decision → split/expedite proposal; demo event WE-046; 30/70 obligations per split (WORLD-2)Adilkhan
- 2026-09-23 15:59shell: the Fable shell becomes THE shell — /today /replenishment /skus/[code] /money /supplier/[po_id] served by the (v2) layout; old (app), (opus_a), (opus_b) groups retired; /v2/* and /opus_a/* keptAdilkhan
- 2026-09-23 15:59merge: ENGINE-1 — per-SKU isolation, leave-one-out outlier p95, approved POs as expected supply, basket A/B, units + IEK min / SE multiple, dated IEK transit within horizon, observed vs inferred stockAdilkhan
- 2026-09-23 15:59merge: lane/fable_ui_1 into lane/shell — one Fable shell (FABLE-UI-1 layout/rail/tokens), token union for the SKU/Money/Supplier screens, Playwright projects unitedAdilkhan
- 2026-09-23 15:58docs: glossary of purchasing and calculation terms (RU)Maulen
- 2026-09-23 15:57Exclude partial and prelaunch months from demand levelAdilkhan
- 2026-09-23 15:57feat(opus-a): complete purchasing flows and responsive interfaceAdilkhan
- 2026-09-23 15:56docs: outlier review guide for the purchasing manager (RU)Maulen
- 2026-09-23 15:51Fall back to rules decisions after provider errorsAdilkhan
- 2026-09-23 15:50Separate observed stockouts from unknown stock and show raw demandAdilkhan
- 2026-09-23 15:48Use dated IEK transit only within the planning horizonAdilkhan
- 2026-09-23 15:48docs: README — ekt.kz read-only catalog paragraph, EKT env vars, etl-then-check wordingAdilkhan
- 2026-09-23 15:47Respect SKU units and supplier order rulesAdilkhan
- 2026-09-23 15:47merge main @104732a into lane/docsAdilkhan
- 2026-09-23 15:47Merge lane/fable_ui_1 into main: one v2 shell for five screens (MERGE-6)Adilkhan
- 2026-09-23 15:45merge: MERGE-5 — /api/today performance fix (batched reads; 9 ms at four runs) over adjust/EKT route and schema changesAdilkhan
- 2026-09-23 15:45Cover supplier basket after SKU-local event recomputeAdilkhan
- 2026-09-23 15:45Count approved purchase orders as expected supplyAdilkhan
- 2026-09-23 15:44merge: lane/today_perf into lane/merge5Adilkhan
- 2026-09-23 15:43Use leave-one-out document quantities for outlier thresholdsAdilkhan
- 2026-09-23 15:41Isolate SKU calculation failures and report countsAdilkhan
- 2026-09-23 15:41FABLE_UI_1 closeoutAdilkhan
- 2026-09-23 15:40docs: L7 checkpointAdilkhan
- 2026-09-23 15:40v2 evidence: Playwright states at 1440×900/390×844, approve-with-adjustment proof, Ainalym brand (D-H54), shared today snapshotAdilkhan
- 2026-09-23 15:39docs: README — 1C export wording follows the «Заказ поставщику» formAdilkhan
- 2026-09-23 15:39docs: README v1.8.1 — 1C «Заказ поставщику» export verified, check 250/0/7/7, 1C input sentence (D-H56)Adilkhan
- 2026-09-23 15:39Preserve dated snapshot truth and bound catalog requestsAdilkhan
- 2026-09-23 15:37Preserve dated snapshot truth and bound catalog requestsAdilkhan
- 2026-09-23 15:36docs: calculation methodology (RU) with a worked SE exampleMaulen
- 2026-09-23 15:34merge: ONEC-1 — 1С input-side visibility in /api/modes, «Заказ поставщику»-shaped exportAdilkhan
- 2026-09-23 15:34fix(check): clean-clone script runs npm run etl before npm run checkAdilkhan
- 2026-09-23 15:34merge: MERGE-4 — EKT-1 read-only ekt.kz catalog adapter over the image/adjust route changesAdilkhan
- 2026-09-23 15:34Record complete ekt catalog snapshot, SKU mappings, and thumbnailsAdilkhan
- 2026-09-23 15:33onec: expose 1C file input and supplier order exportAdilkhan
- 2026-09-23 15:30Document MERGE-4 closeoutAdilkhan
- 2026-09-23 15:30Merge lane/ekt catalog adapter with image and adjustment fieldsAdilkhan
- 2026-09-23 15:29merge: lane/docsAdilkhan
- 2026-09-23 15:29perf(today): supersede previous open proposals per supplier, bounded today/queue views, indexes (TODAY-PERF-1)Adilkhan
- 2026-09-23 15:28Preserve dated snapshot truth and bound catalog requestsAdilkhan
- 2026-09-23 15:28docs(opus-a): record Astra interface baseline and reviewAdilkhan
- 2026-09-23 15:28merge: lane/brandAdilkhan
- 2026-09-23 15:27docs: L7 checkpointAdilkhan
- 2026-09-23 15:27merge main @81f73d6 into lane/docsAdilkhan
- 2026-09-23 15:27docs: README v1.8 — adjust step (409 on stale), clean clone PASS @81f73d6Adilkhan
- 2026-09-23 15:26docs: the five must-have checks as reviewer steps (RU)Maulen
- 2026-09-23 15:26brand: Dain leaf mark + Latin wordmark in every shellAdilkhan
- 2026-09-23 15:25merge: FIX-3 — export urgency by line recommendation, partner test uses the DB path resolver (both migrations kept)Adilkhan
- 2026-09-23 15:25docs: README v1.8 — shared DB path (no sed), version-read approve step, numbers from a keyless clean clone of da810b1Adilkhan
- 2026-09-23 15:24merge: ADJUST-1 — POST /api/recommendations/:id/adjust + GET /api/recommendations/:id (resolved with image_url)Adilkhan
- 2026-09-23 15:24docs: strip local paths from lane closeouts (clean-clone gate)Adilkhan
- 2026-09-23 15:24Run named partner checks against resolved ETL databaseAdilkhan
- 2026-09-23 15:23Implement versioned recommendation adjustment APIAdilkhan
- 2026-09-23 15:21Bind 1C export urgency to each PO line recommendationAdilkhan
- 2026-09-23 15:21brand: Ainalym mark (Dain leaf) as public/brand/ainalym-mark.svgAdilkhan
- 2026-09-23 15:20brand: the product name is always Ainalym in Latin letters (owner law)Adilkhan
- 2026-09-23 15:18merge: lane/fable_ui_2 — Fable v2 screens: SKU card, Money, supplier page (/v2/*)Adilkhan
- 2026-09-23 15:17merge: IMAGES-1 — official IEK thumbnails (379) + Higgsfield category images (30), image_url on SKU/recommendation routesAdilkhan
- 2026-09-23 15:17FABLE_UI_2 closeoutAdilkhan
- 2026-09-23 15:16v2 SKU card: 24-month bars + right rail with recommendation, sources and in-transitAdilkhan
- 2026-09-23 15:16v2 Money: cash, committed by supplier, 60-day outflows, unknown-cost risksAdilkhan
- 2026-09-23 15:16v2 Supplier draft page + Playwright evidence suiteAdilkhan
- 2026-09-23 15:16v2 shell: Ramp-class tokens, sidebar/topbar shell, UI atoms and sales bars chartAdilkhan
- 2026-09-23 15:16Add read-only ekt catalog adapter, snapshot pipeline, and API fieldsAdilkhan
- 2026-09-23 15:16docs(images): record provenance credit spend and verified handoffAdilkhan
- 2026-09-23 15:16docs: data dictionary (RU) — partner files, tables, parsing rulesMaulen
- 2026-09-23 15:14merge: lane/opus_b — Opus 5.5 optionality screens (/opus_b/today, /opus_b/replenishment, /opus_b/skus/[code])Adilkhan
- 2026-09-23 15:14feat(api): expose illustrative SKU image URLs with category fallbackAdilkhan
- 2026-09-23 15:13merge: lane/opus_a — Opus 5.5 optionality screens (/opus_a/today, /opus_a/replenishment, /opus_a/skus/[code])Adilkhan
- 2026-09-23 15:13feat(images): register thirty generated category fallbacksAdilkhan
- 2026-09-23 15:13feat(images): fetch prioritized exact-article SKU thumbnailsAdilkhan
- 2026-09-23 15:13Document ekt.kz catalog API discovery and provenance labelsAdilkhan
- 2026-09-23 15:12docs(opus_b): evidence (desktop+phone, states, keyboard proofs) + closeoutAdilkhan
- 2026-09-23 15:11opus_a: closeoutAdilkhan
- 2026-09-23 15:11opus_a: evidence — Playwright spec (keyboard, 409 stale, adjust state, ⌘K) + 18 desktop/phone screenshots; Today task reasons in RUAdilkhan
- 2026-09-23 15:08opus_a: phone fixes — grid min-content overflow, sticky rationale panel inside scrolling table, filter full width; receipt label without hard-coded service levelAdilkhan
- 2026-09-23 15:08feat(opus_b): Today colour pass — supplier marks, SE/IEK split bar, full-height railAdilkhan
- 2026-09-23 15:08feat(opus_b): Replenishment table + rationale tape row (screen 2)Adilkhan
- 2026-09-23 15:08feat(opus_b): SKU card — banking-style chart + right rail (screen 3)Adilkhan
- 2026-09-23 15:06opus_a: SKU card — 24-month sales bars with stockout bands + excluded one-off docs, forecast line, recommendation receipt, in-transit and sources railAdilkhan
- 2026-09-23 15:05feat(opus_b): Today pulse + warm Ramp-like shell (screen 1)Adilkhan
- 2026-09-23 15:04opus_a: Replenishment — Bills-pattern table grouped by supplier, urgency tabs with counts, keyboard rows, rationale receipt + version-bound adjustAdilkhan
- 2026-09-23 15:03v2 Replenishment: supplier tabs, urgency chips, table with expandable rationale, draft adjustments via version-bound approveAdilkhan
- 2026-09-23 15:03merge: DOMAIN-FIX-1 — export urgency labels, money schedule after approval, order total, hosted calcAdilkhan
- 2026-09-23 15:02docs: close out domain purchase-cycle fixesAdilkhan
- 2026-09-23 15:02merge: lane/voice finalAdilkhan
- 2026-09-23 15:02opus_a: Today pulse — Ramp-like greige shell, number strip, version-bound decision cards, money + agent railAdilkhan
- 2026-09-23 15:00docs(voice): list complete lane artifactsAdilkhan
- 2026-09-23 15:00merge: MERGE-3 — L2a final tip (params/outlier review, scheduled checks, task transitions)Adilkhan
- 2026-09-23 14:59docs: close out MERGE-3 domain integrationAdilkhan
- 2026-09-23 14:59docs(voice): verify after L1 database fixAdilkhan
- 2026-09-23 14:59merge: domain A final closeout with integrated worker semanticsAdilkhan
- 2026-09-23 14:59v2 shell + Today/Pulse screen (Fable UI lane 1)Adilkhan
- 2026-09-23 14:57fix: derive order cost from priced linesAdilkhan
- 2026-09-23 14:57Merge branch 'main' into lane/voiceAdilkhan
- 2026-09-23 14:57docs(voice): close out partner integration gatesAdilkhan
- 2026-09-23 14:57fix: schedule obligations for priced PO linesAdilkhan
- 2026-09-23 14:56fix(deploy): PrivateTmp for the systemd unit + SQLite temp_store=MEMORY (hosted calc run hit disk I/O error on temp files)Adilkhan
- 2026-09-23 14:56merge: lane/l1_fix — L1-FIX-1 (sync ledger, DATABASE_PATH resolver, calc 503 on missing data, health, check fails closed)Adilkhan
- 2026-09-23 14:56fix: export canonical Russian urgency labelsAdilkhan
- 2026-09-23 14:55docs: pitch — five-minute story (RU)Maulen
- 2026-09-23 14:55docs(demo): align form wording with partner caseAdilkhan
- 2026-09-23 14:55docs(demo): record image and scoped secret auditAdilkhan
- 2026-09-23 14:54merge: lane/voiceAdilkhan
- 2026-09-23 14:54test(demo): prove merged offline container scenarioAdilkhan
- 2026-09-23 14:53merge: lane/e2eAdilkhan
- 2026-09-23 14:53docs: close out L1 skeleton fixesAdilkhan
- 2026-09-23 14:52feat(voice): verify shared tools against partner routesAdilkhan
- 2026-09-23 14:52Merge branch 'main' into lane/voiceAdilkhan
- 2026-09-23 14:52test(e2e): hosted demo judge flow + evidenceAdilkhan
- 2026-09-23 14:51fix(deploy): preserve explicit ETL database argumentAdilkhan
- 2026-09-23 14:51merge: lane/docsAdilkhan
- 2026-09-23 14:50merge main @df8b3ed into lane/docsAdilkhan
- 2026-09-23 14:50merge: lane/ai_fixAdilkhan
- 2026-09-23 14:50docs: design notes — what the interface deliberately does not doMaulen
- 2026-09-23 14:50Merge branch 'main' into lane/domain_aAdilkhan
- 2026-09-23 14:50docs(domain): close out integrated gates and handoff gapsAdilkhan
- 2026-09-23 14:49Merge branch 'main' into lane/demoAdilkhan
- 2026-09-23 14:49fix(demo): trust IP headers only behind configured ingressAdilkhan
- 2026-09-23 14:49fix(server): log internal errors server-side (message + top frames, never the body)Adilkhan
- 2026-09-23 14:49fix(truth): use selected AI provider for response labelsAdilkhan
- 2026-09-23 14:49fix(check): fail closed on collection and report errorsAdilkhan
- 2026-09-23 14:48docs(ai): close out L3-FIX-1 regressions and gatesAdilkhan
- 2026-09-23 14:48docs: README v1.7 — run path and judge steps verified on a keyless clean clone of main; task map @T+77Adilkhan
- 2026-09-23 14:48fix(obligations): bump state once per approval transactionAdilkhan
- 2026-09-23 14:47fix(today): base commitments on persisted proposalsAdilkhan
- 2026-09-23 14:47fix(health): bypass demo rate guard and verify SQLite responseAdilkhan
- 2026-09-23 14:47Merge branch 'main' into lane/ai_fixAdilkhan
- 2026-09-23 14:46docs(ai): record green integrated closeoutAdilkhan
- 2026-09-23 14:46fix(ai): verify persisted ledger and draft route after L1 mergeAdilkhan
- 2026-09-23 14:46fix(calc): refuse runs without required partner dataAdilkhan
- 2026-09-23 14:46merge main @9bd8972 into lane/docsAdilkhan
- 2026-09-23 14:46test(demo): record fresh image and pending route gapAdilkhan
- 2026-09-23 14:46feat(ui): API search for SKUs, orders and calculationsAdilkhan
- 2026-09-23 14:46fix(db): resolve one configured database path across app and ETLAdilkhan
- 2026-09-23 14:45Merge branch 'main' into lane/ai_fixAdilkhan
- 2026-09-23 14:45Merge branch 'main' into lane/aiAdilkhan
- 2026-09-23 14:45refactor(domain): use persisted ledger signatureAdilkhan
- 2026-09-23 14:45fix(ledger): keep node sqlite transactions synchronousAdilkhan
- 2026-09-23 14:45Merge branch 'main' into lane/ui_bAdilkhan
- 2026-09-23 14:44feat(ui): workspace and review states, rendersAdilkhan
- 2026-09-23 14:43feat(domain): ledger review tasks and order draftsAdilkhan
- 2026-09-23 14:43Merge branch 'main' into lane/domain_aAdilkhan
- 2026-09-23 14:43docs(demo): checkpoint merged readiness and remaining gatesAdilkhan
- 2026-09-23 14:43merge: lane/voice closeout — Realtime session, tools, typed fallback, notesAdilkhan
- 2026-09-23 14:43Merge branch 'main' into lane/ui_cAdilkhan
- 2026-09-23 14:43feat(ui): notifications for decisions and processing failuresAdilkhan
- 2026-09-23 14:43Merge branch 'main' into lane/voiceAdilkhan
- 2026-09-23 14:42merge: MERGE-2 — L1 full routes + L2a + L2b closeout tips integratedAdilkhan
- 2026-09-23 14:42docs(domain): checkpoint ledger integration boundaryAdilkhan
- 2026-09-23 14:42docs(ai): close out lane with ledger integration pendingAdilkhan
- 2026-09-23 14:42Merge branch 'main' into lane/demoAdilkhan
- 2026-09-23 14:42merge: lane/domain_b closeout into lane/merge2Adilkhan
- 2026-09-23 14:42fix(ai): empty OPENAI_BASE_URL means unset (keyless clone: world compose/play no longer 500)Adilkhan
- 2026-09-23 14:42Merge branch 'main' into lane/ui_cAdilkhan
- 2026-09-23 14:42Merge branch 'main' into lane/aiAdilkhan
- 2026-09-23 14:41Merge branch 'main' into lane/domain_aAdilkhan
- 2026-09-23 14:41fix(domain): keep ledger writes with caller databaseAdilkhan
- 2026-09-23 14:41fix(voice): route partner SKU codes in typed fallbackAdilkhan
- 2026-09-23 14:41Merge branch 'main' into lane/voiceAdilkhan
- 2026-09-23 14:41Merge branch 'main' into lane/ai_fixAdilkhan
- 2026-09-23 14:40merge: lane/ui_a closeout — shell, Pulse, money page, review fixesAdilkhan
- 2026-09-23 14:40Merge branch 'main' into lane/ui_cAdilkhan
- 2026-09-23 14:40feat(ui): purchase order and document listsAdilkhan
- 2026-09-23 14:40fix(voice): review only stored recommendationsAdilkhan
- 2026-09-23 14:40Merge branch 'main' into lane/voiceAdilkhan
- 2026-09-23 14:40Merge branch 'main' into lane/aiAdilkhan
- 2026-09-23 14:40docs(ui): close out shell and Pulse laneAdilkhan
- 2026-09-23 14:39merge main @ec87f9a into lane/docsAdilkhan
- 2026-09-23 14:39docs(world): close out L6-FIX-1 gatesAdilkhan
- 2026-09-23 14:39test(ai): require persisted worker trace after L1 mergeAdilkhan
- 2026-09-23 14:39merge: lane/world — L6-FIX-1 (org-scoped tick, SKU validation, truth axes, labels)Adilkhan
- 2026-09-23 14:39Merge branch 'main' into lane/aiAdilkhan
- 2026-09-23 14:39fix(voice): stop abandoned session handshakesAdilkhan
- 2026-09-23 14:39fix(ai): omit empty proposals after zero-need recomputeAdilkhan
- 2026-09-23 14:38feat(ui): assistant, connections, console states, rendersAdilkhan
- 2026-09-23 14:38docs(demo): distinguish merged data fixes from pending route floorAdilkhan
- 2026-09-23 14:38Merge branch 'main' into lane/ui_aAdilkhan
- 2026-09-23 14:38test(domain): keep ledger in calculation databaseAdilkhan
- 2026-09-23 14:38fix(voice): await slow duplicate tool executionAdilkhan
- 2026-09-23 14:38Merge branch 'main' into lane/voiceAdilkhan
- 2026-09-23 14:38fix(peers): expose supplier axes at result boundaryAdilkhan
- 2026-09-23 14:38fix(ui): keep result truth axes visibleAdilkhan
- 2026-09-23 14:38fix(ai): map replay change summaries to stable subjectAdilkhan
- 2026-09-23 14:37Merge branch 'main' into lane/demoAdilkhan
- 2026-09-23 14:37test(peers): assert worker seams and replay versionAdilkhan
- 2026-09-23 14:37Merge branch 'main' into lane/domain_aAdilkhan
- 2026-09-23 14:37merge main @a32279a into lane/docsAdilkhan
- 2026-09-23 14:36feat(ui): finalize Pulse verification evidenceAdilkhan
- 2026-09-23 14:36Merge branch 'main' into lane/ai_fixAdilkhan
- 2026-09-23 14:36docs: strip local filesystem paths from tracked handoff docs (clean-clone gate)Adilkhan
- 2026-09-23 14:36fix(peers): derive judge event text from numeric inputAdilkhan
- 2026-09-23 14:36fix(ai): use canonical unsent draft labelAdilkhan
- 2026-09-23 14:36fix: preserve fresh stock and current scenario sourcesAdilkhan
- 2026-09-23 14:36fix(ai): derive borderline review from engine statisticsAdilkhan
- 2026-09-23 14:35docs: landing copy (RU)Maulen
- 2026-09-23 14:35test(voice): script corrected speech before calculationAdilkhan
- 2026-09-23 14:35fix(peers): use canonical simulator supplier labelsAdilkhan
- 2026-09-23 14:35docs(domain): refresh checkpoint and gate evidenceAdilkhan
- 2026-09-23 14:35fix(peers): return provenance AI and external axesAdilkhan
- 2026-09-23 14:35fix(ai): bind decision cache to evidence quantitiesAdilkhan
- 2026-09-23 14:34fix(ai): reclaim stale event claims after applied stageAdilkhan
- 2026-09-23 14:34fix(world): validate composed SKU and supplier before writeAdilkhan
- 2026-09-23 14:33fix(demo): keep active host release immutable on redeployAdilkhan
- 2026-09-23 14:33fix(world): scope playback worker to caller organizationAdilkhan
- 2026-09-23 14:33fix(ui): align feed and navigation with landed APIsAdilkhan
- 2026-09-23 14:33fix(ai): preserve unaffected proposal lines on partial recomputeAdilkhan
- 2026-09-23 14:32merge: lane/domain_a closeout into lane/merge2Adilkhan
- 2026-09-23 14:32merge: lane/skeleton closeout into lane/merge2Adilkhan
- 2026-09-23 14:32fix(domain): require stock source alongside fresh balanceAdilkhan
- 2026-09-23 14:31fix(ai): namespace worker ledger actionsAdilkhan
- 2026-09-23 14:31fix(ai): persist worker ledger runs and actionsAdilkhan
- 2026-09-23 14:31test(voice): capture no-key panel fallbackAdilkhan
- 2026-09-23 14:31Merge branch 'main' into lane/voiceAdilkhan
- 2026-09-23 14:31docs(demo): checkpoint hosted demo proof and red integration gapAdilkhan
- 2026-09-23 14:31Merge branch 'main' into lane/demoAdilkhan
- 2026-09-23 14:31fix(domain): align outlier rule with accepted contractAdilkhan
- 2026-09-23 14:30feat(ai): semantic replenishment columns with sourced judgmentsAdilkhan
- 2026-09-23 14:30Merge branch 'main' into lane/aiAdilkhan
- 2026-09-23 14:30test(ai): live smoke opt-in onlyAdilkhan
- 2026-09-23 14:29Merge branch 'main' into lane/domain_aAdilkhan
- 2026-09-23 14:29docs(contract): outlier rule = max(20, min(3×median month, 5×p95 doc))Adilkhan
- 2026-09-23 14:29merge: main world and domain integration checkpointAdilkhan
- 2026-09-23 14:29fix(voice): enforce provider-side ephemeral expiryAdilkhan
- 2026-09-23 14:28docs: L7 checkpointAdilkhan
- 2026-09-23 14:28Merge branch 'main' into lane/aiAdilkhan
- 2026-09-23 14:27docs: README v1.6 + task map @T+59 — M1–M5 PASS on partner data, new outlier rule, fresh on-hand, world/peers/exportAdilkhan
- 2026-09-23 14:27Merge branch 'main' into lane/voiceAdilkhan
- 2026-09-23 14:27feat(voice): publish confirmed result to assistant panelAdilkhan
- 2026-09-23 14:27merge: lane/demoAdilkhan
- 2026-09-23 14:26fix(demo): isolate clean tunnel build and guard route dispatchAdilkhan
- 2026-09-23 14:26Merge branch 'main' into lane/demoAdilkhan
- 2026-09-23 14:26merge: lane/voiceAdilkhan
- 2026-09-23 14:26Merge branch 'main' into lane/voiceAdilkhan
- 2026-09-23 14:26Merge branch 'main' into lane/aiAdilkhan
- 2026-09-23 14:26fix(ai): stabilize live drafting and record green AI gateAdilkhan
- 2026-09-23 14:25merge: lane/ui_cAdilkhan
- 2026-09-23 14:25Merge branch 'main' into lane/voiceAdilkhan
- 2026-09-23 14:25fix(voice): identify ephemeral demo sessionAdilkhan
- 2026-09-23 14:25Merge branch 'main' into lane/ui_cAdilkhan
- 2026-09-23 14:25merge: lane/ui_bAdilkhan
- 2026-09-23 14:25merge main @a70b276 into lane/docsAdilkhan
- 2026-09-23 14:24merge: lane/ui_aAdilkhan
- 2026-09-23 14:24Merge branch 'main' into lane/ui_cAdilkhan
- 2026-09-23 14:24Merge branch 'main' into lane/ui_bAdilkhan
- 2026-09-23 14:24docs: L2a domain closeout and cross-lane gatesAdilkhan
- 2026-09-23 14:24merge: lane/worldAdilkhan
- 2026-09-23 14:24merge main @d9bf2e7 into lane/docsAdilkhan
- 2026-09-23 14:23merge: lane/aiAdilkhan
- 2026-09-23 14:23Merge branch 'main' into lane/aiAdilkhan
- 2026-09-23 14:23fix(ai): resolve stale context and preflight event decisionsAdilkhan
- 2026-09-23 14:23merge: lane/integAdilkhan
- 2026-09-23 14:23fix(ui): preserve focused decisions during refreshAdilkhan
- 2026-09-23 14:22test(domain): prioritize priced decisions over source gapsAdilkhan
- 2026-09-23 14:22feat(ui): connections and world consoleAdilkhan
- 2026-09-23 14:21docs(handoff): close out L2b with verified gates and integration gapAdilkhan
- 2026-09-23 14:20fix(voice): recover from dropped data channelAdilkhan
- 2026-09-23 14:20docs: identify integration branch tip in closeoutAdilkhan
- 2026-09-23 14:20docs: close out INTEG-1 green integrationAdilkhan
- 2026-09-23 14:19feat(api): serve approved 1C order exports through the peer writerAdilkhan
- 2026-09-23 14:19docs(peers): close out world and export lane with gate evidenceAdilkhan
- 2026-09-23 14:18Merge branch 'main' into lane/domain_aAdilkhan
- 2026-09-23 14:18fix(stock): use fresh on-hand quantities in replenishmentAdilkhan
- 2026-09-23 14:18feat(domain): versioned recommendation adjustmentAdilkhan
- 2026-09-23 14:18test(voice): partner-data scoped calculation gateAdilkhan
- 2026-09-23 14:16fix(domain): keep unknown supplier commitments undeterminedAdilkhan
- 2026-09-23 14:16fix(peers): use exact supplier channel state labelsAdilkhan
- 2026-09-23 14:16docs: L1 skeleton closeout and integration gapsAdilkhan
- 2026-09-23 14:15fix(ui): bind decisions and labels to displayed resultsAdilkhan
- 2026-09-23 14:15Merge branch 'main' into lane/aiAdilkhan
- 2026-09-23 14:15Merge branch 'main' into lane/ui_cAdilkhan
- 2026-09-23 14:15feat(ai): finish worker review flow and draft verificationAdilkhan
- 2026-09-23 14:15Merge branch 'main' into lane/ui_aAdilkhan
- 2026-09-23 14:15docs: README sections in plain Russian — for whom, how it worksMaulen
- 2026-09-23 14:15Merge branch 'lane/world' into lane/integAdilkhan
- 2026-09-23 14:15fix(etl): exact unit costs, stockout rule, eval thresholdAdilkhan
- 2026-09-23 14:15fix(domain): expire old stock and dedupe scheduled recomputeAdilkhan
- 2026-09-23 14:15Merge branch 'main' into lane/worldAdilkhan
- 2026-09-23 14:15Merge branch 'main' into lane/voiceAdilkhan
- 2026-09-23 14:15fix(voice): bind transcript to the current speech turnAdilkhan
- 2026-09-23 14:14docs(peers): capture partner integration and mobile evidenceAdilkhan
- 2026-09-23 14:14Merge branch 'main' into lane/skeletonAdilkhan
- 2026-09-23 14:14fix(api): expose truth axes and preserve demo health fieldsAdilkhan
- 2026-09-23 14:13test(domain): fail-first agent ledger loopAdilkhan
- 2026-09-23 14:13fix(domain): preserve large money decimal stringsAdilkhan
- 2026-09-23 14:13docs(handoff): identify resolved cross-lane domain gatesAdilkhan
- 2026-09-23 14:13docs: L7 checkpointAdilkhan
- 2026-09-23 14:13docs: README v1.5 + task map @T+46 — L2b on main, check 55/2Adilkhan
- 2026-09-23 14:13Merge branch 'main' into lane/domain_bAdilkhan
- 2026-09-23 14:12merge main @99e3138 into lane/docs (L7 files: lane/docs versions win)Adilkhan
- 2026-09-23 14:12feat(ui): review queue and deskAdilkhan
- 2026-09-23 14:12Merge branch 'main' into lane/demoAdilkhan
- 2026-09-23 14:12Merge branch 'main' into lane/ui_bAdilkhan
- 2026-09-23 14:12docs(demo): flag reset database path before route mergeAdilkhan
- 2026-09-23 14:12fix(domain): include world sales and escalate stale stockAdilkhan
- 2026-09-23 14:12fix(voice): reserve demo budget for provider callsAdilkhan
- 2026-09-23 14:11test(scenario): prove in-transit sensitivity on an active shortageAdilkhan
- 2026-09-23 14:11fix(etl): seed the organization rowAdilkhan
- 2026-09-23 14:11fix(world): align judge compose with merged workerAdilkhan
- 2026-09-23 14:10fix(money): cashflow uses exact money helpersAdilkhan
- 2026-09-23 14:10Merge branch 'main' into lane/skeletonAdilkhan
- 2026-09-23 14:10docs: purchasing manager walkthrough (RU)Maulen
- 2026-09-23 14:10docs: CONTRACTS v1 (real types) + skeleton testsAdilkhan
- 2026-09-23 14:10feat(scenario): print purchase economics beside the money viewAdilkhan
- 2026-09-23 14:10fix(engine): inactive SKUs yield need 0 instead of aborting the runAdilkhan
- 2026-09-23 14:10fix(voice): replay first result and verify no-key HTTP routeAdilkhan
- 2026-09-23 14:09fix(demo): trust only the configured ingress IP headerAdilkhan
- 2026-09-23 14:08fix(domain): label empty opening cash and source replayAdilkhan
- 2026-09-23 14:08feat(domain): align draft orders and policy decisionsAdilkhan
- 2026-09-23 14:07test(demo): prove local standalone host releaseAdilkhan
- 2026-09-23 14:07feat(ui): money pageAdilkhan
- 2026-09-23 14:07test(ai): partner event replay exposes outlier acceptance gapAdilkhan
- 2026-09-23 14:07fix(voice): enforce purchase scope and stale-state checksAdilkhan
- 2026-09-23 14:07feat(domain): persist affected-only recomputationAdilkhan
- 2026-09-23 14:06feat(domain): structure SKU series and recommendation detailAdilkhan
- 2026-09-23 14:05feat(ui): purchase workspaceAdilkhan
- 2026-09-23 14:05fix(demo): transfer host environment with restricted permissionsAdilkhan
- 2026-09-23 14:05Merge branch 'main' into lane/ui_bAdilkhan
- 2026-09-23 14:04docs: L7 checkpoint — engine findings 2Adilkhan
- 2026-09-23 14:03Merge branch 'main' into lane/domain_bAdilkhan
- 2026-09-23 14:03fix(domain): expose overdue obligations and unknown opening cashAdilkhan
- 2026-09-23 14:03feat(ui): assistant panel and voice statesAdilkhan
- 2026-09-23 14:03fix(world): align partner events and peer labelsAdilkhan
- 2026-09-23 14:03Merge branch 'main' into lane/worldAdilkhan
- 2026-09-23 14:03fix(demo): rate-limit all API paths and validate return pathAdilkhan
- 2026-09-23 14:03Merge branch 'main' into lane/ui_cAdilkhan
- 2026-09-23 14:03Merge branch 'main' into lane/domain_aAdilkhan
- 2026-09-23 14:03feat(domain): validate partner SKUs and preserve affected-only proposalsAdilkhan
- 2026-09-23 14:03feat(ui): pulse states and rendersAdilkhan
- 2026-09-23 14:03docs: L7 checkpoint — engine finding on partner dataAdilkhan
- 2026-09-23 14:02docs: README v1.4, task map, submission v1, clean-clone script, L7 handoffs (lane/docs rebuilt on main without dropped L2b)Adilkhan
- 2026-09-23 14:02Merge branch 'main' into lane/voiceAdilkhan
- 2026-09-23 14:01fix(voice): guard single session and label tool failuresAdilkhan
- 2026-09-23 14:01Merge branch 'main' into lane/ui_aAdilkhan
- 2026-09-23 14:01feat(demo): budget each outgoing provider requestAdilkhan
- 2026-09-23 14:01Merge branch 'main' into lane/demoAdilkhan
- 2026-09-23 14:01Merge branch 'main' into lane/aiAdilkhan
- 2026-09-23 14:01test(ai): guardrails, worker, rulesAdilkhan
- 2026-09-23 14:00merge: checkpoint lane/docs — README v1.3, TASK_MAP, clean-clone script, SUBMISSION_RUAdilkhan
- 2026-09-23 14:00Merge branch 'main' into lane/skeletonAdilkhan
- 2026-09-23 14:00feat: skeleton dev page with mode bannerAdilkhan
- 2026-09-23 14:00Merge branch 'main' into lane/demoAdilkhan
- 2026-09-23 14:00fix(demo): persist first-run ETL on the mounted volumeAdilkhan
- 2026-09-23 13:59Merge branch 'main' into lane/domain_bAdilkhan
- 2026-09-23 13:59fix(domain): integrate exact money and partner scenario checksAdilkhan
- 2026-09-23 13:59merge: checkpoint lane/demoAdilkhan
- 2026-09-23 13:58merge: domain and UI checkpoints into skeleton laneAdilkhan
- 2026-09-23 13:58Merge branch 'main' into lane/voiceAdilkhan
- 2026-09-23 13:58feat(voice): run canonical replenishment serviceAdilkhan
- 2026-09-23 13:58merge: checkpoint lane/worldAdilkhan
- 2026-09-23 13:58merge: checkpoint lane/aiAdilkhan
- 2026-09-23 13:57docs: financial example — what a shortage and an excess cost (SE, KZT)Maulen
- 2026-09-23 13:56docs: L7 checkpointAdilkhan
- 2026-09-23 13:56docs: README v1.3 + task map @T+26 — methodology from engine.ts, domain/API claims, check 41/2Adilkhan
- 2026-09-23 13:56fix(demo): stage standalone host release safelyAdilkhan
- 2026-09-23 13:56Merge branch 'main' into lane/demoAdilkhan
- 2026-09-23 13:55Merge branch 'main' into lane/voiceAdilkhan
- 2026-09-23 13:55fix(voice): refresh state and track change cursorsAdilkhan
- 2026-09-23 13:55Merge branch 'main' into lane/domain_aAdilkhan
- 2026-09-23 13:55feat(peers): world and export peer view with truthful labelsAdilkhan
- 2026-09-23 13:55feat(domain): proposal approval, queue and today viewsAdilkhan
- 2026-09-23 13:55Merge branch 'main' into lane/worldAdilkhan
- 2026-09-23 13:55feat(ui): PulseAdilkhan
- 2026-09-23 13:55Merge branch 'main' into lane/aiAdilkhan
- 2026-09-23 13:55feat(ai): prepared supplier and run drafts with consistency checkAdilkhan
- 2026-09-23 13:54merge main @2b29bd2 into lane/docsAdilkhan
- 2026-09-23 13:54feat(api): skeleton routes, ledger, tick, contracts types, error envelopeAdilkhan
- 2026-09-23 13:54docs: README v1.2 + task map @T+25 — check runner, health, reset, UI shellAdilkhan
- 2026-09-23 13:54Merge branch 'main' into lane/domain_bAdilkhan
- 2026-09-23 13:54feat(domain): handle partner world presets and scenario runnerAdilkhan
- 2026-09-23 13:54merge: checkpoint lane/domain_bAdilkhan
- 2026-09-23 13:54merge: checkpoint lane/domain_aAdilkhan
- 2026-09-23 13:53merge main @ba6643b into lane/docsAdilkhan
- 2026-09-23 13:53merge: checkpoint lane/ui_aAdilkhan
- 2026-09-23 13:53docs: L7 checkpoint 08:56ZAdilkhan
- 2026-09-23 13:53test(demo): container run evidenceAdilkhan
- 2026-09-23 13:53docs: README v1.1 + task map @T+24 — ETL landed (counts, eval SKUs, stockout rule, provenance)Adilkhan
- 2026-09-23 13:52Merge branch 'main' into lane/voiceAdilkhan
- 2026-09-23 13:52feat(voice): fallback, transcription, labelsAdilkhan
- 2026-09-23 13:52merge: L1 skeleton checkpoint — check script, health route, repositories, ETL-backed resetAdilkhan
- 2026-09-23 13:52merge: L9 ETL into skeleton laneAdilkhan
- 2026-09-23 13:52merge main @3e964a0 (L9 ETL) into lane/docsAdilkhan
- 2026-09-23 13:52Merge branch 'main' into lane/aiAdilkhan
- 2026-09-23 13:52feat(ai): interpretation pipeline and event workerAdilkhan
- 2026-09-23 13:51merge: L9 ETL — partner xlsx → sqlite, derived series, eval expectations, world eventsAdilkhan
- 2026-09-23 13:51feat(peers): export approved purchase orders as 1C filesAdilkhan
- 2026-09-23 13:50feat(domain): tasks and scheduled checksAdilkhan
- 2026-09-23 13:50fix(domain): preserve returns and dedupe multi-line event actionsAdilkhan
- 2026-09-23 13:50docs: L9 ETL closeoutAdilkhan
- 2026-09-23 13:50feat(voice): interruption, duplicate delivery, ambiguityAdilkhan
- 2026-09-23 13:49fix(etl): zero-fill months without outgoing linesAdilkhan
- 2026-09-23 13:48Merge branch 'main' into lane/demoAdilkhan
- 2026-09-23 13:48chore(demo): deploy scripts and access handover noteAdilkhan
- 2026-09-23 13:48Merge branch 'main' into lane/domain_aAdilkhan
- 2026-09-23 13:48feat(api): purchase orders, money and SKU routesAdilkhan
- 2026-09-23 13:48feat(domain): replenishment engine and supplier proposalsAdilkhan
- 2026-09-23 13:47Merge branch 'main' into lane/voiceAdilkhan
- 2026-09-23 13:47feat(voice): tool bridge with idempotent executionAdilkhan
- 2026-09-23 13:47docs: data provenance + etl testAdilkhan
- 2026-09-23 13:47feat(domain): purchase approvals, obligations, money and world eventsAdilkhan
- 2026-09-23 13:47Merge branch 'main' into lane/domain_bAdilkhan
- 2026-09-23 13:47Merge branch 'main' into lane/aiAdilkhan
- 2026-09-23 13:47feat(ui): tokens, shell, navigation, labelsAdilkhan
- 2026-09-23 13:47feat(ai): typed decision service with replayAdilkhan
- 2026-09-23 13:46docs: README §9 — recount sales-line volumes from the partner filesAdilkhan
- 2026-09-23 13:46Merge branch 'main' into lane/worldAdilkhan
- 2026-09-23 13:46feat(world): supplier and judge compose pagesAdilkhan
- 2026-09-23 13:46docs: L7 rolling closeout 08:48ZAdilkhan
- 2026-09-23 13:46merge main @a4030eb into lane/docsAdilkhan
- 2026-09-23 13:46docs: L7 checkpoint 08:47ZAdilkhan
- 2026-09-23 13:46data: world events from partner history (disclosed)Adilkhan
- 2026-09-23 13:44Merge remote-tracking branch 'origin/main'Adilkhan
- 2026-09-23 13:44feat(voice): session hook and captionsAdilkhan
- 2026-09-23 13:44feat(demo): access code, rate limit, live-call capAdilkhan
- 2026-09-23 13:44test: replenishment eval expectations (partner data, disclosed)Adilkhan
- 2026-09-23 13:44docs: submission text v1 — state build statusAdilkhan
- 2026-09-23 13:44feat: fixture loader and demo:resetAdilkhan
- 2026-09-23 13:44docs: submission text v1Adilkhan
- 2026-09-23 13:44chore: clean-clone check scriptAdilkhan
- 2026-09-23 13:44feat(voice): ephemeral session routeAdilkhan
- 2026-09-23 13:43docs: task map @T+14Adilkhan
- 2026-09-23 13:43docs: README v1Adilkhan
- 2026-09-23 13:43feat(ai): providers (typesafe→gateway, openai, rules, replay) and live smokeAdilkhan
- 2026-09-23 13:43feat(etl): derived seasonality, stockouts, sku statsAdilkhan
- 2026-09-23 13:43feat(db): typed repositoriesAdilkhan
- 2026-09-23 13:43feat(world): scripted feed, play, composeAdilkhan
- 2026-09-23 13:42test(domain): fail-first replenishment propertiesAdilkhan
- 2026-09-23 13:42feat(etl): partner xlsx → sqlite loaderAdilkhan
- 2026-09-23 13:42test(domain): fail-first purchase orders, money and world eventsAdilkhan
- 2026-09-23 13:41feat(domain): money value objectAdilkhan
- 2026-09-23 13:41chore: production container and start scriptAdilkhan
- 2026-09-23 13:41chore: scripts, vitest, check runner skeletonAdilkhan
- 2026-09-23 13:39data: partner exports (ТОО «Электрокомплект», anonymised, disclosed under 5.4.4)Adilkhan
- 2026-09-23 13:37feat(db): schema v0 from the contract + sqlite clientAdilkhan
- 2026-09-23 13:37feat: seam interfaces for parallel lanesAdilkhan
- 2026-09-23 13:37docs: data + API contract v0 (replenishment case)Adilkhan
- 2026-09-23 13:37docs: product acceptance — what «complete» means for the caseAdilkhan
- 2026-09-23 13:34chore: scaffold Next.js app (create-next-app, TypeScript, App Router, npm) + base depsAdilkhan
- 2026-09-23 13:33docs: progress log (kept by Maulen)Maulen
- 2026-09-23 13:33docs: README skeleton (11 разделов, кейс «Автоматический расчёт заказов поставщикам»)Adilkhan
- 2026-09-23 13:33docs: DISCLOSURE.md (regulation 5.4.4, 5.4.4.2)Adilkhan
- 2026-09-23 13:33chore: .gitignore, .env.exampleAdilkhan
- 2026-09-23 13:33docs: AGENTS.md for the repoAdilkhan
Структура репозитория (1234 файлов)
.dockerignore .env.example .gitignore AGENTS.md CLAUDE.md DISCLOSURE.md Dockerfile README.md docs/CASH_COMMITMENT_RU.md docs/CONTRACTS.md docs/DATA_DICTIONARY_RU.md docs/DATA_REQUESTS_RU.md docs/DEMO_ACCESS.md docs/DESIGN_NOTES.md docs/DOCUMENTS_RU.md docs/EXPORT_1C_GUIDE_RU.md docs/FINANCIAL_EXAMPLE.md docs/GLOSSARY_RU.md docs/JUDGE_CHECKS_RU.md docs/LANDING_COPY.md docs/MANAGER_FAQ_RU.md docs/METHODOLOGY_RU.md docs/OUTLIER_REVIEW_GUIDE_RU.md docs/PILOT_PLAN_RU.md docs/PITCH.md docs/PRODUCT.md docs/PROGRESS_LOG.md docs/README_SECTIONS_RU.md docs/SUBMISSION_RU.md docs/TASK_MAP.md docs/WALKTHROUGH_RU.md docs/agent_handoffs/ADJUST_1_CLOSEOUT.md docs/agent_handoffs/ADJUST_FIX_1_CLOSEOUT.md docs/agent_handoffs/AI_ROUTE_1_CLOSEOUT.md docs/agent_handoffs/ASSIST_1_CLOSEOUT.md docs/agent_handoffs/ASSIST_2_CLOSEOUT.md docs/agent_handoffs/ASSIST_4_CLOSEOUT.md docs/agent_handoffs/CART_1_CLOSEOUT.md docs/agent_handoffs/DOCS_UI_CLOSEOUT.md docs/agent_handoffs/DOMAIN_FIX_1_CLOSEOUT.md docs/agent_handoffs/E2E_1_CLOSEOUT.md docs/agent_handoffs/ENGINE_1_CLOSEOUT.md docs/agent_handoffs/ENGINE_FIX_1_CLOSEOUT.md docs/agent_handoffs/FABLE_UI_1_CLOSEOUT.md docs/agent_handoffs/FABLE_UI_2_CLOSEOUT.md docs/agent_handoffs/FIX_3_CLOSEOUT.md docs/agent_handoffs/IMAGES_1_CLOSEOUT.md docs/agent_handoffs/INTEG_1_CLOSEOUT.md docs/agent_handoffs/JUDGE_FIX_CLOSEOUT.md docs/agent_handoffs/L1_CHECKPOINT.md docs/agent_handoffs/L1_FIX_1_CLOSEOUT.md docs/agent_handoffs/L1_SCHEMA_NOTE.md docs/agent_handoffs/L1_SKELETON_CLOSEOUT.md docs/agent_handoffs/L2A_CHECKPOINT.md docs/agent_handoffs/L2A_DOMAIN_CORE_CLOSEOUT.md docs/agent_handoffs/L2B_CHECKPOINT.md docs/agent_handoffs/L2B_DOMAIN_MONEY_CLOSEOUT.md docs/agent_handoffs/L3_AI_LAYER_CLOSEOUT.md docs/agent_handoffs/L3_CHECKPOINT.md docs/agent_handoffs/L3_FIX_1_CLOSEOUT.md docs/agent_handoffs/L4A_CHECKPOINT.md docs/agent_handoffs/L4A_FILES.md docs/agent_handoffs/L4A_INTEGRATION_FINDINGS.md docs/agent_handoffs/L4A_REVIEW_CLOSEOUT.md docs/agent_handoffs/L4A_REVIEW_FOLLOWUP.md docs/agent_handoffs/L4A_REVIEW_RESOLUTION.md docs/agent_handoffs/L4A_REVIEW_SPEC.md docs/agent_handoffs/L4A_UI_SHELL_PULSE_CLOSEOUT.md docs/agent_handoffs/L4B_CHECKPOINT.md docs/agent_handoffs/L4C_CHECKPOINT.md docs/agent_handoffs/L4C_INTEGRATION_NOTES.md docs/agent_handoffs/L5_CHECKPOINT.md docs/agent_handoffs/L5_VOICE_CLOSEOUT.md docs/agent_handoffs/L6_CHECKPOINT.md docs/agent_handoffs/L6_WORLD_PEERS_CLOSEOUT.md docs/agent_handoffs/L7_CHECKPOINT.md docs/agent_handoffs/L7_REVIEWER_PATH_CLOSEOUT.md docs/agent_handoffs/L8_CHECKPOINT.md docs/agent_handoffs/L9_CHECKPOINT.md docs/agent_handoffs/L9_ETL_CLOSEOUT.md docs/agent_handoffs/LANDING_1_CLOSEOUT.md docs/agent_handoffs/LANDING_LIGHT_CLOSEOUT.md docs/agent_handoffs/LANDING_POLISH_CLOSEOUT.md docs/agent_handoffs/LANDING_VIDEO_CLOSEOUT.md docs/agent_handoffs/MERGE_2_CLOSEOUT.md docs/agent_handoffs/MERGE_3_CLOSEOUT.md docs/agent_handoffs/MERGE_4_CLOSEOUT.md docs/agent_handoffs/MERGE_5_CLOSEOUT.md docs/agent_handoffs/ONEC_1_CLOSEOUT.md docs/agent_handoffs/OPUS_A_CLOSEOUT.md docs/agent_handoffs/OPUS_B_CLOSEOUT.md docs/agent_handoffs/ORDERS_1_CLOSEOUT.md docs/agent_handoffs/POLISH_2_CLOSEOUT.md docs/agent_handoffs/POLISH_2_PLAN.md docs/agent_handoffs/POLISH_2_REVIEW.md docs/agent_handoffs/POLISH_2_REVIEW_SPEC.md docs/agent_handoffs/REVIEW_FIX_1_CLOSEOUT.md docs/agent_handoffs/ROWS_1_CLOSEOUT.md docs/agent_handoffs/SHELL_1_CLOSEOUT.md docs/agent_handoffs/SKU_1_CLOSEOUT.md docs/agent_handoffs/SUPPLIERS_1_CLOSEOUT.md docs/agent_handoffs/TODAY_CHART_CLOSEOUT.md docs/agent_handoffs/TODAY_PERF_1_CLOSEOUT.md docs/agent_handoffs/UX_FIX_A_CLOSEOUT.md docs/agent_handoffs/UX_FIX_B_CLOSEOUT.md docs/agent_handoffs/UX_FIX_C_CLOSEOUT.md docs/agent_handoffs/UX_FIX_D_CLOSEOUT.md docs/agent_handoffs/VOICE_FIX_1_CLOSEOUT.md docs/agent_handoffs/VOICE_FIX_2_CLOSEOUT.md docs/agent_handoffs/WORLD_2_CLOSEOUT.md docs/agent_handoffs/WORLD_3_CLOSEOUT.md docs/evidence/brand/appshell.png docs/evidence/brand/html_evidence.md docs/evidence/brand/opus_a.png docs/evidence/brand/opus_b.png docs/evidence/brand/v2.png docs/evidence/demo/local-container.md docs/evidence/e2e/FILES.txt docs/evidence/e2e/REPORT.md docs/evidence/e2e/RESULTS.md docs/evidence/e2e/RUN_NOTES.md docs/evidence/e2e/SKU_RECHECK.json docs/evidence/e2e/desktop/00-access-empty.jpg docs/evidence/e2e/desktop/01.jpg docs/evidence/e2e/desktop/02.jpg docs/evidence/e2e/desktop/03.jpg docs/evidence/e2e/desktop/04-recheck.jpg docs/evidence/e2e/desktop/04.jpg docs/evidence/e2e/desktop/05.jpg docs/evidence/e2e/desktop/06.jpg docs/evidence/e2e/desktop/07.jpg docs/evidence/e2e/desktop/08.jpg docs/evidence/e2e/desktop/09.jpg docs/evidence/e2e/desktop/10.jpg docs/evidence/e2e/desktop/11.jpg docs/evidence/e2e/desktop/12.jpg docs/evidence/e2e/desktop/measurements.json docs/evidence/e2e/desktop/steps.json docs/evidence/e2e/phone/00-access-empty.jpg docs/evidence/e2e/phone/01.jpg docs/evidence/e2e/phone/02.jpg docs/evidence/e2e/phone/03.jpg docs/evidence/e2e/phone/04-recheck.jpg docs/evidence/e2e/phone/04.jpg docs/evidence/e2e/phone/05.jpg docs/evidence/e2e/phone/06.jpg docs/evidence/e2e/phone/07.jpg docs/evidence/e2e/phone/08.jpg docs/evidence/e2e/phone/09.jpg docs/evidence/e2e/phone/10.jpg docs/evidence/e2e/phone/11-assistant.jpg docs/evidence/e2e/phone/11-money.jpg docs/evidence/e2e/phone/11-replenishment.jpg docs/evidence/e2e/phone/11-today.jpg docs/evidence/e2e/phone/11-world.jpg docs/evidence/e2e/phone/11.jpg docs/evidence/e2e/phone/12.jpg docs/evidence/e2e/phone/measurements.json docs/evidence/e2e/phone/steps.json docs/evidence/images/categories.json docs/evidence/images/checks.json docs/evidence/images/fetch.json docs/evidence/images/files.txt docs/evidence/images/generation.json docs/evidence/images/verification.json docs/evidence/landing/landing_1440.png docs/evidence/landing/landing_1440_full.jpg docs/evidence/landing/landing_390.png docs/evidence/landing/landing_390_full.jpg docs/evidence/opus_a/replenishment_adjust_state.png docs/evidence/opus_a/replenishment_desktop.png docs/evidence/opus_a/replenishment_phone.png docs/evidence/opus_a/replenishment_rationale_desktop.png docs/evidence/opus_a/replenishment_rationale_phone.png docs/evidence/opus_a/replenishment_se_desktop.png docs/evidence/opus_a/sku_desktop.png docs/evidence/opus_a/sku_desktop_full.png docs/evidence/opus_a/sku_not_found_phone.png docs/evidence/opus_a/sku_phone.png docs/evidence/opus_a/sku_phone_full.png docs/evidence/opus_a/today_decision_confirm.png docs/evidence/opus_a/today_desktop.png docs/evidence/opus_a/today_desktop_full.png docs/evidence/opus_a/today_phone.png docs/evidence/opus_a/today_phone_full.png docs/evidence/opus_a/today_search_desktop.png docs/evidence/opus_a/today_stale_409_state.png docs/evidence/opus_b/keyboard.txt docs/evidence/opus_b/replenishment-desktop-expanded.png docs/evidence/opus_b/replenishment-desktop.png docs/evidence/opus_b/replenishment-phone-expanded.png docs/evidence/opus_b/replenishment-phone.png docs/evidence/opus_b/replenishment-state-adjust-unavailable.png docs/evidence/opus_b/shoot.mjs docs/evidence/opus_b/sku-desktop-chart-keys.png docs/evidence/opus_b/sku-desktop-full.png docs/evidence/opus_b/sku-desktop.png docs/evidence/opus_b/sku-phone-full.png docs/evidence/opus_b/sku-phone.png docs/evidence/opus_b/today-desktop-focus.png docs/evidence/opus_b/today-desktop-full.png docs/evidence/opus_b/today-desktop-search.png docs/evidence/opus_b/today-desktop.png docs/evidence/opus_b/today-phone-full.png docs/evidence/opus_b/today-phone.png docs/evidence/opus_b/today-state-empty.png docs/evidence/opus_b/today-state-loading.png docs/evidence/opus_b/today-state-stale.png docs/evidence/opus_b/today-state-unavailable.png docs/evidence/peers/INTEGRATION_20260923.md docs/evidence/peers/judge-compose.png docs/evidence/peers/peer-view.png docs/evidence/peers/supplier-confirmed.png docs/evidence/peers/supplier-draft.png docs/evidence/peers/world-mobile.png docs/evidence/peers/world-partner-feed.png docs/evidence/polish2/README.md docs/evidence/polish2/checks.json docs/evidence/polish2/measurements.json docs/evidence/polish2/money-1280.jpg docs/evidence/polish2/money-1440.jpg docs/evidence/polish2/money-390.jpg docs/evidence/polish2/orders-1280.jpg docs/evidence/polish2/orders-1440.jpg docs/evidence/polish2/orders-390.jpg docs/evidence/polish2/replenishment-1280.jpg docs/evidence/polish2/replenishment-1440.jpg docs/evidence/polish2/replenishment-390.jpg docs/evidence/polish2/replenishment-empty-1440.jpg docs/evidence/polish2/settings-1280.jpg docs/evidence/polish2/settings-1440.jpg docs/evidence/polish2/settings-390.jpg docs/evidence/polish2/settings-cost-1280.jpg docs/evidence/polish2/settings-cost-390.jpg docs/evidence/polish2/sku-detail-1280.jpg docs/evidence/polish2/sku-detail-1440.jpg docs/evidence/polish2/sku-detail-390.jpg docs/evidence/polish2/skus-1280.jpg docs/evidence/polish2/skus-1440.jpg docs/evidence/polish2/skus-390.jpg docs/evidence/polish2/suppliers-1280.jpg docs/evidence/polish2/suppliers-1440.jpg docs/evidence/polish2/suppliers-390.jpg docs/evidence/polish2/today-1280.jpg docs/evidence/polish2/today-1440.jpg docs/evidence/polish2/today-390.jpg docs/evidence/polish2/today-decisions-390.jpg docs/evidence/polish2/world-1280.jpg docs/evidence/polish2/world-1440.jpg docs/evidence/polish2/world-390.jpg docs/evidence/polish2/world-compose-390.jpg docs/evidence/shell/orders_1440x900.png docs/evidence/shell/orders_loading_ribbon_1440x900.png docs/evidence/shell/sku_1440x900.png docs/evidence/shell/skus_1440x900.png docs/evidence/shell/suppliers_1440x900.png docs/evidence/shell/today_1440x900.png docs/evidence/ui/documents/documents_inbox.png docs/evidence/ui/documents/documents_review.png docs/evidence/ui/documents/order_evidence_rail.png docs/evidence/ui/money_1728_partner.png docs/evidence/ui/money_1728_unavailable.png docs/evidence/ui/today_1440_unavailable.png docs/evidence/ui/today_390_unavailable.png docs/evidence/ui/today_feed_phone.png docs/evidence/ui/today_feed_replay.png docs/evidence/ui/today_verification.md docs/evidence/v2/assist/01_money_closed.png docs/evidence/v2/assist/02_money_dock_open.png docs/evidence/v2/assist/03_money_answers.png docs/evidence/v2/assist/04_popup_page_mode.png docs/evidence/v2/assist/05_sku_answers.png docs/evidence/v2/assist2/01_assistant_empty_1440.png docs/evidence/v2/assist2/02_assistant_cards_1440.png docs/evidence/v2/assist2/03_assistant_390.png docs/evidence/v2/assist2/04_dock_shared_thread.png docs/evidence/v2/assist2/05_dock_open_answers_1440.png docs/evidence/v2/assist2/06_dock_390_open.png docs/evidence/v2/assist2/07_dock_390_answers.png docs/evidence/v2/cart/cart_desktop.png docs/evidence/v2/cart/cart_phone.png docs/evidence/v2/cart/cart_review_desktop.png docs/evidence/v2/cart/cart_review_phone.png docs/evidence/v2/cart/cart_totals_desktop.png docs/evidence/v2/cart/cart_totals_phone.png docs/evidence/v2/fable_ui_1/adjust_approve_proof.json docs/evidence/v2/fable_ui_1/adjust_approve_proof_run2.json docs/evidence/v2/fable_ui_1/replenishment_adjust_after_1440x900.png docs/evidence/v2/fable_ui_1/replenishment_adjust_before_1440x900.png docs/evidence/v2/fable_ui_1/replenishment_empty_1440x900.png docs/evidence/v2/fable_ui_1/replenishment_empty_390x844.png docs/evidence/v2/fable_ui_1/replenishment_expanded_1440x900.png docs/evidence/v2/fable_ui_1/replenishment_expanded_390x844.png docs/evidence/v2/fable_ui_1/replenishment_filtered_empty_1440x900.png docs/evidence/v2/fable_ui_1/replenishment_filtered_empty_390x844.png docs/evidence/v2/fable_ui_1/replenishment_populated_1440x900.png docs/evidence/v2/fable_ui_1/replenishment_populated_390x844.png docs/evidence/v2/fable_ui_1/replenishment_stale409_1440x900.png docs/evidence/v2/fable_ui_1/replenishment_stale409_390x844.png docs/evidence/v2/fable_ui_1/replenishment_unavailable_1440x900.png docs/evidence/v2/fable_ui_1/replenishment_unavailable_390x844.png docs/evidence/v2/fable_ui_1/today_empty_1440x900.png docs/evidence/v2/fable_ui_1/today_empty_390x844.png docs/evidence/v2/fable_ui_1/today_offline_1440x900.png docs/evidence/v2/fable_ui_1/today_offline_390x844.png docs/evidence/v2/fable_ui_1/today_populated_1440x900.png docs/evidence/v2/fable_ui_1/today_populated_390x844.png docs/evidence/v2/fable_ui_1/today_stale409_1440x900.png docs/evidence/v2/fable_ui_1/today_stale409_390x844.png docs/evidence/v2/fable_ui_1/today_unavailable_1440x900.png docs/evidence/v2/fable_ui_1/today_unavailable_390x844.png docs/evidence/v2/fable_ui_2/.gitignore docs/evidence/v2/fable_ui_2/console_errors.json docs/evidence/v2/fable_ui_2/money_empty_desktop.png docs/evidence/v2/fable_ui_2/money_empty_phone.png docs/evidence/v2/fable_ui_2/money_populated_desktop.png docs/evidence/v2/fable_ui_2/money_populated_phone.png docs/evidence/v2/fable_ui_2/money_stale_snapshot_desktop.png docs/evidence/v2/fable_ui_2/money_stale_snapshot_phone.png docs/evidence/v2/fable_ui_2/money_unavailable_desktop.png docs/evidence/v2/fable_ui_2/money_unavailable_phone.png docs/evidence/v2/fable_ui_2/sku_404_desktop.png docs/evidence/v2/fable_ui_2/sku_404_phone.png docs/evidence/v2/fable_ui_2/sku_adjust_route_missing_desktop.png docs/evidence/v2/fable_ui_2/sku_focus_ring_desktop.png docs/evidence/v2/fable_ui_2/sku_in_transit_desktop.png docs/evidence/v2/fable_ui_2/sku_in_transit_phone.png docs/evidence/v2/fable_ui_2/sku_no_recommendation_stockouts_desktop.png docs/evidence/v2/fable_ui_2/sku_no_recommendation_stockouts_phone.png docs/evidence/v2/fable_ui_2/sku_populated_outliers_desktop.png docs/evidence/v2/fable_ui_2/sku_populated_outliers_phone.png docs/evidence/v2/fable_ui_2/sku_stale_409_desktop.png docs/evidence/v2/fable_ui_2/sku_stale_409_phone.png docs/evidence/v2/fable_ui_2/sku_unavailable_desktop.png docs/evidence/v2/fable_ui_2/sku_unavailable_phone.png docs/evidence/v2/fable_ui_2/supplier_404_desktop.png docs/evidence/v2/fable_ui_2/supplier_404_phone.png docs/evidence/v2/fable_ui_2/supplier_confirmed_desktop.png docs/evidence/v2/fable_ui_2/supplier_confirmed_phone.png docs/evidence/v2/fable_ui_2/supplier_draft_desktop.png docs/evidence/v2/fable_ui_2/supplier_draft_phone.png docs/evidence/v2/fable_ui_2/supplier_sent_desktop.png docs/evidence/v2/fable_ui_2/supplier_sent_phone.png docs/evidence/v2/fable_ui_2/supplier_stale_409_desktop.png docs/evidence/v2/fable_ui_2/supplier_stale_409_phone.png docs/evidence/v2/orders/orders_desktop.png docs/evidence/v2/orders/orders_desktop_full.png docs/evidence/v2/reviewfix/review_desktop.png docs/evidence/v2/reviewfix/review_desktop_approved.png docs/evidence/v2/reviewfix/review_desktop_full.png docs/evidence/v2/reviewfix/review_phone.png docs/evidence/v2/reviewfix/review_phone_full.png docs/evidence/v2/sku_1/sku_desktop_1440x900.png docs/evidence/v2/sku_1/sku_desktop_1440x900_full.png docs/evidence/v2/sku_1/sku_phone_390x844.png docs/evidence/v2/sku_1/sku_phone_390x844_full.png docs/evidence/v2/suppliers/suppliers_desktop.png docs/evidence/v2/suppliers/suppliers_desktop_full.png docs/evidence/v2/uxfix_a/replenishment_cost_desc_expanded_1440x900.png docs/evidence/v2/uxfix_a/skus_index_1440x900.png docs/evidence/v2/uxfix_b/money_desktop.png docs/evidence/v2/uxfix_b/money_desktop_full.png docs/evidence/v2/uxfix_b/settings_desktop.png docs/evidence/v2/uxfix_b/settings_desktop_full.png docs/evidence/v2/uxfix_c/today_desktop.png docs/evidence/v2/uxfix_c/today_phone.png docs/evidence/v2/uxfix_c/world_desktop.png docs/evidence/v2/uxfix_c/world_phone.png docs/evidence/voice/integration.md docs/evidence/voice/no-key-panel.png docs/evidence/voice/typed-partner-status.png docs/evidence/voice/verification.md docs/integrations/EKT_API.md docs/integrations/ONEC.md eslint.config.mjs fixtures/PROVENANCE.md fixtures/decision_catalog.json fixtures/documents/iek_invoice_demo.xlsx fixtures/documents/iek_invoice_demo_photo.png fixtures/documents/replay.json fixtures/partner/IEK/MOQ ИЭК.xlsx fixtures/partner/IEK/Динамика продаж_2025-2026.xlsx fixtures/partner/IEK/Ежемесячные остатки продукции за последние 2 года ИЭК.xlsx fixtures/partner/IEK/Ежемесячные продажи в количественном выражении за последние 2 года.xlsx fixtures/partner/IEK/Путь ИЭК 22.09.2026.xlsx fixtures/partner/IEK/Сезонность ИЭК.xlsx fixtures/partner/SE/MOQ SystemElectric.xlsx fixtures/partner/SE/Динамика продаж_Syseme Electric_2025-2026.xlsx fixtures/partner/SE/Ежемесячные остатки SystemElectric 2024-2026.xlsx fixtures/partner/SE/Ежемесячные продажи в кол-м выражении SystemElectric 2024-2026.xlsx fixtures/partner/SE/Сезонность SystemElectric 2024-2026.xlsx fixtures/partner/SE/Товар в пути_SystemElectric на 22.09.2026.xlsx fixtures/replay_decisions.json fixtures/sku_images.json fixtures/world_events.jsonl next.config.ts package-lock.json package.json playwright.config.ts public/brand/ainalym-mark.svg public/file.svg public/fonts/InterVariable.woff2 public/fonts/OFL.txt public/fonts/README.md public/globe.svg public/landing/clips/assistant.mp4 public/landing/clips/assistant.png public/landing/clips/assistant.webm public/landing/clips/manifest.json public/landing/clips/money.mp4 public/landing/clips/money.png public/landing/clips/money.webm public/landing/clips/order.mp4 public/landing/clips/order.png public/landing/clips/order.webm public/landing/clips/purchases.mp4 public/landing/clips/purchases.png public/landing/clips/purchases.webm public/landing/clips/today.mp4 public/landing/clips/today.png public/landing/clips/today.webm public/landing/hero/hero-brand-720.mp4 public/landing/hero/hero-brand-poster.webp public/landing/hero/hero-brand.mp4 public/landing/hero/hero-brand.webm public/landing/mountains-poster.jpg public/landing/mountains.mp4 public/next.svg public/sku/010300002_.jpg public/sku/010300003_.jpg public/sku/010300004_.jpg public/sku/010300007_.jpg public/sku/010300008_.jpg public/sku/010300009_.jpg public/sku/010300010_.jpg public/sku/010300011_.jpg public/sku/010300013_.jpg public/sku/010300014_.jpg public/sku/010300016_.jpg public/sku/010300017_.jpg public/sku/010300018_.jpg public/sku/010300019_.jpg public/sku/010300021_.jpg public/sku/010300053_.jpg public/sku/010300068_.jpg public/sku/010300074_.jpg public/sku/010300095_.jpg public/sku/010300096_.jpg public/sku/010300121_.jpg public/sku/010300123_.jpg public/sku/010400849_.jpg public/sku/010400850_.jpg public/sku/010400865_.jpg public/sku/010400867_.jpg public/sku/010400925_.jpg public/sku/010400927_.jpg public/sku/010400932_.jpg public/sku/010500003_.jpg public/sku/010500004_.jpg public/sku/010500005_.jpg public/sku/010500007_.jpg public/sku/010500008_.jpg public/sku/010500010_.jpg public/sku/010500011_.jpg public/sku/010500012_.jpg public/sku/010500017_.jpg public/sku/010500018_.jpg public/sku/010500021_.jpg public/sku/010500022_.jpg public/sku/010500023_.jpg public/sku/010500024_.jpg public/sku/010500032_.jpg public/sku/010500034_.jpg public/sku/010500035_.jpg public/sku/010500036_.jpg public/sku/010500040_.jpg public/sku/010500041_.jpg public/sku/010500042_.jpg public/sku/010500044_.jpg public/sku/010500046_.jpg public/sku/010500047_.jpg public/sku/010500054_.jpg public/sku/010500063_.jpg public/sku/010500091_.jpg public/sku/010500093_.jpg public/sku/010500095_.jpg public/sku/010500101_.jpg public/sku/010500102_.jpg public/sku/010700029_.jpg public/sku/010700032_.jpg public/sku/010700055_.jpg public/sku/010700102_.jpg public/sku/010700103_.jpg public/sku/010700133_.jpg public/sku/010700134_.jpg public/sku/010700135_.jpg public/sku/010700137_.jpg public/sku/010700138_.jpg public/sku/010700139_.jpg public/sku/010700147_.jpg public/sku/010700148_.jpg public/sku/010700153_.jpg public/sku/010700158_.jpg public/sku/010700160_.jpg public/sku/010700164_.jpg public/sku/010700165_.jpg public/sku/010700169_.jpg public/sku/010700170_.jpg public/sku/010700172_.jpg public/sku/010800002_.jpg public/sku/010800004_.jpg public/sku/010800009_.jpg public/sku/010800012_.jpg public/sku/010800016_.jpg public/sku/010800027_.jpg public/sku/010800029_.jpg public/sku/010800030_.jpg public/sku/010800031_.jpg public/sku/010800033_.jpg public/sku/010800045_.jpg public/sku/010800046_.jpg public/sku/010800139_.jpg public/sku/020100001_.jpg public/sku/020100002_.jpg public/sku/020100003_.jpg public/sku/020100004_.jpg public/sku/020100005_.jpg public/sku/020100006_.jpg public/sku/020100008_.jpg public/sku/020100009_.jpg public/sku/020100010_.jpg public/sku/020100011_.jpg public/sku/020100012_.jpg public/sku/020100013_.jpg public/sku/020100015_.jpg public/sku/020100017_.jpg public/sku/020100018_.jpg public/sku/020100019_.jpg public/sku/020100020_.jpg public/sku/020100021_.jpg public/sku/030200406_.jpg public/sku/030200409_.jpg public/sku/030200410_.jpg public/sku/030200411_.jpg public/sku/030200414_.jpg public/sku/030200417_.jpg public/sku/030200418_.jpg public/sku/030200420_.jpg public/sku/030200421_.jpg public/sku/030200422_.jpg public/sku/030200423_.jpg public/sku/030200424_.jpg public/sku/030200425_.jpg public/sku/030200428_.jpg public/sku/030200429_.jpg public/sku/030200430_.jpg public/sku/030200431_.jpg public/sku/030200432_.jpg public/sku/030200433_.jpg public/sku/030200436_.jpg public/sku/030200437_.jpg public/sku/030200438_.jpg public/sku/030200440_.jpg public/sku/030200442_.jpg public/sku/030200444_.jpg public/sku/030200448_.jpg public/sku/030200449_.jpg public/sku/030200450_.jpg public/sku/030200452_.jpg public/sku/030200453_.jpg public/sku/030200454_.jpg public/sku/030200456_.jpg public/sku/030200460_.jpg public/sku/030200461_.jpg public/sku/030200462_.jpg public/sku/030200463_.jpg public/sku/030200464_.jpg public/sku/030200465_.jpg public/sku/030200466_.jpg public/sku/030200467_.jpg public/sku/030200468_.jpg public/sku/030200469_.jpg public/sku/030200470_.jpg public/sku/030200471_.jpg public/sku/030200472_.jpg public/sku/030200473_.jpg public/sku/030200474_.jpg public/sku/030200475_.jpg public/sku/030200476_.jpg public/sku/030200477_.jpg public/sku/030200479_.jpg public/sku/030200481_.jpg public/sku/030200482_.jpg public/sku/030200483_.jpg public/sku/030200485_.jpg public/sku/030200486_.jpg public/sku/030200488_.jpg public/sku/030200489_.jpg public/sku/030200491_.jpg public/sku/030200493_.jpg public/sku/030200497_.jpg public/sku/030200498_.jpg public/sku/030200499_.jpg public/sku/030200500_.jpg public/sku/030200501_.jpg public/sku/030200502_.jpg public/sku/030200503_.jpg public/sku/030200506_.jpg public/sku/030200507_.jpg public/sku/030200508_.jpg public/sku/030200509_.jpg public/sku/030200510_.jpg public/sku/030200511_.jpg public/sku/030200512_.jpg public/sku/030200513_.jpg public/sku/030200514_.jpg public/sku/030200516_.jpg public/sku/030200517_.jpg public/sku/030200518_.jpg public/sku/030200519_.jpg public/sku/030200520_.jpg public/sku/030200521_.jpg public/sku/030200524_.jpg public/sku/030200525_.jpg public/sku/030200527_.jpg public/sku/030200530_.jpg public/sku/030200531_.jpg public/sku/030200532_.jpg public/sku/030200534_.jpg public/sku/030200538_.jpg public/sku/030200539_.jpg public/sku/030200541_.jpg public/sku/030200543_.jpg public/sku/030200551_.jpg public/sku/030200552_.jpg public/sku/030200553_.jpg public/sku/030200558_.jpg public/sku/030200559_.jpg public/sku/030200561_.jpg public/sku/030200567_.jpg public/sku/030200568_.jpg public/sku/030200739_.jpg public/sku/030200741_.jpg public/sku/030200742_.jpg public/sku/030200743_.jpg public/sku/030200744_.jpg public/sku/030200751_.jpg public/sku/030200752_.jpg public/sku/030200753_.jpg public/sku/030200755_.jpg public/sku/030200756_.jpg public/sku/030200757_.jpg public/sku/030200758_.jpg public/sku/030200769_.jpg public/sku/030200771_.jpg public/sku/030200773_.jpg public/sku/030200779_.jpg public/sku/030200782_.jpg public/sku/030200787_.jpg public/sku/030200810_.jpg public/sku/030200811_.jpg public/sku/030200812_.jpg public/sku/030200817_.jpg public/sku/030200819_.jpg public/sku/030200821_.jpg public/sku/030200827_.jpg public/sku/030200829_.jpg public/sku/030200830_.jpg public/sku/030200831_.jpg public/sku/030200832_.jpg public/sku/030200833_.jpg public/sku/030200834_.jpg public/sku/030200837_.jpg public/sku/030200838_.jpg public/sku/030200839_.jpg public/sku/030200840_.jpg public/sku/030200844_.jpg public/sku/030200848_.jpg public/sku/030200849_.jpg public/sku/030200855_.jpg public/sku/030200856_.jpg public/sku/030200857_.jpg public/sku/030200858_.jpg public/sku/030200860_.jpg public/sku/030200863_.jpg public/sku/030200864_.jpg public/sku/030200865_.jpg public/sku/030200872_.jpg public/sku/030200875_.jpg public/sku/030200885_.jpg public/sku/030200886_.jpg public/sku/030200891_.jpg public/sku/030200893_.jpg public/sku/030200894_.jpg public/sku/030200895_.jpg public/sku/030200897_.jpg public/sku/030200898_.jpg public/sku/030200899_.jpg public/sku/030200902_.jpg public/sku/030200905_.jpg public/sku/030200908_.jpg public/sku/030200909_.jpg public/sku/030200910_.jpg public/sku/030200911_.jpg public/sku/030200912_.jpg public/sku/030200920_.jpg public/sku/030200924_.jpg public/sku/030200925_.jpg public/sku/030200926_.jpg public/sku/030200939_.jpg public/sku/030200941_.jpg public/sku/030200944_.jpg public/sku/030200947_.jpg public/sku/030200949_.jpg public/sku/030200953_.jpg public/sku/030200954_.jpg public/sku/030200958_.jpg public/sku/030200960_.jpg public/sku/030200961_.jpg public/sku/030200963_.jpg public/sku/030200964_.jpg public/sku/030200966_.jpg public/sku/030200967_.jpg public/sku/030200971_.jpg public/sku/030200973_.jpg public/sku/030200985_.jpg public/sku/030200986_.jpg public/sku/030200987_.jpg public/sku/030200990_.jpg public/sku/030201017_.jpg public/sku/030201018_.jpg public/sku/030201020_.jpg public/sku/030201034_.jpg public/sku/030201035_.jpg public/sku/030201057_.jpg public/sku/030201075_.jpg public/sku/030201083_.jpg public/sku/030201090_.jpg public/sku/030201093_.jpg public/sku/030201095_.jpg public/sku/030201108_.jpg public/sku/030201119_.jpg public/sku/030201122_.jpg public/sku/030201136_.jpg public/sku/030201244_.jpg public/sku/030201462_.jpg public/sku/080800024_.jpg public/sku/080800030_.jpg public/sku/080800031_.jpg public/sku/080800062_.jpg public/sku/080800070_.jpg public/sku/080800071_.jpg public/sku/080800131_.jpg public/sku/080800134_.jpg public/sku/080800136_.jpg public/sku/080800138_.jpg public/sku/080800139_.jpg public/sku/081100278_.jpg public/sku/081100391_.jpg public/sku/081100392_.jpg public/sku/081100393_.jpg public/sku/081100635_.jpg public/sku/081100642_.jpg public/sku/081100704_.jpg public/sku/081100710_.jpg public/sku/081100713_.jpg public/sku/081100714_.jpg public/sku/081100718_.jpg public/sku/081100743_.jpg public/sku/081100744_.jpg public/sku/081100745_.jpg public/sku/081100746_.jpg public/sku/081100747_.jpg public/sku/081100749_.jpg public/sku/081100750_.jpg public/sku/081100758_.jpg public/sku/081100760_.jpg public/sku/081100761_.jpg public/sku/081100766_.jpg public/sku/081100768_.jpg public/sku/081100774_.jpg public/sku/081100778_.jpg public/sku/081100779_.jpg public/sku/081100780_.jpg public/sku/114001002_.jpg public/sku/114001010_.jpg public/sku/120100002_.jpg public/sku/120100003_.jpg public/sku/120100004_.jpg public/sku/120100005_.jpg public/sku/120100006_.jpg public/sku/120100008_.jpg public/sku/120100010_.jpg public/sku/120100011_.jpg public/sku/120100013_.jpg public/sku/120100030_.jpg public/sku/120100034_.jpg public/sku/120100036_.jpg public/sku/120100037_.jpg public/sku/120100038_.jpg public/sku/120100041_.jpg public/sku/120100044_.jpg public/sku/120100045_.jpg public/sku/120100046_.jpg public/sku/120100050_.jpg public/sku/120100055_.jpg public/sku/120100056_.jpg public/sku/category/iek-0103.jpg public/sku/category/iek-0104.jpg public/sku/category/iek-0105.jpg public/sku/category/iek-0107.jpg public/sku/category/iek-0108.jpg public/sku/category/iek-0201.jpg public/sku/category/iek-0302.jpg public/sku/category/iek-0808.jpg public/sku/category/iek-0811.jpg public/sku/category/iek-1201.jpg public/sku/category/iek-1302.jpg public/sku/category/iek-1303.jpg public/sku/category/iek-1306.jpg public/sku/category/iek-1309.jpg public/sku/category/iek-1501.jpg public/sku/category/iek-2004.jpg public/sku/category/iek-2401.jpg public/sku/category/iek-2403.jpg public/sku/category/iek-2502.jpg public/sku/category/iek-2506.jpg public/sku/category/iek-2514.jpg public/sku/category/iek-2601.jpg public/sku/category/iek-2703.jpg public/sku/category/iek-2801.jpg public/sku/category/iek-2802.jpg public/sku/category/iek-2803.jpg public/sku/category/iek-2901.jpg public/sku/category/se-1.jpg public/sku/category/se-2.jpg public/sku/category/se-3.jpg public/vercel.svg public/window.svg scripts/check.mjs scripts/clean_clone_check.sh scripts/demo_reset.mjs scripts/deploy/first_etl.sh scripts/deploy/hetzner.sh scripts/deploy/tunnel.sh scripts/ekt/mapping.mjs scripts/ekt/snapshot.mjs scripts/etl/derive.mjs scripts/etl/load.mjs scripts/etl/transit-date.mjs scripts/etl/world-events.mjs scripts/fixtures/make_invoice.mjs scripts/fixtures/make_invoice_photo.mjs scripts/fixtures/render_invoice.swift scripts/images/fetch_sku_images.mjs scripts/images/generate_categories.mjs scripts/images/verify_images.mjs scripts/scenario.mjs scripts/start_prod.sh scripts/vitest_reporter.mjs src/ai/catalog.ts src/ai/decisions.ts src/ai/drafting.ts src/ai/extract.ts src/ai/interpret.ts src/ai/provider.ts src/ai/replay.ts src/ai/supplier-reply.ts src/ai/worker.ts src/app/(peers)/layout.tsx src/app/(peers)/peerPages.module.css src/app/(peers)/peers/PeerActions.tsx src/app/(peers)/peers/page.tsx src/app/(peers)/supplier/[po_id]/SupplierActions.tsx src/app/(peers)/supplier/[po_id]/page.tsx src/app/(peers)/world/[code_1c]/JudgeCompose.tsx src/app/(peers)/world/[code_1c]/page.tsx src/app/(v2)/assistant/assistant-page.css src/app/(v2)/assistant/page.tsx src/app/(v2)/connections/page.tsx src/app/(v2)/documents/DocumentsInbox.tsx src/app/(v2)/documents/[id]/DocumentReview.tsx src/app/(v2)/documents/[id]/page.tsx src/app/(v2)/documents/page.tsx src/app/(v2)/layout.tsx src/app/(v2)/money/MoneyPage.tsx src/app/(v2)/money/money.module.css src/app/(v2)/money/page.tsx src/app/(v2)/orders/OrdersView.tsx src/app/(v2)/orders/[po_id]/SupplierDraft.tsx src/app/(v2)/orders/[po_id]/page.tsx src/app/(v2)/orders/[po_id]/supplier.module.css src/app/(v2)/orders/orders.module.css src/app/(v2)/orders/page.tsx src/app/(v2)/orders/pipeline.ts src/app/(v2)/purchases/page.tsx src/app/(v2)/replenishment/page.tsx src/app/(v2)/replenishment/replenishment.module.css src/app/(v2)/review/[id]/ProposalReviewPage.tsx src/app/(v2)/review/[id]/SupplierReplyReview.tsx src/app/(v2)/review/[id]/page.tsx src/app/(v2)/review/[id]/review.module.css src/app/(v2)/review/page.tsx src/app/(v2)/settings/SettingsPage.tsx src/app/(v2)/settings/page.tsx src/app/(v2)/settings/settings.module.css src/app/(v2)/skus/[code]/SkuCard.tsx src/app/(v2)/skus/[code]/page.tsx src/app/(v2)/skus/[code]/sku.module.css src/app/(v2)/skus/page.tsx src/app/(v2)/suppliers/SuppliersView.tsx src/app/(v2)/suppliers/page.tsx src/app/(v2)/suppliers/suppliers.module.css src/app/(v2)/today/page.tsx src/app/(v2)/today/today.module.css src/app/(v2)/world/EventsPage.tsx src/app/(v2)/world/events.module.css src/app/(v2)/world/page.tsx src/app/(v2)/world/runs/[id]/page.tsx src/app/(v2)/world/sentence.ts src/app/api/agent/ledger/route.ts src/app/api/agent/runs/[id]/route.ts src/app/api/agent/runs/route.ts src/app/api/agent/tick/route.ts src/app/api/artifacts/[id]/download/route.ts src/app/api/artifacts/[id]/route.ts src/app/api/assistant/ask/route.ts src/app/api/assistant/message/route.ts src/app/api/calc/run/route.ts src/app/api/calc/runs/[id]/route.ts src/app/api/calc/runs/route.ts src/app/api/decisions/route.ts src/app/api/demo/example/route.ts src/app/api/demo/reset/route.ts src/app/api/documents/[id]/accept/route.ts src/app/api/documents/[id]/route.ts src/app/api/documents/route.ts src/app/api/drafts/route.ts src/app/api/ekt/status/route.ts src/app/api/health/route.ts src/app/api/modes/route.ts src/app/api/money/route.ts src/app/api/orders/[id]/_export.ts src/app/api/orders/[id]/approve/route.ts src/app/api/orders/[id]/export.csv/route.ts src/app/api/orders/[id]/export.xlsx/route.ts src/app/api/orders/[id]/package/route.ts src/app/api/orders/[id]/route.ts src/app/api/orders/route.ts src/app/api/params/route.ts src/app/api/peers/onec-export/[po_id]/route.ts src/app/api/peers/onec-export/records/route.ts src/app/api/proposals/[id]/approve/route.ts src/app/api/proposals/[id]/reject/route.ts src/app/api/proposals/[id]/route.ts src/app/api/proposals/_decision.ts src/app/api/proposals/route.ts src/app/api/queue/route.ts src/app/api/recommendations/[id]/adjust/route.ts src/app/api/recommendations/[id]/route.ts src/app/api/recommendations/route.ts src/app/api/skus/[code]/route.ts src/app/api/skus/route.ts src/app/api/sources/route.ts src/app/api/state/route.ts src/app/api/supplier/[po_id]/reply/route.ts src/app/api/suppliers/[id]/route.ts src/app/api/suppliers/route.ts src/app/api/today/route.ts src/app/api/voice/session/route.ts src/app/api/voice/tools/[name]/route.ts src/app/api/voice/transcribe/route.ts src/app/api/voice/turn/route.ts src/app/api/world/compose/route.ts src/app/api/world/demo/route.ts src/app/api/world/feed/route.ts src/app/api/world/play/route.ts src/app/globals.css src/app/icon.svg src/app/landing/HeroMedia.tsx src/app/landing/ProductClips.tsx src/app/landing/landing.module.css src/app/landing/page.tsx src/app/layout.tsx src/app/opus_a/[[...path]]/page.tsx src/app/page.module.css src/app/page.tsx src/app/skeleton/page.tsx src/app/v2/[[...path]]/page.tsx src/components/assistant/AssistantDock.tsx src/components/assistant/AssistantPage.tsx src/components/assistant/AssistantPanel.tsx src/components/assistant/AssistantSurface.tsx src/components/assistant/PageContext.tsx src/components/assistant/ResultCard.tsx src/components/assistant/Reveal.tsx src/components/assistant/StructuredCard.tsx src/components/assistant/VoiceStateStrip.tsx src/components/assistant/VoiceWave.tsx src/components/assistant/assistant.module.css src/components/assistant/context.ts src/components/assistant/dock.module.css src/components/assistant/index.ts src/components/assistant/reveal.module.css src/components/assistant/surface.module.css src/components/assistant/thread.ts src/components/assistant/types.ts src/components/assistant/useAssistantVoice.ts src/components/assistant/wave.module.css src/components/connections/ConnectionsPage.tsx src/components/connections/connections.module.css src/components/connections/types.ts src/components/documents/EvidenceRail.tsx src/components/documents/client.ts src/components/documents/documents.module.css src/components/documents/fixture.ts src/components/documents/types.ts src/components/feed/WorldFeed.tsx src/components/feed/feed.module.css src/components/labels/index.tsx src/components/labels/labels.module.css src/components/pulse/AgentLedger.tsx src/components/pulse/CalculationComposer.tsx src/components/pulse/Commitments.tsx src/components/pulse/DecisionQueue.tsx src/components/pulse/DueStrip.tsx src/components/pulse/MoneyPage.tsx src/components/pulse/MoneyStrip.tsx src/components/pulse/Pulse.tsx src/components/pulse/Sources.tsx src/components/pulse/format.ts src/components/pulse/money.module.css src/components/pulse/pulse.module.css src/components/pulse/types.ts src/components/purchase/AgentTimeline.tsx src/components/purchase/DemandChart.tsx src/components/purchase/QuantityEditor.tsx src/components/purchase/Rationale.tsx src/components/purchase/Replenishment.tsx src/components/purchase/ResultLabels.tsx src/components/purchase/SkuWorkspace.tsx src/components/purchase/types.ts src/components/purchase/workspace.module.css src/components/review/OrderDesk.tsx src/components/review/ProposalDesk.tsx src/components/review/ReviewQueue.tsx src/components/review/review.module.css src/components/review/types.ts src/components/shell/AppShell.tsx src/components/shell/CommandPalette.tsx src/components/shell/Controls.tsx src/components/shell/api.tsx src/components/shell/controls.module.css src/components/shell/index.ts src/components/shell/navigation.ts src/components/shell/pending.ts src/components/shell/preferences.ts src/components/shell/server.ts src/components/shell/shell.module.css src/components/shell/useFocusSnapshot.ts src/components/v2/Bars.tsx src/components/v2/CartPanel.module.css src/components/v2/CartPanel.tsx src/components/v2/ExportButton.tsx src/components/v2/Shell.tsx src/components/v2/SkuIndex.module.css src/components/v2/SkuIndex.tsx src/components/v2/bars.module.css src/components/v2/loading.module.css src/components/v2/loading.tsx src/components/v2/primitives.module.css src/components/v2/primitives.tsx src/components/v2/shell.module.css src/components/v2/ui.module.css src/components/v2/ui.tsx src/components/world-console/PlaybackTimer.tsx src/components/world-console/WorldConsole.tsx src/components/world-console/WorldControls.tsx src/components/world-console/WorldEventList.tsx src/components/world-console/WorldRun.tsx src/components/world-console/world-console.module.css src/db/client.ts src/db/path.mjs src/db/repo/index.ts src/db/schema.sql src/domain/apply.ts src/domain/cashflow.ts src/domain/documents.ts src/domain/engine.ts src/domain/events.ts src/domain/money.ts src/domain/obligations.ts src/domain/orders.ts src/domain/params.ts src/domain/recompute.ts src/domain/schedule.ts src/domain/skus.ts src/domain/tasks.ts src/domain/urgency.ts src/domain/views.ts src/instrumentation.ts src/middleware.ts src/peers/deliver.ts src/peers/ekt.ts src/peers/onec_export.ts src/peers/supplier.ts src/peers/xlsx.ts src/server/assistant_answers.ts src/server/calc.ts src/server/context.ts src/server/contracts.ts src/server/demo_guard.ts src/server/documents.ts src/server/fixtures.ts src/server/http.ts src/server/ledger.ts src/server/pipeline.ts src/server/recommendations.ts src/server/scheduler.ts src/server/sku_images.ts src/server/sku_lookup.ts src/server/suppliers_overview.ts src/styles/tokens.css src/styles/v2/tokens.css src/voice/Captions.tsx src/voice/summary.ts src/voice/tools.ts src/voice/transport.ts src/voice/typed.ts src/voice/useVoiceSession.ts src/world/compose.ts src/world/demo.ts src/world/feed.ts src/world/http.ts src/world/play.ts tests/ai/adjustment_recompute.test.ts tests/ai/assistant_answers.test.ts tests/ai/decisions.test.ts tests/ai/draft_live_smoke.test.ts tests/ai/drafting.test.ts tests/ai/guardrails.test.ts tests/ai/live_smoke.test.ts tests/ai/org_scope_recompute.test.ts tests/ai/partial_recompute.test.ts tests/ai/partner_event.test.ts tests/ai/routing.test.ts tests/ai/summarize_changes.test.ts tests/ai/supplier_reply.test.ts tests/ai/worker.test.ts tests/ai/worker_integration.test.ts tests/demo/build.test.ts tests/demo/database-path.test.ts tests/demo/guard.test.ts tests/domain/a_apply.test.ts tests/domain/a_decisions.test.ts tests/domain/a_engine.test.ts tests/domain/a_ledger.test.ts tests/domain/a_money.test.ts tests/domain/a_params.test.ts tests/domain/a_partner.test.ts tests/domain/a_schedule.test.ts tests/domain/b_money_orders.test.ts tests/domain/documents.test.ts tests/domain/stockout_real.test.ts tests/domain/suppliers_overview.test.ts tests/domain/uxfix_b_settings.test.ts tests/e2e/assist.config.ts tests/e2e/assist.spec.ts tests/e2e/demo.spec.ts tests/e2e/landing_clips.spec.ts tests/e2e/playwright.config.ts tests/e2e/reporter.ts tests/e2e/uxfix_c.config.ts tests/e2e/uxfix_c.spec.ts tests/e2e/v2_cart.config.ts tests/e2e/v2_cart.spec.ts tests/e2e/v2_orders.config.ts tests/e2e/v2_orders.spec.ts tests/e2e/v2_review.config.ts tests/e2e/v2_review.spec.ts tests/e2e/v2_suppliers.spec.ts tests/e2e/v2_uxfix_b.config.ts tests/e2e/v2_uxfix_b.spec.ts tests/etl/counts.test.ts tests/etl/document_stats.test.ts tests/etl/transit_date.test.ts tests/fixtures/ekt_api.json tests/fixtures/eval/replenishment_expectations.json tests/images/api.test.ts tests/images/fetch.test.mjs tests/peers/JudgeCompose.test.tsx tests/peers/compose_validation.test.ts tests/peers/ekt.test.ts tests/peers/export.test.ts tests/peers/play_scope.test.ts tests/peers/supplier.test.ts tests/peers/truth_axes.test.ts tests/peers/world.test.ts tests/skeleton/adjust.test.ts tests/skeleton/calc_availability.test.ts tests/skeleton/check_reporter.test.ts tests/skeleton/obligations_version.test.ts tests/skeleton/pipeline.test.ts tests/skeleton/provider_truth.test.ts tests/skeleton/repository_ledger.test.ts tests/skeleton/reset.test.ts tests/skeleton/smoke.test.ts tests/skeleton/today_perf.test.ts tests/ui/a_actions.test.tsx tests/ui/a_format_labels.test.tsx tests/ui/a_money_page.test.tsx tests/ui/a_rationale.test.tsx tests/ui/a_sync_shell.test.tsx tests/ui/assistant_captions.test.ts tests/ui/assistant_context.test.ts tests/ui/assistant_followups.test.ts tests/ui/v2_orders_pipeline.test.ts tests/ui_v2/approve.spec.ts tests/ui_v2/fable_ui_2.spec.ts tests/ui_v2/playwright.config.ts tests/ui_v2/screens.spec.ts tests/ui_v2/uxfix_a.spec.ts tests/voice/audio.test.tsx tests/voice/fallback.test.ts tests/voice/interruption.test.ts tests/voice/live.test.ts tests/voice/partner.test.ts tests/voice/session.test.ts tests/voice/sku_lookup.test.ts tests/voice/state_machine.test.tsx tests/voice/summary.test.ts tests/voice/tools.test.ts tsconfig.json vitest.config.ts
Ветки (65)
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.