Skip to content

arch(compositor): безразмерный SpringShape Atlas и cache reuse между scale-equivalent пружинами #229

Description

@lemone112

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

Пружины с одинаковой формой, но разной скоростью, используют один и тот же compiled shape artifact. Compiler/cache перестаёт повторно строить одинаковую нормализованную кривую для разных duration или scale-equivalent mass/stiffness/damping.

Математический закон

Для:

u = ω₀t
ν = v₀/ω₀
ω₀ = sqrt(k/m)
ζ = c/(2 sqrt(km))

получаем:

X''(u) + 2ζX'(u) + X(u) = 1

Нормализованная форма зависит только от:

ζ
ν
reconstruction contract/tolerance
finite horizon policy

ω₀ масштабирует время:

Tphysical = Ushape / ω₀

Следовательно, при корректно безразмерном finite horizon один easing/samples artifact может обслуживать целое семейство duration.

Проблема текущего cache key

Текущий generic cache identity использует raw:

mass, stiffness, damping, v₀, tolerance

Scale-equivalent triples и одинаковые bounce при разных duration получают разные entries, хотя shape совпадает.

Целевая модель

Разделить:

interface SpringShapeArtifact {
  easing/samples
  dimensionlessHorizon: number // U
  shape metadata needed for handoff
}

interface SpringExecution {
  shape: SpringShapeArtifact
  durationMs: U / omega0 * 1000
}

Точные структуры выбираются по size/SSOT conventions; named interface не обязателен в hot tuple path.

Canonical shape key:

ζ, ν, effectiveTolerance, finiteHorizonPolicyVersion, representationKind

Raw authoring identity не должна ломать reuse, но cache key нельзя квантизовать эвристически: canonical doubles выводятся точными формулами и проходят collision-safe equality.

Зависимости

Production implementation заблокирована до прояснения этих контрактов; до этого разрешены oracle, cache simulation и size/perf spike.

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

  1. Scale-equivalent (m,k,c) дают один shape artifact и разные duration при необходимости.
  2. duration/bounce family с общим bounce даёт один shape entry.
  3. ν=v₀/ω₀: физически разные v₀, но одинаковый normalized impulse, совпадают.
  4. Разные ζ/ν/tolerance/horizon policy не collide.
  5. Shape sample + duration reconstruct physical solver trajectory в tolerance.
  6. C¹ serialized handoff velocity масштабируется обратно корректно:
    vphysical = ω₀ · dX/du с учётом value span.
  7. Cache hit не аллоцирует; eviction/retention bounded.
  8. Existing exact raw cache semantics мигрируют без stale artifact reuse.
  9. Browser differential across duration family.
  10. Mutation: omitted ν, wrong time scaling, cache collision, wrong velocity scaling, policy-version drift.

Метрики

На representative token/app corpus измерить:

  • unique raw configurations;
  • unique canonical shapes;
  • cold compiles eliminated;
  • cache hit rate/retention;
  • artifact memory;
  • total generated CSS bytes;
  • start latency cold/warm.

Минимальная acceptance — не synthetic one-key win, а заметное reuse на duration-token/stagger/app fixtures.

Архитектурные ограничения

  • engine manifest хранит physical primitives, semantic roles остаются в Lab UI ([0.2] SSOT motion-токенов: primitives в engine, semantic roles в Lab UI #105);
  • не вводить approximate quantization buckets;
  • authoring params могут сохраняться для diagnostics, но execution shape имеет один SSOT;
  • compiler build-time и runtime compositor используют один canonicalization law;
  • MotionProgram/wire version обновляется явно, если shape identity входит в portable artifact.

GO / NO-GO

GO: существенный cold/cache/retention выигрыш, чистая модель и без повышения bundle gates.

NO-GO: если finite horizon/velocity contracts делают reuse редким или дополнительная canonicalization дороже; сохранить corpus/report, удалить experimental code.

Родитель: #225. Связано: #105, #218, #219, #220, #221, #223.

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