Skip to content

Проверка standalone-ядра ​

Дата: 2026-09-22. Это результаты первого нативного сценария, не сертификация HA и не оценка промышленной нагрузки.

Стенд ​

Windows, Node.js 24.13.0, реальная PostgreSQL 18.4 на loopback, локальная файловая система. Для испытаний PostgreSQL запущена отдельным временным процессом: Docker Desktop на стенде не отвечал. Эта вспомогательная установка находится вне исходников и не является зависимостью продукта.

Функциональные проверки ​

  • Строгая типизация десяти workspaces, type-aware ESLint, Prettier, зависимости слоёв.
  • Runtime build: JS + declarations, без runtime TypeScript loader.
  • Домен: ограничение размера, SHA-256, безопасное имя, bounded metadata/labels, канонизация идемпотентности и права.
  • LocalBlobStore: проверка до публикации, неполное/избыточное/повреждённое содержимое, отмена, неизменяемость, повтор, restart, пустой объект и Range.
  • HTTP/PostgreSQL: миграции и повторный запуск, repository/read/write scopes, невидимость pending, идемпотентность, конфликт тела, cancel, GET/HEAD/206/304/416, If-Range и пагинация.
  • Конкурентные резервы не превышают ёмкость; одновременные запросы с одним ключом возвращают один ID.
  • Сохранённый blob без commit восстанавливается через complete. Занятый upload возвращает 503.
  • Принудительное завершение PostgreSQL-соединения владельца upload-lock не позволяет публикацию через другой pool.
  • Второй API на той же БД и подключение существующей БД к другому каталогу отклоняются.

Реальный файл 5 GiB ​

Скрипт tests/large-transfer.mjs: один реальный HTTP-поток upload → публикация → принудительное завершение серверного процесса → новый процесс → suffix Range → полный download с подсчётом хеша.

ПоказательИзмерение
Bytes5 368 709 120
Upload45 829 ms
Полный download11 176 ms
Пик RSS отдельного серверного процесса142 442 496 bytes, около 136 MiB
SHA-256 до/послеСовпадает
Range после перезапускаТочные последние 17 bytes
Одновременные передачи1

SHA-256 тестового содержимого:

text
b23228f170c6e7ab93aeee2c5711299da5d561470be1c6842ef063f17bfed415

Данные генерируются одним повторно используемым буфером 1 MiB. Сам файл не хранится в Git; тест удаляет собственный временный каталог. Память клиента и серверного процесса разделена. RSS измеряется каждые 100 ms; тест отклоняет пик выше 384 MiB. Показатель не включает page cache ОС и не доказывает ограничение при большом числе клиентов.

Локальный машинный отчёт: test-results/large-transfer.json (исключён из Git). Время зависит от диска, кеша ОС, БД и сети; не используйте эти цифры как SLA или прогноз для сети с несколькими шлюзами.

Пока не подтверждено ​

Аппаратное отключение питания, отказ диска/узла, HA PostgreSQL/blob-store, межузловая сеть, 4 ТБ миграции, распаковка payload/CRC всех ZIP entries, mixed-load fairness и ограничение общей полосы. Эти сценарии остаются отдельными этапами; владелец отложил стенд двух серверов.

Инкремент 0.2 ​

Локально проверены: части после restart, gaps, конфликт индекса/хеша; offline GC и отказ удаления без освобождения квоты; expiry и отозванные права worker; lease generation и реальный worker subprocess; CAS annotations/assets; UPack registration/immutable identity, SemVer/path/symlink validation; SDK по HTTP, скачивание исходных bytes по пакету/пути файла и ACL/Range; dry-run/import/repeat/read-back hash и offline scrub. 13 unit/local tests и 16 PostgreSQL/HTTP integration tests. Browser smoke: страница консоли отображается, обработчик выбора файла работает; полного browser upload/save теста нет.

Реальный 5 GiB multipart: 640 частей по 8 MiB, SIGKILL API после части 319, новый процесс видит 320 подтверждений, продолжение до complete, повторный SIGKILL, Range и полный download. Общий SHA-256 совпал с указанным выше.

