Skip to content

ARCH/DDD: сделать neutral family anchor-defined без скрытой психофизики #219

Description

@lemone112

Проблема

Production-конфиг несёт NeutralTint { ratio, target_mp, hue_stiffness, hue_override_deg }, а ядро содержит TINT_PERCEPTIBLE_MP_FLOOR, CUSP_HALF_WINDOW_DEG, LIGHTNESS_SETTLE, CURVE_REFINE_STEPS и midpoint fallback.

Эти значения меняют продуктовый результат, но не имеют статуса универсальной физики:

  • M′=1.5 не доказан как screen perceptibility threshold;
  • ±40° — текущая aesthetic policy;
  • 0.002 не является общей границей точности finite sRGB8;
  • фиксированное число итераций не доказывает неподвижную точку;
  • Err → midpoint скрывает недостижимость;
  • cusp attraction не является обязательным законом family identity.

Однако утверждение «три anchors однозначно задают научно правильную neutral curve» также неверно. Точки не определяют единственную траекторию без explicit construction model/profile.

Роль neutral family в продукте

Neutral family — не статическая палитра и не только offline candidate set. Это first-class вычислительный механизм адаптивной системы:

immutable anchors
+ versioned construction/profile
+ current context and client contract
→ selected family point
→ finite emitted state

Continuous family позволяет:

  • выбирать точки по дельтам/контрактам;
  • перерешивать их при изменении background/theme/context;
  • сохранять связанную траекторию family;
  • искать минимальное допустимое изменение.

Фактический output всегда конечен и повторно измеряется после emission. Continuous family и finite output domain не конкурируют — это два уровня одной модели.

Доменное решение

Разделить четыре SSOT-понятия:

  1. Client source data — ordered immutable anchors.
  2. Versioned family construction — как из anchors определяется непрерывное/упорядоченное семейство.
  3. Finite emission policy — какие output states реально доступны и как выполняется tie/quantization.
  4. Client role/dependency contract — по какому отношению выбирается текущая точка.
struct NeutralFamilySpecV1 {
    anchors: NonEmptyOrderedAnchors<SourceColor>,
    construction: NeutralConstructionId,
    emission: OutputDomainId,
}

Точные типы и пространство construction подлежат сравнительному DDD/научному review.

Возможные competing constructions

Не утверждать один вариант заранее. Проверить как минимум:

Каждый construction имеет immutable ID, documented semantics, applicability и falsification tests. Ни один не называется универсальной психофизической истиной без данных.

Достаточность входов и UX

Lab Colors не задаёт интерактивных вопросов.

static declarative config/profile
→ deterministic compile
→ resolved tokens либо structured compile error

Если базового набора anchors недостаточно для выбранного explicit construction/contract:

  • versioned Auto-profile применяет собственный детерминированный admitted default; либо
  • client config статически предоставляет дополнительные anchors/constraints; либо
  • компиляция возвращает typed insufficiency/conflict.

Никаких NeedsPreference, askUser, CLI-мастеров или скрытого magic fit.

Источник истины

  • Пользовательские anchors сохраняются побайтно в своём source/output contract.
  • Эмитируемый цвет — конечный output state и источник финального замера.
  • Appearance coordinates декодируются из emitted state в применимом context/model.
  • Exact encoded R=G=B означает только encoded achromatic state; это не обещание одинакового appearance во всех contexts.
  • Near-neutral не объявляется achromatic по недоказанному epsilon.
  • Hue exact achromat отсутствует типом.
  • h_ok и h_cam не являются двумя независимо редактируемыми источниками одного цвета ARCH: запретить независимо изменяемые hue-представления одного цветового стимула #16.

Sampling и role mapping

Semantic/client level не равен фиксированному t.

Дизайн-система передаёт opaque ID и generic contract. Resolver выбирает family point, который выполняет этот контракт в текущем контексте. Одинаковый client level разных families может получить разные t, J′, chroma, alpha и bytes.

Обязательные свойства:

  • byte-exact anchors;
  • deterministic construction identity;
  • continuous-path continuity/monotonicity ровно в объявленных величинах;
  • finite emitted candidate/domain contract;
  • nearest/admissible state с explicit stable tie rule;
  • честные repeated outputs при insufficient finite capacity;
  • no midpoint/error fallback;
  • final-state remeasurement;
  • small input/context changes не создают необъяснимый массовый jump вне declared boundary MATH/PRODUCT: ввести intervention margin, hysteresis и incremental palette stability #268.

Если family не может выполнить требуемый client relation, возвращается typed conflict/capacity status; points не переставляются молча.

Удаляемая или понижаемая policy

После доказанной migration/replacement:

  • ratio как universal tint amount;
  • target_mp как обязательная «правильная сила»;
  • hue_stiffness;
  • hue_override_deg как компенсация слабой общей модели;
  • TINT_PERCEPTIBLE_MP_FLOOR как universal observer threshold;
  • CUSP_HALF_WINDOW_DEG;
  • LIGHTNESS_SETTLE;
  • CURVE_REFINE_STEPS;
  • midpoint/error fallback;
  • frozen gamma как product law.

Current values до замены остаются compatibility baselines/preset data и не удаляются до differential proof shipped behavior.

TDD / falsification

  1. Все source anchors byte-exact.
  2. Current shipped outputs зафиксированы characterization corpus до migration.
  3. Continuous family и finite emission имеют отдельные IDs/tests.
  4. Client level selection зависит от переданного contract/context, а не имени или фиксированного t.
  5. Exact R=G=B не получает invented hue.
  6. Construction change инвалидирует cache/certificate.
  7. Close anchors честно дают repeated finite outputs/capacity status.
  8. Non-monotone/unsatisfied contract возвращает typed result, не fallback/reordering.
  9. Добавление static anchor сохраняет его bytes и имеет declared effect на остальные segments.
  10. Старые low-level fields имеют явную migration policy и не игнорируются молча.
  11. Second-client fixture проходит без Lab UI-specific anchors/semantic names.
  12. Current adaptive background/theme resolve остаётся работающим после замены construction.

Acceptance

  • Generic product UX не требует ratio/target_mp/hue_stiffness/hue_override.
  • Anchors, continuous construction, finite emission и client selection contract разделены.
  • Continuous family остаётся first-class adaptive mechanism.
  • Ни один construction не назван universal human law без evidence.
  • Hidden tint/cusp/float-stop constants удалены либо frozen только в explicit legacy profile.
  • Exact anchors и final emitted state являются проверяемыми SSOT.
  • Недостаточность входов обрабатывается deterministic profile/static config/typed error, не интерактивным вопросом.
  • Migration воспроизводит shipped behavior до осознанного versioned change.
  • Empirical inventory/Rustdoc/whitepaper согласованы с открытым статусом neutral progression.

Зависимости и связи

Закрытый PR #226 остаётся доступным только как audit trail/counterexample source; production-код переносится повторной реализацией от актуального main.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions