COMPO · 9.00 · MODULARGRID ROWS × COLUMNS

ModularGrid
rows ×
columns.

Root schema Topic 9: inherited Topic8 column geometry plus an explicit Y-axis row layout resolved over exactly the same rectangular domain. 9.00 owns ModularGrid identity, RowLayoutSpec, RowGapSpec and RowTrack/RowGap geometry only. Cell identities/addressing wait for 9.01; merged/forbidden regions for 9.02; 2D occupancy/collision/reflow/candidates for 9.03; variants/scoring for 9.04. Canonical ColumnGrid node occupancy remains 8.02.

ModuleCompo 9.00
ScopeModularGrid root + rows
Columnsinherit 8.01
Rowsowned here
Metricsnone
Next9.01

2D root через inheritance, не через копирование

00 / module api

9.00 берёт X-структуру из Topic 8 и добавляет собственную Y-структуру rows. Это создаёт основание для 2D modular grid, но ещё не Cell[].

X / COLUMNS

Inherited from 8.01.

Y / ROWS

Owned and resolved by 9.00.

2D CELLS

Deferred to 9.01.

NO COLUMN RECOMPUTE. 9.00 никогда не пересчитывает column widths/gutters и не создаёт их копию как нового owner.

Root identity

01 / ModularGrid

Root связывает одну column geometry и одну row geometry в общем domain.

ModularGrid {
  modularGridRef,

  gridRef,
  canvasRef,
  gridDomainBindingRef,

  columnGeometryRef,
  columnTopologyRef?,

  rowGeometryRef,

  columnAxis: X,
  rowAxis: Y,

  coordinateFrame:
    CANVAS_TOP_LEFT_Y_DOWN,

  childRefs: {
    cellSetRef?,
    regionSetRef?,
    occupancyMapRef?,
    placementCandidateSetRef?,
    evaluationRef?
  },

  status,
  confidence,
  provenance
}

Topic 8 остаётся owner X-геометрии

02 / column inheritance

ModularGrid обязан ссылаться на точную версию ResolvedColumnGeometry и тот же domain snapshot.

Topic 8: ColumnGrid ↓ ResolvedColumnGeometry ↓ columnGeometryRef Topic 9: ModularGrid ├── columnGeometryRef [REFERENCE] └── rowGeometryRef [OWNED] NOT: copy columns recompute gutters re-own GridNode occupancy

Rows и columns живут в одном rectangle

03 / common domain

Baseline 9.00 не допускает независимый row-domain.

require same: canvasRef gridDomainBindingRef gridDomainRef domainSnapshotRef sourceUnit coordinateFrame columns X extent: domain.x0 → domain.x1 rows Y extent: domain.y0 → domain.y1
NO SPLIT DOMAIN. Нельзя взять columns из safe area A, а rows — из safe area B и назвать результат одной ModularGrid.

Row count explicit

04 / RowLayoutSpec

По Y используем симметричную 8.01 модель allocation, но ownership новый и локальный для rows.

RowLayoutSpec {
  rowLayoutSpecRef,
  modularGridRef,

  rowCount: integer >= 1,

  heightMode:
    EQUAL |
    WEIGHTED |
    EXPLICIT,

  rowWeights[]?,
  rowHeights[]?,

  rowGapSpec,

  normalizationMode:
    RAW_ONLY |
    RAW_AND_SHORT_N,

  normalizationContextRef?,

  confidence,
  provenance
}
NO DEFAULT. 12 columns не подразумевают 12 rows; никакого implicit rowCount здесь нет.

N rows → N−1 gaps

05 / RowGapSpec

Zero row gap допустим, negative — invalid.

UNIFORM

{
  mode: "UNIFORM",
  uniformHeight: g
}

EXPLICIT

{
  mode: "EXPLICIT",
  heights: [
    g0, g1, ...
  ]
}
rowGapCount = max(0, rowCount - 1)

Domain height = hard budget

06 / height allocation