ИзмерениеЗначение
Upload + restart + сборка71 678 ms
Полный download13 408 ms
Пик RSS API147 103 744 bytes, около 140 MiB
Bytes5 368 709 120
Отчётtest-results/large-multipart.json (локальный, ignored)

Первый прогон обнаружил timeout неактивного сокета во время сборки. Для синхронного complete увеличено ожидание до 30 минут при сохранении ограниченного допуска; убран повторный полный hash после уже проверенной потоковой сборки. Повторный прогон прошёл. Reverse proxy должен допускать такую длительность либо клиент использует complete-async и worker. Измерения относятся к одному потоку на локальном диске, не являются сетевым SLA.

История файлов и восстановление (2026-09-22) ​

Добавлены 1 unit test runtime-контрактов и 7 PostgreSQL/HTTP integration tests. Полный набор: 14 unit/local и 23 integration tests. Проверяются страницы по 50 с точным окончанием, параллельное добавление ревизий, сохранение прежних байтов после restart, скачивание текущего указателя по пути файла, конкурирующие restore, повтор с устаревшей ревизией, диапазон PostgreSQL integer, изоляция репозиториев, read/write ACL и отмена SDK-запроса.

Отказы записи воспроизводятся PostgreSQL triggers отдельно в таблице истории и в аудите: HTTP возвращает 503, текущий указатель и число ревизий не меняются. Миграция проверяется на существующей истории схемы 3: старые поля автора/даты остаются null, повторный migrate безопасен, новые записи заполняются.

В браузере на изолированном localhost-профиле проверены загрузка двух ревизий, восстановление первой как третьей, открытие исторического artifact в метаданных и очистка истории/выбора при отключении. Отображение таблицы проверено визуально. Это ручной smoke, не автоматизированная проверка всех browser-сценариев. Потоковые byte paths не менялись; тесты 5 GiB в этом инкременте не повторялись. Стенд двух серверов остаётся отложенным.

Темы и локализация консоли ​

Добавлены проверки словарей/параметров, fallback preferences при запрете storage, семантических цветов и контраста текста в обеих темах. HTTP integration проверяет раздачу tokens.css и appearance-init.js с прежней CSP. Полный набор — 17 unit/local и 23 integration tests.

Ручной browser smoke на отдельной тестовой БД: светлая/тёмная темы, RU/EN без reload, перевод уже загруженных ревизий и дат, восстановление, открытие старого файла, ошибка JSON с переключением языка, успешное сохранение метаданных, reload с сохранёнными темой/языком и пустым ключом. Через file chooser загружен небольшой искусственный файл, подтверждены публикация и появление в каталоге, ошибок JavaScript нет. На ширине 390 CSS px проверено отсутствие горизонтального переполнения страницы; навигация и таблицы имеют собственную прокрутку. Эти проверки не являются полным аудитом доступности или всех browser upload/save сценариев.

Восстановление сетевых передач (2026-09-22) ​

Полный набор после инкремента: 37 unit/local/SDK tests + 25 PostgreSQL/HTTP integration tests. npm run check проверяет strict TypeScript, ESLint, формат и граф зависимостей. Новые сценарии: fault proxy с обрывом multipart и потерей ответов после create/part/complete; пустой upload после потери ответа; повтор без дубликатов; CLI продолжает принятую часть и отклоняет изменённый исходник. SDK по настоящим HTTP-сокетам проверяет range recovery, prefix нового клиента, checksum, неправильные заголовки, отмену активного чтения/ожидания, зависший ответ, Retry-After, общий бюджет и отсутствие retry у CAS.

Повторён реальный 5 GiB профиль --multipart --verified: SIGKILL API после части 319, продолжение, публикация, ещё один SIGKILL, проверка suffix Range, обрыв download внутри первого блока, автоматический повтор и SHA-256 всего файла. Windows, Node.js 24.13.0, локальные PostgreSQL 18.4 и filesystem, один поток.

