29.02 adds two more independent distance channels
29.00 remains immutable. SHAPE/SIZE from 29.01 are not read, averaged or rewritten by this module.
Color distance is comparator-owned
29.02 never assumes RGB Euclidean, DeltaE or any other metric automatically. Comparator identity, color space and normalization contract are explicit evidence.
payload lineage from 29.00
same slot
colorSpaceRef + normalized distance
0 ≤ d ≤ 1
Color-space lineage stays attached
Tone uses normalized scalar difference
Once a foreign owner explicitly provides tone values in [0,1] under one `toneScaleRef`, distance is simply the absolute difference.
Normalized tone axis
Color and tone are independent signals
Two objects may share tone while differing strongly in hue/chroma, or share hue while differing in lightness. 29.02 preserves both channels.
Different color · similar tone
Similar hue · different tone
Tone-scale mismatch yields N_A
Normalized values are comparable only inside the same explicit scale contract. 0.5 on one scale is not silently treated as the same quantity as 0.5 on another.
toneScale:v1 ↔ toneScale:v1
Absolute difference is defined.
toneScale:v1 ↔ toneScale:v2
No automatic conversion or alignment.
`SimilarityRelation` remains channel-local
Distance lineage is stored; score, threshold decision, clusters and cross-channel aggregate stay empty.
COLOR or TONE relation
Zero distance is not missing evidence
Identical comparator color or equal normalized tone can produce 0. Missing evidence/scale lineage stays N_A.
distance = 0
Valid equality descriptor.
evidence missing
No numeric substitute.
tone outside [0,1]
Malformed normalized evidence.
Feature similarity remains separate from proximity
COLOR/TONE relations can link far-apart repeated objects. They never become Topic28 neighbor edges.
Same palette can repeat across the scene
Four channels are now covered
29.01 owns SHAPE/SIZE; 29.02 owns COLOR/TONE. Orientation and texture/style arrive next, while all multi-channel grouping stays at 29.04.
schema
SHAPE / SIZE
COLOR / TONE
ORIENTATION / TEXTURE_STYLE
multi-channel groups
29.02 regression suite
Tests cover explicit pair identity, owner-normalized color evidence, normalized tone values, tone-scale compatibility, same-slot lineage, zero/N_A separation, immutable 29.00 schema and strict absence of SHAPE/SIZE computation, clustering and scoring.
DATA FOR LAYOUT ENGINE
Canonical machine contract for Topic29 color/tone layer.
{
"module": "Compo 29.02",
"name": "color_tone_similarity",
"version": "1.0-canonical",
"canonical_main_title": "Color/tone similarity",
"topic": "29_СХОДСТВО_И_ПОВТОРЯЕМОСТЬ",
"scope": "EXPLICIT_UNORDERED_PAIR_COMPARISONS_FOR_COLOR_AND_TONE_CHANNELS_OVER_IMMUTABLE_29_00_FEATURE_SCHEMA_WITH_CHANNEL_LOCAL_DISTANCES_ONLY",
"main_topic_contract": {
"topic_title": "Сходство и повторяемость",
"topic_goal": "Измеряет сходство по независимым каналам — shape, size, color, tone, orientation, texture/style — и формирует similarity groups без потери источника сигнала.",
"expected_output": "SimilarityRelation[], feature distances, similarity clusters",
"planned_files": [
"29.00 Similarity feature schema",
"29.01 Shape/size similarity",
"29.02 Color/tone similarity",
"29.03 Orientation/texture/style similarity",
"29.04 Multi-channel groups and tests"
]
},
"ownership": {
"owner": "Compo29.02",
"owns": [
"SimilarityColorTonePairRequest",
"SimilarityColorDistanceEvidence",
"SimilarityToneValueEvidence",
"SimilarityFeatureDistanceDescriptor for COLOR/TONE",
"SimilarityRelation for COLOR/TONE",
"SimilarityColorToneRelationSet",
"SimilarityColorToneAttachment",
"canonical unordered subject-pair identity",
"exact same-channel feature binding",
"exact same-slot comparison rule",
"owner-normalized color-distance validation",
"normalized tone absolute-difference derivation",
"tone-scale compatibility validation",
"symmetric relation materialization",
"zero-distance semantics",
"bounded explicit pair resolution",
"non-mutating correction request"
],
"does_not_own": [
"feature extraction",
"color vector generation",
"color comparator implementation internals",
"automatic color-space selection",
"automatic color metric selection",
"automatic tone normalization",
"shape/size similarity — Compo29.01",
"orientation/texture/style similarity — Compo29.03",
"multi-channel aggregation — Compo29.04",
"similarity thresholds — Compo29.04",
"similarity clusters — Compo29.04",
"cross-channel weighting — Compo29.04",
"automatic pair Cartesian product",
"proximity grouping — Topic28",
"attention flow — Topic27",
"universal similarity quality",
"universal beautyScore"
]
},
"supported_channels": [
"COLOR",
"TONE"
],
"distance_kinds": [
"OWNER_NORMALIZED_COLOR_DISTANCE",
"ABSOLUTE_NORMALIZED_TONE_DIFFERENCE"
],
"distance_semantics": {
"color": {
"source": "explicit owner-qualified comparator evidence",
"range": "[0,1]",
"zero": "identical under the named color comparator evidence",
"one": "maximum mismatch only under the comparator owner's normalization contract",
"color_space_inference": "NONE",
"universal_metric_claim": false
},
"tone": {
"source": "explicit normalized scalar tone-value evidence bound to TONE featureRefs",
"formula": "abs(toneA - toneB)",
"input_range": "[0,1]",
"distance_range": "[0,1]",
"zero": "equal normalized tone values in the same explicit toneScaleRef",
"tone_scale_conversion": "NONE",
"perceptual_law_claim": false
},
"relation": {
"pair_identity": "unordered canonical subject pair A↔B",
"symmetric": true,
"same_channel_required": true,
"same_feature_slot_required": true,
"similarityScore": null,
"thresholdDecision": null,
"clusterMembership": "DEFERRED_TO_29_04"
}
},
"policy": {
"max_pair_requests": [
1,
131072
],
"max_color_distance_evidence": [
0,
131072
],
"max_tone_value_evidence": [
0,
262144
],
"overflow": "N_A_NO_TRUNCATION",
"duplicate_request_ref": "INVALID",
"duplicate_channel_pair_slot_request": "INVALID",
"duplicate_evidence_ref": "INVALID",
"auto_pair_cartesian": false,
"auto_color_space_selection": false,
"auto_color_metric_selection": false,
"auto_color_distance_computation": false,
"auto_tone_normalization": false,
"auto_tone_scale_conversion": false,
"auto_cross_slot_comparison": false,
"auto_cross_channel_aggregation": false,
"auto_thresholding": false,
"auto_clustering": false,
"auto_scoring": false
},
"status_semantics": {
"OK": "29.00 feature lineage resolves and requested COLOR/TONE comparison produces a valid symmetric channel-local distance",
"N_A": "feature/evidence is missing, subject/feature/slot lineage mismatches, tone scales differ, or bounds overflow",
"INVALID": "malformed request/evidence, duplicate identity, self-pair, tone value outside [0,1], unsupported channel, or invalid upstream schema",
"zero": "distance 0 is a valid equality observation under the channel contract and is never substituted for N_A"
},
"firewalls": [
"color distance != color similarity score",
"tone difference != tone similarity score",
"distance zero != N_A",
"color distance one != universal maximum visual difference",
"tone distance one != universal maximum perceptual tone difference",
"same color slot != same color value",
"same tone slot != same tone value",
"same feature presence != similarity",
"feature distance != threshold decision",
"SimilarityRelation != similarity cluster",
"COLOR relation != TONE relation",
"color and tone relations cannot be averaged automatically",
"pair request != Cartesian pair generation",
"same-slot comparison != cross-slot inference",
"tone-scale mismatch != automatic conversion",
"missing tone != tone zero",
"Topic29 similarity != Topic28 proximity",
"Topic29 similarity relation != Topic28 neighbor relation",
"Topic29 similarity != Topic27 attention flow",
"N_A != 0",
"INVALID != 0",
"descriptor != score",
"local != global",
"geometry != interpretation",
"heuristic != law",
"no universal similarity threshold",
"no universal beautyScore"
],
"owns_metrics": [],
"independent_numeric_votes": 0,
"topic29ProgressAfterThisModule": "3/5 local",
"next_module": "Compo 29.03 — Orientation/texture/style similarity",
"topic30_started": false,
"publication": "NOT_VERIFIED"
}