COMPO · 23.01 · HUB / CENTER DETECTION

Center from evidence.
Not from habit.

23.01 разрешает hub/center только внутри exact radial root 23.00. Явная координата или явно объявленный hub-subject дают кандидаты; arithmetic mean доступен лишь как отключённая по умолчанию implementation heuristic. Frame origin, viewport center и Topic22 visual centroid никогда не становятся hub автоматически.

ModuleCompo 23.01
Hub evidenceexplicit
Consensusexact only
Mean heuristicopt-in
Metricsnone
NextSTOP

Hub point before polar geometry

00 / contract
exact Compo23.00 root bundle + owner-qualified numeric position observations + explicit hub evidence + optional explicitly-enabled mean heuristic → RadialHubCandidateSet → RadialHubResolution → RadialHubDescriptor → immutable RadialHubAttachment NO ring / radius-band assignment NO polar-angle / sector occupancy NO tolerance-based approximate consensus NO MetricResult / score / layout generator

Hub layer has one owner

01 / ownership
OWNS

Evidence → candidate → hub

Position observations, explicit hub evidence, bounded hub candidates, exact-coordinate consensus, hub descriptor and immutable attachment to the 23.00 seed.

DOES NOT OWN

Rings, sectors or quality

23.02 owns radius/rings, 23.03 owns angles/sectors, 23.04 owns approximation/scoring/generator. Topic22 retains visual mass centroid and moment semantics.

Root bundle is exact

02 / lineage
RadialHubRootBundle {
  schema,          // Compo23.00 RadialSystemSchema
  seed,            // exact schema ref
  subjectSet,      // exact subject set
  frameBinding,    // exact 2D frame
  positionBindings // exact one per subject
}

23.01 validates refs from 23.00.
It does not reconstruct or rewrite root identity.

23.00 stores binding refs in the schema; 23.01 therefore consumes the exact records alongside the schema and validates their canonical refs.

Numeric points are adapters

03 / observed coordinates
BINDING

Exact foreign position

Every observation resolves one exact 23.00 positionRef in the same scope, snapshot and coordinate frame. x/y must be finite numbers.

OWNER

Owner-qualified

positionOwnerRef and coordinateFrameRef must match the foreign binding. 23.01 consumes numeric values but does not claim ownership of upstream geometry.

ZERO IS VALID

(0,0) ≠ N_A

Zero coordinates are legitimate geometry. Missing evidence is N_A; malformed numeric evidence is INVALID.

RadialPositionObservation {
  scopeRef, snapshotRef, subjectRef,
  coordinateFrameRef,
  positionRef, positionOwnerRef,
  x, y, unitRef,
  sourceRef, sourceOwnerRef,
  provenance, status,
  mutationAllowed: false
}

Two explicit hub evidence kinds

04 / declarations
KindMeaningCandidate construction
EXPLICIT_COORDINATEOwner/source explicitly declares x/y as the local radial hub in the exact frame.Uses declared finite x/y directly.
DECLARED_SUBJECT_POSITIONOwner/source explicitly declares an exact 23.00 subject as hub anchor.Resolves that subject's exact RadialPositionObservation.
confidence is diagnostic only confidence != priority source order != priority kind order != priority conflicting explicit hubs → N_A not “highest confidence wins”

Arithmetic mean is opt-in

05 / heuristic
When explicitly enabled

All selected member positions must resolve exactly. Then meanX = Σx/n and meanY = Σy/n creates one bounded candidate with provenance IMPLEMENTATION_HEURISTIC.

Never a hidden default

Mean of member positions is not a perceptual truth, not a visual-mass centroid, not a score, and does not override conflicting explicit evidence.

allowArithmeticMeanCandidate = false // canonical default enabled mean candidate != Topic22 visual center of mass != automatic hub truth != winner over explicit evidence

Candidate set is bounded

06 / deterministic set
RadialHubDetectionPolicy {
  candidateSelectionMode: EXPLICIT_EVIDENCE_ONLY,
  conflictResolutionMode: EXACT_COORDINATE_CONSENSUS_ONLY,
  maxEvidence: 0..128,
  maxCandidates: 1..128,
  maxPositionObservations: 0..4096,
  overflowMode: N_A_WITHOUT_TRUNCATION,
  allowArithmeticMeanCandidate: false,
  autoFrameCenterCandidate: false,
  autoVisualCentroidCandidate: false,
  autoTolerance: false,
  autoScoring: false
}

No Cartesian product, no random seed, no silent truncation. Repeated evidence identity is rejected; distinct evidence may support the same exact point.

Consensus is exact in 23.01

07 / resolution
1 candidateOK. Its exact x/y becomes the local hub point.
same x/yOK. Multiple candidates may corroborate one exact point.
different x/yN_A. No confidence, source or evidence-kind tie-break.
no candidateN_A. Missing hub evidence is not coordinate zero.
exact disagreement in 23.01 != approximate disagreement threshold Approximation/tolerance belongs to 23.04.

Descriptor carries lineage, not quality

08 / output
RadialHubDescriptor {
  radialSystemRef,
  scopeRef, snapshotRef,
  coordinateFrameRef, unitRef,
  x, y,
  supportingHubSubjectRefs[],
  sourceCandidateRefs[],
  basisKinds[],
  heuristicCandidateUsed,
  provenanceSet[],
  status,
  mutationAllowed: false
}
hub point != focal point hub subject != semantic importance hub subject != hierarchy role hub point != symmetric-balance center hub point != visual-mass centroid hub descriptor != score

Attachment does not mutate 23.00

09 / immutable link
RadialHubAttachment {
  radialSystemSeedRef,
  hubDescriptorRef,
  status,
  mutationAllowed: false
}

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

Topic22 centroid is foreign

10 / firewall
Topic22 VisualCentroid: Σ(visualMass_i × position_i) / ΣvisualMass_i 23.01 arithmetic mean candidate: Σ(position_i) / n These are different descriptors, with different owners and semantics. Neither is automatically the radial hub.

Polar decomposition remains downstream

11 / next owners
23.01Exact local hub resolution and hub descriptor attachment.
23.02Distance from resolved hub, radius bands, rings and orbital groups.
23.03Angle about resolved hub, angular spacing, sectors and occupancy.
23.04Approximation/tolerances, target fit, MetricResult, bounded layout generator and final tests.

No hidden center preference

12 / critical firewalls
Canonical here

Exact root lineage, owner-qualified point observations, explicit hub declarations, optional labeled mean heuristic, exact consensus, immutable hub attachment.

Forbidden shortcuts

Viewport center, frame origin, highest-confidence winner, source-order priority, visual centroid import, tolerance-based merge, ring inference, sector inference, radial quality score.

(0,0) can be a valid hub N_A != 0 INVALID != 0 heuristic != law descriptor != score local != global geometry != interpretation correction request != foreign mutation

CANON → LAB → DATA → IDEAS

13 / mandatory hooks
IDEAS_REFS[]Multi-hub ambiguity, declared-vs-perceived center, nested radial systems, off-center hubs, center drift, hubless radial impressions.
DATA_CAPTURE[]Root lineage, numeric point observations, evidence kinds, candidate disagreement and resolved hub points.
DEFERRED_SEMANTIC_INPUTS[]Approximation tolerance, style intent, perceptual center and target-fit semantics remain downstream.
HUMAN_FEEDBACK_HOOKS[]Hub evidence, point observation and frame corrections.
CONFLICT_PRIORITY_ASSUMPTIONS[]No source/confidence/kind ordering breaks exact disagreement.
LAB_HOOKS[]Perceived hub versus geometric estimator, off-axis center and multi-center studies.

23.01 regression suite

14 / deterministic tests

Tests cover exact 23.00 lineage, numeric coordinate adapters, explicit evidence kinds, declared-subject resolution, optional mean heuristic, exact consensus/conflict preservation, zero coordinates, immutable attachment, zero metrics, Topic22 firewall and strict 23.02–23.04 ownership boundaries.

Tests not run yet.

DATA FOR LAYOUT ENGINE