Сначала вычитаются declared row gaps, затем распределяется остаток.

H = domain.y1 - domain.y0 G = Σ rowGapHeight[j] R = H - G EQUAL: rowHeight[i] = R / N WEIGHTED: rowHeight[i] = R * weight[i] / Σweight EXPLICIT: use supplied rowHeight[i] require: Σheight + G ≈ H

Никакого silent compression

07 / unsatisfiable

Row layout, который не помещается по Y, не исправляется автоматически.

EQUAL / WEIGHTED: R <= fitEPS → UNSATISFIABLE EXPLICIT: abs( ΣrowHeight + ΣrowGap - H ) > fitEPS → UNSATISFIABLE rowHeight <= 0 → INVALID rowGap < 0 → INVALID

Y partition

08 / RowTrack + RowGapTrack

Rows идут top-to-bottom в screen coordinates.

RowTrack {
  rowIndex,
  y0,
  y1,
  heightRaw,
  heightShortN?,

  domainX0,
  domainX1,

  status,
  confidence,
  provenance
}

RowGapTrack {
  rowGapIndex,
  topRowIndex,
  bottomRowIndex,

  y0,
  y1,
  heightRaw,
  heightShortN?
}

Точный Y-cover

09 / partition invariants

Rows и declared gaps полностью покрывают inherited domain height.

rows[0].y0 = domain.y0 rows[N-1].y1 = domain.y1 sequence: R0 Gap0 R1 Gap1 ... R(N-1) adjacent: previous.y1 = next.y0

Isotropic row lengths

10 / ShortN

Row heights/gaps получают normalized descriptors только через 6.03.

heightShortN = heightRaw / shortSide rowGapShortN = rowGapRaw / shortSide common 2× scale: raw → 2× ShortN → invariant
NO UV METRIC. axis-fraction UV не используется как canonical row height/gap metric.

Row × column ещё не означает Cell[]

11 / defer cells

9.00 подготавливает lattice evidence, но Cell identity появляется только в 9.01.

9.00 gives: ColumnTrack[] reference RowTrack[] owned 9.01 will define: Cell[] module identity [rowIndex, columnIndex] coordinate addressing Therefore 9.00: cellSetRef = null

Node occupancy ≠ cell occupancy

12 / occupancy firewall

Это главный ownership barrier при переходе из Topic 8 в Topic 9.

TOPIC 8 / 8.02

ColumnGrid node occupancy
занятость canonical X-boundary nodes.

TOPIC 9 / 9.03

ModularGrid cell/region occupancy
занятость 2D ячеек/регионов.

NOT ALIASES. `nodeOccupancyRegistryRef` нельзя записывать в `occupancyMapRef` ModularGrid как будто это одна и та же система.

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

13 / Topic9 ownership

9.00 заранее резервирует child refs, но не реализует будущие контракты.

ModuleCanonical ownership
9.00ModularGrid root, column inheritance, row layout/resolved row geometry
9.01Cell[] / modules, row×column addressing, canonical cell geometry
9.02Merged cells, Region[], forbidden cells/regions
9.032D occupancy map, collision evidence, reflow hooks, placement candidates
9.04Variants, hard filter, local scoring, repairs/comparison/tests

Upstream changes invalidate downstream

14 / recompute

Row geometry или inherited columns меняются → child evidence становится stale, но content не мутируется.

columnGeometryRef changes → rebuild ModularGrid lineage → recompute 9.01 → invalidate 9.02 → invalidate 9.03 → invalidate 9.04 rowGeometryRef changes → recompute 9.01 → invalidate 9.02 / 9.03 / 9.04 mutationAllowed = false

Rows не голосуют

15 / descriptor != score

Row count, equal heights и потенциально квадратные cells пока только geometry descriptors.

FORBIDDEN. `more rows = better`, `equal rows = cleaner`, `square modules = better`, `smaller gaps = more efficient` — без explicit target/profile это не scoring semantics.

