COMPO · 21.02 · MASS SYMMETRY

Compare weight.
Do not redefine mass.

21.02 принимает explicit mirror relations из 21.01 и owner-qualified visual-mass scalar от внешнего владельца. Модуль сравнивает массу внутри зеркальных пар и суммарную массу по двум сторонам конкретной оси, сохраняя on-axis mass отдельно. Результаты описательные: они не являются symmetry error, quality score или final balance verdict.

ModuleCompo 21.02
Input21.01 relations
Massforeign-owned
Aggregationunique subjects
Metricsnone
Next21.03

Mass after correspondence

00 / contract
21.00 exact axis identity
+ 21.01 explicit OK SymmetryRelation[]
+ owner-qualified nonnegative visual-mass binding
+ exact per-subject mass evidence
→ pair mass descriptors
→ unique-subject side mass descriptor

NO raw visual-mass extraction
NO shape/color/position symmetry
NO approximate tolerance
NO symmetry error score
NO MetricResult

Mass comparison, not mass ownership

01 / ownership
OWNS

21.02

Mass adapter identity, exact mass evidence resolution, pairwise mass-difference descriptors, unique-subject side totals, bounded set and immutable attachment.

DOES NOT OWN

Foreign + downstream

Compo4 visual-mass semantics, 21.00 axes, 21.01 pairing/reflection, 21.03 shape/color/position channels, 21.04 tolerance/errors/scoring, Topic22 asymmetric balance.

Adapter boundary: 21.02 can consume a scalar called visual mass only when its owner, channel, unit and measurement context are explicit. It does not infer mass from area, contrast, color, size or hierarchy.

Mass binding is owner-qualified

02 / binding
SymmetryMassBinding {
  scopeRef, snapshotRef,
  massChannelRef,
  massUnitRef,
  massMeasurementContextRef,
  massSemanticsRef,
  massSourceOwnerRef,
  bindingSourceRef,
  bindingSourceOwnerRef,
  provenance, status,
  mutationAllowed: false
}
massChannelRef != implied area
massUnitRef != silently convertible
massSourceOwnerRef must name the foreign owner
value domain = finite nonnegative scalar

Exact evidence, no averaging

03 / evidence
ONE VALUE

OK

All exact compatible evidence records resolve to the same finite nonnegative mass.

MISSING / CONFLICT

N_A

Missing evidence or different compatible values remain unresolved. Confidence never chooses a winner.

MALFORMED

INVALID

Negative/non-finite mass or incompatible binding lineage is invalid.

Zero is data. Mass 0 is a valid scalar when supplied by the owner-qualified source. It is not N_A.

Pair mass difference is descriptive

04 / pair descriptor
PairMassSymmetryDescriptor {
  symmetryRelationRef,
  canonicalSubjectLowRef,
  canonicalSubjectHighRef,
  massLow, massHigh,
  absoluteMassDifference,
  pairMassTotal,
  normalizedPairMassDifference, // [0,1]
  pairMassClass: EXACT_EQUAL | NONZERO_DIFFERENCE,
  symmetryErrorRef: null,
  metricResultRef: null,
  score: null
}
D = |mLow - mHigh|
T = mLow + mHigh
Dnorm = T = 0 ? 0 : D / T

Dnorm = 0 != “beautiful”
Dnorm > 0 != “bad”
No epsilon in 21.02.

Side totals use unique subjects

05 / axis descriptor
AxisMassSymmetryDescriptor {
  symmetryAxisCandidateRef,
  uniqueSubjectRefs[],
  negativeSideSubjectRefs[],
  positiveSideSubjectRefs[],
  onAxisSubjectRefs[],
  negativeSideMass,
  positiveSideMass,
  onAxisMass,
  sideMassAbsoluteDifference,
  sideMassTotal,
  normalizedSideMassDifference,
  status
}
subject side comes only from signedAxisDistance in 21.01 geometry
each selected subject is counted once
on-axis mass is preserved separately
on-axis mass does not enter left/right difference

No off-axis subjects → axis descriptor N_A
not zero by default.

Selection stays explicit and bounded

