COMPO · 8.02 · GRID LINES / NODES / OCCUPANCY REGISTRY

Grid lines,
nodes &
occupancy registry.

Canonical topology layer Topic 8: de-duplicated vertical GridLine geometry, one-dimensional INLINE_BOUNDARY_NODE identities, track-to-node topology edges and explicit ColumnGrid node occupancy snapshots. Zero-width gutters preserve track identity without duplicate nodes. FREE is legal only under COMPLETE registry coverage; PARTIAL absence remains UNKNOWN. No alignment inference, cell occupancy, candidate generation or scoring.

ModuleCompo 8.02
Scopelines / nodes / occupancy
Node1D inline topology
Coveragecomplete / partial
Topic8 · COLUMN GRID
Next8.03

Geometry boundary → topology identity

00 / module api

8.02 превращает track boundaries 8.01 в canonical vertical lines и 1D inline nodes, затем — при наличии explicit registry — описывает occupancy этих nodes.

GRIDLINE

Vertical geometric realization.

GRIDNODE

1D topology identity on X.

OCCUPANCY

Explicit registry state only.

NO PROXIMITY INFERENCE. Объект, визуально стоящий в 1 px от grid line, не считается occupying node. Такое отношение позже измеряет Topic 10.

Сначала собираем все причины существования границы

01 / boundary events

Одна X-позиция может одновременно быть правой границей колонки, левой границей gutter и т. д.

GridBoundaryEvent {
  eventRef,
  x,

  role:
    DOMAIN_LEFT |
    DOMAIN_RIGHT |
    COLUMN_LEFT |
    COLUMN_RIGHT |
    GUTTER_LEFT |
    GUTTER_RIGHT,

  sourceTrackRef,
  sourceIndex?,
  provenance: DERIVED
}

Coincident boundaries → one canonical position

02 / canonicalization

De-duplication нужна прежде всего для zero-width gutters и floating-point closure.

1. collect all boundary events 2. sort by X 3. cluster: Δx <= topologyEPS 4. one canonical position per cluster 5. union: boundaryRoles[] sourceTrackRefs[] eventRefs[] 6. assign ordinal left → right
DEDUP != DATA LOSS. Геометрическая позиция одна, но все semantic roles и source refs сохраняются.

Геометрическая вертикаль

03 / GridLine

Line охватывает Y-extent grid domain и не имеет собственной occupancy semantics.

GridLine {
  gridLineRef,
  topologyRef,
  ordinal,

  orientation:
    VERTICAL,

  xRaw,
  y0Raw,
  y1Raw,

  sourceUnit,
  coordinateFrame,

  boundaryRoles[],
  sourceTrackRefs[],
  eventRefs[],

  confidence,
  provenance: DERIVED
}

1D topology-node, не 2D intersection

04 / GridNode

Node — стабильная топологическая идентичность X-boundary. Его geometric realization — соответствующий GridLine.

GridNode {
  gridNodeRef,
  topologyRef,
  gridLineRef,
  ordinal,

  nodeKind:
    INLINE_BOUNDARY_NODE,

  axis: X,
  xRaw,

  boundaryRoles[],
  incidentTrackRefs[],

  confidence,
  provenance: DERIVED
}
NOT A 2D POINT OWNER. Topic 8 не вводит универсальный `(x,y)` intersection-node. Row/cell topology появится в Topic 9.

Каждый track связывает nodes

05 / track topology

Column/Gutter identity сохраняется как topology-edge поверх canonical nodes.

GridTrackTopologyEdge {
  edgeRef,
  trackRef,

  trackKind:
    COLUMN |
    GUTTER,

  trackIndex,

  leftNodeRef,
  rightNodeRef,

  lengthRaw,
  zeroLength,

  confidence,
  provenance
}

Zero gutter не порождает duplicate nodes

06 / zero-width gutter

При `gutter.widthRaw=0` обе стороны gutter указывают на один и тот же node.

