COMPO · 10.03 · MULTI-OBJECT SHARED AXES

Shared
axes.

Explicit multi-subject shared-axis evaluation for object, text, baseline and reference anchors. The caller supplies the exact group; 10.03 canonicalizes set identity, measures spread/mean/median and reports SHARED or NOT_SHARED under numerical stability only. It never searches subsets, snaps members, creates preference scores or lets a reference silently dominate the group.

ModuleCompo 10.03
Scopeexplicit 2+ shared axes
Generationnone
Scoringdeferred 10.04
Metricsnone
Next10.04

Shared axis starts with an explicit set

00 / explicit group

10.03 evaluates a caller-provided group. It does not search all subsets and does not generate combinatorial groups.

2+

distinct subjects

SET-LIKE

input order irrelevant

NO SCORE

shared axis is a descriptor

One axis only

01 / coordinate family

All members must be comparable in one coordinate family.

INLINE_X → X BLOCK_Y → Y TEXT_BASELINE → BASELINE REFERENCE_AXIS → X | Y | BASELINE but exactly one axis per group mixed axes → INVALID

Spread, mean, median

02 / descriptors

10.03 separates raw group geometry from later design tolerance.

minRaw = min(c_i) maxRaw = max(c_i) spreadRaw = maxRaw - minRaw meanRaw = Σ c_i / N medianRaw = deterministic median(c_i) effectiveSetEpsRaw = max( absEpsRaw, relEps * max(1, max(|c_i|)) ) numericallyShared = spreadRaw <= effectiveSetEpsRaw

Representative only after numeric sharing

03 / representative

A representative coordinate is not a snapping target.

if numericallyShared: representativeCoordinateRaw = meanRaw else: representativeCoordinateRaw = N_A/null IMPORTANT: representative coordinate != preferred design axis != mutation command

SharedAxisClass

04 / class

Class describes evidence semantics, not quality.

ClassMeaning
HOMONYMOUS_SHARED_AXISsame non-reference anchor semantic
CROSS_ANCHOR_SHARED_AXISdifferent non-reference anchors, same X/Y axis
REFERENCE_SHARED_AXISexplicit reference participates
BASELINE_SHARED_AXISbaseline group, no fallback
FALLBACK_BASELINE_SHARED_AXISbaseline group includes explicit fallback proxy

Baseline compatibility remains explicit

05 / baseline groups

10.03 consumes baseline kinds and compatibility policy from the 10.02 contract.

ALPHABETIC + ALPHABETIC → compatible ALPHABETIC + IDEOGRAPHIC → INVALID unless explicit unordered pair is allowed fallback participant → requires allowFallbackProxy = true

Reference does not automatically dominate

06 / references

Reference participation changes the descriptor class, not rule priority.

object LEFT text LEFT grid GRID_X → REFERENCE_SHARED_AXIS but: reference present != reference wins != snap everybody to reference

SHARED is not score 1

07 / status

Geometric status remains independent from interpretation.

SHARED numericallyShared = true NOT_SHARED valid comparable evidence but spread > numeric EPS N_A missing required coordinate INVALID incompatible identity / axis / lineage / policy

Canonical set-like lineage

08 / identity

The same set of participants must produce the same sharedAxisRef regardless of input order.

canonicalParticipantRefs = sort(unique(participantRef)) sharedAxisRef = hash( requestRef, canonical participant/anchor evidence, numericalPolicyRef, baselineCompatibilityPolicyRef? )

No hidden subset generation

09 / ownership

10.03 evaluates explicit groups only.

ResponsibilityOwner
root taxonomy / relation identity10.00
pairwise X/Y offsets10.01
baseline evidence / pair relation10.02
explicit 2+ shared-axis group evaluation10.03
design tolerance / optical / score10.04

Group membership is evidence

10 / IDEAS + DATA

Future learning needs to know who was included, who was excluded and why.

DATA_CAPTURE: explicit members canonical refs coordinate set spread / mean / median numerical EPS SHARED / NOT_SHARED reference/fallback participation N_A / INVALID reason human reason codes NO: generated subset search hidden priority hidden semantic interpretation

Why is the group wrong?

11 / human feedback

Feedback attaches to exact shared-axis evidence.

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

More sharing isn't universally better

12 / descriptor != score

10.03 emits no numeric metric.

FORBIDDEN. `SHARED → 1`, `NOT_SHARED → 0`, `more members → better`, `reference axis → preferred`. These belong to explicit targets/context in 10.04 or later owners.

Multi-object axis cases

13 / Visual Lab

Exact set identity, outliers and references remain visible.

A · SHARED X 3 subjects · same X · SHARED B · OUTLIER valid group · spread > EPS · NOT_SHARED C · REFERENCE REFERENCE class · not reference dominance explicit group only · no subset combinatorics SHARED / NOT_SHARED are descriptors · not scores representativeCoordinateRaw exists only for numerically shared set fallback baseline stays visible in class/evidence semanticConstraintRefs remain opaque module order != priority · no auto-snap

10.03 shared-axis regression

14 / deterministic tests

Tests cover set identity, spread math, N/A, references, baseline compatibility and ownership barriers.

Tests not run yet.

DATA FOR LAYOUT ENGINE

15 / machine contract

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"
}
ARCHITECTURE CHECKPOINT · 10.03 OWNS EXPLICIT 2+ SHARED-AXIS GROUP EVALUATION ONLY. PARTICIPANT INPUT IS SET-LIKE AND ORDER-INVARIANT. NO SUBSET/CARTESIAN GENERATION. SPREAD / MEAN / MEDIAN ARE DESCRIPTORS. SHARED / NOT_SHARED ARE NOT SCORES. REPRESENTATIVE COORDINATE EXISTS ONLY FOR A NUMERICALLY SHARED SET AND IS NOT A SNAP TARGET. BASELINE COMPATIBILITY REMAINS EXPLICIT. REFERENCE PARTICIPATION != REFERENCE DOMINANCE. GRID TOPOLOGY/OCCUPANCY STAYS TOPIC8/9. DESIGN TOLERANCE / OPTICAL / LOCAL SCORE → 10.04. SEMANTIC REFS OPAQUE. MODULE ORDER != PRIORITY. IDEA != CANON. EXPERIMENT != CANON. NO FOREIGN MUTATION. N/A != 0. NO BEAUTYSCORE.
VISITS / ...