Mass after correspondence
+ 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
21.02
Mass adapter identity, exact mass evidence resolution, pairwise mass-difference descriptors, unique-subject side totals, bounded set and immutable attachment.
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.
Mass binding is owner-qualified
SymmetryMassBinding {
scopeRef, snapshotRef,
massChannelRef,
massUnitRef,
massMeasurementContextRef,
massSemanticsRef,
massSourceOwnerRef,
bindingSourceRef,
bindingSourceOwnerRef,
provenance, status,
mutationAllowed: false
}massUnitRef != silently convertible
massSourceOwnerRef must name the foreign owner
value domain = finite nonnegative scalar
Exact evidence, no averaging
OK
All exact compatible evidence records resolve to the same finite nonnegative mass.
N_A
Missing evidence or different compatible values remain unresolved. Confidence never chooses a winner.
INVALID
Negative/non-finite mass or incompatible binding lineage is invalid.
Pair mass difference is descriptive
PairMassSymmetryDescriptor {
symmetryRelationRef,
canonicalSubjectLowRef,
canonicalSubjectHighRef,
massLow, massHigh,
absoluteMassDifference,
pairMassTotal,
normalizedPairMassDifference, // [0,1]
pairMassClass: EXACT_EQUAL | NONZERO_DIFFERENCE,
symmetryErrorRef: null,
metricResultRef: null,
score: null
}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
AxisMassSymmetryDescriptor {
symmetryAxisCandidateRef,
uniqueSubjectRefs[],
negativeSideSubjectRefs[],
positiveSideSubjectRefs[],
onAxisSubjectRefs[],
negativeSideMass,
positiveSideMass,
onAxisMass,
sideMassAbsoluteDifference,
sideMassTotal,
normalizedSideMassDifference,
status
}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
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
}
N_A, INVALID and zero remain separate
| Mass = 0 | valid numeric data |
| Pair difference = 0 | OK exact equality |
| Missing/conflicting exact mass evidence | N_A |
| Negative/non-finite mass | INVALID |
| No off-axis subjects | Axis descriptor N_A |
| Selected relation missing | N_A |
| Selected relation malformed/INVALID | INVALID |
| Overflow | N_A; no truncation |
Downstream ownership remains explicit
| 21.00 | Subjects, coordinate frame and exact reflection-axis candidates. |
| 21.01 | Explicit mirror pairs, anchor reflection geometry and SymmetryRelation[]. |
| 21.02 | Owner-qualified mass evidence, pair mass descriptors and axis-side mass descriptor. |
| 21.03 | Shape/color/position channel symmetry. |
| 21.04 | Approximate tolerance, symmetry errors, intentional violations, scoring/tests. |
| Compo4 | Visual mass definition and raw mass evidence semantics. |
| Topic22 | Asymmetric balance, centroid, torque-like moments and counterweights. |
No hidden balance verdict
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
21.02 regression suite
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.
DATA FOR LAYOUT ENGINE
{
"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."
}