Visual Lab

16 / visual lab

Показываем column inheritance + owned rows, но сознательно не рисуем Cell IDs как 9.01 contract.

A · INHERIT COLUMNS X geometry reference from 8.01 B · OWN ROWS Y partition owned by 9.00 C · ROOT COMPOSITION lattice evidence, no Cell[] yet same canvas/domain/unit/frame required for inherited columns and owned rows N rows → N−1 row gaps · zero gap valid · negative gap invalid EXPLICIT height sum mismatch → UNSATISFIABLE · no silent stretch/clamp 9.01 creates Cell[] and row×column addresses · 9.00 does not 8.02 node occupancy remains upstream · 9.03 later owns 2D cell/region occupancy row geometry != quality score · square-looking modules are not universally preferred

9.00 root + rows regression

17 / deterministic tests

Проверяем inheritance, same-domain contract, row modes, partition, ShortN invariance, child ownership barriers и отсутствие node-occupancy re-ownership.

Tests not run yet.

DATA FOR LAYOUT ENGINE

18 / machine contract

Machine-readable root contract Topic 9.

{
  "module": "Compo 9.00",
  "name": "modular_grid_rows_columns_schema",
  "version": "1.0-canonical",
  "canonical_main_title": "ModularGrid rows×columns schema",
  "topic": "09_МОДУЛЬНАЯ_СЕТКА_КОЛОНКИ_И_РЯДЫ",
  "scope": "MODULARGRID_ROOT_TOPIC8_COLUMN_INHERITANCE_ROW_LAYOUT_SCHEMA_RESOLVED_ROW_GEOMETRY_AND_TOPIC9_OWNERSHIP",
  "review_basis": {
    "public_MAIN": "Topic 9 = ModularGrid rows×columns; 9.00 canonical title confirmed; Topic9 output includes ModularGrid, Cell[], Region[], occupancy map, placement candidates",
    "public_Core_0.00": "public link could not be verified/opened during this build; no Core details were invented",
    "previous_module": "Compo8.04 v1.1 corrective closing module",
    "related_owners_reviewed": [
      "Compo8.00 ColumnGrid root/domain/coordinate contract",
      "Compo8.01 column/gutter/span geometry",
      "Compo8.02 GridLine/GridNode topology + ColumnGrid node occupancy",
      "Compo6.03 ShortN normalization contract"
    ]
  },
  "consumes": [
    "Compo8.00.ColumnGrid",
    "Compo8.00.GridDomainBinding resolved to one rectangular domain",
    "Compo8.00.GridCoordinateContext",
    "Compo8.01.ResolvedColumnGeometry",
    "optional Compo8.02.ColumnGridTopology by reference only",
    "explicit RowLayoutSpec",
    "optional compatible Compo6.03.CanvasNormalizationContext"
  ],
  "provides": [
    "ModularGrid",
    "ModularGridChildRefs",
    "RowLayoutSpec",
    "RowGapSpec",
    "RowTrack[]",
    "RowGapTrack[]",
    "ResolvedRowGeometry",
    "ModularGridOwnershipMap",
    "ModularGridDependencyInvalidation",
    "rowGeometryRef for Compo9.01 / Compo9.03 / Compo9.04"
  ],
  "owns_metrics": [],
  "descriptors_only": [
    "grid.modular.rowCount",
    "grid.modular.rowHeightMode",
    "grid.modular.row.heightRaw",
    "grid.modular.row.heightShortN",
    "grid.modular.rowGap.heightRaw",
    "grid.modular.rowGap.heightShortN",
    "grid.modular.rowGeometryStatus",
    "grid.modular.columnGeometryRef",
    "grid.modular.rowGeometryRef"
  ],
  "modular_grid_schema": {
    "modularGridRef": "stable versioned root ref",
    "gridRef": "source Compo8.00 ColumnGrid ref",
    "canvasRef": "same canvas as source ColumnGrid",
    "gridDomainBindingRef": "same binding as source ColumnGrid",
    "columnGeometryRef": "required Compo8.01 geometry ref",
    "columnTopologyRef": "optional Compo8.02 topology ref, reference only",
    "rowGeometryRef": "required 9.00 ResolvedRowGeometry ref after resolution",
    "columnAxis": "X",
    "rowAxis": "Y",
    "coordinateFrame": "CANVAS_TOP_LEFT_Y_DOWN",
    "childRefs": "ModularGridChildRefs",
    "status": "SCHEMA_READY|PARTIAL|INVALID",
    "confidence": "0..1",
    "provenance": "DERIVED",
    "important": "root references inherited column evidence and owned row geometry; it does not embed Cell/Region/occupancy payloads"
  },
  "modular_grid_child_refs_schema": {
    "cellSetRef": "Compo9.01 output or null",
    "regionSetRef": "Compo9.02 output or null",
    "occupancyMapRef": "Compo9.03 output or null",
    "placementCandidateSetRef": "Compo9.03 output or null",
    "evaluationRef": "Compo9.04 output or null",
    "no_embedded_child_payloads": true
  },
  "row_layout_spec_schema": {
    "rowLayoutSpecRef": "stable explicit ref",
    "modularGridRef": "target ModularGrid root identity",
    "rowCount": "integer >=1",
    "heightMode": "EQUAL|WEIGHTED|EXPLICIT",
    "rowWeights": "required positive finite array length=rowCount for WEIGHTED",
    "rowHeights": "required positive finite array length=rowCount for EXPLICIT",
    "rowGapSpec": "RowGapSpec",
    "normalizationMode": "RAW_ONLY|RAW_AND_SHORT_N",
    "normalizationContextRef": "required for RAW_AND_SHORT_N",
    "confidence": "0..1",
    "provenance": "STANDARD|EMPIRICAL|INITIAL_HEURISTIC|STYLE_PRESET",
    "important": "no default row count/height/gap is injected by 9.00"
  },
  "row_gap_spec_schema": {
    "mode": "UNIFORM|EXPLICIT",
    "uniformHeight": "finite >=0 when UNIFORM",
    "heights": "finite >=0 array length=rowCount-1 when EXPLICIT",
    "unit": "inherits exact source unit of inherited column/domain geometry"
  },
  "row_height_allocation": {
    "domainHeight": "H = domain.y1-domain.y0",
    "gapTotal": "G = sum(resolved row-gap heights)",
    "residual": "R = H-G",
    "EQUAL": "rowHeight_i = R/N",
    "WEIGHTED": "rowHeight_i = R * weight_i / sum(weights)",
    "EXPLICIT": "use supplied rowHeights; require sum(rowHeights)+G == H within fit tolerance",
    "unsatisfiable": "R<=EPS for EQUAL/WEIGHTED or explicit sum mismatch / nonpositive row height",
    "no_autofit": "EXPLICIT heights are never silently stretched or clamped"
  },
  "row_track_schema": {
    "trackRef": "stable derived ref",
    "rowGeometryRef": "parent geometry ref",
    "rowIndex": "zero-based top-to-bottom",
    "y0": "top boundary in source unit",
    "y1": "bottom boundary in source unit",
    "heightRaw": "y1-y0",
    "heightShortN": "optional",
    "domainX0": "same inherited domain left",
    "domainX1": "same inherited domain right",
    "status": "OK",
    "confidence": "0..1",
    "provenance": "DERIVED"
  },
  "row_gap_track_schema": {
    "trackRef": "stable derived ref",
    "rowGapIndex": "0..rowCount-2",
    "topRowIndex": "rowGapIndex",
    "bottomRowIndex": "rowGapIndex+1",
    "y0": "top gap boundary",
    "y1": "bottom gap boundary",
    "heightRaw": "y1-y0; may be zero",
    "heightShortN": "optional",
    "status": "OK",
    "confidence": "0..1",
    "provenance": "DERIVED"
  },
  "resolved_row_geometry_schema": {
    "rowGeometryRef": "stable derived ref from modularGridRef + rowLayoutSpecRef + inherited domain snapshot",
    "modularGridRef": "root identity",
    "gridRef": "source ColumnGrid identity",
    "columnGeometryRef": "inherited Compo8.01 geometry ref",
    "gridDomainRef": "same domain as columns",
    "domainSnapshotRef": "same snapshot as columns when versioned",
    "canvasRef": "same canvas",
    "sourceUnit": "same source unit as columns/domain",
    "coordinateFrame": "CANVAS_TOP_LEFT_Y_DOWN",
    "rowAxis": "Y",
    "rowCount": "resolved integer",
    "rows": "RowTrack[]",
    "rowGaps": "RowGapTrack[]",
    "normalizationContextRef": "optional",
    "status": "OK|N_A|INVALID|UNSATISFIABLE",
    "confidence": "0..1",
    "provenance": "DERIVED"
  },
  "partition_invariants": {
    "top_boundary": "first row.y0 == inherited domain.y0",
    "bottom_boundary": "last row.y1 == inherited domain.y1",
    "sequence": "row0, gap0, row1, ... gapN-2, rowN-1",
    "no_overlap": "adjacent interval boundaries coincide; no positive-height overlap",
    "no_gap_outside_declared_row_gaps": "every y in inherited domain is covered by a row or declared row-gap interval",
    "track_counts": "rows=N, rowGaps=N-1",
    "canonical_order": "top-to-bottom by rowIndex"
  },
  "topic9_ownership_map": {
    "9.00": [
      "ModularGrid root identity",
      "Topic8 column-geometry inheritance contract",
      "RowLayoutSpec / RowGapSpec",
      "resolved RowTrack[] / RowGapTrack[] geometry",
      "Topic9 child-ref shell and ownership boundaries"
    ],
    "9.01": [
      "Cell[] / module identities",
      "row×column coordinate addressing",
      "canonical cell geometry from inherited columns × resolved rows"
    ],
    "9.02": [
      "merged cells",
      "Region[]",
      "forbidden-cell / forbidden-region semantics"
    ],
    "9.03": [
      "ModularGrid cell/region occupancy map",
      "collision evidence",
      "reflow hooks / requests",
      "2D placement candidates"
    ],
    "9.04": [
      "explicit ModularGrid variants",
      "hard-filter interpretation",
      "local Topic9 scoring",
      "repairs/comparison",
      "consolidated Topic9 tests"
    ]
  },
  "cross_topic_ownership": {
    "Compo8.00": "source ColumnGrid root/domain/coordinate ownership remains upstream",
    "Compo8.01": "canonical column/gutter/span geometry remains upstream",
    "Compo8.02": "canonical ColumnGrid lines/nodes and node occupancy remain upstream",
    "Compo6.03": "ShortN normalization owner",
    "Compo10": "alignment/proximity relations may consume ModularGrid evidence but do not own the grid",
    "future_global": "balance/hierarchy/negative space/eye flow/typography/image crop/global composition"
  },
  "domain_inheritance_policy": {
    "baseline": "ModularGrid rows inherit exactly the same rectangular domain/canvas/sourceUnit/frame as ResolvedColumnGeometry",
    "different_domain": "INVALID in 9.00 baseline",
    "different_canvas": "INVALID",
    "different_source_unit": "INVALID",
    "different_coordinate_frame": "INVALID",
    "nonrect_or_disconnected": "must be resolved upstream to a supported rectangular column geometry before 9.00 baseline can proceed",
    "reason": "row×column cells require a common 2D lattice domain"
  },
  "normalization_policy": {
    "raw": "inherits source unit from column/domain geometry",
    "SHORT_N": "row heights/gaps may expose ShortN only through compatible Compo6.03 context",
    "UV": "placement-only and not canonical row-height/gap metric",
    "common_scale": "raw values scale linearly; ShortN invariant when normalization context scales consistently"
  },
  "semantic_firewalls": {
    "modular_vs_column_grid": "ModularGrid references Topic8 columns; it does not re-own them",
    "row_geometry_vs_cells": "RowTrack[] defines Y partition; Cell[] identities wait for 9.01",
    "cell_vs_region": "single cell/module identity waits for 9.01; merged/forbidden region semantics wait for 9.02",
    "cell_occupancy_vs_node_occupancy": "Topic9 2D cell/region occupancy is distinct from Topic8 node occupancy",
    "row_gap_vs_negative_space": "row gap is structural grid interval, not Topic5 free-space ownership",
    "grid_vs_alignment": "Topic10 may measure alignment to grid evidence but does not redefine grid geometry",
    "grid_schema_vs_quality": "row count/equality/square appearance are descriptors, not universal quality votes"
  },
  "metric_policy": {
    "direct_scoring": "FORBIDDEN in 9.00",
    "row_count_score": "FORBIDDEN",
    "equal_rows_are_better": "FORBIDDEN",
    "square_cells_are_better": "FORBIDDEN",
    "smaller_row_gaps_are_better": "FORBIDDEN",
    "beautyScore": "FORBIDDEN"
  },
  "hard_constraints": [
    "9.00 owns the ModularGrid root schema, explicit inheritance of Topic8 column geometry, row-axis layout schema, resolved RowTrack[]/RowGapTrack[] geometry and Topic9 ownership map.",
    "9.00 must reuse an already resolved Compo8.01 ResolvedColumnGeometry; it must not recompute, copy-own or reinterpret column widths/gutters/spans.",
    "The ModularGrid baseline domain is exactly the same rectangular GridDomainBinding / domain snapshot used by the inherited ColumnGrid geometry.",
    "9.00 must not silently bind rows to a different safe zone, crop, canvas region or domain than the inherited columns.",
    "Cross-domain or cross-canvas row/column composition is INVALID unless a future explicit adapter contract is introduced; 9.00 baseline does not provide such an adapter.",
    "Screen coordinate convention remains top-left origin, +X right, +Y down.",
    "Column axis remains X and is owned upstream by Topic8; row axis is Y and is introduced by Topic9.",
    "Row count must be explicit integer >= 1. No universal default row count exists.",
    "Baseline row height modes are EQUAL, WEIGHTED and EXPLICIT.",
    "For N rows, exactly N-1 row-gap intervals exist.",
    "Row gaps may be zero but must never be negative.",
    "Resolved row heights must be strictly positive.",
    "EQUAL and WEIGHTED row modes distribute only the residual domain height after explicit row gaps are subtracted.",
    "EXPLICIT row mode requires sum(rowHeights)+sum(rowGaps) to equal the inherited grid-domain height within implementation fit tolerance; no silent stretch or clamping is allowed.",
    "Row tracks and row-gap tracks must form an exact ordered non-overlapping partition of the inherited grid-domain Y extent.",
    "Row indices are zero-based and canonical top-to-bottom in screen coordinates.",
    "9.00 does not instantiate Cell[] or two-dimensional coordinate addresses; Compo9.01 owns cells/modules and addressing.",
    "9.00 does not own merged cells, regions or forbidden-cell semantics; Compo9.02 owns them.",
    "9.00 does not own ModularGrid cell/region occupancy, collision or reflow policy; Compo9.03 owns them.",
    "9.00 does not own variants or numeric grid scoring; Compo9.04 owns them.",
    "Canonical ColumnGrid GridLine[], GridNode[] and node occupancy remain owned by Compo8.02 and must not be duplicated inside ModularGrid.",
    "A ModularGrid may reference Topic8 topology, but a reference does not transfer ownership.",
    "Topic9 cell/region occupancy and Topic8 node occupancy are distinct evidence domains and must not alias the same registry.",
    "SHORT_N row height/gap descriptors require a compatible Compo6.03 CanvasNormalizationContext.",
    "AXIS_FRACTION_UV remains placement space and must not become the canonical row-height or row-gap metric unit.",
    "Uniform common scaling must scale raw row geometry linearly while preserving compatible SHORT_N values.",
    "Row schema existence, row count, equal rows or square-looking cells are not quality scores.",
    "N/A != 0.",
    "No beautyScore."
  ],
  "hard_rules": [
    "9.00 owns the ModularGrid root schema, explicit inheritance of Topic8 column geometry, row-axis layout schema, resolved RowTrack[]/RowGapTrack[] geometry and Topic9 ownership map.",
    "9.00 must reuse an already resolved Compo8.01 ResolvedColumnGeometry; it must not recompute, copy-own or reinterpret column widths/gutters/spans.",
    "The ModularGrid baseline domain is exactly the same rectangular GridDomainBinding / domain snapshot used by the inherited ColumnGrid geometry.",
    "9.00 must not silently bind rows to a different safe zone, crop, canvas region or domain than the inherited columns.",
    "Cross-domain or cross-canvas row/column composition is INVALID unless a future explicit adapter contract is introduced; 9.00 baseline does not provide such an adapter.",
    "Screen coordinate convention remains top-left origin, +X right, +Y down.",
    "Column axis remains X and is owned upstream by Topic8; row axis is Y and is introduced by Topic9.",
    "Row count must be explicit integer >= 1. No universal default row count exists.",
    "Baseline row height modes are EQUAL, WEIGHTED and EXPLICIT.",
    "For N rows, exactly N-1 row-gap intervals exist.",
    "Row gaps may be zero but must never be negative.",
    "Resolved row heights must be strictly positive.",
    "EQUAL and WEIGHTED row modes distribute only the residual domain height after explicit row gaps are subtracted.",
    "EXPLICIT row mode requires sum(rowHeights)+sum(rowGaps) to equal the inherited grid-domain height within implementation fit tolerance; no silent stretch or clamping is allowed.",
    "Row tracks and row-gap tracks must form an exact ordered non-overlapping partition of the inherited grid-domain Y extent.",
    "Row indices are zero-based and canonical top-to-bottom in screen coordinates.",
    "9.00 does not instantiate Cell[] or two-dimensional coordinate addresses; Compo9.01 owns cells/modules and addressing.",
    "9.00 does not own merged cells, regions or forbidden-cell semantics; Compo9.02 owns them.",
    "9.00 does not own ModularGrid cell/region occupancy, collision or reflow policy; Compo9.03 owns them.",
    "9.00 does not own variants or numeric grid scoring; Compo9.04 owns them.",
    "Canonical ColumnGrid GridLine[], GridNode[] and node occupancy remain owned by Compo8.02 and must not be duplicated inside ModularGrid.",
    "A ModularGrid may reference Topic8 topology, but a reference does not transfer ownership.",
    "Topic9 cell/region occupancy and Topic8 node occupancy are distinct evidence domains and must not alias the same registry.",
    "SHORT_N row height/gap descriptors require a compatible Compo6.03 CanvasNormalizationContext.",
    "AXIS_FRACTION_UV remains placement space and must not become the canonical row-height or row-gap metric unit.",
    "Uniform common scaling must scale raw row geometry linearly while preserving compatible SHORT_N values.",
    "Row schema existence, row count, equal rows or square-looking cells are not quality scores.",
    "N/A != 0.",
    "No beautyScore."
  ],
  "soft_constraints": [],
  "preferences": [],
  "overrides_allowed_by": [
    "a newer explicit RowLayoutSpec may create a new future ResolvedRowGeometry",
    "a newer upstream column/domain snapshot creates a new ModularGrid/row-geometry lineage",
    "historical ModularGrid and row geometry refs remain immutable"
  ],
  "initial_heuristics": {
    "fit_epsilon": {
      "formula": "max(1e-12, abs(domainHeight)*1e-12)",
      "provenance": "IMPLEMENTATION_HEURISTIC",
      "note": "numerical closure only; not a design tolerance"
    }
  },
  "style_preset_values": [],
  "candidate_generation": {
    "cells": "NONE",
    "regions": "NONE",
    "occupancy": "NONE",
    "placement_candidates": "NONE",
    "reason": "9.00 establishes root + row geometry only"
  },
  "correction_policy": {
    "foreign_content_mutation": "FORBIDDEN",
    "invalid_or_unsatisfiable_row_layout": "return INVALID/UNSATISFIABLE diagnostic; never clamp",
    "column_geometry_problem": "route to Compo8.01/input owner",
    "domain_mismatch": "route to Compo8.00/upstream integration owner",
    "missing_normalization_context": "return raw geometry plus N_A normalized representation or route to Compo6.03",
    "cell_or_addressing_question": "route to Compo9.01",
    "merged_or_forbidden_region_question": "route to Compo9.02",
    "occupancy_collision_reflow_question": "route to Compo9.03",
    "variant_or_scoring_question": "route to Compo9.04",
    "alignment_question": "route to Topic10"
  },
  "deferred_inputs": [
    "Compo9.01 Cell/module/addressing contracts",
    "Compo9.02 merged/region/forbidden contracts",
    "Compo9.03 occupancy/collision/reflow/candidate contracts",
    "Compo9.04 variants/scoring/tests",
    "future explicit adapter for nonrect/disconnected row×column domains if required"
  ],
  "recompute_when": [
    "source ColumnGrid/columnGeometryRef changes",
    "inherited GridDomainBinding/domainSnapshot changes",
    "RowLayoutSpec changes",
    "rowCount/heightMode/weights/explicit heights change",
    "RowGapSpec changes",
    "normalization context changes"
  ],
  "tests": [
    "root lineage validation",
    "same-domain inheritance",
    "row layout validation",
    "equal/weighted/explicit row allocation",
    "uniform/explicit row gaps",
    "single-row zero-gap list",
    "unsatisfiable residual",
    "explicit sum mismatch",
    "exact Y partition",
    "ShortN scale invariance",
    "missing normalization",
    "no Cell/Region/occupancy ownership",
    "Topic8 node-occupancy firewall",
    "determinism",
    "no scoring/global leakage"
  ],
  "finality": "MODULARGRID_ROOT_COLUMN_INHERITANCE_AND_RESOLVED_ROW_GEOMETRY_ONLY"
}
ARCHITECTURE CHECKPOINT · 9.00 OWNS MODULARGRID ROOT IDENTITY, TOPIC8 COLUMN-INHERITANCE CONTRACT, ROWLAYOUTSPEC/ROWGAPSPEC AND RESOLVED ROWTRACK[]/ROWGAPTRACK[] GEOMETRY. COLUMNS/GUTTERS/SPANS REMAIN COMPO8.01. GRIDLINE/GRIDNODE/COLUMNGRID NODE OCCUPANCY REMAIN COMPO8.02. ROWS USE Y, TOP-TO-BOTTOM, +Y DOWN, OVER EXACTLY THE SAME RECTANGULAR DOMAIN/CANVAS/UNIT/FRAME AS INHERITED COLUMNS. NO DEFAULT ROWCOUNT. EQUAL/WEIGHTED/EXPLICIT HEIGHT MODES; N ROWS → N−1 GAPS; ZERO GAP VALID; EXPLICIT SUM MISMATCH → UNSATISFIABLE, NEVER SILENT STRETCH/CLAMP. CELL[]/ADDRESSING → 9.01. MERGED/REGION/FORBIDDEN → 9.02. 2D CELL/REGION OCCUPANCY, COLLISION, REFLOW, PLACEMENT CANDIDATES → 9.03. VARIANTS/SCORING → 9.04. NODE OCCUPANCY != CELL OCCUPANCY. NO BEAUTYSCORE.
VISITS / ...