ПоказательИзмерение
Размер5 368 709 120 bytes
Upload с restart и сборкой155 043 ms
Проверяемый SDK download с обрывом52 605 ms
Пик RSS API150 794 240 bytes, около 144 MiB
Пик RSS клиентского процесса теста177 823 744 bytes, около 170 MiB
SHA-256b23228f170c6e7ab93aeee2c5711299da5d561470be1c6842ef063f17bfed415
Локальный отчётtest-results/large-verified.json (ignored)

RSS обоих процессов ограничен assertion <384 MiB, выборка каждые 100 ms. Клиентский пик включает генератор и upload-часть теста. Числа не включают page cache и не являются сравнением throughput предыдущих прогонов: отличаются клиентское хеширование, последовательные Range-запросы и нагрузка машины. Специальный аппаратный стенд и межузловые отказы не проверялись. Web download переведён на тот же проверяемый SDK-поток; отдельный ручной browser save smoke в этом инкременте не проводился.

Сетевые бюджеты шлюза (2026-09-22) ​

Полный набор: 44 unit/local/SDK tests + 30 PostgreSQL/HTTP integration tests. Проверки типов, ESLint, формат и архитектурные границы проходят. Принудительное завершение PostgreSQL-соединения standalone ownership отдельно проверяет остановку активного throttled download, readiness 503 и сохранность файла после restart.

Реализованы общий и per-principal bucket для каждого направления, предел активных операций клиента, корректное закрытие очередей и агрегаты readiness. Проверки: виртуальное монотонное время, математические границы burst/rate, конкуренция принципалов и ключей, защита больших квантов от потока маленьких, отмена/ограничение очередей/backpressure, реальные параллельные full/multipart uploads и downloads по ID, пути файла и Range. HEAD/304/416 не расходуют byte budget. При выключении API активная раздача прерывается, а опубликованные bytes доступны после restart.

Реальный 5 GiB прогон --multipart --verified --traffic, Windows/Node.js 24.13.0, local PostgreSQL 18.4/filesystem, один клиентский поток:

ПоказательИзмерение
Размер5 368 709 120 bytes
Лимит шлюза upload и downloadПо 67 108 864 bytes/s (64 MiB/s)
Лимит принципала upload и downloadПо 50 331 648 bytes/s (48 MiB/s)
Upload с restart и сборкой166 956 ms
Verified download с обрывом128 865 ms
Пик RSS API150 720 512 bytes, около 144 MiB
Пик RSS клиента теста168 525 824 bytes, около 161 MiB
SHA-256b23228f170c6e7ab93aeee2c5711299da5d561470be1c6842ef063f17bfed415
Локальный отчётtest-results/large-traffic.json (ignored)

Сценарий включает SIGKILL API после части 319, продолжение multipart, сборку, SIGKILL после публикации, suffix Range и принудительный обрыв download socket. Проверены целостность и RSS <384 MiB каждого процесса. Скорость не обязана достигать потолка: сюда входят fsync, сборка, restart, hash и HTTP-запросы. Общие квоты нескольких шлюзов, replication/fencing, физическая полоса интерфейса и HA этим прогоном не подтверждаются.

Шлюзы чтения и аренда долей (2026-09-22) ​

Текущий набор: 47 unit/local/SDK tests + 34 PostgreSQL/HTTP integration tests. Добавлены три unit-теста локального окна и расчёта долей, четыре интеграционных сценария; проверки конфигурации и обновления старого каталога расширены для схемы 5.

Проверены writer и два reader в отдельных процессах, сумма скоростей, невозможность увеличить долю локальной настройкой, ACL/405/Range, обрыв при SIGKILL reader и целостность скачивания через writer. Проверены конфликт номера slot/policy, повторный startup до истечения аренды, рост generation, запрет standalone bypass и offline maintenance при живом reader, отсутствие создания storage на reader.

TCP proxy приостанавливает обмен между reader и PostgreSQL во время активного download. Поток завершается до истечения DB reservation благодаря локальному окну; после expiry запускается новый reader с тем же slot. Возвращение DB-связи не оживляет старый процесс. Unit-тесты отдельно моделируют поздний heartbeat и паузу процесса. Условия часов и буферизации изложены в READ_GATEWAYS.

