Тест — это контракт
00 / executable specificationINPUT
canvas
objects[]
roles[]
grid?
stylePreset?
seed
moduleConfig
EXPECTED
status
metric ranges
structural properties
hard violations
determinism
repair hints
ASSERTION
exact equality // DERIVED
range / tolerance // HEURISTIC
set membership // enum/status
invariant // structural
reject reason // hard rule
Ключевое правило: тесты не закрепляют художественный «единственно правильный» layout. Они закрепляют инварианты: отсутствие запрещённых конфликтов, корректный порядок ролей, допустимые диапазоны, воспроизводимость и правильное владение метриками.
Какие тесты нужны
01 / test taxonomy| Тип | Что проверяет | Пример | Жёсткость |
|---|---|---|---|
| DERIVED | чистую геометрию | distance, grid deviation, collision | точное значение ± floating epsilon |
| CONSTRAINT | hard rule | точка вышла за protected zone | обязательный reject |
| HEURISTIC RANGE | наше стартовое дизайнерское правило | dominant/support radius ratio | диапазон, а не exact |
| RELATIONAL | отношение кандидатов | A должен набрать score выше B | ranking assertion |
| DETERMINISM | seeded generation | seed 417 повторяется | структура обязана совпасть |
| REGRESSION | изменения после правок ядра | старые сцены не деградировали | допустимое score drift |
Точность и допуски
02 / tolerances1e−6
geometry epsilon
derived
Для нормализованных координат и чистой математики.
±.02
metric tolerance
heuristic
Для вычислимых perceptual-score V1.
±.05
global drift
heuristic
Для regression score при внутренней переработке.
0
hard violations allowed
hard
Accepted candidate не может содержать hard violation.
HEURISTIC-тест не должен требовать пиксель-в-пиксель одинаковой композиции. Иначе мы случайно превратим генеративный движок в набор жёстких шаблонов.
Reference test suite
03 / click run allRegression protocol
04 / future-safeПосле изменения любого Compo 1.xx
1. run all point-system unit tests
2. run deterministic seeds
3. compare metric deltas
4. compare hard-reject set
5. inspect rank inversions
6. allow documented intended change
7. update expected values only with reason
Нельзя
- менять expected value просто потому, что тест стал красным;
- ослаблять hard constraint ради высокого score;
- дублировать одну метрику в нескольких assertions;
- считать DEFERRED global metric внутри point-suite;
- использовать случайность без сохранённого seed.
DATA FOR LAYOUT ENGINE
05 / machine contract{
"module": "Compo 1.13",
"type": "reference_test_suite",
"consumes": ["Compo 0.00", "Compo 1.01-1.12"],
"testCaseSchema": {
"id": "string",
"owner": "Compo x.xx",
"sourceClass": "DERIVED|HEURISTIC|CONSTRAINT|RELATIONAL|DETERMINISM|REGRESSION",
"input": "object",
"expected": "object",
"tolerance": "number|object|null",
"assertions": "array",
"seed": "integer|null"
},
"globalRules": {
"acceptedCandidateHardViolationCount": 0,
"geometryEpsilon": 0.000001,
"defaultMetricTolerance": 0.02,
"defaultRegressionScoreDrift": 0.05,
"seededStructuralOutputMustRepeat": true,
"deferredMetricsAreNotComputedHere": true,
"singleMetricOwnerRequired": true
},
"suitePolicy": {
"runOnEveryModuleChange": true,
"runBeforeGlobalIntegration": true,
"updateExpectedRequiresReason": true,
"pixelPerfectLayoutAssertion": false
}
}