19 Commits

Author SHA1 Message Date
coopops e9b2a9b54c [794-5][@ant] fix(spa): пакет — восстановление UTF-8 имён записей zip — иначе «в пакете нет файлов»
CI / build (push) Failing after 7s
Десктоп-упаковщик пишет имена в UTF-8, но не ставит bit-11 (UTF-8) в zip → fflate
декодирует кириллицу как latin1 (мохибейк), и пути из manifest.json (UTF-8) не
находят записи. parseZip строит индекс с восстановлением latin1→utf8 и резолвит
манифест устойчиво; fallback-ветка без дублей (имя восстанавливается только для показа).
2026-06-15 10:54:43 +00:00
coopops c7d55ea1f9 [794-5][@ant] fix(api,shared): C6 — канонизация публичного ключа перед сравнением — снять ложный «ключ не активен»
Один ключ встречается как legacy EOS... (бэкфилл из снапшота) и как PUB_K1_...
(подписи нового SDK) — разные строки, строгое сравнение в checkActiveKey давало
active:false. Добавлен canonicalPublicKey (PublicKey.from().toString()) в shared;
C6 сравнивает обе стороны в канонической форме. Инцидент: документ Авдеев-Муравьев.
2026-06-15 10:54:43 +00:00
coopops 0d7e17dd83 [794-5][@ant] feat(spa): живой счётчик блоков — локальный тик +1/500мс при synced, переустановка на реальный head при опросе (без потока запросов)
CI / build (push) Failing after 7s
2026-06-03 19:01:05 +00:00
coopops 59a67c400f [794-5][@ant] feat: расширение подписи .sig → .coopsig — чтобы ОС не предлагала КриптоПро (наш формат secp256k1-JSON несовместим с ГОСТ-CMS); legacy .sig не принимаем (не в проде) 2026-06-03 19:01:05 +00:00
coopops 979dd7bb4b [794-5][@ant] fix(spa): убрать дублирующую подпись про локальную проверку — она уже в зоне загрузки
CI / build (push) Failing after 7s
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 18:24:28 +00:00
coopops 2ae5582ddd [794-5][@ant] feat(spa): редизайн отчёта верификатора + заголовок из meta.title
CI / build (push) Failing after 7s
UI переведён на минималистичную систему с бордо-акцентом и мягкими поверхностями:

- Заголовок документа берётся из meta.title (чистая кириллица), а не из имени
  файла zip — устраняет mojibake «Ð овЅ». В шапку добавлены подписант
  («Фамилия И.О.» из сертификата) и дата подписи.
- Inter Variable (latin+cyrillic) подключён реально (@fontsource-variable),
  раньше был только в font-family → fallback.
- Эмодзи-иконки (⚠) заменены на SVG в цветных кружках (StatusIcon).
- Карточки: мягкая тень + hairline вместо резкой рамки; кнопки/вердикт-бейдж/
  sync-индикатор — единые токены поверхностей и статусов.
- Палитра статусов отделена от бордо (вердикт ≠ бренд).

typecheck чист, vite собирает без ошибок.
2026-06-03 18:17:57 +00:00
coopops 832888051f [794-5][@ant] fix: канонизация регистров хэш-цепочки (C3/C4) + UTC для C6 — подпись проходит проверку
CI / build (push) Failing after 8s
Хэш-цепочка SDK склеивает звенья в РАЗНЫХ регистрах (Crypto.sha256 → строчные
meta_hash/hash; doc_hash из фабрики → ПРОПИСНОЙ), а `.sig` хранит их в едином
(часто верхнем) регистре. Верификатор склеивал сырые строки .sig → C3/C4 падали
на валидных документах.

- C3: composite = SHA-256(meta_hash.toLowerCase + doc_hash.toUpperCase).
- C4: signed_hash = SHA-256(hash.toLowerCase + signed_at[без мс/Z]); SDK берёт
  signed_at как toISOString().split('.')[0], а .sig кладёт с `.000`.
- C6: signed_at без таймзоны → роут с format:date-time отдавал HTTP 400; на фронте
  помечаем `Z` (signed_at семантически UTC).

Регистры и формат signed_at выведены из исходников SDK (Document/Crypto) и
ДОКАЗАНЫ на реальном .sig: после фикса C1/C3/C4/C5 = PASS (крипто-подпись
verifyDigest валидна). C2 на legacy-доках — отдельный формат meta, не этот фикс.
2026-06-03 17:48:11 +00:00
coopops 18471aeea6 [794-5][@ant] fix: current = high-water mark парсера + относительный API base — честный статус индекса
CI / build (push) Failing after 7s
Два дефекта отображения синка:

1. SPA: new URL(path, '') бросал TypeError при пустом VITE_API_BASE → health-проба
   всегда null → «индекс недоступен», хотя бэкенд synced. Фолбэк base на
   window.location.origin (vite-proxy/nginx шлёт /v1 на api). vite.config —
   фикс-порт 5174 (strictPort) + proxy /v1 → :3030, наружу один ssh-проброс.