15 / machine contract
{
  "module": "Compo 23.01",
  "name": "hub_center_detection",
  "version": "1.0-canonical",
  "canonical_main_title": "Hub/center detection",
  "topic": "23_РАДИАЛЬНЫЙ_БАЛАНС_И_ЦЕНТРАЛЬНЫЕ_СИСТЕМЫ",
  "scope": "EXACT_RADIAL_ROOT_LINEAGE_OWNER_QUALIFIED_POSITION_OBSERVATIONS_EXPLICIT_HUB_EVIDENCE_OPTIONAL_EXPLICITLY_ENABLED_ARITHMETIC_MEAN_CANDIDATE_EXACT_CENTER_CONSENSUS_AND_IMMUTABLE_HUB_ATTACHMENT_ONLY",
  "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.01",
    "owns": [
      "RadialPositionObservation adapter",
      "RadialHubEvidenceKind taxonomy",
      "RadialHubEvidence",
      "RadialHubCandidateKind taxonomy",
      "RadialHubCandidate",
      "RadialHubDetectionPolicy",
      "RadialHubCandidateSet",
      "RadialHubResolution",
      "RadialHubDescriptor",
      "RadialHubAttachment",
      "exact hub-point consensus resolution",
      "optional explicitly-enabled arithmetic-mean-of-member-positions center candidate",
      "identity/status/provenance rules for Topic23 hub layer",
      "non-mutating correction request for hub/position evidence"
    ],
    "does_not_own": [
      "RadialSystemSchema / RadialSystemSeed identity — Compo23.00",
      "raw point geometry or foreign position identities — upstream geometry owners",
      "visual center of mass / mass weighting / moments — Topic22",
      "polar radius, rings, radius bands, orbital groups — Compo23.02",
      "polar angle, angular spacing, sector occupancy — Compo23.03",
      "approximation tolerance, target fit, scoring, MetricResult or layout candidate generator — Compo23.04",
      "symmetric balance / mirror correspondence — Topic21",
      "dominance / hierarchy / semantic importance / beautyScore / final-layout ranking",
      "foreign geometry/style/semantic mutation"
    ]
  },
  "consumes": [
    "exact Compo23.00 root bundle: RadialSystemSchema, RadialSystemSeed, RadialSubjectSet, RadialCoordinateFrameBinding, RadialPositionBinding[]",
    "owner-qualified numeric position observations resolving exact foreign positionRef values",
    "explicit hub evidence: EXPLICIT_COORDINATE or DECLARED_SUBJECT_POSITION",
    "optional explicit policy enabling arithmetic-mean center candidate"
  ],
  "provides": [
    "RadialPositionObservation[]",
    "RadialHubEvidence[]",
    "RadialHubCandidateSet",
    "RadialHubResolution",
    "RadialHubDescriptor",
    "RadialHubAttachment"
  ],
  "owns_metrics": [],
  "independent_numeric_votes": 0,
  "status_semantics": {
    "OK": "valid exact local hub resolution or valid record",
    "N_A": "missing/conflicting/not-applicable evidence; never numeric zero",
    "INVALID": "malformed or impossible record; never numeric zero"
  },
  "hub_evidence_kinds": [
    "EXPLICIT_COORDINATE",
    "DECLARED_SUBJECT_POSITION"
  ],
  "hub_candidate_kinds": [
    "EXPLICIT_COORDINATE",
    "DECLARED_SUBJECT_POSITION",
    "ARITHMETIC_MEAN_MEMBER_POSITIONS"
  ],
  "policy": {
    "candidateSelectionMode": "EXPLICIT_EVIDENCE_ONLY by default",
    "conflictResolutionMode": "EXACT_COORDINATE_CONSENSUS_ONLY",
    "maxEvidence": [
      0,
      128
    ],
    "maxCandidates": [
      1,
      128
    ],
    "maxPositionObservations": [
      0,
      4096
    ],
    "overflow": "N_A_WITHOUT_TRUNCATION",
    "allowArithmeticMeanCandidate": false,
    "autoFrameCenterCandidate": false,
    "autoVisualCentroidCandidate": false,
    "autoTolerance": false,
    "autoScoring": false
  },
  "resolution_rules": [
    "one valid candidate -> exact local hub point",
    "multiple candidates with exactly equal x/y -> exact consensus hub point",
    "multiple candidates with different x/y -> N_A; confidence/source order does not select a winner",
    "no valid candidates -> N_A",
    "invalid selected evidence/observation -> INVALID",
    "arithmetic mean is an IMPLEMENTATION_HEURISTIC and exists only when explicitly enabled"
  ],
  "root_attachment_contract": {
    "radialSystemSeedRef": "exact Compo23.00 seed lineage",
    "hubDescriptorRef": "exact Compo23.01 descriptor identity",
    "rootMutation": false,
    "metricResultRefs": []
  },
  "firewalls": [
    "coordinate-frame origin != hub",
    "frame center != hub",
    "viewport center != hub",
    "unweighted arithmetic mean candidate != Topic22 visual center of mass",
    "arithmetic mean candidate != truth and is disabled by default",
    "hub point != focal point",
    "hub point != semantic importance",
    "hub subject != hierarchy role",
    "hub subject != required content",
    "hub resolution != ring membership",
    "hub resolution != sector membership",
    "exact coordinate conflict != approximate agreement",
    "confidence != conflict winner",
    "source order != priority",
    "N_A != 0",
    "INVALID != 0",
    "descriptor != score",
    "heuristic != law",
    "local != global",
    "geometry != interpretation"
  ],
  "topic23ProgressAfterThisModule": "2/5 local",
  "next_module": "Compo 23.02 — Radius bands and orbital groups",
  "hard_stop": "No 23.02–23.04 implementation in this file"
}
VISITS / ...