Shared axis starts with an explicit set
10.03 evaluates a caller-provided group. It does not search all subsets and does not generate combinatorial groups.
distinct subjects
input order irrelevant
shared axis is a descriptor
One axis only
All members must be comparable in one coordinate family.
Spread, mean, median
10.03 separates raw group geometry from later design tolerance.
Representative only after numeric sharing
A representative coordinate is not a snapping target.
SharedAxisClass
Class describes evidence semantics, not quality.
| Class | Meaning |
|---|---|
| HOMONYMOUS_SHARED_AXIS | same non-reference anchor semantic |
| CROSS_ANCHOR_SHARED_AXIS | different non-reference anchors, same X/Y axis |
| REFERENCE_SHARED_AXIS | explicit reference participates |
| BASELINE_SHARED_AXIS | baseline group, no fallback |
| FALLBACK_BASELINE_SHARED_AXIS | baseline group includes explicit fallback proxy |
Baseline compatibility remains explicit
10.03 consumes baseline kinds and compatibility policy from the 10.02 contract.
Reference does not automatically dominate
Reference participation changes the descriptor class, not rule priority.
SHARED is not score 1
Geometric status remains independent from interpretation.
Canonical set-like lineage
The same set of participants must produce the same sharedAxisRef regardless of input order.
No hidden subset generation
10.03 evaluates explicit groups only.
| Responsibility | Owner |
|---|---|
| root taxonomy / relation identity | 10.00 |
| pairwise X/Y offsets | 10.01 |
| baseline evidence / pair relation | 10.02 |
| explicit 2+ shared-axis group evaluation | 10.03 |
| design tolerance / optical / score | 10.04 |
Group membership is evidence
Future learning needs to know who was included, who was excluded and why.
Why is the group wrong?
Feedback attaches to exact shared-axis evidence.
More sharing isn't universally better
10.03 emits no numeric metric.
Multi-object axis cases
Exact set identity, outliers and references remain visible.
10.03 shared-axis regression
Tests cover set identity, spread math, N/A, references, baseline compatibility and ownership barriers.
DATA FOR LAYOUT ENGINE
Machine-readable 10.03 contract.
{
"module": "Compo 10.03",
"name": "multi_object_shared_axes",
"version": "1.0-canonical",
"canonical_main_title": "Multi-object shared axes",
"topic": "10_БАЗОВЫЕ_ЛИНИИ_И_ВЫРАВНИВАНИЕ",
"scope": "EXPLICIT_MULTI_SUBJECT_SHARED_AXIS_GROUPING_AND_NUMERICAL_EVALUATION",
"review_basis": {
"previous_modules": [
"Compo10.00 Alignment taxonomy",
"Compo10.01 pairwise geometric alignment",
"Compo10.02 baseline/text alignment"
],
"related_owners_reviewed": [
"Topic8/9 grid geometry ownership",
"10.01 NumericalPolicy convention",
"10.02 BaselineCompatibilityPolicy convention"
],
"cross_cutting_instruction": "COMPO project instruction v2.0"
},
"consumes": [
"Compo10.00.AlignmentParticipant[2+]",
"owner-qualified AlignmentAnchorEvidence[2+]",
"Compo10.01-compatible NumericalPolicy",
"optional Compo10.02-compatible BaselineCompatibilityPolicy",
"optional opaque semanticConstraintRefs[]"
],
"provides": [
"SharedAxisRequest",
"SharedAxisEvaluation",
"SharedAxisClass",
"SharedAxisRepairRequest",
"serializable shared-axis observation"
],
"owns_metrics": [],
"descriptors_only": [
"alignment.sharedAxis.axis",
"alignment.sharedAxis.participantCount",
"alignment.sharedAxis.anchorKinds",
"alignment.sharedAxis.spreadRaw",
"alignment.sharedAxis.meanRaw",
"alignment.sharedAxis.medianRaw",
"alignment.sharedAxis.effectiveSetEpsRaw",
"alignment.sharedAxis.numericallyShared",
"alignment.sharedAxis.class",
"alignment.sharedAxis.status"
],
"shared_axis_request_schema": {
"requestRef": "stable request ref",
"relationFamily": "MULTI_SUBJECT_SHARED_AXIS",
"axisFamily": "INLINE_X|BLOCK_Y|TEXT_BASELINE|REFERENCE_AXIS",
"participants": "explicit 2+ participant refs",
"anchors": "exact owner-qualified evidence",
"semanticConstraintRefs": "opaque optional refs",
"no_subset_generation": true
},
"shared_axis_evaluation_schema": {
"sharedAxisRef": "stable hash of request lineage, canonical participant/anchor refs and policy refs",
"canonicalParticipantRefs": "sorted set-like participant refs",
"canonicalSubjectRefs": "subjects reordered with canonical participants",
"canonicalAnchorRefs": "anchors reordered with canonical participants",
"coordinateAxis": "X|Y|BASELINE",
"coordinateSetRaw": "coordinates in canonical participant order",
"minRaw": "minimum coordinate",
"maxRaw": "maximum coordinate",
"spreadRaw": "maxRaw-minRaw",
"meanRaw": "arithmetic mean",
"medianRaw": "deterministic median",
"effectiveSetEpsRaw": "numeric stability epsilon across set",
"numericallyShared": "spreadRaw<=effectiveSetEpsRaw",
"representativeCoordinateRaw": "meanRaw if SHARED, otherwise null",
"sharedAxisClass": "descriptive class",
"status": "SHARED|NOT_SHARED|N_A|INVALID",
"confidence": "minimum evidence confidence",
"provenance": "DERIVED",
"score": "not owned",
"mutationAllowed": false
},
"shared_axis_classes": {
"HOMONYMOUS_SHARED_AXIS": "same non-reference anchor semantic across X/Y participants",
"CROSS_ANCHOR_SHARED_AXIS": "different non-reference anchor semantics on same X/Y axis",
"REFERENCE_SHARED_AXIS": "one or more explicit reference anchors participate",
"BASELINE_SHARED_AXIS": "baseline group without fallback proxies",
"FALLBACK_BASELINE_SHARED_AXIS": "baseline group with at least one explicitly allowed fallback proxy"
},
"metric_policy": {
"direct_scoring": "FORBIDDEN",
"SHARED_means_score_1": "FORBIDDEN",
"NOT_SHARED_means_score_0": "FORBIDDEN",
"more_participants_is_better": "FORBIDDEN",
"beautyScore": "FORBIDDEN"
},
"hard_constraints": [
"10.03 owns explicit multi-subject shared-axis grouping/evaluation over owner-qualified alignment anchors.",
"10.03 consumes AlignmentParticipant/AlignmentAnchorEvidence contracts from 10.00 and measured anchor semantics from 10.01/10.02 without redefining them.",
"10.03 does not own pairwise left/right/center/top/bottom offsets; 10.01 owns them.",
"10.03 does not own text baseline extraction; 10.02 owns it.",
"10.03 does not own design tolerance, optical correction or local alignment score; 10.04 owns them.",
"A shared-axis request requires at least two distinct participantRef values and at least two distinct subjectRef values.",
"Participant input order is set-like; canonical participant order is lexical participantRef order.",
"Input order must not change sharedAxisRef, spreadRaw, representativeCoordinateRaw or classification.",
"Duplicate participantRef is INVALID.",
"Duplicate subjectRef in one shared-axis request is INVALID.",
"Each participant.anchorRef must match supplied anchor evidence.",
"All anchors in one shared-axis request must be on one coordinate axis: X, Y or BASELINE.",
"Mixed X/Y/BASELINE axes are INVALID.",
"All anchors must share canvasRef, coordinateFrame and sourceUnit unless upstream mapping already normalized them.",
"10.03 performs no implicit unit conversion, canvas mapping or frame projection.",
"Missing coordinateRaw in any required anchor returns N_A, not zero.",
"Non-finite coordinateRaw is INVALID.",
"Shared-axis numerical coincidence uses explicit NumericalPolicy consumed from 10.01 semantics.",
"Numerical coincidence remains implementation stability, not design tolerance.",
"spreadRaw = max(coordinates)-min(coordinates).",
"meanRaw = arithmetic mean of finite coordinates.",
"medianRaw = deterministic median of finite coordinates.",
"representativeCoordinateRaw is meanRaw only when numericallyShared=true; otherwise it is null.",
"effectiveSetEpsRaw = max(absEpsRaw, relEps*max(1,max(abs(coordinate_i)))).",
"numericallyShared = spreadRaw <= effectiveSetEpsRaw.",
"representativeCoordinateRaw is a descriptive representative of an already numerically shared set; it is never a snapping target by itself.",
"Relation class is descriptive only.",
"SharedAxisClass values: HOMONYMOUS_SHARED_AXIS, CROSS_ANCHOR_SHARED_AXIS, REFERENCE_SHARED_AXIS, BASELINE_SHARED_AXIS, FALLBACK_BASELINE_SHARED_AXIS.",
"REFERENCE_SHARED_AXIS requires at least one explicit GRID_REFERENCE/GRID_X/GRID_Y/reference anchor.",
"BASELINE_SHARED_AXIS requires baseline axis and no fallback baseline evidence.",
"FALLBACK_BASELINE_SHARED_AXIS requires baseline axis with at least one explicit fallback baseline participant.",
"Baseline kind compatibility for baseline groups is explicit; incompatible baseline kinds are INVALID unless BaselineCompatibilityPolicy allows every cross-kind pair present.",
"Fallback baseline participation requires BaselineCompatibilityPolicy.allowFallbackProxy=true.",
"10.03 does not invent a dominant reference anchor when multiple references exist.",
"If more than one explicit reference anchor exists and their coordinates are not numerically shared, result is NOT_SHARED rather than silently choosing one.",
"Shared-axis evaluation status is SHARED, NOT_SHARED, N_A or INVALID.",
"NOT_SHARED is a valid descriptor outcome, not score=0.",
"SHARED is not score=1.",
"More objects on one axis is not universally better.",
"More shared axes are not universally better.",
"Exact grid alignment is not universally better.",
"Intentional misalignment remains valid context and is not auto-corrected.",
"10.03 owns no numeric metric and emits no score.",
"10.03 does not generate participant subsets, combinations or Cartesian candidate groups.",
"The caller must provide the explicit participant set to evaluate.",
"10.03 never mutates object/text/grid positions.",
"Correction requests are owner-qualified and mutationAllowed=false.",
"Grid topology/occupancy remain owned by Topics 8/9.",
"SemanticConstraintRefs remain opaque deferred evidence.",
"Module execution order is not rule priority.",
"IDEA != CANON.",
"EXPERIMENT != CANON.",
"All group membership, lineage, coordinates, spread, mean, median, classification and N_A/INVALID reasons must be serializable.",
"N/A != 0.",
"No beautyScore."
],
"hard_rules": [
"10.03 owns explicit multi-subject shared-axis grouping/evaluation over owner-qualified alignment anchors.",
"10.03 consumes AlignmentParticipant/AlignmentAnchorEvidence contracts from 10.00 and measured anchor semantics from 10.01/10.02 without redefining them.",
"10.03 does not own pairwise left/right/center/top/bottom offsets; 10.01 owns them.",
"10.03 does not own text baseline extraction; 10.02 owns it.",
"10.03 does not own design tolerance, optical correction or local alignment score; 10.04 owns them.",
"A shared-axis request requires at least two distinct participantRef values and at least two distinct subjectRef values.",
"Participant input order is set-like; canonical participant order is lexical participantRef order.",
"Input order must not change sharedAxisRef, spreadRaw, representativeCoordinateRaw or classification.",
"Duplicate participantRef is INVALID.",
"Duplicate subjectRef in one shared-axis request is INVALID.",
"Each participant.anchorRef must match supplied anchor evidence.",
"All anchors in one shared-axis request must be on one coordinate axis: X, Y or BASELINE.",
"Mixed X/Y/BASELINE axes are INVALID.",
"All anchors must share canvasRef, coordinateFrame and sourceUnit unless upstream mapping already normalized them.",
"10.03 performs no implicit unit conversion, canvas mapping or frame projection.",
"Missing coordinateRaw in any required anchor returns N_A, not zero.",
"Non-finite coordinateRaw is INVALID.",
"Shared-axis numerical coincidence uses explicit NumericalPolicy consumed from 10.01 semantics.",
"Numerical coincidence remains implementation stability, not design tolerance.",
"spreadRaw = max(coordinates)-min(coordinates).",
"meanRaw = arithmetic mean of finite coordinates.",
"medianRaw = deterministic median of finite coordinates.",
"representativeCoordinateRaw is meanRaw only when numericallyShared=true; otherwise it is null.",
"effectiveSetEpsRaw = max(absEpsRaw, relEps*max(1,max(abs(coordinate_i)))).",
"numericallyShared = spreadRaw <= effectiveSetEpsRaw.",
"representativeCoordinateRaw is a descriptive representative of an already numerically shared set; it is never a snapping target by itself.",
"Relation class is descriptive only.",
"SharedAxisClass values: HOMONYMOUS_SHARED_AXIS, CROSS_ANCHOR_SHARED_AXIS, REFERENCE_SHARED_AXIS, BASELINE_SHARED_AXIS, FALLBACK_BASELINE_SHARED_AXIS.",
"REFERENCE_SHARED_AXIS requires at least one explicit GRID_REFERENCE/GRID_X/GRID_Y/reference anchor.",
"BASELINE_SHARED_AXIS requires baseline axis and no fallback baseline evidence.",
"FALLBACK_BASELINE_SHARED_AXIS requires baseline axis with at least one explicit fallback baseline participant.",
"Baseline kind compatibility for baseline groups is explicit; incompatible baseline kinds are INVALID unless BaselineCompatibilityPolicy allows every cross-kind pair present.",
"Fallback baseline participation requires BaselineCompatibilityPolicy.allowFallbackProxy=true.",
"10.03 does not invent a dominant reference anchor when multiple references exist.",
"If more than one explicit reference anchor exists and their coordinates are not numerically shared, result is NOT_SHARED rather than silently choosing one.",
"Shared-axis evaluation status is SHARED, NOT_SHARED, N_A or INVALID.",
"NOT_SHARED is a valid descriptor outcome, not score=0.",
"SHARED is not score=1.",
"More objects on one axis is not universally better.",
"More shared axes are not universally better.",
"Exact grid alignment is not universally better.",
"Intentional misalignment remains valid context and is not auto-corrected.",
"10.03 owns no numeric metric and emits no score.",
"10.03 does not generate participant subsets, combinations or Cartesian candidate groups.",
"The caller must provide the explicit participant set to evaluate.",
"10.03 never mutates object/text/grid positions.",
"Correction requests are owner-qualified and mutationAllowed=false.",
"Grid topology/occupancy remain owned by Topics 8/9.",
"SemanticConstraintRefs remain opaque deferred evidence.",
"Module execution order is not rule priority.",
"IDEA != CANON.",
"EXPERIMENT != CANON.",
"All group membership, lineage, coordinates, spread, mean, median, classification and N_A/INVALID reasons must be serializable.",
"N/A != 0.",
"No beautyScore."
],
"soft_constraints": [],
"preferences": [],
"overrides_allowed_by": [
"new upstream anchor evidence creates new lineage",
"explicit baseline compatibility policy can allow baseline kind combinations",
"10.04 may interpret shared-axis spread under explicit target/tolerance profile",
"future semantic/context owner may reject an otherwise geometrically shared axis"
],
"initial_heuristics": {},
"style_preset_values": [],
"candidate_generation": {
"participant_subset_generation": "NONE",
"cartesian_generation": "FORBIDDEN",
"caller_provides_explicit_group": true
},
"correction_policy": {
"foreign_mutation": "FORBIDDEN",
"missing_coordinate": "N_A + request upstream evidence",
"axis_mismatch": "INVALID",
"lineage_mismatch": "INVALID",
"baseline_kind_conflict": "INVALID unless explicit compatibility policy allows",
"not_shared": "descriptor only; optional repair request may be emitted by caller/context, no automatic snapping",
"optical_adjustment": "defer to 10.04"
},
"deferred_inputs": [
"Compo10.04 design tolerance/optical/scoring",
"future semantic interpretation",
"future canonical priority/relaxation policy"
],
"ideas_refs": [
"IDEA-01",
"IDEA-02",
"IDEA-03",
"IDEA-04",
"IDEA-05",
"IDEA-06",
"IDEA-07"
],
"data_capture": [
"explicit participant set",
"canonical participant/subject/anchor refs",
"coordinate axis",
"coordinate set",
"min/max/spread/mean/median",
"effectiveSetEpsRaw",
"numericallyShared",
"sharedAxisClass",
"status",
"reference participation",
"fallback participation",
"baseline compatibility policyRef",
"N_A/INVALID reasons",
"semanticConstraintRefs presence",
"repair refs",
"human reason codes"
],
"deferred_semantic_inputs": [
"semanticObjectRef?",
"semanticPartRef?",
"semanticSensitiveZoneRef?",
"semanticConstraintRefs[]",
"intentRef?",
"readingOrderRef?"
],
"human_feedback_hooks": [
"SHARED_AXIS_GROUP_WRONG",
"OUTLIER_SHOULD_NOT_JOIN",
"EXPECTED_MEMBER_MISSING",
"WRONG_REFERENCE_AXIS",
"BASELINE_GROUP_WRONG",
"OPTICAL_AXIS_SHIFT_NEEDED",
"SEMANTIC_CONFLICT",
"INTENTIONAL_MISALIGNMENT",
"OTHER"
],
"conflict_priority_assumptions": [
"module execution order is not priority",
"numerically shared geometry does not override semantic or intentional constraints",
"reference participation does not imply reference dominance",
"10.03 never auto-snaps outliers",
"NOT_SHARED is not a failure score",
"unresolved conflict is diagnosed/deferred"
],
"lab_hooks": [
"LAB: human grouping judgments for 3+ nearly aligned objects",
"LAB: reference axis vs intentional grid break",
"LAB: outlier inclusion/exclusion",
"LAB: baseline group with fallback proxy",
"LAB: semantic counterexample where numerically shared axis is rejected",
"LAB: text-to-graphic shared-axis experiment as EXPERIMENT only"
],
"recompute_when": [
"participant set changes",
"anchor evidence/version changes",
"coordinate changes",
"canvas/frame/unit changes",
"NumericalPolicy changes",
"BaselineCompatibilityPolicy changes"
],
"tests": [
"2+ participant arity",
"set-like identity",
"duplicate rejection",
"same-subject rejection",
"axis compatibility",
"lineage compatibility",
"missing coordinate N_A",
"spread/mean/median",
"numeric epsilon",
"reference class",
"baseline compatibility",
"fallback handling",
"no subset generation",
"semantic/data/human/LAB hooks",
"no score/no mutation/no grid ownership leakage"
],
"finality": "EXPLICIT_MULTI_SUBJECT_SHARED_AXIS_EVALUATION_ONLY"
}