Axis identity before correspondence
Geometry representation only
21.00
Subject eligibility, coordinate-frame binding, explicit axis declarations, canonical line representation, exact geometry deduplication, bounded axis set and immutable Topic21 seed.
Downstream + foreign
Mirror correspondences, visual mass, channel symmetry, approximate error/tolerance, intentional violation judgement, asymmetrical balance, radial balance, aesthetic scoring or final-layout ranking.
Subjects are explicit
Opaque identity
21.00 receives object/element identity from its owner and does not redefine object semantics.
Appearance is insufficient
Position, shape, size, color, visual mass or hierarchy do not automatically make an element a Topic21 subject.
Explicit selection
No full scene expansion and no automatic subject×axis Cartesian product.
Every axis lives in one frame
SymmetryCoordinateFrameBinding {
scopeRef,
snapshotRef,
coordinateFrameRef,
coordinateFrameOwnerRef,
unitRef,
frameContextRef,
dimensionality: 2,
provenance,
status,
mutationAllowed: false
}
One line equation, one reflection axis
| Axis role | Meaning in 21.00 | Not implied |
|---|---|---|
| OBSERVATION_CANDIDATE | Explicit geometry to test downstream. | Best axis / good symmetry. |
| DECLARED_REFERENCE | Owner supplied reference axis. | Universal ideal. |
| GUIDE_ADAPTER | Axis adapted from an owner-qualified guide. | Guide correctness or symmetry. |
| OWNER_DEFINED | Explicit owner-defined candidate role. | Priority over other candidates. |
Sign ambiguity is removed deterministically
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
No automatic horizontal, vertical or frame-center axes.
Same canonical geometry + same role in the same frame becomes one candidate with declaration lineage.
Candidate order is serialization, not ranking.
Overflow returns N_A rather than silently dropping axes.
N_A stays distinct from geometric zero
| No eligibility evidence for requested subject | N_A |
| Eligibility conflict | N_A / CONFLICT |
| Invalid coordinate-frame declaration | INVALID |
| Axis with a=b=0 | INVALID |
| No selected valid axis declarations | N_A |
| Axis-set overflow | N_A; no truncation |
| signedOffset = 0 | OK; valid geometry |
| Two exact equivalent canonical axes | Deduplicated, lineage preserved |
| Symmetry error not yet known | Deferred, not zero |
Topic21 ownership chain stays separated
| 21.00 | Symmetry subjects, coordinate frame and reflection-axis candidates. |
| 21.01 | Reflected-position matching, mirror correspondence and SymmetryRelation[] materialization. |
| 21.02 | Visual-mass symmetry using Compo4-owned mass values. |
| 21.03 | Shape/color/position channel symmetry. |
| 21.04 | Approximate symmetry tolerance, symmetry errors, intentional-violation semantics, scoring/tests. |
| Topic22 | Asymmetric balance, visual center of mass, moments and counterweights. |
| Topic23 | Radial/central systems and angular/ring structure. |
An axis is not a quality judgement
CANON → LAB → DATA → IDEAS
21.00 regression suite
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.
DATA FOR LAYOUT ENGINE
{
"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."
}