COMPO · 21.00 · SYMMETRY AXIS MODEL

Declare the axis.
Prove nothing yet.

21.00 открывает Topic 21 и создаёт точную root-модель осевой отражательной симметрии: explicit subjects, owner-qualified 2D coordinate frame и явно заявленные axis candidates. Ось хранится как каноническое уравнение прямой. Никакие mirrored pairs, mass/channel comparisons, approximate tolerances, symmetry errors или quality scores здесь ещё не вычисляются.

ModuleCompo 21.00
Geometry2D reflection line
Axesexplicit only
Pairsdeferred 21.01
Metricsnone
Next21.01

Axis identity before correspondence

00 / contract
explicit symmetry subjects + explicit owner-qualified 2D coordinate frame + explicit axis declarations → canonical reflection-axis candidates → SymmetryAxisSet → SymmetryAxisSystemSeed 21.00 stops here. NO reflected subject points NO mirror pairing NO SymmetryRelation NO mass symmetry NO shape/color/position symmetry NO approximate tolerance NO symmetry error NO MetricResult

Geometry representation only

01 / ownership
OWNS

21.00

Subject eligibility, coordinate-frame binding, explicit axis declarations, canonical line representation, exact geometry deduplication, bounded axis set and immutable Topic21 seed.

DOES NOT OWN

Downstream + foreign

Mirror correspondences, visual mass, channel symmetry, approximate error/tolerance, intentional violation judgement, asymmetrical balance, radial balance, aesthetic scoring or final-layout ranking.

Axis candidate is only a hypothesis/reference geometry. Its existence does not prove that any subject has a reflected counterpart and does not imply that symmetry is desirable.

Subjects are explicit

02 / subject set
SymmetrySubjectEligibilityEvidence → exact scope + snapshot + subject → conflict-preserving resolution → SymmetrySubject → explicit selected subject set missing evidence → N_A conflicting eligible / ineligible evidence → N_A invalid evidence record → INVALID overflow → N_A, no truncation
YES

Opaque identity

21.00 receives object/element identity from its owner and does not redefine object semantics.

NO INFERENCE

Appearance is insufficient

Position, shape, size, color, visual mass or hierarchy do not automatically make an element a Topic21 subject.

BOUNDED

Explicit selection

No full scene expansion and no automatic subject×axis Cartesian product.

Every axis lives in one frame

03 / coordinate frame
SymmetryCoordinateFrameBinding {
  scopeRef,
  snapshotRef,
  coordinateFrameRef,
  coordinateFrameOwnerRef,
  unitRef,
  frameContextRef,
  dimensionality: 2,
  provenance,
  status,
  mutationAllowed: false
}
NO silent px ↔ normalized conversion NO silent local ↔ global frame conversion NO inferred handedness / reading direction NO automatic canvas-center semantics Different coordinateFrameRef or unitRef → different geometric context.

One line equation, one reflection axis

04 / axis declaration
Input declaration: a·x + b·y = c hypot(a,b) > 0 Canonical candidate: nₓ·x + nᵧ·y = d hypot(nₓ,nᵧ) = 1 axis direction: v = (-nᵧ, nₓ) The stored line is infinite. Segment bounds, guide extents and visible strokes are NOT part of axis identity.
Axis roleMeaning in 21.00Not implied
OBSERVATION_CANDIDATEExplicit geometry to test downstream.Best axis / good symmetry.
DECLARED_REFERENCEOwner supplied reference axis.Universal ideal.
GUIDE_ADAPTERAxis adapted from an owner-qualified guide.Guide correctness or symmetry.
OWNER_DEFINEDExplicit owner-defined candidate role.Priority over other candidates.

Sign ambiguity is removed deterministically

05 / canonicalization
(a,b,c) → divide by hypot(a,b) → (nₓ,nᵧ,d) Because (n,d) and (-n,-d) describe the same line: if first non-zero component of (nₓ,nᵧ) is negative → multiply nₓ,nᵧ,d by -1. Examples: x = 0 → (1,0,0) -2x = -8 → (1,0,4) y = 3 → (0,1,3) This canonicalization is representation hygiene. It is NOT approximate-symmetry tolerance.
Zero is valid. signedOffset = 0 means the axis passes through the coordinate-frame origin. It must never be rewritten as N_A.

