COMPO · 24.02 · MASS DISTRIBUTION ALONG DIAGONAL

Project mass.
Preserve geometry.

24.02 проецирует owner-qualified visual-mass samples на конкретный diagonal axis candidate из 24.00 и описывает их распределение вдоль оси. Signed coordinate, perpendicular offset, weighted centroid, span и side-mass сохраняются как геометрические descriptors — без скрытого «баланса», tension или quality score.

ModuleCompo 24.02
Inputaxis + positive mass samples
Projectionexact orthogonal
Bandsexplicit only
Metricsnone
NextSTOP

Mass samples become axis projections

24.02 consumes a specific 24.00 axis. It does not decide whether that axis is the scene's main diagonal.

00 / contract
24.00 DiagonalAxisCandidateSet + DiagonalCompositionSeed + owner-qualified positive mass samples + optional explicit along-axis interval bands → DiagonalMassProjectionDescriptor[] → DiagonalMassDistributionDescriptor[] → DiagonalMassDistributionSet → MassDistributionAttachment NO main/counter role NO tension profile NO score / candidate generator

How the mass projection works

Пояснительные схемы показывают, какие величины являются наблюдаемой геометрией, а какие интерпретации остаются downstream.

01 / visual explainer

Orthogonal projection

Каждая mass sample точка опускается перпендикуляром на diagonal axis. Получаем t вдоль оси и p поперёк.

mass m₁mass m₂projection is geometry; no quality inference

Signed coordinate

Anchor делит ось на отрицательную и положительную стороны. t = 0 валиден и означает попадание точно в anchor.

anchor · t=0t < 0t > 0sign ≠ good / bad

Mass-weighted centroid along axis

Centroid-along-axis — среднее t с весами mass. Это descriptor положения распределения, не balance score.

μₜlarger circles = larger explicit mass values

Same total mass, different spread

Одинаковая total mass не означает одинаковую distribution. Span и variance-like spread должны оставаться различимыми descriptors.

A · compact spreadB · wide spreadtotalMass(A) = totalMass(B), distribution(A) ≠ distribution(B)

Explicit interval bands only

Center/ends buckets не появляются автоматически. Если нужны bands, границы объявляет owner.

[-120,-20)[-20,45)[45,160]overlapping declared bands → N_A, no hidden winner

Side-mass imbalance is descriptive

(M+ − M−) / Mtotal лежит в [-1,1]. Ни +1, ни −1 сами по себе не являются «лучше» или «хуже».

M−M+imbalance = +0.12descriptor ≠ preference ≠ tension

24.02 owns projection distribution only

Visual mass values arrive as foreign owner-qualified evidence; 24.02 owns their relationship to an explicit diagonal.

02 / ownership
OWNS

Projection descriptors

Along coordinate, perpendicular offset, exact lineage and mass sample refs.

OWNS

Distribution descriptors

Total mass, weighted along centroid, spread, side masses and explicit interval occupancy.

DOES NOT OWN

Interpretive balance

Main/counter roles, tension, desirability, scoring and layout ranking remain downstream.

Mass is explicit, positive and owner-qualified

24.02 does not infer mass from pixels, area, darkness, color or semantic importance.

03 / evidence
DiagonalMassSampleEvidence {
  scopeRef, snapshotRef,
  axisCandidateRef,
  subjectRef,
  coordinateFrameRef,
  point: {x, y},
  massValue: positive finite number,
  massMeasureRef,
  massMeasureOwnerRef,
  sourceRef, sourceOwnerRef,
  confidence: [0,1] | null,   // diagnostic only
  provenance,
  status,
  mutationAllowed: false
}
Important
A massValue of 0 is not silently accepted as “absence”. The evidence contract requires a positive mass sample. If upstream says a subject contributes no mass in a channel, that must be represented by that owner's own applicability semantics, not fabricated here.

Exact orthogonal projection

All math stays in the exact shared coordinate frame of the 24.00 candidate.

04 / math
u = d / ||d|| n = (-u.y, u.x) rᵢ = pointᵢ - axis.anchor tᵢ = dot(rᵢ, u) // along-axis coordinate pᵢ = dot(rᵢ, n) // perpendicular offset NO hidden image-width normalization NO clipping NO tolerance
DiagonalMassProjectionDescriptor {
  subjectRef,
  axisCandidateRef,
  massValue,
  alongCoordinate,
  perpendicularOffset,
  projectionPoint,
  evidenceRefs[],
  bandOccupancyRef: null | exact ref,
  tensionProfileRef: null,
  scoreRef: null,
  status,
  mutationAllowed: false
}

Aggregate without turning it into a score

Aggregation is deterministic geometry over selected valid samples for one axis candidate.