06 / set
MassSymmetrySelectionPolicy {
selectionMode: EXPLICIT_SYMMETRY_RELATIONS_ONLY,
subjectAggregationMode: UNIQUE_SUBJECTS_FROM_SELECTED_RELATIONS,
maxRelations: 1..16384,
autoRelationGeneration: false,
autoMassInference: false,
fullCartesian: false,
overflow: N_A_NO_TRUNCATION
}
Duplicate relation refs are deduplicated by identity. A subject appearing in several selected relations contributes to side totals once.

N_A, INVALID and zero remain separate

07 / status
Mass = 0valid numeric data
Pair difference = 0OK exact equality
Missing/conflicting exact mass evidenceN_A
Negative/non-finite massINVALID
No off-axis subjectsAxis descriptor N_A
Selected relation missingN_A
Selected relation malformed/INVALIDINVALID
OverflowN_A; no truncation

Downstream ownership remains explicit

08 / owners
21.00Subjects, coordinate frame and exact reflection-axis candidates.
21.01Explicit mirror pairs, anchor reflection geometry and SymmetryRelation[].
21.02Owner-qualified mass evidence, pair mass descriptors and axis-side mass descriptor.
21.03Shape/color/position channel symmetry.
21.04Approximate tolerance, symmetry errors, intentional violations, scoring/tests.
Compo4Visual mass definition and raw mass evidence semantics.
Topic22Asymmetric balance, centroid, torque-like moments and counterweights.

No hidden balance verdict

09 / firewalls
equal pair mass != proof of symmetry
equal side mass != proof of symmetry
nonzero mass difference != automatically bad
on-axis mass != zero evidence
low mass != redundant
high mass != dominant
mass symmetry != position symmetry
mass symmetry != shape symmetry
mass symmetry != color symmetry

21.02 owns_metrics = []
21.02 independent numeric votes = 0
21.02 symmetryError = none

N_A != 0
INVALID != 0
descriptor != score
correction request != foreign mutation

CANON → LAB → DATA → IDEAS

10 / mandatory hooks
IDEAS_REFS[]Mass-perception and side-weight studies.
DATA_CAPTURE[]Mass evidence, pair differences and side totals.
DEFERRED_SEMANTIC_INPUTS[]Channel symmetry, tolerance, errors and scoring.
HUMAN_FEEDBACK_HOOKS[]Mass binding/evidence corrections.
CONFLICT_PRIORITY_ASSUMPTIONS[]No confidence or serialization winner.
LAB_HOOKS[]Perceived mass and cross-channel disagreement.

21.02 regression suite

11 / deterministic tests

Tests cover foreign mass ownership, exact evidence lineage, zero mass, conflict preservation, pair and side mass math, unique-subject aggregation, on-axis neutrality, explicit selection, overflow N_A, immutable attachment, zero metrics and 21.03/21.04/Topic22 ownership firewalls.

Tests not run yet.

DATA FOR LAYOUT ENGINE