Candidate set is explicit and bounded

06 / axis set
Explicit only

No automatic horizontal, vertical or frame-center axes.

Exact dedup

Same canonical geometry + same role in the same frame becomes one candidate with declaration lineage.

No best-axis search

Candidate order is serialization, not ranking.

No truncation

Overflow returns N_A rather than silently dropping axes.

SymmetryAxisSetPolicy { selectionMode: EXPLICIT_AXIS_DECLARATIONS_ONLY, maxAxes: 1..1024, autoFrameCenterAxes: false, autoBestAxisSearch: false, autoPairGeneration: false, fullCartesian: false, overflowMode: N_A_NO_TRUNCATION }

N_A stays distinct from geometric zero

07 / status
No eligibility evidence for requested subjectN_A
Eligibility conflictN_A / CONFLICT
Invalid coordinate-frame declarationINVALID
Axis with a=b=0INVALID
No selected valid axis declarationsN_A
Axis-set overflowN_A; no truncation
signedOffset = 0OK; valid geometry
Two exact equivalent canonical axesDeduplicated, lineage preserved
Symmetry error not yet knownDeferred, not zero

Topic21 ownership chain stays separated

08 / next owners
21.00Symmetry subjects, coordinate frame and reflection-axis candidates.
21.01Reflected-position matching, mirror correspondence and SymmetryRelation[] materialization.
21.02Visual-mass symmetry using Compo4-owned mass values.
21.03Shape/color/position channel symmetry.
21.04Approximate symmetry tolerance, symmetry errors, intentional-violation semantics, scoring/tests.
Topic22Asymmetric balance, visual center of mass, moments and counterweights.
Topic23Radial/central systems and angular/ring structure.

An axis is not a quality judgement

09 / firewalls
axis candidate != symmetry proof axis candidate != mirror correspondence axis candidate != symmetry error axis candidate != symmetry score declared reference axis != universal ideal frame center != automatic axis vertical/horizontal appearance != inferred axis label reflection symmetry != asymmetric balance reflection symmetry != radial/rotational balance 21.00 owns_metrics = [] 21.00 independent numeric votes = 0 21.00 SymmetryRelation[] = deferred 21.00 symmetry errors = deferred N_A != 0 INVALID != 0 local != global geometry != interpretation descriptor != score heuristic != law correction request != foreign mutation module execution order != rule priority no universal beautyScore

CANON → LAB → DATA → IDEAS

10 / mandatory hooks
IDEAS_REFS[]Perceived-axis and multi-axis studies.
DATA_CAPTURE[]Subjects, frames, declarations and canonical axes.
DEFERRED_SEMANTIC_INPUTS[]Pairs, mass/channels, errors and scoring.
HUMAN_FEEDBACK_HOOKS[]Subject/frame/axis corrections.
CONFLICT_PRIORITY_ASSUMPTIONS[]No source/order winner.
LAB_HOOKS[]Axis recall, scope and intentional-offset studies.

21.00 regression suite

11 / deterministic tests

Tests cover eligibility conflict preservation, explicit frame identity, normalized line geometry, sign canonicalization, zero-offset validity, exact candidate deduplication, bounded selection, immutable root seed, zero metrics, Topic22/23 firewalls and hard stops for 21.01–21.04.

Tests not run yet.

DATA FOR LAYOUT ENGINE

