Последний функциональный файл Topic 6
6.04 превращает изменения format context в детерминированные invalidation/recompute/adaptation events.
Versioned snapshots 6.00–6.03.
ChangeSet → hooks → recompute/adaptation requests.
None. Operational descriptors only.
CanvasFormatSnapshot
Stateful adaptation возможна только между явно версионированными состояниями. Snapshot также несёт coordinate-frame и normalization-domain semantics, чтобы их изменение не исчезало из diff.
CanvasFormatSnapshot {
snapshotRef,
canvasRef,
canvasVersion,
extent,
aspectRatioWH,
logAspectRatio,
exactClass,
behaviorClass,
behaviorPolicyRef,
physicalMetadataVersion?,
viewingContextRef?,
normalizationContextRef,
confidence,
provenance
}
Что именно изменилось
ChangeSet хранит semantic diff, а не только список поменявшихся чисел. Производный behavior transition не считается второй независимой family поверх вызвавшего его aspect change.
Pure common scale нужно доказать
Совпадающий aspect ratio ещё не доказывает common scale.
Operational stable behavior
6.01 остаётся stateless canonical classifier. 6.04 может поверх него стабилизировать transition state.
Enter square-like
Exit square-like
ChangeClass
Класс нужен для routing, не для эстетической оценки.
| Class | Meaning |
|---|---|
INITIAL | previous snapshot отсутствует |
NO_CHANGE | watched semantic fields совпадают |
PURE_COMMON_SCALE | доказан единый scale factor |
ASPECT_CHANGE | aspect изменился, stable behavior state не сменился |
BEHAVIOR_TRANSITION | stable behavior state сменился |
PHYSICAL_CONTEXT_CHANGE | изменился physical metadata context |
VIEWING_CONTEXT_CHANGE | изменился viewing context |
NORMALIZATION_DOMAIN_CHANGE | изменился normalization domain/unit semantics |
COMBINED_CHANGE | несколько независимых families одновременно |
Recompute routing
6.04 знает зависимости, но не перехватывает ownership целевых метрик.
Invariant ≠ stale-proof
Pure common scale позволяет оптимизировать pipeline, но не игнорировать raw evidence и provenance.
Raw geometry
Normalized geometry
AdaptationHookInvocation
Hooks исполняются в фиксированных фазах.
AdaptationHookInvocation {
hookId,
trigger,
phase,
targetOwner,
payloadRefs[],
mutationAllowed: false
}
LayoutAdaptationRequest
Когда format behavior действительно изменился, 6.04 может попросить layout owner построить новые candidates.
LayoutAdaptationRequest {
requestId,
canvasRef,
reason:
BEHAVIOR_TRANSITION |
ASPECT_CHANGE_WITHIN_CLASS |
PHYSICAL_CONTEXT_CHANGE |
VIEWING_CONTEXT_CHANGE |
CUSTOM,
fromSnapshotRef,
toSnapshotRef,
constraints[],
candidateOwner,
mutationAllowed: false
}
Что автоматически эмитить
Автоматизм существует только как explicit integration policy.
FormatAdaptationPolicy {
policyRef,
emitLayoutRequestOnBehaviorTransition,
emitLayoutRequestOnAspectChangeWithinClass,
emitLayoutRequestOnPhysicalContextChange,
emitLayoutRequestOnViewingContextChange,
recomputeRawGeometryOnPureCommonScale,
recomputeNormalizedGeometryOnPureCommonScale,
hookOrder[],
provenance
}
Что обязан не сломать Topic 6
6.04 содержит consolidated regression barriers всей темы, но не становится owner предыдущих metrics.
| Module | Barrier |
|---|---|
| 6.00 | explicit extent; canvas ≠ content bounds |
| 6.01 | exact class ≠ policy behavior; no hidden near-square tolerance |
| 6.02 | PPI ≠ DPI; no default viewing distance |
| 6.03 | ShortN isotropic ≠ UV metric geometry |
| 6.04 | stateful diff/hysteresis/hooks; adaptation request ≠ mutation |
Последняя граница темы
Adaptation layer координирует owners, а не поглощает их.
Topic7
safe / bleed / margins.
Topic8
grids / grid occupancy.
Future layout
actual responsive candidate generation.
Global
balance / hierarchy / eye-flow.
Visual Lab
Разные format changes требуют разных recompute/adaptation paths.
Topic 6 adaptation regression
Проверяем common-scale proof, change classification, hysteresis, hook ordering, dependency routing, N/A semantics и ownership barriers.
DATA FOR LAYOUT ENGINE
Machine-readable 6.04 contract.
{
"module": "Compo 6.04",
"name": "tests_and_adaptation_hooks",
"version": "1.1-corrective",
"canonical_main_title": "Tests and adaptation hooks",
"topic": "06_ФОРМАТ_ПОСТЕРА_И_СООТНОШЕНИЕ_СТОРОН",
"scope": "STATEFUL_FORMAT_CHANGE_CLASSIFICATION_RECOMPUTE_ROUTING_ADAPTATION_HOOKS_HYSTERESIS_AND_TOPIC6_REGRESSION",
"consumes": [
"Compo6.00.CanvasDescriptor snapshots / change evidence",
"Compo6.01.FormatClassResult",
"Compo6.02.PhysicalCanvasMetadata?",
"Compo6.03.CanvasNormalizationContext",
"FormatAdaptationPolicy",
"FormatBehaviorHysteresisPolicy?",
"downstream dependency registry"
],
"provides": [
"CanvasFormatSnapshot",
"CanvasFormatChangeSet",
"FormatChangeClass",
"StableBehaviorState",
"FormatAdaptationPolicy",
"FormatBehaviorHysteresisPolicy",
"FormatAdaptationPlan",
"AdaptationHookInvocation[]",
"RecomputeRequest[]",
"LayoutAdaptationRequest[]",
"Topic6RegressionCase[]",
"Topic6RegressionSuite",
"adaptationHooksRef for CanvasDescriptor"
],
"owns_metrics": [],
"descriptors_only": [
"canvas.adaptation.changeClass",
"canvas.adaptation.changedFields[]",
"canvas.adaptation.isPureCommonScale",
"canvas.adaptation.aspectChanged",
"canvas.adaptation.behaviorTransition",
"canvas.adaptation.physicalContextChanged",
"canvas.adaptation.viewingContextChanged",
"canvas.adaptation.normalizationContextChanged",
"canvas.adaptation.stableBehaviorState",
"canvas.adaptation.recomputeTargets[]",
"canvas.adaptation.layoutRequestReasons[]",
"canvas.adaptation.status"
],
"canvas_format_snapshot_schema": {
"snapshotRef": "stable versioned ref",
"canvasRef": "same canvas identity",
"canvasVersion": "monotonic/version token from owner",
"extent": {
"width": "6.00",
"height": "6.00",
"unit": "6.00"
},
"aspectRatioWH": "6.00",
"logAspectRatio": "6.00",
"exactClass": "6.01",
"behaviorClass": "6.01 or N_A",
"behaviorPolicyRef": "6.01 policy ref or null",
"physicalMetadataVersion": "6.02 ref/version or null",
"viewingContextRef": "6.02 ref or null",
"normalizationContextRef": "6.03 ref",
"confidence": "0..1",
"provenance": "object",
"coordinateFrame": "6.00 coordinate-frame semantics; required for change classification",
"normalizationDomainTopologyRef": "semantic domain/crop topology ref; required for pure common-scale proof"
},
"format_change_set_schema": {
"changeRef": "string",
"canvasRef": "string",
"fromSnapshotRef": "optional for initial state",
"toSnapshotRef": "required",
"changedFields": "explicit semantic field paths[]",
"changeClass": "INITIAL|NO_CHANGE|PURE_COMMON_SCALE|ASPECT_CHANGE|BEHAVIOR_TRANSITION|BEHAVIOR_POLICY_CHANGE|PHYSICAL_CONTEXT_CHANGE|VIEWING_CONTEXT_CHANGE|NORMALIZATION_CONTEXT_CHANGE|NORMALIZATION_DOMAIN_CHANGE|COORDINATE_FRAME_CHANGE|COMBINED_CHANGE",
"isPureCommonScale": "boolean",
"commonScaleFactor": "finite >0 only when proved",
"aspectChanged": "boolean",
"behaviorTransition": "optional {from,to}",
"confidence": "0..1",
"provenance": "DERIVED"
},
"pure_common_scale_proof": {
"requirements": [
"same canvas identity",
"same extent unit",
"same coordinate-frame semantics",
"at least one extent dimension actually changes; k=1 with only metadata/context changes is not a PURE_COMMON_SCALE change event",
"positive finite k = newWidth/oldWidth",
"newHeight/oldHeight equals same k within declared numerical tolerance",
"aspect ratio/log aspect unchanged within numerical tolerance",
"normalization domain topology/crop unchanged"
],
"important": "same behavior class alone is not proof of common scaling",
"result": "raw dimensional geometry changes by k^p; ShortN/UV representations may remain invariant where their owner semantics permit"
},
"hysteresis_policy_schema": {
"policyRef": "string",
"enabled": "boolean",
"enterSquareLikeLogTolerance": "finite >=0",
"exitSquareLikeLogTolerance": "finite >= enterSquareLikeLogTolerance",
"requiredRelation": "exit >= enter",
"stateDomain": "SQUARE_LIKE|PORTRAIT_LIKE|LANDSCAPE_LIKE|N_A",
"purpose": "stabilize operational behavior state across sequential resizes",
"important": "does not rewrite Compo6.01 canonical stateless behaviorClass",
"provenance": "STYLE_PRESET|EMPIRICAL|INITIAL_HEURISTIC"
},
"stable_behavior_state_semantics": {
"input": "previous StableBehaviorState + current 6.01 logAspectRatio/behavior evidence + explicit hysteresis policy",
"inside_from_non_square": "enter SQUARE_LIKE only when |logAspect| <= enter threshold",
"remain_square_like": "stay SQUARE_LIKE while |logAspect| <= exit threshold",
"leave_square_like": "when |logAspect| > exit threshold, select PORTRAIT_LIKE or LANDSCAPE_LIKE by sign",
"non_square_sign_flip": "PORTRAIT_LIKE↔LANDSCAPE_LIKE transition follows current sign unless square-like entry threshold is satisfied",
"disabled": "stable state equals current 6.01 behaviorClass",
"missing_policy": "no operational hysteresis state mutation; use current canonical class or N_A according consumer policy"
},
"format_adaptation_policy_schema": {
"policyRef": "string",
"emitLayoutRequestOnBehaviorTransition": "boolean",
"emitLayoutRequestOnAspectChangeWithinClass": "boolean",
"emitLayoutRequestOnPhysicalContextChange": "boolean",
"emitLayoutRequestOnViewingContextChange": "boolean",
"recomputeRawGeometryOnPureCommonScale": "boolean",
"recomputeNormalizedGeometryOnPureCommonScale": "boolean",
"hookOrder": "optional ordered exact hook ids or prefixes used only as a deterministic tie-break inside a fixed canonical phase order",
"provenance": "STYLE_PRESET|IMPLEMENTATION_HEURISTIC|EMPIRICAL"
},
"adaptation_hook_schema": {
"hookId": "string",
"trigger": "CANVAS_EXTENT_CHANGED|FORMAT_BEHAVIOR_STATE_CHANGED|PHYSICAL_METADATA_CHANGED|VIEWING_CONTEXT_CHANGED|NORMALIZATION_CONTEXT_CHANGED|TOPIC6_CONTEXT_CHANGED",
"phase": "INVALIDATE|RECOMPUTE|REQUEST_ADAPTATION|AFTER_RECOMPUTE",
"targetOwner": "owner-qualified module/subsystem",
"payloadRefs": "evidence refs[]",
"mutationAllowed": "false for all canonical 6.04 hooks",
"deterministicOrder": "fixed phase order INVALIDATE→RECOMPUTE→REQUEST_ADAPTATION→AFTER_RECOMPUTE; within a phase, explicit policy hookOrder then lexical fallback"
},
"recompute_request_schema": {
"requestId": "string",
"reason": "string enum/qualified reason",
"targetOwner": "module owner",
"targetEvidenceRefs": "refs[]",
"dependencyKind": "RAW_GEOMETRY|NORMALIZED_GEOMETRY|FORMAT_BEHAVIOR|PHYSICAL_CONTEXT|VIEWING_CONTEXT|SPACE_DOMAIN|CUSTOM",
"priority": "HARD_INVALIDATION|RECOMPUTE|DIAGNOSTIC",
"mutationAllowed": false,
"provenance": "DERIVED"
},
"layout_adaptation_request_schema": {
"requestId": "string",
"canvasRef": "string",
"reason": "BEHAVIOR_TRANSITION|ASPECT_CHANGE_WITHIN_CLASS|PHYSICAL_CONTEXT_CHANGE|VIEWING_CONTEXT_CHANGE|CUSTOM",
"fromSnapshotRef": "string",
"toSnapshotRef": "string",
"constraints": "preserved hard constraints[]",
"candidateOwner": "future layout solver / relevant owner",
"mutationAllowed": false,
"important": "6.04 requests adaptation; it does not choose object positions/scales/typography/grid itself"
},
"dependency_registry": {
"6.00_change": [
"6.01 format behavior",
"6.03 normalization context",
"6.04 adaptation state"
],
"6.00_raster_extent_or_physical_binding_change": [
"6.02 physical/PPI metadata"
],
"6.01_behavior_change": [
"6.04 stable behavior/adaptation request"
],
"6.02_physical_change": [
"6.04 physical-context hooks",
"future physical/readability consumers"
],
"6.02_viewing_change": [
"6.04 viewing-context hooks",
"future angular/readability consumers"
],
"6.03_context_change": [
"Compo4.01 ShortN² evidence",
"Compo5.02 ShortN clearance evidence",
"future normalized-geometry consumers"
],
"canvas_domain_boundary_change": [
"Compo5.00/5.01 full-canvas space domain consumers"
],
"INITIAL": [
"6.01 format behavior initialization",
"6.02 physical/viewing context initialization when present",
"6.03 normalization context initialization",
"Compo4.01 / Compo5.02 normalized-evidence initialization",
"Compo5.00/5.01 full-canvas domain initialization"
]
},
"common_scale_recompute_semantics": {
"raw_geometry": "raw lengths/areas and raw-space evidence may need recompute because they scale with k^p",
"normalized_geometry": "ShortN/UV values are mathematically invariant under proved common scale, but cached results may still require provenance/contextRef refresh",
"4.01": "raw silhouette/alpha areas change with k²; normalized ShortN² may remain invariant after recompute",
"5.02": "raw clearance changes with k; ShortN clearance may remain invariant after recompute",
"6.01": "behavior class remains invariant under common scale",
"warning": "invariance is not permission to skip all recomputation when downstream evidence stores raw values or versioned provenance"
},
"change_classification_policy": {
"INITIAL": "no previous snapshot; full subscribed context initialization/recompute is emitted",
"NO_CHANGE": "no watched semantic or versioned context field changed",
"PURE_COMMON_SCALE": "proved same positive scale factor on both axes and no independent semantic context change",
"BEHAVIOR_TRANSITION": "effective/stable behavior state changes due geometry or behavior-policy change; derived aspect+transition is one format-change family, not automatically COMBINED",
"ASPECT_CHANGE": "aspect/log-aspect changes without stable behavior transition",
"BEHAVIOR_POLICY_CHANGE": "behavior policy ref changed without an effective stable-state transition",
"PHYSICAL_CONTEXT_CHANGE": "physical metadata version changed alone",
"VIEWING_CONTEXT_CHANGE": "viewing context changed alone",
"NORMALIZATION_CONTEXT_CHANGE": "normalization context ref/version changed alone without domain topology change",
"NORMALIZATION_DOMAIN_CHANGE": "normalization domain/crop/unit semantics changed alone",
"COORDINATE_FRAME_CHANGE": "coordinate-frame semantics changed alone",
"COMBINED_CHANGE": "two or more independent root change families apply"
},
"metric_policy": {
"adaptation_change_classes": "descriptors only",
"hysteresis_state": "operational state only",
"recompute_requests": "dependency-routing objects, not scores",
"layout_adaptation_requests": "requests, not mutations",
"direct_scoring": "FORBIDDEN in 6.04",
"more_recompute_requests_is_better": "FORBIDDEN",
"fewer_transitions_is_better": "FORBIDDEN",
"stable_square_like_is_better": "FORBIDDEN"
},
"regression_scope": {
"covers": [
"Compo6.00",
"Compo6.01",
"Compo6.02",
"Compo6.03",
"Compo6.04"
],
"required_barriers": [
"6.00 explicit extent/aspect ratio ownership",
"6.01 stateless behavior class with explicit near-square policy",
"6.02 PPI != DPI and explicit viewing distance",
"6.03 ShortN isotropic metric space != UV placement space",
"6.03 shortSidePx only for PX normalization domains",
"pure common scale proof requires same positive factor on width and height",
"common-scale invariance does not erase raw recompute/provenance requirements",
"6.04 hysteresis does not overwrite 6.01 canonical behavior class",
"layout adaptation request != foreign mutation",
"Topic7 safe/bleed and Topic8 grid remain external",
"no global balance/hierarchy/eye-flow leakage"
]
},
"hard_constraints": [
"one metric = one owner",
"6.04 owns no design-quality metric; adaptation outputs are descriptors/requests",
"6.04 consumes 6.00–6.03 evidence and must not recompute their owned canonical metrics under new aliases",
"format change classification compares versioned snapshots of the same canvas identity unless explicitly declared as migration",
"pure common scale must be proved from both axes with one positive factor; unchanged aspect class alone is insufficient",
"stateful hysteresis requires explicit policy and may not rewrite the canonical 6.01 behaviorClass",
"hysteresis exit tolerance must be >= enter tolerance",
"disabled hysteresis makes operational stable state follow current 6.01 behavior class",
"recompute request is not a correction score and not a foreign mutation",
"layout adaptation request is not permission for 6.04 to move/scale/crop objects, alter typography, margins, safe zones or grids",
"hook execution order must be deterministic",
"hard invalidation precedes recompute; recompute precedes adaptation request; after-recompute hooks run last",
"common-scale invariance of normalized values does not imply raw evidence or provenance can be silently left stale",
"normalization context version changes must propagate to 4.01/5.02 normalized evidence dependencies",
"full-canvas domain boundary changes must propagate to Topic5 domain consumers",
"PPI/DPI semantics remain owned by 6.02",
"ShortN/UV semantics remain owned by 6.03",
"safe/bleed/margins remain Topic7",
"grid occupancy remains Topic8",
"global balance/hierarchy/eye-flow remain future owners",
"N/A != 0",
"no beautyScore",
"coordinate-frame changes must be visible in semantic diff and cannot collapse to NO_CHANGE",
"a derived behavior transition caused by an aspect change is one format-change family; it must classify as BEHAVIOR_TRANSITION unless another independent context family also changes",
"INITIAL snapshot must emit initialization/recompute requests for subscribed canonical downstream contexts rather than only lifecycle hooks",
"normalizationContextRef-only refresh is an explicit NORMALIZATION_CONTEXT_CHANGE, not an unexplained COMBINED_CHANGE",
"hookOrder may only break ties inside the fixed canonical phase order and cannot move adaptation before recompute",
"PURE_COMMON_SCALE as a change class requires an actual extent change; k=1 cannot mask a normalization/context-only change"
],
"initial_heuristics": {
"common_scale_relative_tolerance": {
"value": 1e-09,
"provenance": "IMPLEMENTATION_HEURISTIC"
},
"reference_hysteresis_policy": {
"value": {
"enterSquareLikeLogTolerance": 0.04,
"exitSquareLikeLogTolerance": 0.06
},
"provenance": "STYLE_PRESET"
}
},
"correction_policy": {
"foreign_layout_mutation": "FORBIDDEN",
"invalid_snapshot": "route to relevant 6.00–6.03 owner",
"behavior_policy_issue": "route to Compo6.01",
"physical_context_issue": "route to Compo6.02",
"normalization_issue": "route to Compo6.03",
"missing_dependency_registry": "request integration/runtime owner configuration",
"adaptation_needed": "emit LayoutAdaptationRequest to future solver/owner"
},
"deferred_inputs": [
"future concrete layout solver consuming LayoutAdaptationRequest",
"Topic7 safe/bleed adaptation",
"Topic8 grid adaptation",
"future typography/image/layout responsive adaptation",
"future global balance/hierarchy/eye-flow"
],
"recompute_when": [
"any 6.00–6.03 snapshot/version changes",
"hysteresis policy changes",
"adaptation policy changes",
"dependency registry changes",
"downstream owner subscribes/unsubscribes from hooks"
],
"finality": "TOPIC6_ADAPTATION_HOOKS_STATEFUL_TRANSITIONS_AND_REGRESSION_ONLY"
}