2D root через inheritance, не через копирование
9.00 берёт X-структуру из Topic 8 и добавляет собственную Y-структуру rows. Это создаёт основание для 2D modular grid, но ещё не Cell[].
Inherited from 8.01.
Owned and resolved by 9.00.
Deferred to 9.01.
Root identity
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-геометрии
ModularGrid обязан ссылаться на точную версию ResolvedColumnGeometry и тот же domain snapshot.
Rows и columns живут в одном rectangle
Baseline 9.00 не допускает независимый row-domain.
Row count explicit
По 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
}
N rows → N−1 gaps
Zero row gap допустим, negative — invalid.
UNIFORM
{
mode: "UNIFORM",
uniformHeight: g
}EXPLICIT
{
mode: "EXPLICIT",
heights: [
g0, g1, ...
]
}Domain height = hard budget
Сначала вычитаются declared row gaps, затем распределяется остаток.
Никакого silent compression
Row layout, который не помещается по Y, не исправляется автоматически.
Y partition
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
Rows и declared gaps полностью покрывают inherited domain height.
Isotropic row lengths
Row heights/gaps получают normalized descriptors только через 6.03.
Row × column ещё не означает Cell[]
9.00 подготавливает lattice evidence, но Cell identity появляется только в 9.01.
Node occupancy ≠ cell occupancy
Это главный 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 ячеек/регионов.
Пять модулей — пять границ
9.00 заранее резервирует child refs, но не реализует будущие контракты.
| Module | Canonical ownership |
|---|---|
| 9.00 | ModularGrid root, column inheritance, row layout/resolved row geometry |
| 9.01 | Cell[] / modules, row×column addressing, canonical cell geometry |
| 9.02 | Merged cells, Region[], forbidden cells/regions |
| 9.03 | 2D occupancy map, collision evidence, reflow hooks, placement candidates |
| 9.04 | Variants, hard filter, local scoring, repairs/comparison/tests |
Upstream changes invalidate downstream
Row geometry или inherited columns меняются → child evidence становится stale, но content не мутируется.
Rows не голосуют
Row count, equal heights и потенциально квадратные cells пока только geometry descriptors.
Visual Lab
Показываем column inheritance + owned rows, но сознательно не рисуем Cell IDs как 9.01 contract.
9.00 root + rows regression
Проверяем inheritance, same-domain contract, row modes, partition, ShortN invariance, child ownership barriers и отсутствие node-occupancy re-ownership.
DATA FOR LAYOUT ENGINE
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"
}