2. health.current_block брался из последней строки permission_history → «висел» на
   блоке последней смены прав (6303) в тихие периоды и читался как зависание.
   Теперь current = block_num tip-записи стрима (getParserHead) = докуда реально
   обработал парсер; растёт у головы в реальном времени. Побочно чинит C6:
   beyond_index сравнивал at с устаревшим current_block_time (31 мая) и ложно
   отбраковывал свежие запросы.
2026-06-03 17:00:22 +00:00
coopops 73b3a235bf [794-5][@ant] fix: бамп @coopenomics/parser2 → ^1.1.3 — устраняет краш consumer на XTRIM
CI / build (push) Failing after 7s
parser2@1.1.3 фиксит XtrimSupervisor (XTRIM MINID по un-acked pending,
а не lastDeliveredId) + null-гард в parseStreamEntries. До фикса индексатор
детерминированно падал в краш-лупе на entries-read=172094.

Проверено на live mono-ai-1 (484k блоков, genesis resync):
entries-read 15690 → 189608 монотонно, точка 172094 пройдена без краша;
crash_lines=0, restarts=0, supervisor рестартов индексатора=0;
stream_lag=0, status=synced. permission_history заполнен (genesis-блоки).
2026-06-03 13:30:40 +00:00
coopops 0dfc49890c [794-5][@ant] feat(api): честный health (chain-head поллер + статус по stream-lag) и supervisor индексатора с backoff — head/synced больше не врут в тихие permission-периоды, а падение consumer не убивает индексацию навсегда (рестарт с экспоненциальным backoff)
CI / build (push) Failing after 7s
Поллер get_info ведёт head_block независимо от permission-событий; статус определяется лагом Redis-группы (вычитали стрим до хвоста), а не дельтой блоков. Supervisor вскрыл баг parser2@1.1.2 (XtrimSupervisor триммит un-acked pending → parseStreamEntries падает на null fields обрезанной записи) —消ит детерминированно, отчёт парсер-агенту.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 12:49:47 +00:00
coopops 7b669be120 [794-5][@ant] fix(api): parser2@1.1.2/ship-reader@0.3.1 — block_time = on-chain header timestamp вместо wall-clock; C6 point-in-time теперь корректен (ключ резолвится по времени подписи документа)
CI / build (push) Failing after 7s
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 12:20:21 +00:00
coopops fbeef9a8f1 [794-5][@ant] fix(api): parser2@1.1.1 (native-delta фикс) + пропуск genesis-sentinel permission — native-delta теперь реально приходит (ABI-декод вместо JSON.parse бинаря), а пустая permission_object id=0 из genesis больше не мусорит индекс
CI / build (push) Failing after 8s
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 11:45:39 +00:00
coopops d9bf1e8e91 [794-5][@ant] feat: локальный бутстрап-стек (parser2 Parser + verifier-api + pg/redis) против цепи mono-ai-N — раннер SHiP→Redis, compose с host-gateway и скрипт авто-chain_id, чтобы индексировать permissions с genesis и проверять C6 на живых документах
CI / build (push) Failing after 7s
2026-06-03 08:14:43 +00:00
coopops 25269a9cb1 [794-3][@ant] fix(shared): регистронезависимые хэш-проверки C1–C3 и сертификат C5 под реальный формат mono — doc_hash приходит из фабрики в верхнем регистре, у сертификата нет public_key; иначе подлинные документы ложно не проходят
CI / build (push) Failing after 7s
2026-06-03 08:07:14 +00:00
coopops 98453ccda3 [794-8][@ant] feat: verifier-spa отчёт, печать, i18n и дизайн-токены бордо — презентация вердикта в фирменном минималистичном дизайн-языке кооперативной экономики (плоскости, ведущий цвет бордо только chrome)
CI / build (push) Failing after 7s
2026-06-03 07:31:25 +00:00
coopops 4146d1f0dc [794-7][@ant] feat: verifier-spa загрузка PDF/.sig/ZIP + оркестратор C1–C8 и вердикт — локальная проверка целостности и подписи плюс C6 через api, контент не уходит на сервер (приватность) 2026-06-03 07:31:25 +00:00
coopops 0224167494 [794-5][@ant] feat: verifier-api demux-индексер permissions из native-delta parser2 — исторический суперсет authority в Postgres для доказательной point-in-time проверки ключа (C6) 2026-06-03 07:31:02 +00:00
coopops b9ce2cbb54 [794-3][@ant] feat: packages/shared — контракт .sig v2.0, JCS-канонизация и чистые проверки C1–C5 — единый межкомпонентный контракт верификации для браузера и Node без дублирования 2026-06-03 07:31:02 +00:00
coopops cc2ebc4196 [794-2][@ant] feat: скелет монорепы verifier (api+spa+shared) + docker/CI/deploy — единая структура и автономные пайплайны для разработки всех эпиков верификатора 2026-06-03 07:30:53 +00:00