COMPO · 19.01 · SIZE CONTRIBUTION

Calibrate size.
Keep channels separate.

19.01 превращает один явно выбранный owner-qualified SIZE signal из 19.00 в bounded normalized contribution через явные weak/strong anchors. Здесь нет суммирования нескольких size channels, correlation correction, composite rank или hierarchy confidence.

ModuleCompo 19.01
Input19.00 SIZE
Mappingexplicit anchors
Range[0,1]
Metricsnone
Next19.02

Contribution after signal registration

00 / contract
19.00 exact SIZE + SCALAR observation
+ 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

01 / ownership
OWNS

19.01

Exact SIZE evidence revalidation, explicit calibration profile, bounded normalized contribution descriptor, explicit set and immutable attachment.

DOES NOT OWN

Foreign + downstream

Raw size semantics, visual mass, Topic16 scale relations, dominance, Topic18 subordination, other hierarchy channels, correlation-aware aggregation and final ranking.

Adapter boundary: a SIZE binding names its source owner. 19.01 maps that exact scalar into a normalized contribution but does not redefine what the scalar physically or perceptually means.

Weak and strong anchors are explicit

02 / calibration profile
WEAK

Contribution 0

weakAnchorValue is the explicitly calibrated weak end of this exact SIZE channel.

STRONG

Contribution 1

strongAnchorValue is the explicitly calibrated strong end. It may be numerically above or below the weak anchor.

RANGE

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
}
No universal “bigger = stronger” law: if the foreign scalar is inverse-oriented, strongAnchorValue may be numerically smaller than weakAnchorValue.

Evidence lineage is revalidated

03 / exact upstream lineage

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.

observation.evidenceRefs
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

04 / contribution math
t = (x - weak) / (strong - weak)

0 ≤ t ≤ 1
→ contribution = t

outside range + CLAMP
→ contribution = min(1, max(0, t))

outside range + N_A_NO_EXTRAPOLATION
→ N_A
VALID ZERO

0 is data

Contribution 0 is a legitimate calibrated weak-end value. It must never be collapsed into N_A.

NO RANK

Contribution ≠ winner

A higher size contribution does not by itself determine visual hierarchy, dominance, quality or final layout rank.

Multiple size channels remain separate

05 / explicit set
width-like SIZE contribution
+ 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
Dependencies survive by identity: explicit 19.00 dependency refs touching selected size observations may be carried into the SizeContributionSet for 19.04. 19.01 does not turn them into numeric correlation coefficients.

N_A, invalid and zero stay distinct

06 / status semantics
CaseResult
Valid value at weak anchorOK · contribution 0
Valid value at strong anchorOK · contribution 1
Outside anchors + explicit clampOK · clamped 0/1
Outside anchors + no extrapolationN_A
Missing/conflicting exact evidenceN_A
Equal weak/strong anchorsINVALID
Non-SIZE observationINVALID
SIZE but non-SCALAR bindingN_A in v1

Topic 19 ownership chain stays clean

07 / module boundary
19.00Signal subjects, bindings, observations and explicit dependency topology.
19.01Per-observation normalized SIZE contribution under explicit calibration.
19.02TONE / COLOR contribution.
19.03ISOLATION / POSITION / SEMANTIC_PRIORITY contribution.
19.04Correlation-aware anti-double-counting, composite rank, confidence and final Topic19 tests.
Topic18Declared generic subordination and local subordination target fit.

No hidden hierarchy score

08 / firewalls
normalizedSizeContribution
!= 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

09 / mandatory hooks
IDEAS_REFS[]Calibration and perceptual size-salience research.
DATA_CAPTURE[]Raw scalar, anchors, contribution, lineage and clamp state.
DEFERRED_SEMANTIC_INPUTS[]Other channels, correlation, rank and confidence.
HUMAN_FEEDBACK_HOOKS[]Anchor, binding and evidence corrections.
CONFLICT_PRIORITY_ASSUMPTIONS[]No implicit channel or confidence winner.
LAB_HOOKS[]Calibration drift and size-channel redundancy studies.

19.01 regression suite

10 / deterministic tests

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.

Tests not run yet.

DATA FOR LAYOUT ENGINE

11 / machine contract
{
  "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."
}
VISITS / ...