05 / distribution
DescriptorDefinitionNot equivalent to
totalMassΣmᵢimportance, quality
weightedMeanAlongΣ(mᵢtᵢ)/Σmᵢbalance score
weightedMeanPerpΣ(mᵢpᵢ)/Σmᵢcounter-diagonal
minAlong / maxAlong / spanAlongobserved support along axistension
weightedAlongVarianceΣmᵢ(tᵢ−μ)²/Σmᵢgood/bad spread
positiveSideMass / negativeSideMass / anchorMassmass partition by sign of tpreferred side
signedSideImbalance(M+−M−)/Mtotalquality metric

Bands are declarations, not defaults

Explicit bands help downstream compare distribution profiles without smuggling in arbitrary thirds, center zones or equal-width bins.

06 / bands
DiagonalMassBandDefinition {
  bandRef,
  axisCandidateRef,
  minAlong,
  maxAlong,
  includeMin,
  includeMax,
  bandOwnerRef,
  sourceRef,
  provenance,
  status,
  mutationAllowed: false
}

Rules:
- minAlong < maxAlong
- exact overlaps → N_A for the band profile
- no auto-generated gaps or equal-width bins
- uncovered samples stay UNASSIGNED, never become zero

Explicit, bounded axis distribution requests

No full subject × axis Cartesian generation.

07 / set policy
SelectionEXPLICIT_AXIS_DISTRIBUTION_REQUESTS_ONLY
Max distributions1..1024
Max samples1..16384
OverflowN_A without truncation
DiagonalMassDistributionDescriptor {
  axisCandidateRef,
  projectionRefs[],
  totalMass,
  weightedMeanAlong,
  weightedMeanPerp,
  minAlong, maxAlong, spanAlong,
  weightedAlongVariance,
  negativeSideMass,
  anchorMass,
  positiveSideMass,
  signedSideImbalance,
  bandOccupancyRefs[],
  counterDiagonalRef: null,
  tensionProfileRef: null,
  scoreRef: null,
  status,
  mutationAllowed: false
}

Immutable attachment to 24.00 seed

Root axis candidate records remain untouched.

08 / attachment
MassDistributionAttachment { diagonalCompositionSeedRef, massDistributionSetRef, status, mutationAllowed: false } 24.00 DiagonalCompositionSeed remains unchanged.

Interpretation remains downstream

24.02 gives 24.03/24.04 evidence, not conclusions.

09 / next owners
ModuleOwns next24.02 does not do it
24.03Counter-diagonal and tension profilesNo axis role pairing, no controlled-tension target, no stability judgment.
24.04Scoring, candidates and testsNo MetricResult, independent vote, target profile or repair generator.
25.*Flow routesNo path-template coverage or reading-route semantics.

Mass distribution ≠ quality

These separations are normative and regression-tested.

10 / firewalls
t = 0 is valid

Exact anchor projection is numeric geometry, not N_A.

Spread ≠ tension

Wide or compact distribution has no built-in desirability.

Side ≠ preference

Positive/negative coordinate sign is not good/bad.

No score

24.02 owns zero MetricResult records and zero independent numeric votes.

visual mass != semantic priority visual mass != object size weightedMeanAlong != visual center of mass of Topic22 signedSideImbalance != balance score weightedAlongVariance != tension perpendicular offset != counter-diagonal N_A != 0 INVALID != 0

CANON → LAB → DATA → IDEAS

Perceptual mass models and preferred distribution profiles stay experimental until explicitly sourced.

11 / mandatory hooks
IDEAS_REFS[]Perceived mass vs geometric mass; axis-spread perception.
DATA_CAPTURE[]Mass samples, t/p projections, aggregate descriptors.
DEFERRED_SEMANTIC_INPUTS[]Desired spread, tension, role of main/counter axes.
HUMAN_FEEDBACK_HOOKS[]Correct mass measure, point, axis request or bands.
CONFLICT_PRIORITY_ASSUMPTIONS[]Confidence cannot choose contradictory mass values.
LAB_HOOKS[]Mass-distribution perception and diagonal stability studies.

24.02 regression suite

Tests cover exact 24.00 lineage, positive owner-qualified mass evidence, orthogonal projection math, valid zero coordinates, weighted distribution descriptors, explicit non-overlapping bands, bounded selection, immutable attachment and strict 24.03–24.04 / Topic25 firewalls.

12 / deterministic tests
Tests not run yet.

DATA FOR LAYOUT ENGINE

Machine-readable contract for integration and cross-module audit.