positive gutter: Node A → GutterEdge → Node B zero-width gutter: Node A ↺ GutterEdge(length=0) → Node A ColumnTrack: leftNodeRef != rightNodeRef always

Occupancy приходит как explicit assertion

07 / NodeOccupancyBinding

Registry хранит факт привязки из placement/layout/integration owner, но не выводит его из координат.

NodeOccupancyBinding {
  bindingRef,
  gridRef,
  topologyRef,
  nodeRef,
  contentRef,

  bindingKind:
    PLACEMENT_ANCHOR |
    CONTENT_EDGE |
    CONTENT_CENTER |
    CUSTOM,

  sourceOwnerRef,
  sourceEvidenceRef,

  bindingStatus:
    ACTIVE |
    INACTIVE,

  confidence,
  provenance
}

COMPLETE vs PARTIAL

08 / coverage semantics

Это ключ к корректному различению `FREE` и `UNKNOWN`.

COMPLETE

Registry заявляет полное покрытие snapshot. Нет active bindings → FREE.

PARTIAL

Registry знает только часть bindings. Нет active bindings → UNKNOWN.

ABSENCE != FREE. Без complete coverage нельзя утверждать, что node свободен.

FREE / UNKNOWN / OCCUPIED / MULTI_OCCUPIED

09 / occupancy states

Количество occupants — descriptor, а не встроенная capacity violation.

COMPLETE + activeCount=0 → FREE PARTIAL + activeCount=0 → UNKNOWN activeCount=1 → OCCUPIED activeCount>=2 → MULTI_OCCUPIED
MULTI_OCCUPIED != BAD. Universal max capacity здесь не существует. Если она понадобится, explicit capacity/target policy должен появиться downstream.

One state per canonical node

10 / registry snapshot

Output registry идёт в node ordinal order и хранит active/inactive binding lineage.

ColumnGridNodeOccupancyRegistry {
  registryRef,
  gridRef,
  topologyRef,

  coverageMode,
  sourceSnapshotRef,

  nodeStates[],
  activeBindings[],
  inactiveBindings[],

  status,
  confidence,
  provenance: DERIVED
}

Occupancy ≠ alignment ≠ cell occupancy

11 / ownership firewalls

Три похожих понятия разведены по owners.

QuestionOwner
Какие X-boundaries/lines/nodes существуют?8.02
Какой content explicit registered on node?8.02
Как генерировать placement candidate?8.03
Является ли multi occupancy нарушением target?8.04 / explicit constraint owner
Какая 2D grid cell occupied?Topic 9
Насколько object edge близок/выровнен к line?Topic 10

Topology/registry change only invalidates downstream

12 / recompute

8.02 не передвигает объекты и не пересобирает кандидатов самостоятельно.

columnGeometry changes → recompute 8.02 topology → invalidate 8.03 → invalidate 8.04 occupancy snapshot changes → invalidate dependent 8.03 → invalidate 8.04 mutationAllowed = false

Topology не является quality vote

13 / descriptor != score

Количество линий, узлов, свободных или занятых nodes само по себе ничего не говорит о качестве композиции.

FORBIDDEN. `more free nodes = better`, `single occupancy = better`, `more grid lines = more structured` — без explicit downstream target это не scoring semantics.

Visual Lab

14 / visual lab

Главный counterexample — zero gutter и PARTIAL registry.

A · POSITIVE GUTTER gutter has two distinct nodes B · ZERO GUTTER one canonical node · many roles C · REGISTRY COVERAGE partial registry: empty node = UNKNOWN GridLine = vertical geometry · GridNode = canonical 1D inline topology identity zero gutter keeps track identity but creates a zero-length topology edge occupancy comes only from explicit bindings · never inferred from proximity COMPLETE + no active binding = FREE · PARTIAL + no active binding = UNKNOWN MULTI_OCCUPIED is descriptive · no universal capacity rule Topic9 owns cell/region occupancy · Topic10 owns alignment/proximity

