Проверка 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 с подсчётом хеша.
| Показатель | Измерение |
|---|---|
| Bytes | 5 368 709 120 |
| Upload | 45 829 ms |
| Полный download | 11 176 ms |
| Пик RSS отдельного серверного процесса | 142 442 496 bytes, около 136 MiB |
| SHA-256 до/после | Совпадает |
| Range после перезапуска | Точные последние 17 bytes |
| Одновременные передачи | 1 |
SHA-256 тестового содержимого:
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 |
| Полный download | 13 408 ms |
| Пик RSS API | 147 103 744 bytes, около 140 MiB |
| Bytes | 5 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 API | 150 794 240 bytes, около 144 MiB |
| Пик RSS клиентского процесса теста | 177 823 744 bytes, около 170 MiB |
| SHA-256 | b23228f170c6e7ab93aeee2c5711299da5d561470be1c6842ef063f17bfed415 |
| Локальный отчёт | 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 API | 150 720 512 bytes, около 144 MiB |
| Пик RSS клиента теста | 168 525 824 bytes, около 161 MiB |
| SHA-256 | b23228f170c6e7ab93aeee2c5711299da5d561470be1c6842ef063f17bfed415 |
| Локальный отчёт | 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 GiB | Upload, ms | Download, ms | Peak RSS API, bytes | Peak RSS клиента, bytes |
|---|---|---|---|---|
| Full, restart, Range | 11 363 | 11 494 | 148 357 120 | 205 815 808 |
| Multipart, managed key, throttled | 148 111 | 128 887 | 157 294 592 | 166 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 GiB | Upload, ms | Download, ms | Peak RSS API, bytes | Peak RSS клиента, bytes |
|---|---|---|---|---|
| Full, restart, Range | 22 612 | 12 082 | 148 099 072 | 225 304 576 |
| Multipart, managed key, throttled | 173 838 | 129 213 | 139 120 640 | 172 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.