13 / machine contract
{
  "module": "Compo 24.02",
  "name": "mass_distribution_along_diagonal",
  "version": "1.0-canonical",
  "canonical_main_title": "Mass distribution along diagonal",
  "topic": "24_ДИАГОНАЛЬНАЯ_КОМПОЗИЦИЯ",
  "scope": "OWNER_QUALIFIED_POSITIVE_VISUAL_MASS_SAMPLES_EXACT_PROJECTION_TO_EXPLICIT_24_00_DIAGONAL_AXIS_AND_NONSCORING_ALONG_AXIS_DISTRIBUTION_DESCRIPTORS_ONLY",
  "main_topic_contract": {
    "topic_title": "Диагональная композиция",
    "topic_goal": "Описывает диагональную структуру всей сцены: main diagonal, counter-diagonal, проекции масс на ось и controlled diagonal tension.",
    "expected_output": "DiagonalCompositionDescriptor, main/counter axes, projection distribution",
    "planned_files": [
      "24.00 Diagonal axis candidates",
      "24.01 Object orientation vs diagonal",
      "24.02 Mass distribution along diagonal",
      "24.03 Counter-diagonal and tension profiles",
      "24.04 Scoring, candidates and tests"
    ]
  },
  "ownership": {
    "owner": "Compo24.02",
    "owns": [
      "DiagonalMassSampleEvidence adapter",
      "DiagonalMassSampleResolution",
      "DiagonalMassProjectionDescriptor",
      "DiagonalMassBandDefinition",
      "DiagonalMassBandOccupancy",
      "DiagonalMassDistributionDescriptor",
      "DiagonalMassDistributionSetPolicy",
      "DiagonalMassDistributionSet",
      "MassDistributionAttachment",
      "exact orthogonal projection math onto explicit 24.00 axis candidate",
      "mass-weighted along-axis centroid and signed side-mass descriptors",
      "explicit owner-declared along-axis interval occupancy",
      "identity/status/provenance rules for Topic24 mass-distribution layer",
      "non-mutating correction request for mass/projection evidence errors"
    ],
    "does_not_own": [
      "24.00 axis candidate identity or geometry — Compo24.00",
      "object orientation relation — Compo24.01",
      "raw visual mass extraction or salience model — upstream mass owner",
      "main/counter diagonal role assignment — Compo24.03/24.04",
      "counter-diagonal relation and controlled tension profiles — Compo24.03",
      "target fit, MetricResult, candidate generator or scoring — Compo24.04",
      "flow-template path matching — Topic25",
      "hierarchy / dominance / beautyScore / final-layout ranking",
      "foreign geometry/style/semantic mutation"
    ]
  },
  "consumes": [
    "exact 24.00 DiagonalAxisCandidateSet and DiagonalCompositionSeed lineage",
    "owner-qualified positive mass samples with exact 2D points",
    "optional explicit along-axis interval bands"
  ],
  "provides": [
    "DiagonalMassProjectionDescriptor[]",
    "DiagonalMassBandOccupancy[]",
    "DiagonalMassDistributionDescriptor[]",
    "DiagonalMassDistributionSet",
    "MassDistributionAttachment"
  ],
  "owns_metrics": [],
  "independent_numeric_votes": 0,
  "projection_math": {
    "unitAxis": "u=d/||d||",
    "unitNormal": "n=(-u.y,u.x)",
    "alongCoordinate": "dot(point-anchor,u)",
    "perpendicularOffset": "dot(point-anchor,n)",
    "weightedMeanAlong": "sum(m_i*t_i)/sum(m_i)",
    "signedSideImbalance": "(positiveSideMass-negativeSideMass)/totalMass",
    "hiddenNormalization": null
  },
  "band_policy": {
    "bands": "EXPLICIT_OWNER_DECLARED_INTERVALS_ONLY",
    "implicitEqualWidthBins": false,
    "implicitCenterEndThresholds": false,
    "overlap": "N_A_NO_WINNER",
    "uncoveredSamples": "preserved as unassigned, not zero"
  },
  "status_semantics": {
    "OK": "valid exact lineage and positive mass evidence",
    "N_A": "missing/conflicting evidence, overlapping bands, or bounded-policy overflow; never numeric zero",
    "INVALID": "malformed/impossible record; never numeric zero"
  },
  "firewalls": [
    "visual mass != semantic importance",
    "projection coordinate != movement direction",
    "positive-side mass != better",
    "negative-side mass != worse",
    "zero along-coordinate is valid geometry",
    "weightedMeanAlong != balance score",
    "side imbalance != quality score",
    "spread != tension",
    "mass distribution != counter-diagonal",
    "N_A != 0",
    "INVALID != 0",
    "local != global"
  ],
  "visual_explanation": {
    "diagrams": [
      "orthogonal projection from object mass samples to diagonal axis",
      "signed along-axis coordinate and perpendicular offset",
      "mass-weighted centroid along the axis",
      "same total mass with different along-axis spread",
      "explicit interval-band occupancy without hidden bins"
    ]
  },
  "topic24ProgressAfterThisModule": "3/5 local",
  "next_module": "Compo 24.03 — Counter-diagonal and tension profiles",
  "hard_stop": "No 24.03–24.04 implementation in this file"
}
VISITS / ...