Contribution after signal registration
+ exact evidence lineage
+ explicit weak / strong calibration anchors
→ normalizedSizeContribution ∈ [0,1]
19.01 stops here.
NO tone/color contribution
NO isolation/position/semantic contribution
NO correlation weight
NO composite rank
NO MetricResult
Per-size-signal contribution only
19.01
Exact SIZE evidence revalidation, explicit calibration profile, bounded normalized contribution descriptor, explicit set and immutable attachment.
Foreign + downstream
Raw size semantics, visual mass, Topic16 scale relations, dominance, Topic18 subordination, other hierarchy channels, correlation-aware aggregation and final ranking.
Weak and strong anchors are explicit
Contribution 0
weakAnchorValue is the explicitly calibrated weak end of this exact SIZE channel.
Contribution 1
strongAnchorValue is the explicitly calibrated strong end. It may be numerically above or below the weak anchor.
Policy required
Outside the anchor interval, either clamp explicitly or return N_A. No silent extrapolation.
SizeContributionCalibrationProfile {
hierarchySignalBindingRef: exact SIZE + SCALAR binding,
weakAnchorValue: finite,
strongAnchorValue: finite and != weakAnchorValue,
outOfRangePolicy:
CLAMP_TO_UNIT_INTERVAL |
N_A_NO_EXTRAPOLATION,
calibrationContextRef,
calibrationSourceRef,
calibrationSourceOwnerRef,
provenance,
mutationAllowed: false
}
strongAnchorValue may be numerically smaller than weakAnchorValue.Evidence lineage is revalidated
19.00 stores an observation payload identity plus evidence refs. 19.01 needs the actual finite scalar, so it verifies the exact evidence records named by that observation rather than guessing from geometry or another module.
must equal
canonical exact evidence refs used here
all payloads equal → OK
missing exact evidence → N_A
conflicting scalar values → N_A
payload identity mismatch → N_A
NO average
NO median
NO confidence winner
One deterministic linear mapping
0 ≤ t ≤ 1
→ contribution = t
outside range + CLAMP
→ contribution = min(1, max(0, t))
outside range + N_A_NO_EXTRAPOLATION
→ N_A
0 is data
Contribution 0 is a legitimate calibrated weak-end value. It must never be collapsed into N_A.
Contribution ≠ winner
A higher size contribution does not by itself determine visual hierarchy, dominance, quality or final layout rank.
Multiple size channels remain separate
+ area-like SIZE contribution
+ owner-defined SIZE contribution
remain separate descriptors.
19.01 does NOT:
sum them
average them
take max/min
rank subjects
estimate correlation
apply de-duplication weights
N_A, invalid and zero stay distinct
| Case | Result |
|---|---|
| Valid value at weak anchor | OK · contribution 0 |
| Valid value at strong anchor | OK · contribution 1 |
| Outside anchors + explicit clamp | OK · clamped 0/1 |
| Outside anchors + no extrapolation | N_A |
| Missing/conflicting exact evidence | N_A |
| Equal weak/strong anchors | INVALID |
| Non-SIZE observation | INVALID |
| SIZE but non-SCALAR binding | N_A in v1 |
Topic 19 ownership chain stays clean
| 19.00 | Signal subjects, bindings, observations and explicit dependency topology. |
| 19.01 | Per-observation normalized SIZE contribution under explicit calibration. |
| 19.02 | TONE / COLOR contribution. |
| 19.03 | ISOLATION / POSITION / SEMANTIC_PRIORITY contribution. |
| 19.04 | Correlation-aware anti-double-counting, composite rank, confidence and final Topic19 tests. |
| Topic18 | Declared generic subordination and local subordination target fit. |
No hidden hierarchy score
!= MetricResult
!= dominance score
!= Topic18 role
!= Topic16 scale ratio/class
!= visual mass
!= composite rank
!= hierarchy confidence
!= final-layout rank
19.01 owns_metrics = []
19.01 independent numeric votes = 0
0 != N_A != INVALID
CANON → LAB → DATA → IDEAS
19.01 regression suite
Tests cover explicit calibration, reversed numeric anchors, exact upstream evidence lineage, payload identity, clamp/N_A policies, valid zero/one contributions, no cross-channel aggregation, immutable attachments, zero MetricResults and 19.02–19.04 ownership firewalls.
DATA FOR LAYOUT ENGINE
{
"module": "Compo 19.01",
"name": "size_contribution",
"version": "1.0-canonical",
"canonical_main_title": "Size contribution",
"topic": "19_ВИЗУАЛЬНАЯ_ИЕРАРХИЯ_ПО_РАЗМЕРУ_ТОНУ_И_ЦВЕТУ",
"scope": "EXPLICIT_SIZE_SIGNAL_CALIBRATION_AND_PER_OBSERVATION_NORMALIZED_SIZE_CONTRIBUTION_ONLY_WITHOUT_CROSS_CHANNEL_AGGREGATION_CORRELATION_RANKING_OR_SCORING",
"main_topic_contract": {
"topic_title": "Визуальная иерархия по размеру, тону и цвету",
"topic_goal": "Объединяет size, tone, color, isolation, position и semantic priority в многоканальную иерархию с защитой от double-counting коррелированных сигналов.",
"expected_output": "HierarchySignal[], composite rank, confidence, dependencies",
"planned_files": [
"19.00 Hierarchy signal model",
"19.01 Size contribution",
"19.02 Tone/color contribution",
"19.03 Isolation/position/semantic contribution",
"19.04 Correlation-aware hierarchy and tests"
]
},
"ownership": {
"owner": "Compo19.01",
"owns": [
"SizeContributionOutOfRangePolicy taxonomy",
"SizeContributionCalibrationProfile",
"SizeContributionSelectionPolicy",
"SizeContributionEvidenceResolution adapter",
"SizeContributionDescriptor",
"SizeContributionSet",
"SizeContributionAttachment",
"explicit weak-anchor to strong-anchor linear calibration for one exact SIZE binding",
"per-observation bounded normalized size contribution",
"identity/status/provenance rules for Topic19 size-contribution layer",
"non-mutating correction request for calibration/profile/evidence lineage"
],
"does_not_own": [
"HierarchySignalSubject / HierarchySignalBinding / HierarchySignalObservation / dependency identity — Compo19.00",
"raw size measurement semantics — foreign measurement owner",
"visual mass — Compo4",
"dominance / focal ranking — Compo13",
"generic hierarchy / subordination — Topic18",
"object-to-object scale ratios/classes/ladders — Topic16",
"tone/color contribution — Compo19.02",
"isolation/position/semantic contribution — Compo19.03",
"correlation estimation / anti-double-counting / composite rank / hierarchy confidence — Compo19.04",
"MetricResult scoring",
"global beautyScore",
"final-layout ranking",
"foreign geometry/style/semantic mutation"
]
},
"consumes": [
"valid Compo19.00 HierarchySignalSystemSeed lineage",
"valid Compo19.00 HierarchySignalObservation with signalKind SIZE",
"exact Compo19.00 HierarchySignalBinding with signalKind SIZE and representationKind SCALAR",
"exact Compo19.00 HierarchySignalEvidence records named by the observation evidenceRefs",
"explicit SizeContributionCalibrationProfile",
"explicit SizeContributionSelectionPolicy",
"optional explicit Compo19.00 dependency refs preserved for downstream anti-double-counting"
],
"provides": [
"SizeContributionCalibrationProfile",
"SizeContributionEvidenceResolution[]",
"SizeContributionDescriptor[]",
"SizeContributionSet",
"SizeContributionAttachment"
],
"owns_metrics": [],
"metric_ownership_note": "19.01 computes bounded per-observation normalized size contributions as descriptive downstream inputs. These are not MetricResults, independent numeric votes, dominance scores, composite ranks or final-layout rankings.",
"out_of_range_policy_taxonomy": {
"CLAMP_TO_UNIT_INTERVAL": "Values beyond explicit weak/strong anchors are clamped to 0 or 1. This policy must be declared; it is never implicit.",
"N_A_NO_EXTRAPOLATION": "Values outside the closed anchor interval produce N_A. No extrapolation and no silent clamp."
},
"calibration_profile_schema": {
"sizeContributionCalibrationProfileRef": "stable identity",
"scopeRef": "Topic19 scope",
"hierarchySignalBindingRef": "exact Compo19.00 SIZE+SCALAR binding",
"weakAnchorValue": "finite scalar mapped to normalized contribution 0",
"strongAnchorValue": "finite scalar mapped to normalized contribution 1; must differ from weakAnchorValue",
"outOfRangePolicy": "CLAMP_TO_UNIT_INTERVAL|N_A_NO_EXTRAPOLATION",
"calibrationContextRef": "explicit style/brief/measurement calibration context",
"calibrationSourceRef": "explicit source",
"calibrationSourceOwnerRef": "owner",
"provenance": "canonical provenance",
"status": "OK|INVALID",
"mutationAllowed": false,
"firewall": "Weak/strong anchors are explicit calibration semantics. 19.01 does not assume that numerically larger size is always visually stronger."
},
"selection_policy_schema": {
"selectionMode": "EXPLICIT_SIZE_OBSERVATION_REFS_ONLY",
"duplicatePolicy": "IDENTITY_DEDUPLICATE",
"missingPolicy": "N_A_NO_GUESS",
"maxContributions": "1..16384",
"overflowPolicy": "N_A_NO_TRUNCATION",
"crossBindingAggregationAllowed": false,
"fullCartesianProductAllowed": false,
"autoMissingSizeSignalSynthesis": false
},
"evidence_resolution_schema": {
"sizeContributionEvidenceResolutionRef": "stable identity",
"hierarchySignalObservationRef": "exact 19.00 observation",
"hierarchySignalBindingRef": "exact SIZE+SCALAR binding",
"evidenceRefs": "must exactly equal observation.evidenceRefs after canonical dedup/order",
"resolvedScalarValue": "finite scalar when OK; null under N_A/INVALID",
"observationPayloadRef": "must equal hash of resolved scalar payload",
"status": "OK|N_A|INVALID",
"reasonCode": "EXACT_SINGLE_VALUE|CONSENSUS_EQUAL|MISSING_EVIDENCE|CONFLICT|LINEAGE_MISMATCH|INVALID_INPUT",
"mutationAllowed": false,
"firewall": "19.01 revalidates exact evidence lineage because 19.00 observation stores a payload identity, not an unowned normalized size value. Conflicting values are never averaged."
},
"contribution_descriptor_schema": {
"sizeContributionDescriptorRef": "stable identity",
"hierarchySignalObservationRef": "exact 19.00 SIZE observation",
"hierarchySignalSubjectRef": "copied exact subject ref",
"hierarchySignalBindingRef": "exact binding",
"sizeContributionCalibrationProfileRef": "exact calibration",
"sizeContributionEvidenceResolutionRef": "exact evidence resolution",
"rawSizeValue": "resolved finite scalar",
"weakAnchorValue": "profile anchor",
"strongAnchorValue": "profile anchor",
"normalizedSizeContribution": "finite [0,1] when OK; null when N_A/INVALID",
"wasClamped": "boolean when OK; false otherwise",
"status": "OK|N_A|INVALID",
"reasonCode": "WITHIN_CALIBRATION|CLAMPED_WEAK_SIDE|CLAMPED_STRONG_SIDE|OUTSIDE_CALIBRATION|LINEAGE_MISMATCH|MISSING_OBSERVED|INVALID_INPUT",
"confidence": null,
"rank": null,
"score": null,
"mutationAllowed": false
},
"normalization_formula": {
"raw": "t = (x - weakAnchorValue) / (strongAnchorValue - weakAnchorValue)",
"within": "if 0 <= t <= 1, normalizedSizeContribution = t",
"clamp": "if policy CLAMP_TO_UNIT_INTERVAL, normalizedSizeContribution = min(1,max(0,t))",
"no_extrapolation": "if policy N_A_NO_EXTRAPOLATION and t outside [0,1], status=N_A",
"orientation": "weakAnchorValue may be numerically greater or less than strongAnchorValue; explicit anchors define direction"
},
"contribution_set_schema": {
"sizeContributionSetRef": "stable identity",
"scopeRef": "scope",
"snapshotRef": "snapshot",
"hierarchySignalSystemSeedRef": "exact 19.00 root seed",
"sizeContributionSelectionPolicyRef": "explicit policy",
"sizeContributionDescriptorRefs": "canonical unique refs",
"preservedDependencyRefs": "explicit 19.00 dependencies touching selected size observations; copied by identity only",
"status": "OK|N_A|INVALID",
"reasonCode": "OK|MISSING_SELECTION|CONTRIBUTION_OVERFLOW|INVALID_INPUT",
"mutationAllowed": false,
"firewall": "Multiple size channels remain separate contributions. 19.01 does not sum, average, max, rank or decorrelate them."
},
"attachment_schema": {
"sizeContributionAttachmentRef": "stable identity",
"hierarchySignalSystemSeedRef": "exact immutable 19.00 seed",
"sizeContributionSetRef": "derived set",
"mutationAllowed": false,
"firewall": "Attachment does not rewrite HierarchySignalSystemSeed and does not fill its sizeContributionAttachmentRef in place."
},
"status_policy": {
"nonSizeObservation": "INVALID",
"nonScalarSizeBinding": "N_A; 19.01 v1 numeric size contribution requires SCALAR",
"missingExactEvidence": "N_A",
"conflictingEvidence": "N_A",
"bindingMismatch": "N_A",
"payloadIdentityMismatch": "N_A",
"equalCalibrationAnchors": "INVALID",
"outsideRangeClampPolicy": "OK + clamped contribution",
"outsideRangeNoExtrapolation": "N_A",
"zeroContribution": "valid numeric 0 when calibration resolves there",
"oneContribution": "valid numeric 1 when calibration resolves there",
"N_A_not_zero": true
},
"identity_policy": {
"sizeContributionCalibrationProfileRef": "hash(scope, exact binding, weak/strong anchors, out-of-range policy, calibration context, source/owner, provenance, status)",
"sizeContributionSelectionPolicyRef": "hash(selection/dedup/missing/max/overflow/no-aggregation/no-Cartesian/source/owner/provenance/status)",
"sizeContributionEvidenceResolutionRef": "hash(observation, binding, canonical exact evidence refs, resolved scalar or null, payload identity, status, reason)",
"sizeContributionDescriptorRef": "hash(observation, subject, binding, calibration, resolution, raw value, normalized contribution, clamped flag, status, reason)",
"sizeContributionSetRef": "hash(scope, snapshot, root seed, selection policy, canonical contribution refs, preserved dependency refs, status, reason)",
"sizeContributionAttachmentRef": "hash(root seed, contribution set, immutable attachment semantics)"
},
"critical_firewalls": [
"19.01 owns no MetricResult and no independent numeric vote",
"normalizedSizeContribution != quality score",
"normalizedSizeContribution != dominance score",
"normalizedSizeContribution != Topic18 hierarchy role",
"normalizedSizeContribution != Topic16 scale class or pairwise ratio",
"raw size value != visual mass unless the foreign owner explicitly says so",
"weak/strong anchors are explicit; higher numeric size is not universally stronger",
"0 contribution is a valid numeric value and 0 != N_A",
"missing size observation != zero contribution",
"multiple size channels are not summed or averaged in 19.01",
"dependency declarations are preserved but not converted into correlation weights",
"no correlation estimation in 19.01",
"no anti-double-counting weights in 19.01",
"no composite rank in 19.01",
"no hierarchy confidence in 19.01",
"no final-layout ranking",
"HierarchySignalSystemSeed remains immutable",
"attachment != root mutation"
],
"IDEAS_REFS": [
"IDEA-01 compare weak/strong anchor calibration against human size-salience judgements",
"IDEA-02 study absolute-bound calibration versus cohort-relative calibration in LAB before canonizing alternatives",
"IDEA-03 collect cases where lower numeric owner-defined size signal corresponds to stronger appearance",
"IDEA-04 study size-channel redundancy before 19.04 anti-double-counting",
"IDEA-05 measure calibration drift across viewport and format contexts"
],
"DATA_CAPTURE": [
"scopeRef",
"snapshotRef",
"hierarchySignalSystemSeedRef",
"hierarchySignalObservationRef",
"hierarchySignalSubjectRef",
"hierarchySignalBindingRef",
"sizeContributionCalibrationProfileRef",
"sizeContributionEvidenceResolutionRef",
"rawSizeValue",
"weakAnchorValue",
"strongAnchorValue",
"normalizedSizeContribution",
"wasClamped",
"sizeContributionDescriptorRef",
"sizeContributionSetRef",
"preservedDependencyRefs[]",
"status",
"reasonCode"
],
"DEFERRED_SEMANTIC_INPUTS": [
"19.02 tone/color contribution",
"19.03 isolation/position/semantic contribution",
"19.04 numeric correlation/dependency strength",
"19.04 anti-double-counting weights",
"19.04 composite rank",
"19.04 hierarchy confidence",
"global composition quality and final-layout ranking"
],
"HUMAN_FEEDBACK_HOOKS": [
"correct selected size observation",
"correct exact size binding",
"correct weak anchor",
"correct strong anchor",
"correct out-of-range policy",
"correct calibration context",
"correct evidence lineage",
"mark clamping inappropriate",
"mark missing size channel intentional"
],
"CONFLICT_PRIORITY_ASSUMPTIONS": [
"evidence confidence cannot resolve scalar conflicts",
"multiple size channels have no implicit priority",
"calibration profile order has no priority",
"dependency order has no priority",
"module execution order has no hierarchy priority"
],
"LAB_HOOKS": [
"size contribution calibration study",
"clamp-vs-NA study",
"viewport-specific calibration study",
"multi-size-channel redundancy study",
"declared-vs-perceived size hierarchy study",
"human correction reason taxonomy"
],
"next_module": "Compo 19.02 — Tone/color contribution",
"hard_stop": "Do not implement 19.02, 19.03 or 19.04 in this file."
}