12 / machine contract
{
  "module": "Compo 21.00",
  "name": "symmetry_axis_model",
  "version": "1.0-canonical",
  "canonical_main_title": "Symmetry axis model",
  "topic": "21_СИММЕТРИЧНЫЙ_БАЛАНС",
  "scope": "EXPLICIT_SYMMETRY_SUBJECTS_OWNER_QUALIFIED_2D_COORDINATE_FRAME_BINDINGS_AND_CANONICAL_REFLECTION_AXIS_CANDIDATES_ONLY_WITHOUT_MIRROR_CORRESPONDENCE_MASS_OR_CHANNEL_SYMMETRY_APPROXIMATION_OR_SCORING",
  "main_topic_contract": {
    "topic_title": "Симметричный баланс",
    "topic_goal": "Измеряет осевую и зеркальную симметрию по позиции, форме, массе и цвету, включая approximate symmetry и намеренные нарушения.",
    "expected_output": "SymmetryRelation[], axis candidates, symmetry errors",
    "planned_files": [
      "21.00 Symmetry axis model",
      "21.01 Mirror correspondence",
      "21.02 Mass symmetry",
      "21.03 Channel symmetry: shape/color/position",
      "21.04 Approximate symmetry, scoring/tests"
    ]
  },
  "ownership": {
    "owner": "Compo21.00",
    "owns": [
      "SymmetrySubjectEligibilityEvidence",
      "SymmetrySubjectEligibilityResolution",
      "SymmetrySubject",
      "SymmetrySubjectSetPolicy",
      "SymmetrySubjectSet",
      "SymmetryCoordinateFrameBinding",
      "SymmetryAxisRole taxonomy",
      "SymmetryAxisDeclaration",
      "SymmetryAxisCandidate",
      "SymmetryAxisSetPolicy",
      "SymmetryAxisSet",
      "SymmetryAxisSystemSeed root identity",
      "canonical 2D reflection-axis representation as a normalized line equation",
      "deterministic sign canonicalization and exact geometry deduplication",
      "identity/status/provenance rules for Topic21 axis layer",
      "non-mutating correction request for subject/frame/axis declaration errors"
    ],
    "does_not_own": [
      "mirror correspondence / SymmetryRelation materialization — Compo21.01",
      "visual-mass symmetry — Compo21.02",
      "shape/color/position channel symmetry — Compo21.03",
      "approximate symmetry tolerance / symmetry errors / intentional-violation evaluation / MetricResult scoring — Compo21.04",
      "visual mass values — Compo4",
      "dominance / focal hierarchy — Compo13",
      "multi-signal visual hierarchy — Topic19",
      "asymmetric balance / visual centroid / torque-like moments / counterweights — Topic22",
      "radial / rotational balance — Topic23",
      "global beautyScore",
      "final-layout ranking",
      "foreign geometry/style/semantic mutation"
    ]
  },
  "consumes": [
    "explicit foreign object/element identities",
    "explicit symmetry-subject eligibility evidence",
    "explicit owner-qualified 2D coordinate frame declaration",
    "explicit axis declarations represented by line coefficients a*x + b*y = c",
    "optional declaration role/source/provenance metadata"
  ],
  "provides": [
    "SymmetrySubjectSet",
    "SymmetryCoordinateFrameBinding",
    "SymmetryAxisDeclaration[]",
    "SymmetryAxisCandidate[]",
    "SymmetryAxisSet",
    "SymmetryAxisSystemSeed"
  ],
  "owns_metrics": [],
  "independent_numeric_votes": 0,
  "axis_geometry_contract": {
    "input_equation": "a*x + b*y = c",
    "valid_input": "finite coefficients with hypot(a,b) > 0",
    "canonicalization": "divide a,b,c by hypot(a,b), then flip all signs when the first non-zero canonical normal component is negative",
    "stored_equation": "unitNormalX*x + unitNormalY*y = signedOffset",
    "axis_direction": "(-unitNormalY, unitNormalX)",
    "canonicalization_is_not": "approximate-symmetry tolerance",
    "reflection_math": "deferred to 21.01; unit-normal representation is compatible with p' = p - 2*(n·p-d)*n"
  },
  "axis_roles": [
    "OBSERVATION_CANDIDATE",
    "DECLARED_REFERENCE",
    "GUIDE_ADAPTER",
    "OWNER_DEFINED"
  ],
  "status_semantics": {
    "OK": "explicit compatible evidence / valid frame / valid axis declaration exists",
    "N_A": "missing explicit evidence, missing requested subject, empty selected axis list, or bounded-set overflow; no guessing or truncation",
    "INVALID": "malformed frame, degenerate axis coefficients, invalid enum/provenance, or contradictory root lineage",
    "zero_note": "numeric zero axis offset is valid and distinct from N_A"
  },
  "selection_policy": {
    "subjects": "EXPLICIT_SUBJECTS_ONLY",
    "axes": "EXPLICIT_AXIS_DECLARATIONS_ONLY",
    "auto_frame_center_axes": false,
    "auto_best_axis_search": false,
    "auto_pair_generation": false,
    "full_cartesian": false,
    "overflow": "N_A_NO_TRUNCATION"
  },
  "critical_firewalls": [
    "axis candidate != symmetry proof",
    "axis candidate != mirror correspondence",
    "axis candidate != symmetry score",
    "axis candidate != balance quality",
    "declared reference axis != automatically desirable",
    "frame center != automatic symmetry axis",
    "horizontal/vertical labels are not inferred without explicit frame semantics",
    "zero signedOffset is a valid geometric value and not N_A",
    "no approximate tolerance in 21.00",
    "no nearest-neighbour matching in 21.00",
    "no shape similarity in 21.00",
    "no mass comparison in 21.00",
    "no color/position channel symmetry in 21.00",
    "no symmetry error in 21.00",
    "no intentional-violation judgement in 21.00",
    "reflection symmetry != asymmetric balance",
    "reflection symmetry != radial/rotational balance",
    "visual mass remains Compo4-owned",
    "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 explicit guide axes with axes preferred by human symmetry judgements",
    "IDEA-02 study when composition-frame center axes are useful candidates without canonizing them as defaults",
    "IDEA-03 collect multi-axis compositions before defining best-axis search",
    "IDEA-04 compare exact reflection axes with intentionally offset visual systems",
    "IDEA-05 study local-group symmetry versus whole-composition symmetry"
  ],
  "DATA_CAPTURE": [
    "scopeRef",
    "snapshotRef",
    "symmetrySubjectRefs[]",
    "coordinateFrameBindingRef",
    "axisDeclarationRefs[]",
    "axisCandidateRefs[]",
    "axisRoleByCandidate",
    "unitNormalByCandidate",
    "signedOffsetByCandidate",
    "axisSetRef",
    "symmetryAxisSystemSeedRef",
    "status",
    "reasonCode"
  ],
  "DEFERRED_SEMANTIC_INPUTS": [
    "21.01 mirrored subject pairing and SymmetryRelation[]",
    "21.01 reflected-position residuals",
    "21.02 mass symmetry",
    "21.03 shape/color/position symmetry channels",
    "21.04 approximate tolerance and symmetry errors",
    "21.04 intentional symmetry-breaking target semantics",
    "21.04 scoring and repairs",
    "Topic22 asymmetric-balance descriptors",
    "Topic23 radial/rotational balance"
  ],
  "HUMAN_FEEDBACK_HOOKS": [
    "correct symmetry subject eligibility",
    "correct coordinate frame owner/unit/context",
    "correct axis declaration coefficients",
    "correct axis role",
    "mark axis candidate missing",
    "mark axis candidate extraneous",
    "mark same geometric axis declared through duplicate sources"
  ],
  "CONFLICT_PRIORITY_ASSUMPTIONS": [
    "eligibility confidence does not choose a winner",
    "axis declaration serialization order has no priority",
    "axis role lexical order has no priority",
    "source order does not define authority",
    "module execution order does not imply symmetry priority",
    "multiple valid axes are peers until downstream explicit policy says otherwise"
  ],
  "LAB_HOOKS": [
    "axis-candidate recall study",
    "multi-axis composition study",
    "human perceived-axis annotation study",
    "frame-center default risk study",
    "local-vs-global symmetry scope study",
    "intentional offset symmetry study"
  ],
  "topic21ProgressAfterThisModule": "1/5 local",
  "next_module": "Compo 21.01 — Mirror correspondence",
  "hard_stop": "Do not implement 21.01/21.02/21.03/21.04 in this file."
}
VISITS / ...