Skip to content

Latest commit

 

History

History
173 lines (111 loc) · 30.7 KB

CORE_VALIDATION.md

File metadata and controls

173 lines (111 loc) · 30.7 KB

Проверка 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.