Испытания выполнены на Windows, локальном PostgreSQL и одном согласованном storage root. Отказы двух физических серверов, репликация файлов/БД, внешний балансировщик, скачки DB clock и промышленный HA не проверялись.

Повторный standalone regression --multipart --verified --traffic с новым кодом: 5 368 709 120 bytes, SIGKILL посреди upload и после публикации, обрыв download, полное совпадение SHA-256 b23228f170c6e7ab93aeee2c5711299da5d561470be1c6842ef063f17bfed415. Upload с продолжением и сборкой — 192,364 ms; verified download — 127,989 ms. RSS API — 151,617,536 bytes (около 145 MiB), клиента — 162,799,616 bytes (около 155 MiB), оба ниже assertion 384 MiB. Квоты: 64 MiB/s на шлюз и 48 MiB/s на principal в каждом направлении. Этот большой прогон проверяет standalone regression; несколько readers и потеря PostgreSQL проверены отдельными сценариями выше. Отчёт: ignored test-results/large-traffic.json.

Удаление и retention, 2026-09-25 ​

Локально прошли npm run check, build, 84 unit/local tests и полный последовательный прогон 98 PostgreSQL/HTTP integration tests. Проверены scoped artifact.delete без legacy escalation, revision conflict, защищённые метки, references и исторические asset/attachment pins, конкурентные delete/reference, rollback аудита, отозванный credential, repeat/restart, неизменяемая package identity, latest после удаления и offline GC после grace с освобождением резерва. Upgrade fixture восстанавливает старую схему и проверяет миграции; readiness требует версии 13/14.

Браузерная приёмка через Edge проверяет реальные API/SDK, managed repository discovery, отсутствие удаления у legacy write, предварительный просмотр, подтверждение ID, отказ при изменённой ревизии, RU/EN и light/dark. Новый код проверен с прежними multipart pause/resume, metadata/attachments/history и адаптивными экранами. Скриншоты находятся в ignored test-results. Большой прогон 5 GiB в этом инкременте не повторялся; предыдущие результаты выше относятся к своим версиям. Два физических сервера не проверялись.

Декомпозиция SDK, 2026-09-25 ​

Windows, Node 24.13.0, PostgreSQL 18.4, Edge: полный npm run gate -- release завершился успешно 12:18 UTC. Прошли static/policy/build, 104 unit/fault/governance теста, 105 PostgreSQL/HTTP тестов, оба браузерных сценария, аудит зависимостей (0 уязвимостей) и обе передачи 5 GiB. Проверяется прежний публичный контракт SDK с 81703c5: 68 методов и конструктор. Класс facade — 240 строк кода; ARCH-012/013 удалены, осталось 26 исключений. ADR 0028.

Full upload/download после restart: 5 368 709 120 bytes, upload 12 704 ms, download 11 054 ms, peak server 122 957 824 bytes, client 230 535 168 bytes. Multipart с managed key и traffic limits: upload 121 560 ms, verified download 129 515 ms, peak server 160 215 040 bytes, client 175 583 232 bytes. Оба процесса ниже 384 MiB. Подтверждены kill/restart на части 320, restart после публикации и искусственный обрыв скачивания; SHA-256 обоих результатов — b23228f170c6e7ab93aeee2c5711299da5d561470be1c6842ef063f17bfed415.

Открытое наблюдение: два первоначальных локальных full-upload прогона завершились ECONNRESET; в диагностическом повторе отправитель передал 1 656 750 080 bytes за 33 990 ms, тело ещё не было полностью отправлено. Этот отправитель использует node:http напрямую, без SDK. Причина не установлена; два последующих full-upload прогона, включая полный release-профиль, прошли. Это не доказательство устранения причины. В тесты добавлены объём/фаза отправки и наблюдение серверного socket timeout без изменения поведения соединения и без вывода credentials. Перед промышленным релизом требуется закрыть это наблюдение воспроизводимой диагностикой под нагрузкой; тайм-ауты продукта и критерии гейтов не ослаблялись.

Отчёты находятся в игнорируемом test-results; локальная приёмка отмечена dirty working tree до commit. Проверки двух физических серверов по-прежнему отложены.

