COMPO · 22.01 · VISUAL CENTER OF MASS

Weighted center.
No balance verdict.

22.01 получает точные numeric values через owner-qualified refs 22.00 и вычисляет weighted VisualCentroid в той же 2D frame. Centroid остаётся наблюдаемым descriptor: он не становится geometric center, target, fulcrum, признаком «хорошего баланса» или score.

ModuleCompo 22.01
Input22.00 exact lineage
Centroidweighted x / y
Mass channelsexact compatible only
Metricsnone
NextSTOP

Numeric evidence before centroid

00 / contract
valid Compo22.00 model + frame + bindings + seed + exact numeric position evidence for every observation + exact numeric visual-mass evidence for every observation + exact compatible mass channel signature → per-subject contribution descriptors → VisualCentroid → immutable VisualCentroidAttachment NO frame-center target NO centroid desirability NO torque / lever arm NO regional distribution NO counterweight NO score / MetricResult

22.01 owns the weighted observation only

01 / ownership
OWNS

Resolution + centroid math

Exact numeric position/mass evidence resolution, compatibility signature, contribution descriptors, weighted centroid identity and immutable attachment.

DOES NOT OWN

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

02 / root bundle
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

03 / evidence
POSITION

VisualCentroidPositionEvidence

Exact subject + positionBindingRef + positionRef + positionOwnerRef, finite x/y values, source/provenance. The evidence owner must match the 22.00 position owner.

MASS

VisualCentroidMassEvidence

Exact subject + massBindingRef + visualMassRef + visualMassOwnerRef, finite nonnegative massValue, source/provenance. Zero mass is valid.

Conflict is preserved

04 / resolution
CaseResultRule
One or duplicate-identical exact valueOKResolve exact numeric value.
Missing exact evidenceN_ANo inference from geometry, names or other subjects.
Multiple different exact valuesN_ANo averaging and no confidence winner.
Wrong owner/ref, non-finite coordinate, negative massINVALIDLineage or numeric contract is malformed.

Mass channels must be comparable

05 / compatibility
massCompatibilitySignature = visualMassOwnerRef + massChannelRef + massContextRef all included subjects must share one exact signature mixed signatures → N_A / INCOMPATIBLE_MASS_BINDINGS NO implicit rescale NO z-score NO normalization across foreign channels NO channel preference

Weighted centroid is deterministic

06 / math
M = Σ mᵢ WX = Σ (mᵢ × xᵢ) WY = Σ (mᵢ × yᵢ) if M > 0: centroidX = WX / M centroidY = WY / M massShareᵢ = mᵢ / M xComponentᵢ = massShareᵢ × xᵢ yComponentᵢ = massShareᵢ × yᵢ if M == 0: centroid = N_A 0 coordinate is valid. 0 mass is valid. 0 total mass does NOT mean centroid (0,0).

Contribution is descriptive lineage

07 / descriptor
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

08 / status
OK

Computable

Exact root lineage, compatible mass channel, complete conflict-free numeric evidence, total mass above zero and finite result.

N_A

Not applicable / unresolved

Missing or conflicted evidence, incompatible mass signatures, zero total mass, empty selection or bounded overflow.

INVALID

Malformed

Wrong owner/ref, invalid root lineage, non-finite coordinate, negative/non-finite mass, invalid policy or record.

Attachment is non-mutating

09 / attachment
VisualCentroidAttachment {
  asymmetricBalanceSystemSeedRef,
  asymmetricBalanceModelRef,
  visualCentroidRef,
  status,
  mutationAllowed: false
}

Compo22.00 model and seed remain unchanged.
No foreign observationBinding.visualCentroidContributionRef is mutated.

Next owners remain separate

10 / downstream
22.02

Moments / arms

Explicit reference point or axis semantics, signed arms and torque-like descriptors. A centroid is not automatically the fulcrum.

22.03

Regions / counterweights

Regional partitions and counterweight relations. A contribution descriptor is not automatically a counterweight.

22.04

Scoring / candidates

Target profile, local score semantics, bounded deterministic candidates and final Topic22 tests.

Center ≠ balance quality

11 / firewalls
Forbidden shortcuts

centroid==frame center ⇒ good; centroid offset ⇒ bad; mass share ⇒ dominance; zero mass ⇒ redundant; mixed mass channels ⇒ normalize; evidence conflict ⇒ average.

Canonical here

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

12 / hooks
IDEAS_REFS[]Centroid sensitivity and perceived-balance studies.
DATA_CAPTURE[]Exact evidence, resolutions, contributions and centroid.
DEFERRED_SEMANTIC_INPUTS[]Moment, region, counterweight and scoring semantics stay downstream.
HUMAN_FEEDBACK_HOOKS[]Position/mass evidence and binding corrections.
CONFLICT_PRIORITY_ASSUMPTIONS[]No confidence or serialization winner.
LAB_HOOKS[]Human validation and mass-channel studies.

22.01 regression suite

13 / deterministic tests

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.

Tests not run yet.

DATA FOR LAYOUT ENGINE

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