Воспроизводимость
При одинаковых Markdown, JSON, Framework lock и версии генератора повторная сборка должна создавать байт-в-байт одинаковый результат.
Docara не записывает в portable output текущую дату и абсолютные локальные
пути. _docara/page-metadata.json использует историю Git exact source, если она
доступна; в Composer dist без .git поля updated_at, revision и author
равны null. Время распаковки или изменения файла не попадает в публичный
результат. Для каждой страницы квитанция build_production.docara/resolved-page-plans.json
содержит:
- итоговую конфигурацию;
- упорядоченный trace входных файлов с SHA-256;
- provenance каждого значения;
- canonical hash плана;
- нормализованные вызовы компонентов;
- точный asset plan;
- output path и публичный URL.
Для проверки соберите сайт дважды в чистые каталоги и сравните хэши деревьев. Изменение входа или lock должно объяснимо изменить соответствующий план.
Если поиск включён, content_sha256 в _docara/search-index.json вычисляется
из canonical documents, а query revision _docara/search.js — из точных байтов
runtime. Поэтому изменение содержания и изменение поискового кода инвалидируют
кэш независимо и остаются воспроизводимыми.
CSS постоянного каркаса собирается из зафиксированных Framework-ресурсов и
declarative-shell.css и публикуется общими файлами
docara-shell.<sha256>.css; имя определяется точными байтами файла. Группировка
зависит только от наборов CSS всех страниц, поэтому одинаковая сборка получает
те же файлы. Framework shell receipt фиксирует для каждой страницы её исходные
CSS, подключаемые файлы и их порядок, предзагруженные модули и hash каждого
файла, а любое содержательное изменение даёт новое имя. Однострочная
пересборка build --page не трогает другие страницы: она использует
опубликованные файлы и добавляет новые только для изменившегося набора, а
полная сборка заново группирует весь сайт.
Если настроены redirects, квитанция redirects.json аналогично фиксирует
canonical records, SHA-256 канонически нормализованного source, locale, версию
документации и base_url. Форматирование и порядок записей во входном JSON не
меняют результат сборки.