12 / machine contract
{
  "module": "Compo 21.02",
  "name": "mass_symmetry",
  "version": "1.0-canonical",
  "canonical_main_title": "Mass symmetry",
  "topic": "21_СИММЕТРИЧНЫЙ_БАЛАНС",
  "scope": "OWNER_QUALIFIED_NONNEGATIVE_VISUAL_MASS_ADAPTER_EXACT_MASS_EVIDENCE_RESOLUTION_PAIRWISE_AND_AXIS_SIDE_MASS_SYMMETRY_DESCRIPTORS_ONLY_WITHOUT_CHANNEL_APPROXIMATION_OR_SCORING",
  "main_topic_contract": {
    "topic_title": "Симметричный баланс",
    "topic_goal": "Измеряет осевую и зеркальную симметрию по позиции, форме, массе и цвету, включая approximate symmetry и намеренные нарушения.",
    "expected_output": "SymmetryRelation[], axis candidates, symmetry errors",
    "planned_files": [
      "21.00 Symmetry axis model",
      "21.01 Mirror correspondence",
      "21.02 Mass symmetry",
      "21.03 Channel symmetry: shape/color/position",
      "21.04 Approximate symmetry, scoring/tests"
    ]
  },
  "ownership": {
    "owner": "Compo21.02",
    "owns": [
      "SymmetryMassBinding",
      "SymmetryMassEvidence",
      "SymmetryMassEvidenceResolution",
      "PairMassSymmetryDescriptor",
      "AxisMassSymmetryDescriptor",
      "MassSymmetrySelectionPolicy",
      "MassSymmetrySet",
      "MassSymmetryAttachment",
      "owner-qualified nonnegative scalar visual-mass adapter without redefining visual-mass semantics",
      "exact per-subject mass evidence resolution without averaging or confidence winner",
      "pairwise absolute and normalized mass-difference descriptors for explicit Compo21.01 SymmetryRelation records",
      "unique-subject negative/positive/on-axis mass aggregation relative to one exact Compo21.00 reflection axis",
      "identity/status/provenance rules for Topic21 mass-symmetry layer",
      "non-mutating correction request for mass binding/evidence/relation lineage errors"
    ],
    "does_not_own": [
      "visual mass definition or raw visual-mass extraction — Compo4",
      "symmetry subject / coordinate frame / axis candidate identity — Compo21.00",
      "mirror pairing / anchor reflection / SymmetryRelation identity — Compo21.01",
      "shape/color/position channel symmetry — Compo21.03",
      "approximate tolerance / symmetry errors / intentional symmetry-breaking judgement / MetricResult scoring — Compo21.04",
      "dominance / focal hierarchy — Compo13",
      "multi-signal visual hierarchy — Topic19",
      "asymmetric balance — Topic22",
      "radial/rotational balance — Topic23",
      "global beautyScore",
      "final-layout ranking",
      "foreign geometry/style/semantic mutation"
    ]
  },
  "consumes": [
    "valid Compo21.00 SymmetryAxisSystemSeed lineage and one exact axis candidate identity",
    "valid Compo21.01 MirrorCorrespondenceSet and explicit OK SymmetryRelation records",
    "one explicit owner-qualified SymmetryMassBinding referencing the foreign visual-mass owner/channel/unit/context",
    "exact SymmetryMassEvidence records for subjects used by selected relations",
    "explicit MassSymmetrySelectionPolicy and explicit selected SymmetryRelation refs only"
  ],
  "provides": [
    "SymmetryMassBinding",
    "SymmetryMassEvidenceResolution[]",
    "PairMassSymmetryDescriptor[]",
    "AxisMassSymmetryDescriptor",
    "MassSymmetrySet",
    "MassSymmetryAttachment"
  ],
  "owns_metrics": [],
  "independent_numeric_votes": 0,
  "mass_math": {
    "pair_absolute_difference": "abs(mA-mB)",
    "pair_total": "mA+mB",
    "pair_normalized_difference": "pair_total == 0 ? 0 : abs(mA-mB)/pair_total",
    "axis_negative_mass": "sum unique selected subjects with signedAxisDistance < 0",
    "axis_positive_mass": "sum unique selected subjects with signedAxisDistance > 0",
    "axis_on_axis_mass": "sum unique selected subjects with signedAxisDistance == 0; excluded from side difference",
    "axis_normalized_side_difference": "side_total == 0 ? N_A when no off-axis subjects, otherwise abs(positive-negative)/(positive+negative)",
    "exact_classification": "EXACT_EQUAL only when raw masses are exactly equal; no epsilon in 21.02",
    "descriptor_note": "normalized difference is descriptive geometry-adjacent evidence, not a quality score or symmetry error"
  },
  "status_semantics": {
    "OK": "exact upstream lineage and exact compatible mass evidence produce finite nonnegative mass values",
    "N_A": "missing/conflicting exact mass evidence, missing selected relation, no off-axis subjects for axis-side descriptor, empty selection or bounded overflow; no guess/average/truncation",
    "INVALID": "malformed mass binding/evidence/policy, negative/non-finite mass, invalid upstream relation or root/axis/frame lineage mismatch",
    "zero_note": "mass value 0, pair difference 0 and side mass total 0 can be valid numeric observations and remain distinct from N_A"
  },
  "selection_policy": {
    "mode": "EXPLICIT_SYMMETRY_RELATIONS_ONLY",
    "subject_aggregation": "UNIQUE_SUBJECTS_FROM_SELECTED_RELATIONS",
    "auto_relation_generation": false,
    "auto_mass_inference": false,
    "auto_visual_mass_recomputation": false,
    "full_cartesian": false,
    "overflow": "N_A_NO_TRUNCATION"
  },
  "critical_firewalls": [
    "visual mass remains Compo4-owned",
    "mass adapter != visual-mass definition",
    "pair mass equality != symmetry quality",
    "pair mass difference != symmetry error score",
    "axis side mass equality != proof of mirror symmetry",
    "mass symmetry != shape symmetry",
    "mass symmetry != color symmetry",
    "mass symmetry != position symmetry",
    "low mass != redundant",
    "high mass != dominant",
    "on-axis mass is neutral to side difference and is not discarded",
    "canonical subject lexical order != negative/positive axis side",
    "nonzero pair mass difference != automatically bad",
    "exact equal mass != automatically desirable",
    "no epsilon or approximate tolerance in 21.02",
    "no raw mass extraction in 21.02",
    "no automatic pair generation in 21.02",
    "no confidence winner for conflicting evidence",
    "no averaging conflicting evidence",
    "no symmetry error score in 21.02",
    "no MetricResult in 21.02",
    "zero mass and zero difference are valid and not N_A",
    "N_A != 0",
    "INVALID != 0",
    "local != global",
    "geometry != interpretation",
    "descriptor != score",
    "heuristic != law",
    "correction request != foreign mutation",
    "module execution order != rule priority",
    "one metric = one owner",
    "no universal beautyScore",
    "IDEA != CANON",
    "EXPERIMENT != CANON"
  ],
  "IDEAS_REFS": [
    "IDEA-01 compare geometric visual-mass adapters with human perceived side-weight judgements",
    "IDEA-02 study whether pairwise mass equality predicts perceived mirror balance independently of shape/color",
    "IDEA-03 collect on-axis mass cases before deciding any special weighting policy",
    "IDEA-04 study mass-symmetric but position-asymmetric compositions",
    "IDEA-05 compare unique-subject side totals with pair-local mass descriptors"
  ],
  "DATA_CAPTURE": [
    "scopeRef",
    "snapshotRef",
    "symmetryAxisSystemSeedRef",
    "mirrorCorrespondenceSetRef",
    "symmetryAxisCandidateRef",
    "symmetryMassBindingRef",
    "selectedSymmetryRelationRefs[]",
    "massEvidenceRefsBySubject",
    "resolvedMassBySubject",
    "pairMassDifferenceByRelation",
    "pairNormalizedMassDifferenceByRelation",
    "axisNegativeMass",
    "axisPositiveMass",
    "axisOnAxisMass",
    "axisNormalizedSideDifference",
    "pairMassSymmetryDescriptorRefs[]",
    "axisMassSymmetryDescriptorRef",
    "massSymmetrySetRef",
    "status",
    "reasonCode"
  ],
  "DEFERRED_SEMANTIC_INPUTS": [
    "21.03 shape/color/position channel symmetry",
    "21.04 approximate symmetry tolerance",
    "21.04 symmetry error normalization",
    "21.04 intentional symmetry-breaking target semantics",
    "21.04 MetricResult scoring and repairs",
    "Topic22 asymmetric-balance interpretation",
    "Topic23 radial/rotational balance"
  ],
  "HUMAN_FEEDBACK_HOOKS": [
    "correct visual-mass binding owner/channel/unit/context",
    "correct mass evidence",
    "mark mass evidence conflict real",
    "correct selected SymmetryRelation",
    "correct axis candidate lineage",
    "mark relation selection missing",
    "mark relation selection extraneous",
    "correct side classification source geometry"
  ],
  "CONFLICT_PRIORITY_ASSUMPTIONS": [
    "mass evidence confidence does not choose a winner",
    "mass evidence serialization order has no priority",
    "selected relation order has no priority",
    "canonical subject lexical order does not define axis side",
    "mass channel naming does not define authority",
    "module execution order does not imply symmetry preference"
  ],
  "LAB_HOOKS": [
    "perceived-mass calibration study",
    "pair-mass versus side-total study",
    "on-axis mass study",
    "mass-only symmetry isolation study",
    "cross-channel disagreement study for 21.03/21.04",
    "human correction reason taxonomy"
  ],
  "topic21ProgressAfterThisModule": "3/5 local",
  "next_module": "Compo 21.03 — Channel symmetry: shape/color/position",
  "hard_stop": "Do not implement 21.03 or 21.04 in this file."
}
VISITS / ...