8.02 topology/occupancy regression

15 / deterministic tests

Проверяем line/node canonicalization, zero-gutter self-edge, registry coverage, multi occupancy, invalid bindings и ownership barriers.

Tests not run yet.

DATA FOR LAYOUT ENGINE

16 / machine contract

Machine-readable 8.02 contract.

{
  "module": "Compo 8.02",
  "name": "grid_lines_nodes_and_occupancy_registry",
  "version": "1.0-canonical",
  "canonical_main_title": "Grid lines, nodes и occupancy registry",
  "topic": "08_КОЛОННАЯ_СЕТКА",
  "scope": "CANONICAL_COLUMNGRID_BOUNDARY_LINES_1D_TOPOLOGY_NODES_TRACK_EDGES_AND_EXPLICIT_NODE_OCCUPANCY_REGISTRY",
  "consumes": [
    "Compo8.00.ColumnGrid",
    "Compo8.01.ResolvedColumnGeometry",
    "optional explicit NodeOccupancyRegistrySpec",
    "owner-qualified NodeOccupancyBinding[]"
  ],
  "provides": [
    "GridBoundaryEvent",
    "GridLine[]",
    "GridNode[]",
    "ColumnGridTopology",
    "GridTrackTopologyEdge[]",
    "NodeOccupancyBinding",
    "NodeOccupancyRegistrySpec",
    "NodeOccupancyState[]",
    "ColumnGridNodeOccupancyRegistry",
    "TopologyInvalidationRequest"
  ],
  "owns_metrics": [],
  "descriptors_only": [
    "grid.line.xRaw",
    "grid.line.boundaryRoles",
    "grid.line.sourceTrackRefs",
    "grid.node.ordinal",
    "grid.node.xRaw",
    "grid.node.boundaryRoles",
    "grid.node.incidentTrackRefs",
    "grid.node.occupancyState",
    "grid.node.activeBindingCount",
    "grid.node.occupantRefs",
    "grid.topology.nodeCount",
    "grid.topology.lineCount"
  ],
  "boundary_event_schema": {
    "eventRef": "derived stable ref",
    "x": "finite source-unit X coordinate",
    "role": "DOMAIN_LEFT|DOMAIN_RIGHT|COLUMN_LEFT|COLUMN_RIGHT|GUTTER_LEFT|GUTTER_RIGHT",
    "sourceTrackRef": "ColumnTrack/GutterTrack ref or domain ref",
    "sourceIndex": "optional track index",
    "provenance": "DERIVED"
  },
  "grid_line_schema": {
    "gridLineRef": "stable derived ref within one columnGeometryRef",
    "topologyRef": "parent topology ref",
    "ordinal": "zero-based left-to-right unique position index",
    "orientation": "VERTICAL",
    "xRaw": "canonical X coordinate",
    "y0Raw": "grid-domain top",
    "y1Raw": "grid-domain bottom",
    "sourceUnit": "inherits Compo8.01 geometry",
    "coordinateFrame": "CANVAS_TOP_LEFT_Y_DOWN",
    "boundaryRoles": "sorted unique roles from clustered boundary events",
    "sourceTrackRefs": "sorted unique source refs",
    "eventRefs": "sorted source event refs",
    "confidence": "minimum source confidence",
    "provenance": "DERIVED"
  },
  "grid_node_schema": {
    "gridNodeRef": "stable derived ref",
    "topologyRef": "same topology",
    "gridLineRef": "one-to-one canonical geometric realization",
    "ordinal": "same canonical ordinal as line",
    "nodeKind": "INLINE_BOUNDARY_NODE",
    "axis": "X",
    "xRaw": "same canonical X as line",
    "boundaryRoles": "sorted unique roles",
    "incidentTrackRefs": "sorted unique track refs touching this boundary",
    "confidence": "0..1",
    "provenance": "DERIVED",
    "important": "not a generic 2D point/intersection owner"
  },
  "track_topology_edge_schema": {
    "edgeRef": "derived ref",
    "trackRef": "Compo8.01 ColumnTrack/GutterTrack ref",
    "trackKind": "COLUMN|GUTTER",
    "trackIndex": "integer",
    "leftNodeRef": "canonical node at track x0",
    "rightNodeRef": "canonical node at track x1",
    "lengthRaw": "track width",
    "zeroLength": "true only for zero-width gutter baseline",
    "confidence": "0..1",
    "provenance": "DERIVED"
  },
  "canonicalization": {
    "input": "all domain/column/gutter X boundary events",
    "sort": "ascending X, then canonical role order, then eventRef",
    "cluster": "adjacent positions whose difference <= topologyEpsilon",
    "representative": "minimum finite X in cluster; only an implementation canonicalization choice",
    "roles": "union all roles",
    "source_refs": "union all source track refs",
    "output_order": "strictly left-to-right unique line/node ordinals",
    "zero_gutter": "its left/right events cluster to one canonical node",
    "column_positive_width": "column left/right must resolve to different nodes"
  },
  "occupancy_binding_schema": {
    "bindingRef": "stable unique ref",
    "gridRef": "same ColumnGrid",
    "topologyRef": "same ColumnGridTopology",
    "nodeRef": "existing canonical GridNode ref",
    "contentRef": "owner-qualified content/object ref",
    "bindingKind": "PLACEMENT_ANCHOR|CONTENT_EDGE|CONTENT_CENTER|CUSTOM",
    "sourceOwnerRef": "owner that asserts this occupancy binding",
    "sourceEvidenceRef": "evidence/candidate/layout snapshot ref",
    "bindingStatus": "ACTIVE|INACTIVE",
    "confidence": "0..1",
    "provenance": "object",
    "important": "binding asserts registry occupancy; it is not inferred from proximity"
  },
  "occupancy_registry_spec_schema": {
    "registryRef": "stable versioned ref",
    "gridRef": "same ColumnGrid",
    "topologyRef": "same topology",
    "coverageMode": "COMPLETE|PARTIAL",
    "sourceSnapshotRef": "layout/candidate/integration snapshot identity",
    "bindings": "NodeOccupancyBinding[]",
    "confidence": "0..1",
    "provenance": "object",
    "duplicate_binding_ref": "INVALID"
  },
  "node_occupancy_state_semantics": {
    "COMPLETE + 0 active bindings": "FREE",
    "PARTIAL + 0 active bindings": "UNKNOWN",
    "1 active binding": "OCCUPIED",
    "2+ active bindings": "MULTI_OCCUPIED",
    "inactive_bindings": "do not count toward current activeBindingCount",
    "multi_occupied": "descriptor only; no universal violation",
    "absence_without_registry": "N_A for occupancy subsystem"
  },
  "column_grid_node_occupancy_registry_schema": {
    "registryRef": "source registry ref",
    "gridRef": "grid identity",
    "topologyRef": "topology identity",
    "coverageMode": "COMPLETE|PARTIAL",
    "sourceSnapshotRef": "source state snapshot",
    "nodeStates": "one NodeOccupancyState per canonical GridNode, in ordinal order",
    "activeBindings": "sorted active bindings",
    "inactiveBindings": "sorted inactive bindings",
    "status": "OK|N_A|INVALID",
    "confidence": "minimum relevant evidence confidence",
    "provenance": "DERIVED"
  },
  "ownership_map": {
    "8.00": "ColumnGrid root/domain/coordinate ownership",
    "8.01": "columns/gutters/spans and resolved 1D geometry",
    "8.02": "canonical GridLine/GridNode topology and ColumnGrid node occupancy registry",
    "8.03": "placement candidate generation using topology/occupancy evidence",
    "8.04": "variants, target interpretation/scoring and Topic8 regression",
    "9.x": "ModularGrid rows/cells/regions and 2D cell/region occupancy",
    "10.x": "alignment/proximity relations to existing Topic8 grid evidence"
  },
  "semantic_firewalls": {
    "line_vs_node": "GridLine is geometric vertical line; GridNode is one-dimensional topology identity",
    "node_vs_intersection": "Topic8 GridNode is not a generic 2D intersection-point contract",
    "occupancy_vs_alignment": "occupancy binding is explicit state; visual closeness/alignment is Topic10",
    "occupancy_vs_placement": "registry may describe an accepted/current placement snapshot but does not generate the placement",
    "multi_occupancy_vs_violation": "MULTI_OCCUPIED is descriptive until explicit capacity/target policy exists downstream",
    "free_vs_unknown": "absence of binding is FREE only under COMPLETE registry coverage",
    "node_vs_cell_occupancy": "Topic8 node occupancy and Topic9 cell/region occupancy are distinct owners"
  },
  "metric_policy": {
    "direct_scoring": "FORBIDDEN in 8.02",
    "node_count_score": "FORBIDDEN",
    "occupancy_count_score": "FORBIDDEN",
    "free_nodes_are_better": "FORBIDDEN",
    "single_occupancy_is_better": "FORBIDDEN without explicit downstream capacity policy",
    "beautyScore": "FORBIDDEN"
  },
  "hard_constraints": [
    "8.02 owns canonical ColumnGrid GridLine[], one-dimensional GridNode[] topology and the ColumnGrid node occupancy registry.",
    "GridLine is geometric evidence; GridNode is the canonical topology identity associated with one unique inline X boundary position.",
    "GridNode in Topic8 is one-dimensional INLINE_BOUNDARY_NODE, not a generic 2D intersection node.",
    "Canonical GridLine/GridNode positions are derived only from an already resolved Compo8.01 column geometry.",
    "Coincident boundary events within implementation equality tolerance are de-duplicated into one canonical GridLine/GridNode while preserving every boundaryRole and sourceTrackRef.",
    "Zero-width gutters must not create duplicate coincident lines/nodes.",
    "A zero-width gutter remains a real GutterTrack identity and maps to a zero-length topology edge whose leftNodeRef equals rightNodeRef.",
    "Positive-width columns must always map between two distinct canonical nodes.",
    "Grid lines are vertical and span the resolved grid domain Y extent.",
    "Boundary roles are descriptive provenance: DOMAIN_LEFT, DOMAIN_RIGHT, COLUMN_LEFT, COLUMN_RIGHT, GUTTER_LEFT, GUTTER_RIGHT.",
    "Boundary role multiplicity at one node is valid and expected at shared track boundaries.",
    "8.02 does not change 8.01 track geometry while canonicalizing topology.",
    "Node occupancy is explicit registry state; 8.02 must not infer occupancy from visual proximity, alignment tolerance, overlap or content bounding boxes.",
    "Node occupancy bindings must be owner-qualified and reference an existing canonical node in the same grid/topology.",
    "Registry coverageMode COMPLETE means absence of an active binding may be resolved as FREE.",
    "Registry coverageMode PARTIAL means absence of an active binding resolves as UNKNOWN, never FREE.",
    "One active binding yields OCCUPIED; more than one yields MULTI_OCCUPIED. MULTI_OCCUPIED is descriptive and not automatically a violation.",
    "No universal node capacity is defined in 8.02.",
    "Inactive bindings do not count as current occupancy but remain available as registry provenance if supplied.",
    "Duplicate bindingRef values are INVALID.",
    "Unknown nodeRef in a binding is INVALID.",
    "A contentRef may explicitly occupy more than one node; 8.02 does not prohibit this.",
    "A node may explicitly carry more than one occupant; 8.02 records it without scoring.",
    "Topic10 owns geometric alignment/proximity relations to grid lines/nodes and must not re-own occupancy identity.",
    "Topic9 owns ModularGrid cell/region occupancy and must not re-own ColumnGrid node occupancy.",
    "8.03 may consume topology/occupancy to generate placement candidates but does not own the registry.",
    "8.04 may interpret explicit occupancy constraints/targets but raw occupancy counts/states do not vote independently.",
    "Topology or occupancy change only invalidates downstream evidence; it does not mutate content.",
    "N/A != 0.",
    "No beautyScore."
  ],
  "hard_rules": [
    "8.02 owns canonical ColumnGrid GridLine[], one-dimensional GridNode[] topology and the ColumnGrid node occupancy registry.",
    "GridLine is geometric evidence; GridNode is the canonical topology identity associated with one unique inline X boundary position.",
    "GridNode in Topic8 is one-dimensional INLINE_BOUNDARY_NODE, not a generic 2D intersection node.",
    "Canonical GridLine/GridNode positions are derived only from an already resolved Compo8.01 column geometry.",
    "Coincident boundary events within implementation equality tolerance are de-duplicated into one canonical GridLine/GridNode while preserving every boundaryRole and sourceTrackRef.",
    "Zero-width gutters must not create duplicate coincident lines/nodes.",
    "A zero-width gutter remains a real GutterTrack identity and maps to a zero-length topology edge whose leftNodeRef equals rightNodeRef.",
    "Positive-width columns must always map between two distinct canonical nodes.",
    "Grid lines are vertical and span the resolved grid domain Y extent.",
    "Boundary roles are descriptive provenance: DOMAIN_LEFT, DOMAIN_RIGHT, COLUMN_LEFT, COLUMN_RIGHT, GUTTER_LEFT, GUTTER_RIGHT.",
    "Boundary role multiplicity at one node is valid and expected at shared track boundaries.",
    "8.02 does not change 8.01 track geometry while canonicalizing topology.",
    "Node occupancy is explicit registry state; 8.02 must not infer occupancy from visual proximity, alignment tolerance, overlap or content bounding boxes.",
    "Node occupancy bindings must be owner-qualified and reference an existing canonical node in the same grid/topology.",
    "Registry coverageMode COMPLETE means absence of an active binding may be resolved as FREE.",
    "Registry coverageMode PARTIAL means absence of an active binding resolves as UNKNOWN, never FREE.",
    "One active binding yields OCCUPIED; more than one yields MULTI_OCCUPIED. MULTI_OCCUPIED is descriptive and not automatically a violation.",
    "No universal node capacity is defined in 8.02.",
    "Inactive bindings do not count as current occupancy but remain available as registry provenance if supplied.",
    "Duplicate bindingRef values are INVALID.",
    "Unknown nodeRef in a binding is INVALID.",
    "A contentRef may explicitly occupy more than one node; 8.02 does not prohibit this.",
    "A node may explicitly carry more than one occupant; 8.02 records it without scoring.",
    "Topic10 owns geometric alignment/proximity relations to grid lines/nodes and must not re-own occupancy identity.",
    "Topic9 owns ModularGrid cell/region occupancy and must not re-own ColumnGrid node occupancy.",
    "8.03 may consume topology/occupancy to generate placement candidates but does not own the registry.",
    "8.04 may interpret explicit occupancy constraints/targets but raw occupancy counts/states do not vote independently.",
    "Topology or occupancy change only invalidates downstream evidence; it does not mutate content.",
    "N/A != 0.",
    "No beautyScore."
  ],
  "soft_constraints": [],
  "preferences": [],
  "overrides_allowed_by": [
    "a newer Compo8.01 columnGeometryRef produces a new topology version",
    "a newer explicit occupancy registry snapshot produces a new registry version",
    "historical topology/registry outputs remain immutable and tied to original refs"
  ],
  "initial_heuristics": {
    "topology_epsilon": {
      "formula": "max(1e-12, abs(domainWidth)*1e-12)",
      "provenance": "IMPLEMENTATION_HEURISTIC",
      "note": "used only to de-duplicate numerically coincident boundary events"
    },
    "role_sort_order": {
      "value": [
        "DOMAIN_LEFT",
        "COLUMN_LEFT",
        "GUTTER_LEFT",
        "GUTTER_RIGHT",
        "COLUMN_RIGHT",
        "DOMAIN_RIGHT"
      ],
      "provenance": "IMPLEMENTATION_HEURISTIC",
      "note": "deterministic serialization order only; no semantic priority"
    }
  },
  "style_preset_values": [],
  "candidate_generation": {
    "placement_candidates": "NONE",
    "reason": "8.02 resolves topology/registry state; 8.03 owns candidate generation"
  },
  "correction_policy": {
    "foreign_content_mutation": "FORBIDDEN",
    "invalid_column_geometry": "route to 8.01",
    "unknown_node_binding": "return INVALID and request binding/source correction",
    "missing_registry": "occupancy = N_A, not FREE",
    "alignment_question": "route to Topic10",
    "cell_occupancy_question": "route to Topic9",
    "placement_question": "route to 8.03",
    "capacity_or_scoring_question": "route to 8.04 or explicit downstream constraint owner"
  },
  "deferred_inputs": [
    "Compo8.03 placement candidate contracts",
    "Compo8.04 occupancy/capacity target interpretation if needed",
    "Topic9 2D ModularGrid cell/region occupancy",
    "Topic10 alignment relations"
  ],
  "recompute_when": [
    "Compo8.01 columnGeometryRef changes",
    "track x0/x1 changes",
    "domain Y extent changes",
    "occupancy registry spec changes",
    "binding status/node/content/source snapshot changes"
  ],
  "tests": [
    "positive-gutter topology",
    "zero-gutter dedup",
    "boundary-role union",
    "track-to-node mapping",
    "zero-length gutter edge",
    "column distinct-node invariant",
    "topology determinism",
    "complete registry free state",
    "partial registry unknown state",
    "single/multi occupancy",
    "inactive binding",
    "duplicate binding",
    "unknown node",
    "same content multiple nodes",
    "missing registry N_A",
    "no alignment inference",
    "no cell occupancy",
    "no scoring/global leakage"
  ],
  "finality": "COLUMNGRID_CANONICAL_BOUNDARY_TOPOLOGY_AND_EXPLICIT_NODE_OCCUPANCY_OWNER"
}
ARCHITECTURE CHECKPOINT · 8.02 OWNS CANONICAL COLUMNGRID GRIDLINE[], ONE-DIMENSIONAL INLINE_BOUNDARY_NODE[] TOPOLOGY AND COLUMNGRID NODE OCCUPANCY REGISTRY. GRIDLINE IS GEOMETRY; GRIDNODE IS TOPOLOGY IDENTITY, NOT GENERIC 2D INTERSECTION. COINCIDENT BOUNDARIES DEDUPE WHILE PRESERVING ALL ROLES/LINEAGE. ZERO-WIDTH GUTTER MAPS TO A ZERO-LENGTH SELF-EDGE ON ONE NODE; POSITIVE-WIDTH COLUMNS ALWAYS CONNECT DISTINCT NODES. OCCUPANCY IS EXPLICIT — NEVER INFERRED FROM PROXIMITY. COMPLETE+NO BINDING=FREE; PARTIAL+NO BINDING=UNKNOWN. MULTI_OCCUPIED IS DESCRIPTIVE, NOT AUTOMATICALLY A VIOLATION. TOPIC9 OWNS CELL/REGION OCCUPANCY; TOPIC10 OWNS ALIGNMENT/PROXIMITY. 8.03 CANDIDATES; 8.04 TARGET INTERPRETATION/SCORING. NO BEAUTYSCORE.
VISITS / ...