Pairwise geometry, not preference
10.01 turns two explicit 10.00 anchor participants into a deterministic raw offset measurement. It never snaps subjects or decides whether the offset is desirable.
left / right / centerX / grid-X
top / bottom / centerY / grid-Y
raw relation evidence only
Allowed semantics
Baseline remains outside this module.
| Axis | Anchor semantics |
|---|---|
| X | LEFT · RIGHT · CENTER_X · GRID_X |
| Y | TOP · BOTTOM · CENTER_Y · GRID_Y |
| Baseline | DEFER → 10.02 |
Homonymous, cross-anchor, reference
The class describes what is being compared; it is not a quality label.
HOMONYMOUS
LEFT↔LEFT, RIGHT↔RIGHT, CENTER_X↔CENTER_X, TOP↔TOP…
CROSS_ANCHOR
LEFT↔RIGHT, CENTER_X↔LEFT, TOP↔BOTTOM… on one axis.
REFERENCE
At least one GRID_X / GRID_Y or GRID_REFERENCE anchor.
INVALID
X↔Y, baseline here, same subject, incompatible lineage.
Canonical signed and absolute offset
Signed direction is based on canonical participantRef order so input order cannot change the result.
EPS is not design tolerance
Numerical coincidence prevents floating-point noise from becoming a fake geometric distinction.
NumericalPolicy {
policyRef,
absEpsRaw,
relEps,
provenance
}
Missing is not zero
Unknown coordinate and incompatible evidence are intentionally different outcomes.
Grid is evidence, not re-owned topology
Objects/text can align to an explicit grid reference while Topic8/9 retain grid ownership.
Input order invariance
A↔B and B↔A are the same pairwise relation and the same measurement lineage.
Child-module firewall
10.01 does not consume future ownership just because raw geometry is available.
| Question | Owner |
|---|---|
| Alignment taxonomy / root identity | 10.00 |
| Pairwise geometric X/Y offsets | 10.01 |
| Text baseline relations | 10.02 |
| Shared axes for 2+ subjects | 10.03 |
| Tolerance / optical / local score | 10.04 |
New cross-cutting contract
The raw measurement is preserved so future LAB/human/model layers can distinguish anchor choice, geometry and context.
Why did a person reject it?
Human feedback remains evidence, not an automatic canon change.
Request, never snap
10.01 cannot move a subject into alignment.
AlignmentMeasurementRepairRequest {
repairRequestRef,
measurementRef,
reasonCode,
targetOwnerRef,
sourceEvidenceRefs[],
suggestedAction,
mutationAllowed: false,
provenance: DERIVED
}
Zero offset is not beauty
An exact relation can be semantically wrong, optically undesirable or intentionally broken.
Geometric relation cases
The lab distinguishes exact geometry, cross-anchor alignment, grid reference and semantic/optical deferral.
10.01 pairwise relation regression
Tests cover geometry, lineage, N/A, numerical stability, relation classes, order invariance, new data hooks and ownership barriers.
DATA FOR LAYOUT ENGINE
Machine-readable 10.01 contract.
{
"module": "Compo 10.01",
"name": "left_right_center_top_bottom_relations",
"version": "1.0-canonical",
"canonical_main_title": "Left/right/center/top/bottom relations",
"topic": "10_БАЗОВЫЕ_ЛИНИИ_И_ВЫРАВНИВАНИЕ",
"scope": "PAIRWISE_GEOMETRIC_ALIGNMENT_MEASUREMENT_FOR_EDGE_CENTER_AND_XY_REFERENCE_ANCHORS",
"review_basis": {
"public_MAIN": "10.01 exact title confirmed; Topic10 output requires AlignmentRelation[]",
"previous_module": "Compo10.00 Alignment taxonomy",
"related_owners_reviewed": [
"Compo8.02 GridLine/GridNode ownership",
"Compo9.01 atomic Cell geometry/addressing",
"Compo9.03 ModularGrid occupancy/collision boundary",
"Compo10.00 AlignmentRelation/participant/anchor taxonomy"
],
"cross_cutting_instruction": "COMPO project instruction v2.0",
"ideas_register": "COMPO_IDEAS reviewed before implementation"
},
"consumes": [
"Compo10.00.AlignmentRelation root shell",
"Compo10.00.AlignmentParticipant[2]",
"Compo10.00.AlignmentAnchorEvidence[2]",
"explicit NumericalPolicy",
"optional opaque semanticConstraintRefs[]"
],
"provides": [
"GeometricAlignmentMeasurement",
"PairwiseGeometricAlignmentRelation",
"AlignmentRelationClass",
"NumericalCoincidenceDescriptor",
"AlignmentMeasurementRepairRequest",
"serializable alignment observation record"
],
"owns_metrics": [],
"descriptors_only": [
"alignment.pair.anchorKindA",
"alignment.pair.anchorKindB",
"alignment.pair.relationClass",
"alignment.pair.signedDeltaRaw",
"alignment.pair.absoluteOffsetRaw",
"alignment.pair.effectiveEpsRaw",
"alignment.pair.numericallyCoincident",
"alignment.pair.coordinateEvidenceMode"
],
"allowed_anchor_semantics": {
"X": [
"LEFT",
"RIGHT",
"CENTER_X",
"GRID_X"
],
"Y": [
"TOP",
"BOTTOM",
"CENTER_Y",
"GRID_Y"
],
"excluded_here": [
"TEXT_BASELINE"
]
},
"relation_class_semantics": {
"HOMONYMOUS_ALIGNMENT": "same non-reference anchor semantic on both subjects",
"CROSS_ANCHOR_ALIGNMENT": "different non-reference anchor semantics on one coordinate axis",
"REFERENCE_ALIGNMENT": "at least one explicit grid/reference anchor participates",
"quality_meaning": "NONE; class is descriptive only"
},
"numerical_policy_schema": {
"policyRef": "required stable ref",
"absEpsRaw": "finite >=0 in exact sourceUnit",
"relEps": "finite >=0 dimensionless",
"effectiveEpsRaw": "max(absEpsRaw, relEps*max(1,abs(coordA),abs(coordB)))",
"purpose": "numerical stability only; not design tolerance",
"provenance": "IMPLEMENTATION_HEURISTIC|STANDARD"
},
"measurement_schema": {
"measurementRef": "stable hash of relationRef + canonical anchor evidence refs + numericalPolicyRef",
"relationRef": "Compo10.00 root identity",
"relationFamily": "PAIRWISE_ANCHOR_ALIGNMENT",
"axisFamily": "INLINE_X|BLOCK_Y|REFERENCE_AXIS",
"canonicalParticipantRefs": "sorted participant refs",
"canonicalSubjectRefs": "subjects in canonical participant order",
"canonicalAnchorRefs": "anchors in canonical participant order",
"anchorKinds": "semantic kinds in canonical participant order",
"relationClass": "HOMONYMOUS_ALIGNMENT|CROSS_ANCHOR_ALIGNMENT|REFERENCE_ALIGNMENT",
"coordinateAxis": "X|Y",
"coordinatePairRaw": "[coord0,coord1] in canonical participant order",
"signedDeltaRaw": "coord1-coord0",
"absoluteOffsetRaw": "abs(signedDeltaRaw)",
"effectiveEpsRaw": "derived from NumericalPolicy",
"numericallyCoincident": "absoluteOffsetRaw<=effectiveEpsRaw",
"coordinateEvidenceModes": "EXACT|FALLBACK|UNSPECIFIED values propagated from evidence where supplied",
"status": "OK|N_A|INVALID",
"confidence": "minimum of relation/anchor evidence confidence",
"provenance": "DERIVED",
"score": "not owned",
"mutationAllowed": false
},
"axis_family_policy": {
"pure_non_reference_X": "INLINE_X",
"pure_non_reference_Y": "BLOCK_Y",
"any_reference_X": "REFERENCE_AXIS",
"any_reference_Y": "REFERENCE_AXIS",
"mixed_X_Y": "INVALID",
"baseline": "DEFER_TO_Compo10.02"
},
"identity_policy": {
"relationRef": "owned by Compo10.00 and symmetric",
"canonical_order": "ascending participantRef",
"measurementRef": "order-invariant because anchor evidence is reordered with canonical participants",
"signed_delta": "order-sensitive only to canonical serialization order, never input order"
},
"topic10_ownership_map": {
"10.00": "taxonomy/root relation/participants/anchor contracts",
"10.01": "pairwise geometric X/Y anchor offsets and numerical coincidence descriptors",
"10.02": "baseline/text alignment",
"10.03": "multi-object shared axes",
"10.04": "design tolerance/optical correction/local alignment score/tests"
},
"metric_policy": {
"direct_scoring": "FORBIDDEN in 10.01",
"zero_offset_is_better": "FORBIDDEN",
"more_alignment_is_better": "FORBIDDEN",
"beautyScore": "FORBIDDEN"
},
"hard_constraints": [
"10.01 owns pairwise geometric alignment measurement for left/right/centerX/top/bottom/centerY and explicit X/Y reference anchors.",
"10.01 consumes the AlignmentRelation root taxonomy and anchor evidence contract from Compo10.00 rather than redefining relation identity.",
"Concrete pairwise relation measurement requires relationFamily=PAIRWISE_ANCHOR_ALIGNMENT.",
"TEXT_BASELINE anchors are not measured by 10.01; Compo10.02 owns baseline/text alignment.",
"Multi-subject shared-axis aggregation is not owned by 10.01; Compo10.03 owns it.",
"Tolerance, optical correction, target interpretation and local alignment scoring are not owned by 10.01; Compo10.04 owns them.",
"Allowed geometric anchor semantics are LEFT, RIGHT, CENTER_X, TOP, BOTTOM, CENTER_Y, GRID_X and GRID_Y.",
"LEFT, RIGHT, CENTER_X and GRID_X are X-coordinate anchors.",
"TOP, BOTTOM, CENTER_Y and GRID_Y are Y-coordinate anchors.",
"A pairwise geometric alignment relation requires exactly two distinct participantRef values and two distinct subjectRef values.",
"Comparing two anchors of the same subject is outside alignment scope and is INVALID rather than becoming implicit width/height measurement.",
"Participant.anchorRef must match the supplied anchor evidence for that participant.",
"Both geometric coordinates must refer to the same canvasRef, coordinateFrame and sourceUnit unless an explicit upstream mapping adapter has already produced same-frame evidence.",
"10.01 performs no implicit unit conversion, canvas mapping or coordinate-frame projection.",
"Missing coordinateRaw yields N_A, not zero.",
"Non-finite coordinateRaw is INVALID.",
"X and Y anchors cannot be compared in the same pairwise relation.",
"The relation axisFamily must match the coordinate axis: INLINE_X for pure geometric X pairs, BLOCK_Y for pure geometric Y pairs, or REFERENCE_AXIS when a grid/reference anchor participates.",
"REFERENCE_AXIS must still contain exactly one coordinate axis; mixed X/Y is INVALID.",
"Pairwise alignment is symmetric. Input participant order must not change relationRef, measurementRef, absolute offset or relation class.",
"Signed delta is deterministic but defined only in canonical participantRef order.",
"signedDeltaRaw = coordinate(second canonical participant) - coordinate(first canonical participant).",
"absoluteOffsetRaw = abs(signedDeltaRaw).",
"The sign of signedDeltaRaw is a canonical serialization direction, not a semantic priority or visual preference.",
"Numerical coincidence uses an explicit NumericalPolicy and must remain separate from design tolerance.",
"NumericalPolicy requires policyRef, absEpsRaw>=0 and relEps>=0.",
"effectiveEpsRaw = max(absEpsRaw, relEps * max(1, abs(coordA), abs(coordB))).",
"numericallyCoincident is true only when absoluteOffsetRaw <= effectiveEpsRaw.",
"Numerical EPS is implementation stability, not a design tolerance and not an aesthetic threshold.",
"Relation class is descriptive only: HOMONYMOUS_ALIGNMENT, CROSS_ANCHOR_ALIGNMENT or REFERENCE_ALIGNMENT.",
"HOMONYMOUS_ALIGNMENT means both anchors use the same non-reference semantic kind.",
"CROSS_ANCHOR_ALIGNMENT means non-reference anchors differ but share the same coordinate axis.",
"REFERENCE_ALIGNMENT means at least one GRID_X/GRID_Y or GRID_REFERENCE anchor participates.",
"Exact geometric coincidence is not universally better than non-zero offset.",
"More pairwise alignment relations are not universally better.",
"10.01 owns no numeric metric and emits no score.",
"10.01 creates no placement candidate and does not mutate any subject position.",
"Grid evidence from Topic8/9 is consumed by reference only; 10.01 does not re-own grid lines, nodes, cells, regions or occupancy.",
"SemanticConstraintRefs remain opaque deferred evidence and are not interpreted by 10.01.",
"A semantic conflict may later invalidate a geometrically exact relation, but 10.01 does not invent that priority.",
"Intentional misalignment may later be preferred by context; 10.01 records geometry only.",
"Module execution order is not rule priority.",
"Correction requests are owner-qualified and mutationAllowed=false.",
"All relation measurements, N_A/INVALID reasons and source evidence must be serializable for DATA/human calibration.",
"IDEA references remain R&D links and are not provenance classes.",
"LAB experiments may compare human judgments of offsets and anchors but do not mutate CANON automatically.",
"N/A != 0.",
"No beautyScore."
],
"hard_rules": [
"10.01 owns pairwise geometric alignment measurement for left/right/centerX/top/bottom/centerY and explicit X/Y reference anchors.",
"10.01 consumes the AlignmentRelation root taxonomy and anchor evidence contract from Compo10.00 rather than redefining relation identity.",
"Concrete pairwise relation measurement requires relationFamily=PAIRWISE_ANCHOR_ALIGNMENT.",
"TEXT_BASELINE anchors are not measured by 10.01; Compo10.02 owns baseline/text alignment.",
"Multi-subject shared-axis aggregation is not owned by 10.01; Compo10.03 owns it.",
"Tolerance, optical correction, target interpretation and local alignment scoring are not owned by 10.01; Compo10.04 owns them.",
"Allowed geometric anchor semantics are LEFT, RIGHT, CENTER_X, TOP, BOTTOM, CENTER_Y, GRID_X and GRID_Y.",
"LEFT, RIGHT, CENTER_X and GRID_X are X-coordinate anchors.",
"TOP, BOTTOM, CENTER_Y and GRID_Y are Y-coordinate anchors.",
"A pairwise geometric alignment relation requires exactly two distinct participantRef values and two distinct subjectRef values.",
"Comparing two anchors of the same subject is outside alignment scope and is INVALID rather than becoming implicit width/height measurement.",
"Participant.anchorRef must match the supplied anchor evidence for that participant.",
"Both geometric coordinates must refer to the same canvasRef, coordinateFrame and sourceUnit unless an explicit upstream mapping adapter has already produced same-frame evidence.",
"10.01 performs no implicit unit conversion, canvas mapping or coordinate-frame projection.",
"Missing coordinateRaw yields N_A, not zero.",
"Non-finite coordinateRaw is INVALID.",
"X and Y anchors cannot be compared in the same pairwise relation.",
"The relation axisFamily must match the coordinate axis: INLINE_X for pure geometric X pairs, BLOCK_Y for pure geometric Y pairs, or REFERENCE_AXIS when a grid/reference anchor participates.",
"REFERENCE_AXIS must still contain exactly one coordinate axis; mixed X/Y is INVALID.",
"Pairwise alignment is symmetric. Input participant order must not change relationRef, measurementRef, absolute offset or relation class.",
"Signed delta is deterministic but defined only in canonical participantRef order.",
"signedDeltaRaw = coordinate(second canonical participant) - coordinate(first canonical participant).",
"absoluteOffsetRaw = abs(signedDeltaRaw).",
"The sign of signedDeltaRaw is a canonical serialization direction, not a semantic priority or visual preference.",
"Numerical coincidence uses an explicit NumericalPolicy and must remain separate from design tolerance.",
"NumericalPolicy requires policyRef, absEpsRaw>=0 and relEps>=0.",
"effectiveEpsRaw = max(absEpsRaw, relEps * max(1, abs(coordA), abs(coordB))).",
"numericallyCoincident is true only when absoluteOffsetRaw <= effectiveEpsRaw.",
"Numerical EPS is implementation stability, not a design tolerance and not an aesthetic threshold.",
"Relation class is descriptive only: HOMONYMOUS_ALIGNMENT, CROSS_ANCHOR_ALIGNMENT or REFERENCE_ALIGNMENT.",
"HOMONYMOUS_ALIGNMENT means both anchors use the same non-reference semantic kind.",
"CROSS_ANCHOR_ALIGNMENT means non-reference anchors differ but share the same coordinate axis.",
"REFERENCE_ALIGNMENT means at least one GRID_X/GRID_Y or GRID_REFERENCE anchor participates.",
"Exact geometric coincidence is not universally better than non-zero offset.",
"More pairwise alignment relations are not universally better.",
"10.01 owns no numeric metric and emits no score.",
"10.01 creates no placement candidate and does not mutate any subject position.",
"Grid evidence from Topic8/9 is consumed by reference only; 10.01 does not re-own grid lines, nodes, cells, regions or occupancy.",
"SemanticConstraintRefs remain opaque deferred evidence and are not interpreted by 10.01.",
"A semantic conflict may later invalidate a geometrically exact relation, but 10.01 does not invent that priority.",
"Intentional misalignment may later be preferred by context; 10.01 records geometry only.",
"Module execution order is not rule priority.",
"Correction requests are owner-qualified and mutationAllowed=false.",
"All relation measurements, N_A/INVALID reasons and source evidence must be serializable for DATA/human calibration.",
"IDEA references remain R&D links and are not provenance classes.",
"LAB experiments may compare human judgments of offsets and anchors but do not mutate CANON automatically.",
"N/A != 0.",
"No beautyScore."
],
"soft_constraints": [],
"preferences": [],
"overrides_allowed_by": [
"new upstream anchor evidence creates a new measurement lineage",
"10.04 may interpret this raw offset under explicit tolerance/optical profiles",
"future semantic/context owners may reject or contextualize an otherwise geometrically exact relation"
],
"initial_heuristics": {},
"style_preset_values": [],
"candidate_generation": {
"placement_or_alignment_candidates": "NONE",
"reason": "10.01 measures explicit pairwise relation evidence only"
},
"correction_policy": {
"foreign_mutation": "FORBIDDEN",
"missing_coordinate": "return N_A and request coordinate evidence resolution",
"axis_or_unit_mismatch": "return INVALID and route to source/integration owner",
"wrong_anchor": "request anchor evidence correction; do not substitute another anchor silently",
"optical_adjustment": "route to Compo10.04",
"baseline_request": "route to Compo10.02",
"semantic_conflict": "preserve opaque semantic evidence and defer priority resolution"
},
"deferred_inputs": [
"Compo10.02 baseline/text relation evidence",
"Compo10.03 shared-axis aggregation",
"Compo10.04 design tolerance/optical/scoring",
"future semantic object/part/sensitive-zone interpretation",
"future priority/relaxation policy"
],
"ideas_refs": [
"IDEA-01",
"IDEA-02",
"IDEA-03",
"IDEA-04",
"IDEA-05",
"IDEA-06",
"IDEA-07"
],
"data_capture": [
"relationRef and measurementRef",
"canonical participant/subject/anchor refs",
"relationClass and coordinateAxis",
"coordinatePairRaw",
"signedDeltaRaw and absoluteOffsetRaw",
"NumericalPolicy ref and effectiveEpsRaw",
"numericallyCoincident",
"coordinateEvidenceModes and confidence",
"N_A/INVALID reasons",
"semanticConstraintRefs presence without interpretation",
"repair request refs",
"human correction reason codes when available"
],
"deferred_semantic_inputs": [
"semanticObjectRef?",
"semanticPartRef?",
"semanticSensitiveZoneRef?",
"semanticConstraintRefs[]",
"intentRef?"
],
"human_feedback_hooks": [
"ALIGNMENT_RELATION_WRONG",
"WRONG_ANCHOR_SELECTED",
"OPTICAL_OFFSET_NEEDED",
"SEMANTIC_CONFLICT",
"INTENTIONAL_MISALIGNMENT",
"EXPECTED_COINCIDENCE_MISSED",
"OTHER"
],
"conflict_priority_assumptions": [
"module execution order is not priority",
"numericallyCoincident does not override semantic or intentional constraints",
"10.01 never auto-snaps subjects to zero offset",
"10.01 never upgrades numerical EPS into design tolerance",
"geometry/semantic/intent evidence remain separate channels until canonical context resolution"
],
"lab_hooks": [
"LAB: human judgments of small raw offsets around numerical/design tolerance boundary",
"LAB: left-left versus cross-anchor alignment interpretation",
"LAB: grid-reference alignment versus intentional grid breaks",
"LAB: semantic counterexamples where exact geometric alignment is rejected by humans",
"LAB: capture wrong-anchor versus optical-offset human reason codes",
"LAB: downstream text-to-graphic alignment experiment as EXPERIMENT only"
],
"recompute_when": [
"relationRef changes",
"participant/anchor evidence ref changes",
"coordinateRaw changes under a new evidence ref/version",
"canvas/frame/unit changes",
"NumericalPolicy changes"
],
"tests": [
"allowed anchor semantics",
"same-subject rejection",
"X/Y axis compatibility",
"baseline deferral",
"same canvas/frame/unit",
"missing coordinate N_A",
"nonfinite coordinate INVALID",
"order-invariant relation/measurement identity",
"deterministic signed delta by canonical order",
"numerical EPS separation from design tolerance",
"homonymous/cross/reference classes",
"data/semantic/human/LAB hooks",
"no score/global leakage/foreign mutation"
],
"finality": "PAIRWISE_GEOMETRIC_ALIGNMENT_OFFSET_MEASUREMENT_ONLY"
}