COMPO · 8.00 · COLUMNGRID SCHEMA / OWNERSHIP

ColumnGrid
schema &
ownership.

Root contract Topic 8: explicit grid-domain binding, canonical X-column / Y-block coordinate semantics, child-reference shell and strict ownership split across 8.01–8.04. Node occupancy is reserved for 8.02; 2D ModularGrid cell/region occupancy stays Topic 9. No hidden column count, gutter ratio, placement generation or scoring.

ModuleCompo 8.00
ScopeColumnGrid root
AxisX columns / Y block
Metricsnone
Topic8 · COLUMN GRID
Next8.01

ColumnGrid — корень, не готовая геометрия

00 / root contract

8.00 создаёт стабильный root identity и связывает grid с explicit domain. Колонки, gutters, lines, nodes и occupancy появляются только в дочерних модулях.

OWNS

Root schema, domain binding, coordinate contract.

DOES NOT OWN

Columns / gutters / nodes / occupancy / score.

AXIS

Column partition on X, block extent on Y.

NO EMBEDDED CHILD CONTRACTS. 8.00 не должен «на всякий случай» хранить columnCount, gutterWidth или nodeOccupancy внутри root schema — иначе ownership будет продублирован.

Grid domain выбирается явно

01 / GridDomainBinding

ColumnGrid строится внутри owner-qualified domain: canvas, safe shell, platform-safe snapshot или другого explicit source.

GridDomainBinding {
  bindingRef,
  gridDomainRef,
  domainOwnerRef,

  canvasRef,
  domainSnapshotRef?,

  geometryType:
    RECT |
    REGION_REF |
    DISCONNECTED_REGION_REF,

  rect? | regionRef?,

  unit:
    PX |
    CANVAS_UNIT |
    MM,

  coordinateFrame:
    CANVAS_TOP_LEFT_Y_DOWN,

  mappingAdapterRef?,
  confidence,
  provenance
}
DOMAIN != GRID. Safe zone может быть grid domain, но сама сетка не становится owner safe semantics.

Не схлопывать сложную область в bbox

02 / non-rect domains

Irregular или disconnected safe-region не должен превращаться в один прямоугольник только ради удобства grid math.

RECT

Baseline напрямую поддерживается.

REGION_REF

PARTIAL до explicit adapter.

DISCONNECTED

Adapter должен явно разбить domain на допустимые segments/instances. BBox-collapse запрещён.

Column axis = X

03 / coordinate contract

Baseline Topic 8 — классическая вертикальная колонная сетка в экранной системе координат.

coordinateFrame = CANVAS_TOP_LEFT_Y_DOWN columnAxis = X blockAxis = Y +X → right +Y → down Columns partition: x0 ... x1 Columns extend through: bound domain Y extent
NO IMPLICIT ROTATION. Landscape/portrait меняют размеры domain, но не превращают ColumnGrid в row-grid автоматически.

Raw domain units + optional ShortN

04 / normalization

8.00 задаёт контракт пространства, но не рассчитывает widths/gutters — это будет 8.01.

sourceUnit: PX | CANVAS_UNIT | MM optional normalized length: SHORT_N via Compo6.03 only AXIS_FRACTION_UV: placement-only not metric width/gutter unit
REF != CONVERSION. Наличие mappingAdapterRef лишь идентифицирует adapter. 8.00 не должен притворяться, что строковая ссылка сама конвертирует единицы.

Root shell

05 / ColumnGrid

Root хранит только identity и ссылки на child outputs.

ColumnGrid {
  gridRef,
  canvasRef,

  gridDomainBindingRef,
  coordinateContextRef,

  gridKind:
    COLUMN_GRID,

  columnAxis:
    X,

  blockAxis:
    Y,

  childRefs: {
    columnGeometryRef?,
    gridTopologyRef?,
    occupancyRegistryRef?,
    placementCandidateSetRef?,
    gridEvaluationRef?
  },

  status,
  confidence,
  provenance
}

Пять модулей — пять границ

06 / Topic8 ownership

Topic 8 заранее делится так, чтобы later modules не создавали overlapping owners.

