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.
How the mass projection works
Пояснительные схемы показывают, какие величины являются наблюдаемой геометрией, а какие интерпретации остаются downstream.
Orthogonal projection
Каждая mass sample точка опускается перпендикуляром на diagonal axis. Получаем t вдоль оси и p поперёк.
Signed coordinate
Anchor делит ось на отрицательную и положительную стороны. t = 0 валиден и означает попадание точно в anchor.
Mass-weighted centroid along axis
Centroid-along-axis — среднее t с весами mass. Это descriptor положения распределения, не balance score.
Same total mass, different spread
Одинаковая total mass не означает одинаковую distribution. Span и variance-like spread должны оставаться различимыми descriptors.
Explicit interval bands only
Center/ends buckets не появляются автоматически. Если нужны bands, границы объявляет owner.
Side-mass imbalance is descriptive
(M+ − M−) / Mtotal лежит в [-1,1]. Ни +1, ни −1 сами по себе не являются «лучше» или «хуже».
24.02 owns projection distribution only
Visual mass values arrive as foreign owner-qualified evidence; 24.02 owns their relationship to an explicit diagonal.
Projection descriptors
Along coordinate, perpendicular offset, exact lineage and mass sample refs.
Distribution descriptors
Total mass, weighted along centroid, spread, side masses and explicit interval occupancy.
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.
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
}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.
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.
| Descriptor | Definition | Not equivalent to |
|---|---|---|
| totalMass | Σmᵢ | importance, quality |
| weightedMeanAlong | Σ(mᵢtᵢ)/Σmᵢ | balance score |
| weightedMeanPerp | Σ(mᵢpᵢ)/Σmᵢ | counter-diagonal |
| minAlong / maxAlong / spanAlong | observed support along axis | tension |
| weightedAlongVariance | Σmᵢ(tᵢ−μ)²/Σmᵢ | good/bad spread |
| positiveSideMass / negativeSideMass / anchorMass | mass partition by sign of t | preferred side |
| signedSideImbalance | (M+−M−)/Mtotal | quality metric |
Bands are declarations, not defaults
Explicit bands help downstream compare distribution profiles without smuggling in arbitrary thirds, center zones or equal-width bins.
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 zeroExplicit, bounded axis distribution requests
No full subject × axis Cartesian generation.
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.
Interpretation remains downstream
24.02 gives 24.03/24.04 evidence, not conclusions.
| Module | Owns next | 24.02 does not do it |
|---|---|---|
| 24.03 | Counter-diagonal and tension profiles | No axis role pairing, no controlled-tension target, no stability judgment. |
| 24.04 | Scoring, candidates and tests | No MetricResult, independent vote, target profile or repair generator. |
| 25.* | Flow routes | No path-template coverage or reading-route semantics. |
Mass distribution ≠ quality
These separations are normative and regression-tested.
Exact anchor projection is numeric geometry, not N_A.
Wide or compact distribution has no built-in desirability.
Positive/negative coordinate sign is not good/bad.
24.02 owns zero MetricResult records and zero independent numeric votes.
CANON → LAB → DATA → IDEAS
Perceptual mass models and preferred distribution profiles stay experimental until explicitly sourced.
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.
DATA FOR LAYOUT ENGINE
Machine-readable contract for integration and cross-module audit.
{
"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"
}