Skip to content

feat(compiler): serialization-aware portfolio выбирает минимальный сертифицированный artifact #232

Description

@lemone112

Пользовательский результат

Spring compiler оптимизирует не абстрактное число узлов, а реальную стоимость browser artifact. Для одной математической траектории он строит несколько доказанно корректных представлений и детерминированно выбирает минимальное по объявленной cost function.

Подтверждённая проблема

Текущий pipeline минимизирует adaptive piecewise-linear nodes, после чего каждый узел сериализуется как:

linear(value percent%, value percent%, ...)

Но CSS linear() допускает implicit positions:

  • первый 0% и последний 100% могут быть опущены;
  • равномерные промежуточные stops могут не иметь процентов;
  • runs могут использовать автоматическое распределение.

Иногда больше равномерных values без positions короче, чем меньше adaptive nodes с длинными decimal percentages. Следовательно, minimum knot count != minimum artifact bytes.

Прототип показал случаи, где uniform implicit запись была короче adaptive explicit примерно на 5–10%, и другие случаи, где adaptive уверенно выигрывала. Нужен portfolio, не один глобальный победитель.

Кандидаты первого portfolio

A. Adaptive explicit linear

Текущий certified RDP artifact.

B. Uniform implicit linear

Равномерная certified grid, сериализуются только progress values, positions выводит CSS grammar.

C. Hybrid linear

Critical anchors/extrema/tangent задаются явно, внутри допустимых runs positions опускаются или кодируются компактнее.

D. Cubic Hermite

Только после GO #231 и отдельного browser capability result.

Portfolio должен быть расширяемым internal образом, но не generic plugin architecture с runtime overhead.

Cost function

Первый обязательный критерий:

raw UTF-8 bytes browser artifact

Параллельно измерять:

  • gzip/Brotli consumer bytes;
  • number of keyframes/stops;
  • browser parse/start cost;
  • retained sample metadata для C¹ handoff;
  • initial+total bundle impact.

Выбор production representation не обязан всегда совпадать с raw-minimum, если browser start/memory доказывают другой Pareto winner. Тогда policy должна быть versioned и воспроизводимой, а не hardware-dependent runtime benchmark.

Канонизация CSS linear()

Независимо от полного portfolio проверить бесплатные/малорисковые сокращения:

  • не печатать обязательные 0%/100%, если CSS semantics exact;
  • shortest round-trip только там, где он нужен для tangent/identity;
  • implicit uniform positions;
  • canonical whitespace/separators;
  • не схлопывать соседние stops вопреки right-bias/discontinuity semantics;
  • round-trip через независимый CSS-linear parser/reference.

Архитектурные требования

  • каждый candidate сначала доказывает один effective tolerance ([compositor] Выражать reconstruction error в единицах результата #223);
  • candidate comparison выполняется build/cold compile, не на кадре;
  • serialized artifact является SSOT фактически исполняемой и sampled handoff-кривой;
  • compiler/runtime и compositor используют один emitter/canonical parser;
  • cache identity включает representation policy/version либо cache хранит canonical shape и лениво derived representations;
  • dynamic positive-control не платит за build compiler portfolio;
  • никаких eval/runtime generated JS.

RED / доказательства

  1. Corpus, где A выигрывает B, и corpus, где B выигрывает A.
  2. Candidate evaluator отклоняет любой artifact с error > effective tolerance.
  3. CSS grammar round-trip для omitted positions, duplicate stops, extrema, overshoot, signed zero.
  4. Dense numeric oracle фактически parsed representation.
  5. Deterministic tie-break; одинаковый input -> байт-в-байт output.
  6. Min selector mutation: reversed comparison, raw/gzip confusion, invalid candidate accepted.
  7. Browser Chromium/Firefox/WebKit parsed trajectory parity.
  8. Metafile/import-cost: unused representations/tree branches не раздувают runtime.
  9. Pack/Vite compiler artifacts reproduce choice.
  10. Benchmark: build time bounded; portfolio не съедает выигрыш perf(compositor): root-matched recurrence вместо exp/sin/cos на каждом узле сетки #227/perf(compositor): локальная энергетическая сетка вместо global worst-case oversampling #228.

GO

  • corpus-wide artifact bytes не хуже baseline ни в одном accepted scenario;
  • есть измеримый aggregate/representative win;
  • browser/start/handoff contracts зелёные;
  • code size/runtime graph не регрессируют.

NO-GO

Если selector complexity и compiler size превышают реальные consumer savings, оставить только подтверждённые canonical CSS сокращения, сохранить report и не шипить portfolio abstraction.

Не входит

  • онлайн autotuning по устройству;
  • изменение authored animation semantics;
  • новый runtime entry;
  • competitor claims.

Родитель: #225. Связано: #220, #221, #222, #223, #227, #228, #231.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions