COMPO · 23.02 · RADIUS BANDS / ORBITAL GROUPS

Distance groups.
No hidden tolerance.

23.02 переводит точные позиции относительно hub 23.01 в неотрицательные радиусы, применяет только явно заданные radius bands и строит exact-radius rings / orbital groups. Угол, sectors, approximate symmetry и scoring здесь не появляются.

ModuleCompo 23.02
Radiusexact derived
Bandsexplicit only
Approximationdeferred 23.04
Metricsnone
NextSTOP

Radius first. Angle later.

00 / contract
exact 23.00 radial root + exact 23.01 hub descriptor + owner-qualified subject positions → dx / dy → radiusSquared → radius → explicit radius-band assignments → exact-radius rings → non-scoring orbital groups NO polar angle NO angular spacing / sectors NO approximate-radius tolerance NO target fit / MetricResult / generator

One owner for radial distance grouping

01 / ownership
OWNS

Distance + radial grouping

Derived radius observations, explicit interval bands, exact-radius rings, band-backed orbital groups, immutable attachment and all local identity/status/provenance rules.

DOES NOT OWN

Angle + quality

Polar angle, angular sectors, approximate-ring tolerance, perceptual ring merge, target fit, MetricResult, candidate generation, symmetry, visual mass, hierarchy or beauty.

Hub lineage must be exact

02 / 23.00 + 23.01
ROOT

23.00 exact bundle

Schema, seed, subject set, coordinate frame and one exact position binding per radial subject must remain consistent.

HUB

23.01 exact descriptor

Hub descriptor and attachment must reference the same radial system, scope, snapshot, coordinate frame and unit.

NO SUBSTITUTE

Centroid ≠ hub

Topic22 visual centroid, frame origin, viewport center and arbitrary point cannot silently replace the resolved 23.01 hub.

Euclidean radius is descriptive geometry

03 / radius observations
RadialRadiusObservation {
  radialSystemRef,
  scopeRef, snapshotRef,
  subjectRef,
  coordinateFrameRef, unitRef,
  positionRef, positionOwnerRef,
  hubDescriptorRef,
  dx, dy,
  radiusSquared,
  radius,
  derivedFrom[],
  provenance: DERIVED,
  status,
  mutationAllowed: false
}
dx = x - hub.x dy = y - hub.y radiusSquared = dx² + dy² radius = √radiusSquared radius = 0 is valid geometry. radius = 0 != N_A. 23.02 deliberately does NOT call atan2.

Radius bands are explicit intervals

04 / band definitions
EXPLICIT

No hidden ring thresholds

Every band has an explicit owner/source, nonnegative min/max radius and explicit lower/upper inclusion flags. No k-means, quantiles or “natural” gaps are inferred.

AMBIGUITY

Multiple matches stay N_A

If one radius belongs to multiple declared bands, assignment is AMBIGUOUS/N_A. Source order, confidence, narrower interval or lexical band name never selects a winner.

RadialRadiusBandDefinition {
  bandRef,
  radialSystemRef,
  scopeRef, snapshotRef,
  coordinateFrameRef, unitRef,
  minRadius, maxRadius,
  lowerInclusive, upperInclusive,
  sourceRef, sourceOwnerRef,
  provenance,
  status,
  mutationAllowed: false
}

Band assignment preserves gaps

05 / exact interval membership
ResultConditionStatus
ASSIGNEDExactly one explicit interval contains the radius.OK
UNASSIGNEDNo explicit interval contains the radius.OK
AMBIGUOUSTwo or more explicit intervals contain the radius.N_A
UNASSIGNED != failure UNASSIGNED != bad composition UNASSIGNED != zero radius A band is a declared radial partition, not a desirability class.

Exact rings need no tolerance

06 / exact-radius groups
EXACT_RADIUS_RING

At least two subjects have exactly equal derived radiusSquared. Their ring descriptor records the exact common radius. This is deterministic geometry.

NOT HERE

Near-equal radii, perceptual ring tolerance, fuzzy clustering and “close enough” merge belong to 23.04 and require explicit approximation policy.

radiusSquared_A === radiusSquared_B → exact-radius relation is available |radius_A - radius_B| < ε → NOT canonical in 23.02 → ε is not invented here

RadialGroupDescriptor stays non-scoring

07 / orbital groups
RadialGroupDescriptor {
  groupRef,
  groupKind: EXACT_RADIUS_RING | RADIUS_BAND_GROUP,
  radialSystemRef,
  scopeRef, snapshotRef,
  coordinateFrameRef, unitRef,
  subjectRefs[],
  exactRadius,          // only exact ring
  radiusBandRef,        // only band group
  observedMinRadius,
  observedMaxRadius,
  sourceRadiusObservationRefs[],
  provenanceSet[],
  status,
  mutationAllowed: false
}
RadialGroupDescriptor != hierarchy group != symmetry class != angular sector != style quality != score A subject may appear in: 1 exact-radius ring descriptor and 1 explicit band-backed descriptor. These are different descriptive relations, not double votes.

Bounded and deterministic

08 / policy
BANDS

0..512

Overflow becomes N_A without truncation. Definitions remain explicit-only.

SUBJECTS

1..4096

One exact position/radius observation per selected root subject. Missing or conflicting lineage is preserved.

GROUPS

0..4096

Derived exact-ring and band groups are bounded. No Cartesian subject×band candidate generator exists.

Attachment is immutable

09 / root preserved
RadialRadiusBandAttachment {
  radialSystemSeedRef,
  hubDescriptorRef,
  radiusObservationSetRef,
  radiusBandSetRef,
  orbitalGroupSetRef,
  status,
  mutationAllowed: false
}

Compo23.00 RadialSystemSeed.radiusBandAttachmentRef
remains unchanged in-place.

Angular structure remains downstream

10 / next owners
23.02Distance from hub, explicit radius bands, exact-radius rings and orbital groups.
23.03Polar angle, angular spacing, angular sectors and sector occupancy.
23.04Approximation/tolerance, target fit, MetricResult, bounded generator and final tests.

Radius does not smuggle interpretation

11 / critical firewalls
Canonical here

Exact hub lineage, Euclidean radius, explicit bands, exact equal-radius rings, descriptive orbital groups and immutable attachments.

Forbidden shortcuts

Angle/sector derivation, approximate-ring tolerance, hidden band discovery, band-as-quality, radius-as-importance, mass centroid import, symmetry score, radial score or generator.

radius != angle radius != mass radius != importance ring != sector band != quality N_A != 0 INVALID != 0 descriptor != score local != global geometry != interpretation correction request != foreign mutation

CANON → LAB → DATA → IDEAS

12 / mandatory hooks
IDEAS_REFS[]Nested rings, ring density, radial layering, sparse orbits, hub-adjacent objects, discontinuous bands.
DATA_CAPTURE[]Hub lineage, dx/dy, radii, exact ring membership, explicit band assignments and ambiguity cases.
DEFERRED_SEMANTIC_INPUTS[]Perceptual ring tolerance, target ring spacing, style intent and desired occupancy remain downstream.
HUMAN_FEEDBACK_HOOKS[]Band boundary, unit, hub-lineage and grouping corrections.
CONFLICT_PRIORITY_ASSUMPTIONS[]No band/source/confidence ordering breaks multiple-match ambiguity.
LAB_HOOKS[]Perceived ring grouping versus exact radius, tolerance psychophysics and orbital density studies.

23.02 regression suite

13 / deterministic tests

Tests cover exact 23.00/23.01 lineage, zero-radius validity, Euclidean distance math, explicit interval boundaries, band gaps, ambiguity preservation, exact equal-radius rings, band-backed groups, immutable attachment, zero metrics, no angle/sector API and strict 23.03–23.04 ownership boundaries.

Tests not run yet.

DATA FOR LAYOUT ENGINE

14 / machine contract
{
  "module": "Compo 23.02",
  "name": "radius_bands_and_orbital_groups",
  "version": "1.0-canonical",
  "canonical_main_title": "Radius bands and orbital groups",
  "topic": "23_РАДИАЛЬНЫЙ_БАЛАНС_И_ЦЕНТРАЛЬНЫЕ_СИСТЕМЫ",
  "scope": "EXACT_COMPO23_00_ROOT_AND_COMPO23_01_HUB_LINEAGE_DERIVED_NONNEGATIVE_RADII_EXPLICIT_RADIUS_BANDS_EXACT_RADIUS_RINGS_AND_NONSCORING_ORBITAL_GROUP_DESCRIPTORS_ONLY_WITHOUT_ANGLE_SECTORS_TOLERANCE_OR_SCORING",
  "main_topic_contract": {
    "topic_title": "Радиальный баланс и центральные системы",
    "topic_goal": "Формализует радиальные композиции: hub, rings, radius bands, angular sectors и распределение элементов вокруг центра.",
    "expected_output": "RadialGroupDescriptor, hub, rings, sectors",
    "planned_files": [
      "23.00 Radial system schema",
      "23.01 Hub/center detection",
      "23.02 Radius bands and orbital groups",
      "23.03 Angular spacing / sector occupancy",
      "23.04 Scoring, generator and tests"
    ]
  },
  "ownership": {
    "owner": "Compo23.02",
    "owns": [
      "RadialRadiusObservation",
      "RadialRadiusObservationSet",
      "RadialRadiusBandDefinition",
      "RadialRadiusBandPolicy",
      "RadialRadiusBandAssignment",
      "RadialRadiusBandSet",
      "RadialOrbitalGroupKind taxonomy",
      "RadialGroupDescriptor",
      "RadialOrbitalGroupSet",
      "RadialRadiusBandAttachment",
      "exact Euclidean distance-from-hub derivation without angle",
      "explicit interval-based radius-band assignment with ambiguity preservation",
      "exact equal-radius ring grouping without tolerance",
      "band-backed orbital grouping without quality interpretation",
      "identity/status/provenance rules for Topic23 radial-distance layer",
      "non-mutating correction request for radius/band/group lineage"
    ],
    "does_not_own": [
      "RadialSystemSchema / RadialSystemSeed identity — Compo23.00",
      "hub detection / hub truth — Compo23.01",
      "raw point geometry or foreign position identities — upstream geometry owners",
      "polar angle, angular spacing, angular sectors or sector occupancy — Compo23.03",
      "approximate-radius tolerance, fuzzy ring merge, target fit, scoring, MetricResult or generator — Compo23.04",
      "visual center of mass, moments and counterweights — Topic22",
      "mirror symmetry and symmetric-balance scoring — Topic21",
      "hierarchy, dominance, semantic importance, beautyScore or final-layout ranking",
      "foreign geometry/style/semantic mutation"
    ]
  },
  "consumes": [
    "exact Compo23.00 root bundle: RadialSystemSchema, RadialSystemSeed, RadialSubjectSet, RadialCoordinateFrameBinding, RadialPositionBinding[]",
    "exact Compo23.01 hub layer: RadialHubDescriptor + RadialHubAttachment",
    "owner-qualified RadialPositionObservation[] resolving exact 23.00 position bindings",
    "optional explicit RadialRadiusBandDefinition[] and bounded policies"
  ],
  "provides": [
    "RadialRadiusObservation[]",
    "RadialRadiusObservationSet",
    "RadialRadiusBandDefinition[]",
    "RadialRadiusBandAssignment[]",
    "RadialRadiusBandSet",
    "RadialGroupDescriptor[]",
    "RadialOrbitalGroupSet",
    "RadialRadiusBandAttachment"
  ],
  "owns_metrics": [],
  "independent_numeric_votes": 0,
  "status_semantics": {
    "OK": "valid exact local radius/band/group descriptor",
    "N_A": "missing/conflicting/ambiguous/not-applicable evidence; never numeric zero",
    "INVALID": "malformed or impossible record; never numeric zero"
  },
  "radius_rules": [
    "dx = subject.x - hub.x",
    "dy = subject.y - hub.y",
    "radiusSquared = dx^2 + dy^2",
    "radius = sqrt(radiusSquared)",
    "radius >= 0 and radius=0 is valid",
    "no angle is computed in 23.02"
  ],
  "band_policy": {
    "definitionMode": "EXPLICIT_INTERVALS_ONLY",
    "multipleMatchMode": "N_A_NO_GUESS",
    "gapMode": "UNASSIGNED_OK",
    "maxBands": [
      0,
      512
    ],
    "maxRadiusObservations": [
      1,
      4096
    ],
    "maxOrbitalGroups": [
      0,
      4096
    ],
    "overflow": "N_A_WITHOUT_TRUNCATION",
    "autoBandDiscovery": false,
    "autoTolerance": false,
    "autoApproximateRingMerge": false,
    "autoScoring": false
  },
  "orbital_group_kinds": [
    "EXACT_RADIUS_RING",
    "RADIUS_BAND_GROUP"
  ],
  "group_rules": [
    "EXACT_RADIUS_RING requires at least two subjects with exactly equal derived radiusSquared; no tolerance",
    "RADIUS_BAND_GROUP groups subjects with one unambiguous explicit band assignment",
    "a subject may appear in an exact-radius ring and a band-backed group because these are distinct descriptors, not independent scores",
    "singleton explicit band groups are valid descriptive groups",
    "unassigned band membership is valid and does not imply error or low quality",
    "ambiguous multiple-band membership is N_A and is never resolved by source order/confidence"
  ],
  "root_attachment_contract": {
    "radialSystemSeedRef": "exact Compo23.00 seed lineage",
    "hubDescriptorRef": "exact Compo23.01 hub descriptor identity",
    "radiusObservationSetRef": "exact Compo23.02 radius set identity",
    "radiusBandSetRef": "exact Compo23.02 band set identity",
    "orbitalGroupSetRef": "exact Compo23.02 group set identity",
    "rootMutation": false,
    "metricResultRefs": []
  },
  "firewalls": [
    "radius != angle",
    "radius != visual mass",
    "radius != hierarchy or importance",
    "radius=0 != N_A",
    "equal radius != equal shape/color/semantic role",
    "exact-radius ring != approximate ring",
    "radius band != quality band",
    "band midpoint is not inferred as target",
    "unassigned band != bad composition",
    "multiple band match -> N_A, not winner selection",
    "orbital group != angular sector",
    "orbital group != symmetry class",
    "descriptor != score",
    "N_A != 0",
    "INVALID != 0",
    "heuristic != law",
    "local != global",
    "geometry != interpretation",
    "correction request != foreign mutation"
  ],
  "topic23ProgressAfterThisModule": "3/5 local",
  "next_module": "Compo 23.03 — Angular spacing / sector occupancy",
  "hard_stop": "No 23.03–23.04 implementation in this file"
}
VISITS / ...