Numeric evidence before centroid
22.01 owns the weighted observation only
Resolution + centroid math
Exact numeric position/mass evidence resolution, compatibility signature, contribution descriptors, weighted centroid identity and immutable attachment.
Foreign semantics or judgement
Geometry, visual-mass definition, frame-center meaning, moment arms, counterweights, regional balance, quality targets, candidates and MetricResult stay with their declared owners.
Root bundle is exact 22.00 lineage
VisualCentroidRootBundle {
model, frame,
positionBindings[],
massBindings[],
seed
}
required:
model.asymmetricBalanceCoordinateFrameBindingRef == frame.ref
canonical(positionBindingRefs) == canonical(model.positionBindingRefs)
canonical(massBindingRefs) == canonical(model.massBindingRefs)
seed.asymmetricBalanceModelRef == model.asymmetricBalanceModelRef
Each model observation must resolve to its exact subject + positionBindingRef + massBindingRef.22.00 stores joined observation records and binding refs. 22.01 receives the exact binding records alongside the model; it does not reconstruct them from names or DOM order.
Evidence dereferences foreign refs, not semantics
VisualCentroidPositionEvidence
Exact subject + positionBindingRef + positionRef + positionOwnerRef, finite x/y values, source/provenance. The evidence owner must match the 22.00 position owner.
VisualCentroidMassEvidence
Exact subject + massBindingRef + visualMassRef + visualMassOwnerRef, finite nonnegative massValue, source/provenance. Zero mass is valid.
Conflict is preserved
| Case | Result | Rule |
|---|---|---|
| One or duplicate-identical exact value | OK | Resolve exact numeric value. |
| Missing exact evidence | N_A | No inference from geometry, names or other subjects. |
| Multiple different exact values | N_A | No averaging and no confidence winner. |
| Wrong owner/ref, non-finite coordinate, negative mass | INVALID | Lineage or numeric contract is malformed. |
Mass channels must be comparable
Weighted centroid is deterministic
Contribution is descriptive lineage
VisualCentroidContributionDescriptor {
subjectRef,
observationBindingRef,
positionResolutionRef,
massResolutionRef,
x, y, massValue,
massShare,
weightedX, weightedY,
centroidXComponent,
centroidYComponent,
status,
score: null,
metricResultRef: null,
mutationAllowed: false
}
VisualCentroid {
totalVisualMass,
weightedXSum,
weightedYSum,
centroidX,
centroidY,
coordinateUnitRef,
massCompatibilitySignature,
contributionDescriptorRefs[],
status,
score: null,
metricResultRef: null,
mutationAllowed: false
}N_A remains different from zero
Computable
Exact root lineage, compatible mass channel, complete conflict-free numeric evidence, total mass above zero and finite result.
Not applicable / unresolved
Missing or conflicted evidence, incompatible mass signatures, zero total mass, empty selection or bounded overflow.
Malformed
Wrong owner/ref, invalid root lineage, non-finite coordinate, negative/non-finite mass, invalid policy or record.
Attachment is non-mutating
VisualCentroidAttachment {
asymmetricBalanceSystemSeedRef,
asymmetricBalanceModelRef,
visualCentroidRef,
status,
mutationAllowed: false
}
Compo22.00 model and seed remain unchanged.
No foreign observationBinding.visualCentroidContributionRef is mutated.Next owners remain separate
Moments / arms
Explicit reference point or axis semantics, signed arms and torque-like descriptors. A centroid is not automatically the fulcrum.
Regions / counterweights
Regional partitions and counterweight relations. A contribution descriptor is not automatically a counterweight.
Scoring / candidates
Target profile, local score semantics, bounded deterministic candidates and final Topic22 tests.
Center ≠ balance quality
centroid==frame center ⇒ good; centroid offset ⇒ bad; mass share ⇒ dominance; zero mass ⇒ redundant; mixed mass channels ⇒ normalize; evidence conflict ⇒ average.
Exact root lineage, exact owner-qualified values, explicit channel compatibility, weighted centroid math, N_A/INVALID preservation and immutable downstream attachment.
CANON → LAB → DATA → IDEAS
22.01 regression suite
Tests cover exact 22.00 lineage, evidence ownership, duplicate-identical versus conflicting values, zero semantics, mass-channel compatibility, weighted centroid math, permutation invariance, immutable attachment, no moment/counterweight/scoring leakage and Topic21/22.02–22.04 firewalls.
DATA FOR LAYOUT ENGINE
{
"module": "Compo 22.01",
"name": "visual_center_of_mass",
"version": "1.0-canonical",
"canonical_main_title": "Visual center of mass",
"topic": "22_АСИММЕТРИЧНЫЙ_БАЛАНС",
"scope": "EXACT_OWNER_QUALIFIED_NUMERIC_POSITION_AND_VISUAL_MASS_EVIDENCE_OVER_ONE_VALID_COMPO22_00_MODEL_WEIGHTED_VISUAL_CENTROID_AND_PER_SUBJECT_CONTRIBUTION_DESCRIPTORS_ONLY_WITHOUT_MOMENTS_COUNTERWEIGHTS_REGIONAL_BALANCE_OR_SCORING",
"main_topic_contract": {
"topic_title": "Асимметричный баланс",
"topic_goal": "Описывает асимметричный баланс через visual center of mass, moments/плечи, regional distribution и counterweights, не требуя зеркального соответствия.",
"expected_output": "VisualCentroid, mass moments, balance descriptors",
"planned_files": [
"22.00 Asymmetric balance model",
"22.01 Visual center of mass",
"22.02 Torque-like moment descriptors",
"22.03 Counterweight and regional mass distribution",
"22.04 Scoring, candidates and tests"
]
},
"ownership": {
"owner": "Compo22.01",
"owns": [
"VisualCentroidPositionEvidence",
"VisualCentroidPositionResolution",
"VisualCentroidMassEvidence",
"VisualCentroidMassResolution",
"VisualCentroidContributionDescriptor",
"VisualCentroidSelectionPolicy",
"VisualCentroid",
"VisualCentroidAttachment",
"exact numeric resolution of the Compo22.00 positionRef and visualMassRef owned by their declared foreign owners",
"exact mass-channel compatibility check across one centroid computation",
"weighted visual-centroid computation in the exact Compo22.00 coordinate frame",
"identity/status/provenance rules for Topic22 centroid layer",
"non-mutating correction request for position/mass evidence or root-lineage errors"
],
"does_not_own": [
"AsymmetricBalanceModel / subjects / frame / position / mass binding identities — Compo22.00",
"raw geometry or position semantics — foreign geometry owner",
"visual-mass definition or raw visual-mass extraction — Compo4 / foreign mass owner",
"torque-like moment / lever-arm descriptors — Compo22.02",
"counterweight or regional mass distribution — Compo22.03",
"balance scoring / candidate generation / MetricResult — Compo22.04",
"mirror symmetry — Topic21",
"radial balance — Topic23",
"dominance / focal hierarchy — Compo13",
"global beautyScore",
"final-layout ranking",
"foreign geometry/mass/style/semantic mutation"
]
},
"consumes": [
"valid Compo22.00 AsymmetricBalanceModel, frame, position bindings, mass bindings and immutable system seed",
"exact owner-qualified numeric position evidence for every included observation binding",
"exact owner-qualified nonnegative visual-mass evidence for every included observation binding",
"one explicit VisualCentroidSelectionPolicy"
],
"provides": [
"VisualCentroidPositionResolution[]",
"VisualCentroidMassResolution[]",
"VisualCentroidContributionDescriptor[]",
"VisualCentroid",
"VisualCentroidAttachment"
],
"owns_metrics": [],
"independent_numeric_votes": 0,
"centroid_math": {
"total_visual_mass": "sum(m_i)",
"weighted_x_sum": "sum(m_i * x_i)",
"weighted_y_sum": "sum(m_i * y_i)",
"centroid_x": "weighted_x_sum / total_visual_mass when total_visual_mass > 0",
"centroid_y": "weighted_y_sum / total_visual_mass when total_visual_mass > 0",
"mass_share": "m_i / total_visual_mass",
"subject_x_component": "mass_share_i * x_i",
"subject_y_component": "mass_share_i * y_i",
"zero_total_mass": "N_A; centroid is undefined rather than (0,0)",
"coordinate_note": "signed or zero coordinates are valid finite values; no frame-center preference is implied"
},
"mass_compatibility": {
"mode": "EXACT_OWNER_CHANNEL_CONTEXT",
"required_same_fields": [
"visualMassOwnerRef",
"massChannelRef",
"massContextRef"
],
"incompatible_result": "N_A",
"auto_conversion": false,
"auto_normalization": false,
"reason": "different owner-defined mass channels are not silently combined"
},
"status_semantics": {
"OK": "valid exact Compo22.00 lineage, compatible mass bindings, complete conflict-free numeric evidence, finite weighted sums and total visual mass > 0",
"N_A": "missing/conflicting numeric evidence, incompatible mass channels, zero total visual mass, empty/overflow selection; no guessing/averaging/conversion/truncation",
"INVALID": "malformed evidence/policy/root bundle, evidence bound to foreign refs or wrong owner/source, negative/non-finite mass, non-finite coordinate, or root lineage mismatch",
"zero_note": "x=0, y=0, mass=0, weighted component=0 and centroid coordinate=0 are valid numbers; N_A remains distinct from zero"
},
"selection_policy": {
"mode": "ALL_MODEL_OBSERVATIONS_EXACT",
"subset_rule": "no centroid-specific subset; model a subgroup with a separate Compo22.00 scope/model",
"conflict": "N_A_NO_WINNER",
"overflow": "N_A_NO_TRUNCATION",
"auto_position_inference": false,
"auto_visual_mass_inference": false,
"auto_mass_normalization": false,
"auto_mass_conversion": false,
"auto_frame_center_target": false,
"auto_subject_subset": false,
"full_cartesian": false
},
"critical_firewalls": [
"visual centroid != geometric center",
"visual centroid != frame center",
"visual centroid != fulcrum or target by default",
"centroid offset from frame center is not computed or judged in 22.01",
"visual centroid position != balance quality",
"centroid at frame center != automatically balanced",
"centroid away from frame center != automatically imbalanced",
"per-subject centroid contribution != dominance",
"mass share != hierarchy rank",
"zero mass != redundant",
"high mass != semantically important",
"visual mass != geometric area",
"mass-channel compatibility != universal mass semantics",
"different mass channels are not auto-normalized or converted",
"conflicting evidence is not averaged",
"confidence does not choose a winner",
"all model observations participate; no hidden subset",
"zero total mass makes centroid N_A, not zero",
"no torque-like moment in 22.01",
"no lever arm in 22.01",
"no regional partition in 22.01",
"no counterweight inference in 22.01",
"no balance score in 22.01",
"no candidate generation in 22.01",
"no MetricResult in 22.01",
"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 center and visual centroid under controlled visual-mass shifts",
"IDEA-02 compare multiple owner-defined visual-mass channels without canonicalizing one prematurely",
"IDEA-03 study centroid sensitivity to zero-mass and low-mass decorative objects",
"IDEA-04 collect intentionally balanced asymmetric layouts with centroid on and off geometric center",
"IDEA-05 compare whole-composition centroid to separately modeled local-group centroids"
],
"DATA_CAPTURE": [
"scopeRef",
"snapshotRef",
"asymmetricBalanceModelRef",
"asymmetricBalanceCoordinateFrameBindingRef",
"asymmetricBalanceSystemSeedRef",
"observationBindingRefs[]",
"positionEvidenceRefs[]",
"massEvidenceRefs[]",
"positionResolutionRefs[]",
"massResolutionRefs[]",
"massCompatibilitySignature",
"totalVisualMass",
"weightedXSum",
"weightedYSum",
"centroidX",
"centroidY",
"visualCentroidContributionDescriptorRefs[]",
"visualCentroidRef",
"visualCentroidAttachmentRef",
"status",
"reasonCode"
],
"DEFERRED_SEMANTIC_INPUTS": [
"22.02 explicit reference point/axis semantics and torque-like moment descriptors",
"22.02 centroid-relative or other explicit lever-arm semantics if declared there",
"22.03 regional partition and counterweight semantics",
"22.04 balance target profiles / scoring / bounded candidates",
"Topic21 reflection symmetry descriptors",
"Topic23 radial-system descriptors"
],
"HUMAN_FEEDBACK_HOOKS": [
"correct numeric position evidence for an exact positionRef",
"correct numeric visual-mass evidence for an exact visualMassRef",
"mark evidence conflict real",
"correct mass channel/context binding in Compo22.00",
"split an incompatible mass-channel scope into separate models",
"correct coordinate frame/unit binding in Compo22.00",
"mark zero-total-mass case intentionally non-applicable"
],
"CONFLICT_PRIORITY_ASSUMPTIONS": [
"position evidence confidence does not choose a winner",
"mass evidence confidence does not choose a winner",
"evidence serialization order has no priority",
"subject lexical order has no balance priority",
"mass channel naming has no authority beyond its declared owner",
"module execution order does not imply balance importance"
],
"LAB_HOOKS": [
"visual-centroid human validation study",
"mass-channel sensitivity study",
"geometric-center versus visual-centroid study",
"zero-mass subject study",
"local versus global centroid study",
"centroid versus perceived-balance study"
],
"topic22ProgressAfterThisModule": "2/5 local",
"next_module": "Compo 22.02 — Torque-like moment descriptors",
"hard_stop": "Do not implement 22.02, 22.03 or 22.04 in this file."
}