ModuleCanonical ownership
8.00ColumnGrid root, domain binding, coordinate contract, ownership map
8.01Columns, widths, gutters, spans, resolved 1D geometry
8.02GridLine[], GridNode[], ColumnGrid node occupancy registry
8.03Bounded deterministic placement candidates + lineage
8.04Variants, explicit-target local scoring, Topic8 regression

Node occupancy живёт в 8.02

07 / occupancy ownership

MAIN прямо требует, чтобы ownership занятости grid nodes в итоге жил в Topic 8. 8.00 резервирует границу, но не реализует registry.

ColumnGrid node occupancy → Compo8.02 ModularGrid cell/region occupancy → Topic9 / 9.03 These are NOT aliases. Topic9 may reference/project ColumnGrid nodes, but must not re-own their occupancy state.

Grid evidence ≠ alignment relation

08 / Topic10 firewall

Topic10 сможет измерять выравнивание объектов относительно grid lines/nodes, но не переопределяет grid topology.

Topic 8

Что является column/grid line/node и где оно находится.

Topic 10

Как object edge/center/baseline соотносится с уже существующей line/node.

7.05 может менять domain snapshot

09 / dynamic domain

Platform overlay lifecycle остаётся 7.05. Topic 8 получает только versioned resolved geometry/ref.

7.05 DynamicSafeZoneSnapshot v17 ↓ 8.00 GridDomainBinding domainSnapshotRef = v17 ↓ 8.01 geometry 8.02 topology / occupancy interpretation 8.03 candidates 8.04 evaluation 7.05 changes to v18 ↓ INVALIDATE downstream Topic8 evidence NOT: move content automatically

Recompute ≠ mutation

10 / invalidation

Изменение domain/canvas/context должно инвалидировать зависимые child results, а не тихо переписывать layout.

ColumnGridDependencyInvalidation {
  gridRef,
  sourceChangeRef,

  invalidate: [
    "Compo8.01",
    "Compo8.02",
    "Compo8.03",
    "Compo8.04"
  ],

  mutationAllowed: false
}

Сетка пока ничего не «улучшает»

11 / no quality leakage

Сам факт наличия колонной сетки или определённое количество колонок не являются quality evidence.

FORBIDDEN. «12 колонок лучше 6», «симметричная сетка лучше асимметричной», «чем уже gutter, тем плотнее и современнее» — такие statements требуют отдельного explicit target/empirical policy и не принадлежат 8.00.

Visual Lab

12 / visual lab

8.00 показывает только domain/root semantics — без притворной geometry 8.01.

A · RECT GRID DOMAIN 8.00 binds root → explicit RECT domain actual columns deferred to 8.01 B · DISCONNECTED DOMAIN PARTIAL until explicit adapter NO enclosing bbox collapse C · OWNERSHIP CHAIN 8.00 ROOT 8.01 GEOMETRY 8.02 NODES / OCCUPANCY columnAxis=X · blockAxis=Y · top-left frame · +Y down 8.02 owns ColumnGrid node occupancy · Topic9 owns ModularGrid cell/region occupancy Topic10 consumes lines/nodes for alignment; it does not own them dynamic 7.05 domain snapshot change invalidates Topic8 children, never reflows content grid schema != score · no preferred column count in 8.00

8.00 schema regression

13 / deterministic tests

Проверяем identity, domain, coordinate contract, child-ref shell, ownership firewalls и invalidation semantics.

Tests not run yet.

DATA FOR LAYOUT ENGINE

14 / machine contract

Machine-readable root contract Topic 8.