Время жизни upload и целостность раздачи, 2026-09-25 ​

Windows, Node 24.13.0, PostgreSQL 18.4, Edge: окончательный npm run gate -- quick release завершился успешно в 13:13 UTC. Прошли policy/static/build, 105 unit/fault/governance тестов, 112 PostgreSQL/HTTP тестов, оба браузерных сценария, аудит зависимостей (0 уязвимостей) и обе передачи 5 GiB. Пропусков нет. Новые модули укладываются в лимиты; потолки трёх существующих исключений снижены, общее число остаётся 26. ADR 0029.

До исправления через гейты воспроизведены успешный короткий EOF LocalBlobStore и закрытие реального upload-сокета во время управляемой паузы backend. Регрессии проверяют отдельные idle/deadline, full/part/complete, cleanup и повтор, 400/503 с закрытием непрочитанного тела при отказе headers/admission, full/Range раздачу и выдачу по пути файла усечённого blob, освобождение допусков и безопасные коды диагностики. Найденный механизм socket timeout подтверждён; связь с двумя историческими ECONNRESET из предыдущего раздела по имеющимся логам не доказана.

Сценарий 5 GiBUpload, msDownload, msPeak RSS API, bytesPeak RSS клиента, bytes
Full, restart, Range11 36311 494148 357 120205 815 808
Multipart, managed key, throttled148 111128 887157 294 592166 924 288

Размер каждого файла — 5 368 709 120 bytes; SHA-256 — b23228f170c6e7ab93aeee2c5711299da5d561470be1c6842ef063f17bfed415. Multipart включает остановку API после части 319, продолжение с части 320, restart после публикации, принудительный обрыв скачивания и SDK verified download. Лимиты трафика — 64 MiB/s на шлюз и 48 MiB/s на principal в каждом направлении; RSS обоих процессов ниже assertion 384 MiB. Значения получены для одного потока на локальном filesystem и не являются SLA/HA.

Отчёты: игнорируемые test-results/large-transfer.json, large-traffic.json и gates/*.json. Приёмка выполнена до commit; последующая правка документации не меняет исполняемый код. Репликация двух физических серверов, внешний балансировщик и online GC этим инкрементом не подтверждаются.

Завершение декомпозиции API, 2026-09-25 ​

Windows, Node 24.13.0, PostgreSQL 18.4, Edge: npm run gate -- quick release завершился успешно в 13:45 UTC. Прошли policy/static/build, 105 unit/fault/governance тестов, 115 PostgreSQL/HTTP тестов, оба браузерных сценария, аудит зависимостей (0 уязвимостей) и обе передачи 5 GiB. Новые регрессии проверяют rollback после захвата ownership при ошибке HTTP wiring/частичного startup, отсутствие потерянных stdout listeners, повторный close/restart и явную конфигурацию webDirectory. Полный HTTP inventory остаётся 123 операции, OpenAPI и схема БД не изменены.

AST: server.ts 649 → 84 строки кода, createServer 598 → 67. ARCH-016/017 удалены, осталось 24 других исключения; новые модули проходят 500/300/100 без послаблений. Направление зависимостей проверено: 173 модуля, 598 связей. ADR 0030.

Сценарий 5 GiBUpload, msDownload, msPeak RSS API, bytesPeak RSS клиента, bytes
Full, restart, Range22 61212 082148 099 072225 304 576
Multipart, managed key, throttled173 838129 213139 120 640172 961 792

Каждый файл — 5 368 709 120 bytes; SHA-256 — b23228f170c6e7ab93aeee2c5711299da5d561470be1c6842ef063f17bfed415. Подтверждены kill/restart на части 320, restart после публикации, искусственный обрыв download и verified resume; оба процесса ниже RSS assertion 384 MiB. Квоты: 64 MiB/s на шлюз, 48 MiB/s на principal. Отчёты в ignored test-results; рабочее дерево при проверке ещё не было закоммичено. Это локальный regression одного потока, не измерение SLA или подтверждение двухсерверного HA.

Arkvory · ProAnimaStudio