{
  "module": "Compo 8.00",
  "name": "column_grid_schema_and_ownership",
  "version": "1.0-canonical",
  "canonical_main_title": "ColumnGrid schema и ownership",
  "topic": "08_КОЛОННАЯ_СЕТКА",
  "scope": "COLUMNGRID_ROOT_SCHEMA_DOMAIN_BINDING_COORDINATE_CONTRACT_AND_TOPIC8_OWNERSHIP",
  "consumes": [
    "Compo6.00.CanvasDescriptor or equivalent explicit canvas identity",
    "explicit GridDomainBinding",
    "optional Compo6.03.CanvasNormalizationContext",
    "optional Compo7.00 rectangular safe/margin shell geometry as a domain source",
    "optional Compo7.05 DynamicSafeZoneSnapshot as a versioned domain source",
    "optional explicit domain adapter for non-rect/disconnected regions"
  ],
  "provides": [
    "ColumnGrid",
    "GridDomainBinding",
    "GridCoordinateContext",
    "ColumnGridChildRefs",
    "ColumnGridOwnershipMap",
    "ColumnGridDependencyInvalidation",
    "Topic8 module boundary refs for 8.01–8.04"
  ],
  "owns_metrics": [],
  "descriptors_only": [
    "grid.column.gridRef",
    "grid.column.canvasRef",
    "grid.column.gridDomainRef",
    "grid.column.domainSnapshotRef",
    "grid.column.domainGeometryType",
    "grid.column.sourceUnit",
    "grid.column.coordinateFrame",
    "grid.column.columnAxis",
    "grid.column.blockAxis",
    "grid.column.geometryRef",
    "grid.column.topologyRef",
    "grid.column.occupancyRegistryRef",
    "grid.column.placementCandidateSetRef",
    "grid.column.evaluationRef",
    "grid.column.status",
    "grid.column.confidence"
  ],
  "grid_domain_binding_schema": {
    "bindingRef": "stable versioned ref",
    "gridDomainRef": "owner-qualified source domain ref",
    "domainOwnerRef": "Compo6.00 | Compo7.00 | Compo7.05 | explicit external owner",
    "canvasRef": "must match ColumnGrid canvasRef unless explicit mapping adapter exists",
    "domainSnapshotRef": "required for dynamic/versioned domain sources",
    "geometryType": "RECT | REGION_REF | DISCONNECTED_REGION_REF",
    "rect": "required for RECT; finite x0< x1 and y0< y1",
    "regionRef": "required for REGION_REF / DISCONNECTED_REGION_REF",
    "unit": "PX | CANVAS_UNIT | MM",
    "coordinateFrame": "CANVAS_TOP_LEFT_Y_DOWN",
    "mappingAdapterRef": "optional explicit cross-space/cross-canvas adapter",
    "confidence": "0..1",
    "provenance": "object",
    "important": "8.00 never derives the grid domain from content occupancy or object extrema"
  },
  "grid_coordinate_context_schema": {
    "coordinateContextRef": "stable ref",
    "canvasRef": "same canvas as grid/domain",
    "sourceUnit": "PX | CANVAS_UNIT | MM",
    "coordinateFrame": "CANVAS_TOP_LEFT_Y_DOWN",
    "columnAxis": "X",
    "blockAxis": "Y",
    "normalizationContextRef": "optional Compo6.03 context",
    "normalizedLengthMode": "NONE | SHORT_N",
    "uvPolicy": "PLACEMENT_ONLY_NOT_METRIC",
    "important": "portrait/landscape changes domain dimensions but do not rotate ColumnGrid ownership semantics implicitly"
  },
  "column_grid_schema": {
    "gridRef": "stable versioned root ref",
    "canvasRef": "canvas identity",
    "gridDomainBindingRef": "required GridDomainBinding ref",
    "coordinateContextRef": "required GridCoordinateContext ref",
    "gridKind": "COLUMN_GRID",
    "columnAxis": "X",
    "blockAxis": "Y",
    "childRefs": "ColumnGridChildRefs",
    "status": "SCHEMA_READY | PARTIAL | INVALID",
    "confidence": "0..1",
    "provenance": "object",
    "important": "root shell references child contracts but does not duplicate their data"
  },
  "child_refs_schema": {
    "columnGeometryRef": "Compo8.01 output ref or null",
    "gridTopologyRef": "Compo8.02 output ref or null",
    "occupancyRegistryRef": "Compo8.02 ColumnGrid node occupancy registry ref or null",
    "placementCandidateSetRef": "Compo8.03 output ref or null",
    "gridEvaluationRef": "Compo8.04 output ref or null",
    "no_embedded_child_payloads": true
  },
  "topic8_ownership_map": {
    "8.00": [
      "ColumnGrid root identity",
      "GridDomainBinding",
      "GridCoordinateContext",
      "child-ref shell",
      "Topic8 ownership boundary"
    ],
    "8.01": [
      "columns",
      "column widths",
      "gutters",
      "spans",
      "resolved 1D column geometry"
    ],
    "8.02": [
      "canonical grid lines",
      "canonical grid nodes",
      "ColumnGrid node occupancy registry",
      "node occupancy state/provenance"
    ],
    "8.03": [
      "placement candidates constrained by resolved ColumnGrid",
      "candidate lineage",
      "bounded/deterministic column-grid candidate generation"
    ],
    "8.04": [
      "grid variants",
      "explicit-target local grid scoring",
      "Topic8 violation/repair aggregation where applicable",
      "consolidated Topic8 regression"
    ]
  },
  "cross_topic_ownership": {
    "Compo6.00": "canvas/domain identity and aspect ratio",
    "Compo6.03": "canonical ShortN normalization context",
    "Compo7.00": "safe/margin/bleed shell geometry that may be selected as a grid domain",
    "Compo7.05": "dynamic platform-safe region lifecycle/snapshots",
    "Compo9": "2D modular grid rows/cells/regions and ModularGrid cell/region occupancy; must not re-own ColumnGrid node occupancy",
    "Compo10": "alignment relations that may consume Topic8 lines/nodes; does not own the line/node definitions",
    "future_global": "balance/hierarchy/eye-flow/global composition evaluation"
  },
  "domain_resolution_policy": {
    "RECT": "direct baseline support",
    "REGION_REF": "PARTIAL until an explicit adapter exposes a supported column-domain representation",
    "DISCONNECTED_REGION_REF": "PARTIAL unless an explicit adapter creates separate valid grid-domain segments/instances",
    "forbidden": "silent bounding-box collapse of irregular or disconnected safe regions"
  },
  "identity_policy": {
    "same_canvas": "required by default",
    "cross_canvas": "INVALID without explicit mappingAdapterRef",
    "dynamic_snapshot": "domainSnapshotRef participates in lineage and recompute identity",
    "child_ref_canvas_consistency": "validated downstream when child outputs resolve"
  },
  "normalization_policy": {
    "raw_source_unit": "inherited from explicit domain binding",
    "SHORT_N": "optional normalized representation through Compo6.03 only",
    "UV": "placement-only; not canonical metric distance/width unit",
    "conversion": "requires explicit adapter; unitMappingRef/mappingAdapterRef is evidence of adapter identity, not an implementation of conversion by itself"
  },
  "lifecycle_and_recompute": {
    "root_shell_mutation": "forbidden as implicit response to dependency change",
    "domain_snapshot_change": [
      "invalidate/recompute Compo8.01 geometry",
      "invalidate/recompute Compo8.02 topology/occupancy interpretation where geometry-dependent",
      "invalidate Compo8.03 placement candidates",
      "invalidate Compo8.04 evaluations"
    ],
    "canvas_geometry_change": "same downstream invalidation chain",
    "normalization_context_change": "recompute normalized grid measurements in downstream owners",
    "important": "invalidation is not automatic content reflow"
  },
  "semantic_firewalls": {
    "grid_vs_safe_zone": "grid may bind to a safe-zone domain but does not own safety semantics",
    "grid_vs_content": "grid existence does not imply content must occupy every column/node",
    "schema_vs_geometry": "8.00 root schema does not define actual widths/gutters/spans",
    "node_vs_cell_occupancy": "ColumnGrid node occupancy belongs 8.02; ModularGrid cell/region occupancy belongs Topic9",
    "grid_vs_alignment": "Topic10 measures alignment relations to grid evidence but does not redefine grid topology",
    "grid_vs_quality": "column count/grid presence are not universal quality votes"
  },
  "metric_policy": {
    "direct_scoring": "FORBIDDEN in 8.00",
    "column_count_score": "FORBIDDEN",
    "grid_presence_score": "FORBIDDEN",
    "more_columns_is_better": "FORBIDDEN",
    "symmetrical_grid_is_better": "FORBIDDEN",
    "beautyScore": "FORBIDDEN"
  },
  "hard_constraints": [
    "8.00 owns the ColumnGrid root schema, grid identity, domain binding, coordinate-space contract and Topic8 ownership map only.",
    "8.00 does not own column count, column widths, gutter widths or span geometry; Compo8.01 owns those contracts.",
    "8.00 does not own canonical grid lines, grid nodes or node occupancy; Compo8.02 owns those contracts and the ColumnGrid node occupancy registry.",
    "8.00 does not generate placement candidates; Compo8.03 owns candidate generation over an already resolved ColumnGrid.",
    "8.00 does not own grid variant scoring; Compo8.04 owns variants, local scoring and consolidated Topic8 tests.",
    "The baseline ColumnGrid is one-dimensional along canvas X: columns partition the inline X axis and extend through the bound grid domain in Y.",
    "Screen coordinate convention remains top-left origin with +X right and +Y down.",
    "A grid domain must be explicit and owner-qualified; 8.00 must not infer a safe zone, margin, canvas crop or platform-safe region from content geometry.",
    "A rectangular domain may be consumed directly. A non-rect or disconnected region requires an explicit adapter or remains PARTIAL; it must not be collapsed to one bounding box silently.",
    "Canvas/domain/grid identity must remain explicit and consistent. Cross-canvas bindings are INVALID unless an explicit mapping adapter is supplied.",
    "The grid source unit follows the bound domain unit. Unit conversion requires an explicit mapping/adapter; a string ref alone does not perform conversion.",
    "SHORT_N may be carried as an optional normalized representation only through a compatible Compo6.03 CanvasNormalizationContext.",
    "AXIS_FRACTION_UV is placement space, not the canonical metric unit for grid widths/gutters.",
    "Dynamic safe-region snapshots from Compo7.05 may be bound as versioned grid-domain evidence, but 8.00 does not own overlay lifecycle or safe-region resolution.",
    "A change of bound domain snapshot invalidates downstream Topic8 geometry/topology/candidate/evaluation evidence; it does not mutate content or rebuild a grid automatically.",
    "Topic8 ColumnGrid node occupancy and Topic9 ModularGrid cell/region occupancy are distinct ownership domains.",
    "Topic10 alignment may consume grid lines/nodes but does not retroactively own or redefine them.",
    "Grid schema existence is not a quality score.",
    "No universal preferred column count or gutter ratio is defined in 8.00.",
    "N/A != 0.",
    "No beautyScore."
  ],
  "hard_rules": [
    "8.00 owns the ColumnGrid root schema, grid identity, domain binding, coordinate-space contract and Topic8 ownership map only.",
    "8.00 does not own column count, column widths, gutter widths or span geometry; Compo8.01 owns those contracts.",
    "8.00 does not own canonical grid lines, grid nodes or node occupancy; Compo8.02 owns those contracts and the ColumnGrid node occupancy registry.",
    "8.00 does not generate placement candidates; Compo8.03 owns candidate generation over an already resolved ColumnGrid.",
    "8.00 does not own grid variant scoring; Compo8.04 owns variants, local scoring and consolidated Topic8 tests.",
    "The baseline ColumnGrid is one-dimensional along canvas X: columns partition the inline X axis and extend through the bound grid domain in Y.",
    "Screen coordinate convention remains top-left origin with +X right and +Y down.",
    "A grid domain must be explicit and owner-qualified; 8.00 must not infer a safe zone, margin, canvas crop or platform-safe region from content geometry.",
    "A rectangular domain may be consumed directly. A non-rect or disconnected region requires an explicit adapter or remains PARTIAL; it must not be collapsed to one bounding box silently.",
    "Canvas/domain/grid identity must remain explicit and consistent. Cross-canvas bindings are INVALID unless an explicit mapping adapter is supplied.",
    "The grid source unit follows the bound domain unit. Unit conversion requires an explicit mapping/adapter; a string ref alone does not perform conversion.",
    "SHORT_N may be carried as an optional normalized representation only through a compatible Compo6.03 CanvasNormalizationContext.",
    "AXIS_FRACTION_UV is placement space, not the canonical metric unit for grid widths/gutters.",
    "Dynamic safe-region snapshots from Compo7.05 may be bound as versioned grid-domain evidence, but 8.00 does not own overlay lifecycle or safe-region resolution.",
    "A change of bound domain snapshot invalidates downstream Topic8 geometry/topology/candidate/evaluation evidence; it does not mutate content or rebuild a grid automatically.",
    "Topic8 ColumnGrid node occupancy and Topic9 ModularGrid cell/region occupancy are distinct ownership domains.",
    "Topic10 alignment may consume grid lines/nodes but does not retroactively own or redefine them.",
    "Grid schema existence is not a quality score.",
    "No universal preferred column count or gutter ratio is defined in 8.00.",
    "N/A != 0.",
    "No beautyScore."
  ],
  "soft_constraints": [],
  "preferences": [],
  "overrides_allowed_by": [
    "a newer explicit GridDomainBinding/domain snapshot may be used for future ColumnGrid instances",
    "a newer explicit GridCoordinateContext may supersede an older future evaluation context",
    "historical ColumnGrid roots remain tied to original refs and are not retroactively mutated"
  ],
  "initial_heuristics": {},
  "style_preset_values": [],
  "candidate_generation": {
    "geometry_candidates": "NONE",
    "placement_candidates": "NONE",
    "reason": "8.00 is a schema/ownership module; 8.03 owns bounded placement candidate generation"
  },
  "correction_policy": {
    "foreign_content_mutation": "FORBIDDEN",
    "missing_canvas": "route to Compo6.00/integration owner",
    "missing_or_invalid_grid_domain": "route to source domain owner or explicit adapter",
    "missing_normalization_context": "allow raw-only downstream geometry or route to Compo6.03",
    "column_geometry_question": "route to Compo8.01",
    "grid_line_node_occupancy_question": "route to Compo8.02",
    "placement_candidate_question": "route to Compo8.03",
    "variant_scoring_question": "route to Compo8.04",
    "modular_rows_cells_question": "route to Topic9",
    "alignment_question": "route to Topic10"
  },
  "deferred_inputs": [
    "Compo8.01 column widths/gutters/spans",
    "Compo8.02 grid lines/nodes/ColumnGrid node occupancy registry",
    "Compo8.03 placement candidates",
    "Compo8.04 variants/scoring/tests",
    "Topic9 two-dimensional ModularGrid",
    "Topic10 alignment relations",
    "future non-rect/disconnected domain adapters"
  ],
  "recompute_when": [
    "canvas identity or geometry changes",
    "GridDomainBinding changes",
    "domainSnapshotRef changes",
    "domain geometry/unit/frame changes",
    "GridCoordinateContext changes",
    "Compo6.03 normalizationContext changes",
    "resolved child refs are replaced by newer explicit versions"
  ],
  "tests": [
    "root schema validation",
    "rect domain validation",
    "cross-canvas mismatch",
    "non-rect partial behavior",
    "disconnected region no bbox collapse",
    "coordinate frame",
    "X/Y axis ownership",
    "ShortN context contract",
    "UV metric prohibition",
    "child-ref shell",
    "Topic8 ownership firewall",
    "Topic9 node-vs-cell occupancy firewall",
    "Topic10 alignment firewall",
    "dynamic domain invalidation",
    "determinism",
    "no score/global leakage"
  ],
  "finality": "COLUMNGRID_ROOT_SCHEMA_DOMAIN_BINDING_AND_TOPIC8_OWNERSHIP_ONLY"
}
ARCHITECTURE CHECKPOINT · 8.00 OWNS COLUMNGRID ROOT IDENTITY, GRIDDOMAINBINDING, GRIDCOORDINATECONTEXT AND TOPIC8 OWNERSHIP MAP ONLY. COLUMN COUNT/WIDTHS/GUTTERS/SPANS → 8.01. GRID LINES/NODES/COLUMNGRID NODE OCCUPANCY → 8.02. PLACEMENT CANDIDATES → 8.03. VARIANTS/LOCAL SCORING/REGRESSION → 8.04. COLUMN AXIS=X, BLOCK AXIS=Y, SCREEN +Y DOWN. NON-RECT/DISCONNECTED DOMAINS MUST NOT BE SILENTLY COLLAPSED TO BBOX. TOPIC9 OWNS MODULARGRID CELL/REGION OCCUPANCY, NOT COLUMNGRID NODE OCCUPANCY. TOPIC10 MAY CONSUME GRID EVIDENCE FOR ALIGNMENT BUT DOES NOT OWN GRID TOPOLOGY. GRID SCHEMA != QUALITY SCORE. NO BEAUTYSCORE.
VISITS / ...