COMPO · 9.03 · OCCUPANCY / COLLISION / REFLOW · v1.1

Occupancy,
collision &
reflow.

Corrective v1.1 runtime grid layer Topic 9: explicit COMPLETE/PARTIAL/MISSING occupancy snapshots over atomic CellRefs, derived region occupancy descriptors, discrete grid-occupancy collision evidence, mutation-free reflow requests and bounded seeded deterministic 2D placement candidates. Forbidden constraints remain a separate 9.02 channel. Candidate feasibility is not layout quality and never becomes a numeric score here.

ModuleCompo 9.03
Scopeoccupancy / collision / reflow
Candidatesbounded + seeded
Forbiddenseparate 9.02 channel
Metricsnone
Next9.04

Occupancy — отдельный runtime layer

00 / module api

9.03 получает immutable Cell/Region/Forbidden evidence и строит текущий occupancy snapshot, collision checks, reflow requests и placement candidates.

OCCUPANCY

FREE / UNKNOWN / OCCUPIED.

COLLISION

Discrete CellRef conflict only.

REFLOW

Request, never mutation.

Coverage определяет смысл отсутствия binding

01 / occupancy snapshot

Без coverage нельзя отличить реально свободную cell от просто неописанной.

OccupancySnapshotSpec {
  occupancyMapRef,
  cellSetRef,

  coverage:
    COMPLETE |
    PARTIAL |
    MISSING,

  bindings[],

  confidence,
  provenance
}
COMPLETE + no active occupant → FREE PARTIAL + no active occupant → UNKNOWN MISSING → N_A

Distinct contentRef matters

02 / OccupancyBinding

Два bindings одного contentRef не превращают cell в MULTI_OCCUPIED.

OccupancyBinding {
  bindingRef,
  cellSetRef,
  cellRef,
  contentRef,

  status:
    ACTIVE |
    INACTIVE,

  sourceOwnerRef,
  sourceEvidenceRef,

  confidence,
  provenance
}

Только memberCellRefs

03 / region occupancy

Outer envelope region не участвует в occupancy aggregation.

all FREE → EMPTY_KNOWN all occupied → FULLY_OCCUPIED_KNOWN occupied + FREE → PARTIALLY_OCCUPIED_KNOWN occupied + UNKNOWN/N_A → OCCUPIED_WITH_UNKNOWN UNKNOWN/N_A only → UNKNOWN missing map → N_A

CLEAR / COLLISION / UNKNOWN

04 / grid collision

Collision смотрит только current atomic-cell occupancy.

any proposed cell OCCUPIED or MULTI_OCCUPIED → COLLISION else any proposed cell UNKNOWN or N_A → UNKNOWN else all proposed cells FREE → CLEAR
GRID COLLISION ONLY. Это не pixel-level shape intersection и не collision с содержимым gutters/row gaps.

Explicit excludeContentRef

05 / self exclusion

При relocation можно исключить собственные текущие bindings из проверки, не изменяя snapshot.

stored occupants: [A, B] excludeContentRef = A evaluation occupants: [B] stored map: unchanged

Constraint остаётся 9.02

06 / forbidden channel

Candidate filter объединяет evidence channels, но не смешивает их семантику.

OCCUPANCY

FREE / UNKNOWN / OCCUPIED / MULTI_OCCUPIED
owner: 9.03

FORBIDDEN

FORBIDDEN / UNRESTRICTED / N_A
owner: 9.02

NO ALIAS. `FORBIDDEN != OCCUPIED`; `UNRESTRICTED != FREE`.

One contentRef per request

07 / placement request

Source scope и filtering policies задаются явно.

GridPlacementRequest {
  requestRef,
  contentRef,

  modularGridRef,
  cellSetRef,
  regionSetRef?,

  occupancyMapRef?,
  forbiddenRegistryRef?,

  candidateSourceKind:
    ALL_CELLS |
    EXPLICIT_CELL_REFS |
    EXPLICIT_REGION_REFS |
    RECT_BLOCK,

  allowedCellRefs[]?,
  allowedRegionRefs[]?,
  rowSpan?,
  columnSpan?,

  occupancyPolicy:
    REQUIRE_KNOWN_FREE |
    ALLOW_UNKNOWN |
    IGNORE_OCCUPANCY,

  forbiddenPolicy:
    REQUIRE_UNRESTRICTED |
    IGNORE_FORBIDDEN,

  excludeContentRef?,

  generationBudget,
  seed
}

Четыре bounded source models

08 / candidate sources

Никакого hidden multi-object Cartesian product.

SourceFootprint
ALL_CELLSкаждая atomic Cell отдельно
EXPLICIT_CELL_REFSтолько explicit allow-list cells
EXPLICIT_REGION_REFSexact Region.memberCellRefs
RECT_BLOCKвсе valid top-left anchors заданного rowSpan×columnSpan

Unknown не маскируется

09 / filter policies

Enabled channel либо разрешает, либо блокирует, либо оставляет PARTIAL evidence.

REQUIRE_KNOWN_FREE: CLEAR → keep COLLISION → reject UNKNOWN/N_A → unresolved/reject ALLOW_UNKNOWN: COLLISION → reject CLEAR → keep COMPLETE UNKNOWN → keep PARTIAL IGNORE_OCCUPANCY: occupancy channel NOT_APPLIED REQUIRE_UNRESTRICTED: FORBIDDEN → reject UNRESTRICTED → pass missing/N_A registry → unresolved/reject IGNORE_FORBIDDEN: forbidden channel NOT_APPLIED

No silent truncation

10 / generation budget

Raw space проверяется до materialization.

GenerationBudget {
  maxRawEvaluations,
  maxAcceptedCandidates
}
potentialRawCount > maxRawEvaluations → BUDGET_EXCEEDED NOT: generate first N silently

Fingerprint включает runtime snapshots

11 / candidate identity

Та же requestRef с новой occupancy map — уже другой candidate set.

generationFingerprint includes: requestRef contentRef cellSetRef regionSetRef occupancyMapRef forbiddenRegistryRef source parameters policies budget seed candidateSetRef = requestRef + hash(fingerprint)

Advisory only

12 / reflow hooks

Collision или нехватка evidence не запускают автоматическое движение.

ReflowRequest {
  reflowRequestRef,

  requestKind:
    REQUEST_RELOCATE_CONTENT |
    REQUEST_RELEASE_OCCUPANCY |
    REQUEST_RESOLVE_OCCUPANCY |
    REQUEST_RESOLVE_FORBIDDEN_CONSTRAINT |
    REQUEST_EXPAND_PLACEMENT_SCOPE |
    REQUEST_REGENERATE_CANDIDATES,

  contentRef,
  sourceEvidenceRefs[],
  targetOwnerRef,

  mutationAllowed: false
}

Runtime state локален

13 / ownership firewalls

9.03 не становится global layout solver.

QuestionOwner
Atomic Cell?9.01
Region/forbidden?9.02
Cell/region occupancy?9.03
Grid collision?9.03
Reflow requests?9.03
2D placement candidates?9.03
Variants/scoring/final local fit?9.04

Feasible candidate ≠ good design

14 / descriptor != score

Количество свободных cells или candidates не является эстетическим голосом.

FORBIDDEN. `more free cells = better`, `fewer collisions = prettier`, `higher seedPriority = better`. 9.03 не выдаёт numeric quality score.

Visual Lab

15 / visual lab

Показываем independence occupancy/forbidden, unknown evidence и reflow without mutation.

A · OCCUPANCY SNAPSHOT FREEOCCUPIEDUNKNOWN absence semantics depend on coverage B · TWO CHANNELS OCCUPIED FORBIDDEN independent evidence channels C · REFLOW REQUEST request != automatic movement COMPLETE+absence → FREE · PARTIAL+absence → UNKNOWN · MISSING → N/A collision = discrete proposed CellRefs versus current occupancy snapshot FORBIDDEN != OCCUPIED · UNRESTRICTED != FREE one contentRef per placement request · no multi-object Cartesian product raw candidate space above budget → BUDGET_EXCEEDED, not prefix truncation seed priority only selects deterministic subset · never becomes score

9.03 occupancy/collision/candidate regression

16 / deterministic tests

Проверяем coverage semantics, region aggregation, self-exclusion, forbidden independence, budgets, deterministic candidate identity и mutation barriers.

Tests not run yet.

DATA FOR LAYOUT ENGINE

17 / machine contract

Machine-readable 9.03 contract.

{
  "module": "Compo 9.03",
  "name": "occupancy_collision_reflow_hooks",
  "version": "1.1-corrective",
  "canonical_main_title": "Occupancy, collision, reflow hooks",
  "topic": "09_МОДУЛЬНАЯ_СЕТКА_КОЛОНКИ_И_РЯДЫ",
  "scope": "CELL_REGION_OCCUPANCY_GRID_COLLISION_REFLOW_HOOKS_AND_BOUNDED_2D_PLACEMENT_CANDIDATES",
  "review_basis": {
    "public_MAIN": "9.03 exact title confirmed; Topic9 output includes occupancy map and placement candidates",
    "public_Core_0.00": "canonical public Core link still not verifiable; no Core contents invented",
    "previous_module": "Compo9.02 regions + forbidden constraints",
    "related_owners_reviewed": [
      "Compo9.01 CellSet/CellRef/addressing/neighbors",
      "Compo9.02 RegionSet/ForbiddenGridRegistry",
      "Compo8.02 ColumnGrid node occupancy registry",
      "Compo8.03 bounded seeded deterministic candidate generation patterns"
    ]
  },
  "consumes": [
    "Compo9.00.ModularGrid",
    "Compo9.01.CellSet",
    "optional Compo9.02.RegionSet",
    "optional Compo9.02.ForbiddenGridRegistry",
    "explicit OccupancySnapshotSpec",
    "explicit GridPlacementRequest",
    "explicit GenerationBudget"
  ],
  "provides": [
    "OccupancyBinding",
    "OccupancySnapshotSpec",
    "CellOccupancyState[]",
    "RegionOccupancyDescriptor[]",
    "ModularGridOccupancyMap",
    "GridOccupancyCollision",
    "CandidateConstraintCheck",
    "ReflowRequest",
    "GridPlacementRequest",
    "GridPlacementCandidate",
    "GridPlacementCandidateSet",
    "CandidateRejectionDiagnostic",
    "ProposedOccupancyBinding[]"
  ],
  "owns_metrics": [],
  "descriptors_only": [
    "grid.modular.occupancy.coverage",
    "grid.modular.cell.occupancyState",
    "grid.modular.cell.distinctOccupantCount",
    "grid.modular.region.occupancyState",
    "grid.modular.collision.result",
    "grid.modular.candidate.rawCount",
    "grid.modular.candidate.acceptedCount",
    "grid.modular.candidate.evidenceStatus"
  ],
  "occupancy_binding_schema": {
    "bindingRef": "stable unique ref",
    "cellSetRef": "exact CellSet lineage",
    "cellRef": "exact atomic CellRef",
    "contentRef": "explicit occupant identity",
    "status": "ACTIVE|INACTIVE",
    "sourceOwnerRef": "required owner-qualified source",
    "sourceEvidenceRef": "required evidence ref",
    "confidence": "0..1",
    "provenance": "STANDARD|EMPIRICAL|INITIAL_HEURISTIC|STYLE_PRESET|DERIVED"
  },
  "occupancy_snapshot_spec_schema": {
    "occupancyMapRef": "stable versioned snapshot ref",
    "cellSetRef": "exact CellSet lineage",
    "coverage": "COMPLETE|PARTIAL|MISSING",
    "bindings": "OccupancyBinding[]",
    "confidence": "0..1",
    "provenance": "STANDARD|EMPIRICAL|INITIAL_HEURISTIC|STYLE_PRESET|DERIVED",
    "important": "absence semantics depend on coverage"
  },
  "cell_occupancy_semantics": {
    "MISSING": "N_A for every cell",
    "COMPLETE + 0 distinct active contentRef": "FREE",
    "PARTIAL + 0 distinct active contentRef": "UNKNOWN",
    "1 distinct active contentRef": "OCCUPIED",
    ">=2 distinct active contentRef": "MULTI_OCCUPIED",
    "inactive_bindings": "do not occupy",
    "same_content_duplicate_bindings": "one distinct occupant"
  },
  "region_occupancy_semantics": {
    "all FREE": "EMPTY_KNOWN",
    "all occupied/multi and no unknown": "FULLY_OCCUPIED_KNOWN",
    "mix occupied and FREE, no unknown": "PARTIALLY_OCCUPIED_KNOWN",
    "occupied plus UNKNOWN/N_A": "OCCUPIED_WITH_UNKNOWN",
    "UNKNOWN/N_A with no occupied": "UNKNOWN",
    "missing map": "N_A",
    "source": "exact Region.memberCellRefs only"
  },
  "collision_schema": {
    "collisionRef": "stable derived ref",
    "occupancyMapRef": "exact current snapshot",
    "cellSetRef": "exact lineage",
    "contentRef": "proposed content",
    "proposedCellRefs": "unique explicit atomic CellRefs",
    "excludeContentRef": "optional exact self-exclusion",
    "result": "CLEAR|COLLISION|UNKNOWN|N_A|INVALID",
    "collidingCellRefs": "proven occupied after self-exclusion",
    "unknownCellRefs": "unresolved cells",
    "occupantRefsByCell": "remaining distinct occupants",
    "confidence": "0..1",
    "provenance": "DERIVED",
    "meaning": "grid occupancy collision only, not arbitrary geometric object intersection"
  },
  "reflow_request_schema": {
    "reflowRequestRef": "stable ref",
    "requestKind": "REQUEST_RELOCATE_CONTENT|REQUEST_RELEASE_OCCUPANCY|REQUEST_RESOLVE_OCCUPANCY|REQUEST_RESOLVE_FORBIDDEN_CONSTRAINT|REQUEST_EXPAND_PLACEMENT_SCOPE|REQUEST_REGENERATE_CANDIDATES",
    "contentRef": "explicit content",
    "sourceEvidenceRefs": "collision/constraint/candidate refs",
    "targetOwnerRef": "layout_owner|occupancy_source_owner|constraint_owner|placement_request_owner|candidate_orchestrator",
    "suggestedCellRefs": "optional advisory refs",
    "mutationAllowed": false,
    "provenance": "DERIVED"
  },
  "grid_placement_request_schema": {
    "requestRef": "stable explicit ref",
    "contentRef": "exactly one content identity",
    "modularGridRef": "exact 9.00 root",
    "cellSetRef": "exact 9.01 set",
    "regionSetRef": "required for EXPLICIT_REGION_REFS",
    "occupancyMapRef": "optional current 9.03 map",
    "forbiddenRegistryRef": "optional current 9.02 registry",
    "candidateSourceKind": "ALL_CELLS|EXPLICIT_CELL_REFS|EXPLICIT_REGION_REFS|RECT_BLOCK",
    "allowedCellRefs": "required for EXPLICIT_CELL_REFS",
    "allowedRegionRefs": "required for EXPLICIT_REGION_REFS",
    "rowSpan": "integer >=1 for RECT_BLOCK",
    "columnSpan": "integer >=1 for RECT_BLOCK",
    "occupancyPolicy": "REQUIRE_KNOWN_FREE|ALLOW_UNKNOWN|IGNORE_OCCUPANCY",
    "forbiddenPolicy": "REQUIRE_UNRESTRICTED|IGNORE_FORBIDDEN",
    "excludeContentRef": "optional explicit self-exclusion",
    "generationBudget": "GenerationBudget",
    "seed": "required deterministic seed",
    "confidence": "0..1",
    "provenance": "STANDARD|EMPIRICAL|INITIAL_HEURISTIC|STYLE_PRESET"
  },
  "generation_budget_schema": {
    "maxRawEvaluations": "integer >=1",
    "maxAcceptedCandidates": "integer >=1",
    "budget_exceeded": "return BUDGET_EXCEEDED before raw materialization; no silent prefix truncation"
  },
  "candidate_source_semantics": {
    "ALL_CELLS": "one one-cell candidate for every atomic Cell",
    "EXPLICIT_CELL_REFS": "one one-cell candidate per explicit unique allowed CellRef",
    "EXPLICIT_REGION_REFS": "one candidate per exact Region.memberCellRefs footprint",
    "RECT_BLOCK": "one candidate for every valid top-left anchor of explicit rowSpan×columnSpan complete atomic block",
    "cross_content_cartesian": "FORBIDDEN"
  },
  "candidate_filter_semantics": {
    "occupancy_REQUIRE_KNOWN_FREE": "accept only collision=CLEAR",
    "occupancy_ALLOW_UNKNOWN": "reject COLLISION; CLEAR=>COMPLETE evidence, UNKNOWN=>PARTIAL evidence",
    "occupancy_IGNORE_OCCUPANCY": "no occupancy rejection; evidenceStatus NOT_APPLIED for occupancy channel",
    "forbidden_REQUIRE_UNRESTRICTED": "requires OK registry and all footprint cells UNRESTRICTED_BY_THIS_REGISTRY",
    "forbidden_IGNORE_FORBIDDEN": "no forbidden rejection; evidenceStatus NOT_APPLIED for forbidden channel",
    "combined": "candidate accepted only when no enabled channel proves or blocks feasibility"
  },
  "candidate_schema": {
    "candidateRef": "generation-set-scoped deterministic ref",
    "candidateSetRef": "parent set",
    "requestRef": "source request",
    "contentRef": "single content",
    "sourceKind": "CELL|REGION|RECT_BLOCK",
    "sourceRef": "CellRef|RegionRef|derived rect-block signature",
    "footprintCellRefs": "canonical row-major unique CellRefs",
    "collisionEvidence": "GridOccupancyCollision or NOT_APPLIED",
    "forbiddenEvidence": "CandidateConstraintCheck or NOT_APPLIED",
    "evidenceStatus": "COMPLETE|PARTIAL|NOT_APPLIED",
    "proposedOccupancyBindings": "proposal objects; never applied automatically",
    "seedPriority": "deterministic subset-selection key only",
    "score": "null / not owned",
    "mutationAllowed": false
  },
  "candidate_set_identity": {
    "candidateSetRef": "candidate-set:<requestRef>:<generationFingerprintHash>",
    "generationFingerprint": "deterministic serialization of request+lineage+source+policies+budget+seed+occupancyMapRef+forbiddenRegistryRef",
    "important": "any relevant snapshot or policy change creates new identity"
  },
  "ownership_map": {
    "8.02": "ColumnGrid node occupancy",
    "9.01": "atomic Cell identity/address/geometry",
    "9.02": "Region membership and forbidden constraints",
    "9.03": "cell/region occupancy, grid collision, reflow hooks, 2D placement candidates",
    "9.04": "variants, hard-filter aggregation, local scoring, repairs/comparison/tests"
  },
  "semantic_firewalls": {
    "forbidden_vs_occupied": "9.02 forbidden constraint and 9.03 occupancy state are independent",
    "unrestricted_vs_free": "UNRESTRICTED_BY_THIS_REGISTRY is not FREE",
    "node_vs_cell_occupancy": "8.02 node occupancy and 9.03 cell occupancy never share registry identity",
    "region_envelope_vs_collision": "grid collision uses Region.memberCellRefs, not outerEnvelope",
    "grid_collision_vs_geometry_collision": "9.03 collision is discrete occupancy collision only",
    "candidate_vs_accepted_layout": "candidate is local feasibility evidence, not layout commitment",
    "seed_priority_vs_score": "seedPriority is not a score",
    "reflow_vs_mutation": "reflow request never mutates foreign-owned state"
  },
  "metric_policy": {
    "direct_scoring": "FORBIDDEN in 9.03",
    "free_cell_count_score": "FORBIDDEN",
    "collision_count_score": "FORBIDDEN",
    "candidate_count_score": "FORBIDDEN",
    "seedPriority_score": "FORBIDDEN",
    "beautyScore": "FORBIDDEN"
  },
  "hard_constraints": [
    "9.03 owns canonical ModularGrid atomic-cell occupancy state, region occupancy descriptors, grid-occupancy collision evidence, mutation-free reflow hooks and bounded seeded deterministic 2D placement candidate generation.",
    "Atomic Cell identity/address/geometry remain owned by Compo9.01.",
    "Region identity/membership/forbidden constraints remain owned by Compo9.02.",
    "Canonical ColumnGrid GridNode occupancy remains owned by Compo8.02 and must not alias ModularGrid cell occupancy.",
    "Occupancy map lineage is scoped to exactly one CellSetRef.",
    "Occupancy coverage state is explicit: COMPLETE, PARTIAL or MISSING.",
    "MISSING coverage produces occupancy map status N_A and every atomic Cell occupancy state N_A.",
    "COMPLETE coverage plus no active occupant binding on a Cell means FREE.",
    "PARTIAL coverage plus no active occupant binding on a Cell means UNKNOWN.",
    "One distinct active contentRef on a Cell means OCCUPIED.",
    "Two or more distinct active contentRef values on a Cell means MULTI_OCCUPIED.",
    "Multiple active bindings for the same contentRef on one Cell do not create MULTI_OCCUPIED by themselves.",
    "Inactive occupancy bindings are preserved as provenance but do not occupy cells.",
    "Unknown CellRef, duplicate bindingRef or cross-CellSet binding is INVALID.",
    "Occupancy binding contentRef must be explicit and non-empty.",
    "Region occupancy is derived only from its explicit memberCellRefs and never from outerEnvelope geometry.",
    "Region occupancy descriptors are EMPTY_KNOWN, PARTIALLY_OCCUPIED_KNOWN, FULLY_OCCUPIED_KNOWN, OCCUPIED_WITH_UNKNOWN, UNKNOWN or N_A.",
    "Region occupancy with any UNKNOWN member and at least one proven occupied member is OCCUPIED_WITH_UNKNOWN.",
    "Region occupancy with UNKNOWN members and no proven occupied member is UNKNOWN.",
    "Region occupancy is a descriptor and is not a score.",
    "Forbidden state from 9.02 and occupancy state from 9.03 are independent evidence channels.",
    "FORBIDDEN does not imply OCCUPIED.",
    "UNRESTRICTED_BY_THIS_REGISTRY does not imply FREE.",
    "GridOccupancyCollision evaluates proposed atomic CellRefs against current occupancy evidence only.",
    "Collision result is COLLISION if any proposed Cell is OCCUPIED or MULTI_OCCUPIED after explicit self-exclusion policy.",
    "Collision result is UNKNOWN if there is no proven collision but at least one proposed Cell is UNKNOWN or N_A.",
    "Collision result is CLEAR only when all evaluated proposed Cells are known FREE after explicit self-exclusion policy.",
    "Collision does not inspect forbidden constraints; forbidden conflict is a separate CandidateConstraintCheck.",
    "Collision does not claim exact pixel/shape intersection inside gutters, row gaps or arbitrary object geometry.",
    "Self-exclusion is allowed only by explicit excludeContentRef and removes only that contentRef from occupancy evaluation; it never deletes stored bindings.",
    "Reflow hooks are advisory requests with mutationAllowed=false.",
    "9.03 never automatically moves content, clears occupancy, edits RegionSet, changes forbidden declarations or rewrites CellSet.",
    "Baseline reflow request kinds are REQUEST_RELOCATE_CONTENT, REQUEST_RELEASE_OCCUPANCY, REQUEST_RESOLVE_OCCUPANCY, REQUEST_RESOLVE_FORBIDDEN_CONSTRAINT, REQUEST_EXPAND_PLACEMENT_SCOPE and REQUEST_REGENERATE_CANDIDATES.",
    "One GridPlacementRequest operates on exactly one explicit contentRef.",
    "Baseline candidate source kinds are ALL_CELLS, EXPLICIT_CELL_REFS, EXPLICIT_REGION_REFS and RECT_BLOCK.",
    "RECT_BLOCK requires explicit rowSpan>=1 and columnSpan>=1 and enumerates valid top-left anchors only.",
    "EXPLICIT_REGION_REFS uses exact Region memberCellRefs as occupancy footprint; region outerEnvelope is not used for grid-occupancy collision.",
    "Candidate occupancy policy is explicit: REQUIRE_KNOWN_FREE, ALLOW_UNKNOWN or IGNORE_OCCUPANCY.",
    "Candidate forbidden policy is explicit: REQUIRE_UNRESTRICTED or IGNORE_FORBIDDEN.",
    "REQUIRE_KNOWN_FREE accepts only footprints whose collision result is CLEAR.",
    "ALLOW_UNKNOWN rejects proven COLLISION but may retain UNKNOWN candidates with evidenceStatus PARTIAL.",
    "IGNORE_OCCUPANCY does not convert occupied cells to free; it marks occupancy filtering NOT_APPLIED.",
    "REQUIRE_UNRESTRICTED requires a present OK forbidden registry and every footprint Cell state UNRESTRICTED_BY_THIS_REGISTRY.",
    "A missing forbidden registry under REQUIRE_UNRESTRICTED yields unresolved candidate evidence and must not be treated as unrestricted.",
    "Any FORBIDDEN cell under REQUIRE_UNRESTRICTED rejects the candidate.",
    "IGNORE_FORBIDDEN does not convert forbidden cells to allowed; it marks forbidden filtering NOT_APPLIED.",
    "GenerationBudget requires finite integer maxRawEvaluations>=1 and maxAcceptedCandidates>=1.",
    "If potential raw candidate count exceeds maxRawEvaluations, generation returns BUDGET_EXCEEDED and does not silently truncate the raw candidate space.",
    "CandidateSetRef must include a deterministic generation fingerprint over request lineage, source, policies, budget, seed, occupancyMapRef and forbiddenRegistryRef.",
    "Changing seed, budget, candidate source, occupancy snapshot, forbidden registry or policy must create a new candidate-set identity.",
    "Candidate semantic identity includes exact ordered footprint CellRefs and source semantics.",
    "Candidate subset selection above maxAcceptedCandidates is deterministic and seed-dependent.",
    "Seed priority is an implementation selection key only and must never become a score or aesthetic preference.",
    "Candidate generation must not produce a Cartesian product across multiple contentRef values.",
    "Proposed occupancy bindings emitted by candidates are proposals only and never mutate the current occupancy map.",
    "Placement candidate acceptance is local grid feasibility evidence, not global layout acceptance.",
    "9.03 owns no numeric aesthetic metric.",
    "9.04 owns explicit variants, hard-filter aggregation, local Topic9 scoring, repairs/comparison and consolidated tests.",
    "N/A != 0.",
    "No beautyScore.",
    "Collision identity must canonicalize proposedCellRefs before hashing so semantically identical footprints are order-invariant.",
    "Collision identity must include excludeContentRef because self-exclusion can change the collision result.",
    "Generation fingerprint must canonicalize set-like allowedCellRefs and allowedRegionRefs before hashing."
  ],
  "hard_rules": [
    "9.03 owns canonical ModularGrid atomic-cell occupancy state, region occupancy descriptors, grid-occupancy collision evidence, mutation-free reflow hooks and bounded seeded deterministic 2D placement candidate generation.",
    "Atomic Cell identity/address/geometry remain owned by Compo9.01.",
    "Region identity/membership/forbidden constraints remain owned by Compo9.02.",
    "Canonical ColumnGrid GridNode occupancy remains owned by Compo8.02 and must not alias ModularGrid cell occupancy.",
    "Occupancy map lineage is scoped to exactly one CellSetRef.",
    "Occupancy coverage state is explicit: COMPLETE, PARTIAL or MISSING.",
    "MISSING coverage produces occupancy map status N_A and every atomic Cell occupancy state N_A.",
    "COMPLETE coverage plus no active occupant binding on a Cell means FREE.",
    "PARTIAL coverage plus no active occupant binding on a Cell means UNKNOWN.",
    "One distinct active contentRef on a Cell means OCCUPIED.",
    "Two or more distinct active contentRef values on a Cell means MULTI_OCCUPIED.",
    "Multiple active bindings for the same contentRef on one Cell do not create MULTI_OCCUPIED by themselves.",
    "Inactive occupancy bindings are preserved as provenance but do not occupy cells.",
    "Unknown CellRef, duplicate bindingRef or cross-CellSet binding is INVALID.",
    "Occupancy binding contentRef must be explicit and non-empty.",
    "Region occupancy is derived only from its explicit memberCellRefs and never from outerEnvelope geometry.",
    "Region occupancy descriptors are EMPTY_KNOWN, PARTIALLY_OCCUPIED_KNOWN, FULLY_OCCUPIED_KNOWN, OCCUPIED_WITH_UNKNOWN, UNKNOWN or N_A.",
    "Region occupancy with any UNKNOWN member and at least one proven occupied member is OCCUPIED_WITH_UNKNOWN.",
    "Region occupancy with UNKNOWN members and no proven occupied member is UNKNOWN.",
    "Region occupancy is a descriptor and is not a score.",
    "Forbidden state from 9.02 and occupancy state from 9.03 are independent evidence channels.",
    "FORBIDDEN does not imply OCCUPIED.",
    "UNRESTRICTED_BY_THIS_REGISTRY does not imply FREE.",
    "GridOccupancyCollision evaluates proposed atomic CellRefs against current occupancy evidence only.",
    "Collision result is COLLISION if any proposed Cell is OCCUPIED or MULTI_OCCUPIED after explicit self-exclusion policy.",
    "Collision result is UNKNOWN if there is no proven collision but at least one proposed Cell is UNKNOWN or N_A.",
    "Collision result is CLEAR only when all evaluated proposed Cells are known FREE after explicit self-exclusion policy.",
    "Collision does not inspect forbidden constraints; forbidden conflict is a separate CandidateConstraintCheck.",
    "Collision does not claim exact pixel/shape intersection inside gutters, row gaps or arbitrary object geometry.",
    "Self-exclusion is allowed only by explicit excludeContentRef and removes only that contentRef from occupancy evaluation; it never deletes stored bindings.",
    "Reflow hooks are advisory requests with mutationAllowed=false.",
    "9.03 never automatically moves content, clears occupancy, edits RegionSet, changes forbidden declarations or rewrites CellSet.",
    "Baseline reflow request kinds are REQUEST_RELOCATE_CONTENT, REQUEST_RELEASE_OCCUPANCY, REQUEST_RESOLVE_OCCUPANCY, REQUEST_RESOLVE_FORBIDDEN_CONSTRAINT, REQUEST_EXPAND_PLACEMENT_SCOPE and REQUEST_REGENERATE_CANDIDATES.",
    "One GridPlacementRequest operates on exactly one explicit contentRef.",
    "Baseline candidate source kinds are ALL_CELLS, EXPLICIT_CELL_REFS, EXPLICIT_REGION_REFS and RECT_BLOCK.",
    "RECT_BLOCK requires explicit rowSpan>=1 and columnSpan>=1 and enumerates valid top-left anchors only.",
    "EXPLICIT_REGION_REFS uses exact Region memberCellRefs as occupancy footprint; region outerEnvelope is not used for grid-occupancy collision.",
    "Candidate occupancy policy is explicit: REQUIRE_KNOWN_FREE, ALLOW_UNKNOWN or IGNORE_OCCUPANCY.",
    "Candidate forbidden policy is explicit: REQUIRE_UNRESTRICTED or IGNORE_FORBIDDEN.",
    "REQUIRE_KNOWN_FREE accepts only footprints whose collision result is CLEAR.",
    "ALLOW_UNKNOWN rejects proven COLLISION but may retain UNKNOWN candidates with evidenceStatus PARTIAL.",
    "IGNORE_OCCUPANCY does not convert occupied cells to free; it marks occupancy filtering NOT_APPLIED.",
    "REQUIRE_UNRESTRICTED requires a present OK forbidden registry and every footprint Cell state UNRESTRICTED_BY_THIS_REGISTRY.",
    "A missing forbidden registry under REQUIRE_UNRESTRICTED yields unresolved candidate evidence and must not be treated as unrestricted.",
    "Any FORBIDDEN cell under REQUIRE_UNRESTRICTED rejects the candidate.",
    "IGNORE_FORBIDDEN does not convert forbidden cells to allowed; it marks forbidden filtering NOT_APPLIED.",
    "GenerationBudget requires finite integer maxRawEvaluations>=1 and maxAcceptedCandidates>=1.",
    "If potential raw candidate count exceeds maxRawEvaluations, generation returns BUDGET_EXCEEDED and does not silently truncate the raw candidate space.",
    "CandidateSetRef must include a deterministic generation fingerprint over request lineage, source, policies, budget, seed, occupancyMapRef and forbiddenRegistryRef.",
    "Changing seed, budget, candidate source, occupancy snapshot, forbidden registry or policy must create a new candidate-set identity.",
    "Candidate semantic identity includes exact ordered footprint CellRefs and source semantics.",
    "Candidate subset selection above maxAcceptedCandidates is deterministic and seed-dependent.",
    "Seed priority is an implementation selection key only and must never become a score or aesthetic preference.",
    "Candidate generation must not produce a Cartesian product across multiple contentRef values.",
    "Proposed occupancy bindings emitted by candidates are proposals only and never mutate the current occupancy map.",
    "Placement candidate acceptance is local grid feasibility evidence, not global layout acceptance.",
    "9.03 owns no numeric aesthetic metric.",
    "9.04 owns explicit variants, hard-filter aggregation, local Topic9 scoring, repairs/comparison and consolidated tests.",
    "N/A != 0.",
    "No beautyScore.",
    "Collision identity must canonicalize proposedCellRefs before hashing so semantically identical footprints are order-invariant.",
    "Collision identity must include excludeContentRef because self-exclusion can change the collision result.",
    "Generation fingerprint must canonicalize set-like allowedCellRefs and allowedRegionRefs before hashing."
  ],
  "soft_constraints": [],
  "preferences": [],
  "overrides_allowed_by": [
    "a newer explicit occupancy snapshot creates a new occupancyMapRef",
    "a newer forbidden registry changes candidate constraint evidence without mutating occupancy",
    "a new request/seed/budget/policy creates a new candidate set lineage",
    "historical occupancy maps and candidate sets remain immutable"
  ],
  "initial_heuristics": {
    "seed_hash": {
      "algorithm": "FNV-1a 32-bit reference implementation for deterministic subset selection",
      "provenance": "IMPLEMENTATION_HEURISTIC",
      "note": "selection determinism only; not visual scoring"
    }
  },
  "style_preset_values": [],
  "correction_policy": {
    "foreign_content_mutation": "FORBIDDEN",
    "collision": "emit REQUEST_RELOCATE_CONTENT or REQUEST_RELEASE_OCCUPANCY; do not move/delete",
    "unknown_occupancy": "emit REQUEST_RESOLVE_OCCUPANCY",
    "forbidden_conflict": "emit REQUEST_RESOLVE_FORBIDDEN_CONSTRAINT or relocate",
    "candidate_exhaustion": "emit REQUEST_EXPAND_PLACEMENT_SCOPE or REQUEST_REGENERATE_CANDIDATES",
    "variant_scoring_question": "route to Compo9.04"
  },
  "deferred_inputs": [
    "Compo9.04 variants/scoring/closing tests",
    "non-grid exact geometric object collision if required by another owner",
    "global multi-content placement orchestration"
  ],
  "recompute_when": [
    "CellSetRef changes",
    "RegionSetRef changes",
    "ForbiddenGridRegistry changes",
    "occupancy snapshot coverage/bindings change",
    "placement request/source/policy/budget/seed changes"
  ],
  "tests": [
    "occupancy COMPLETE/PARTIAL/MISSING semantics",
    "distinct occupants vs duplicate same content",
    "region occupancy descriptors",
    "self-exclusion collision",
    "CLEAR/COLLISION/UNKNOWN/N_A",
    "forbidden independence",
    "candidate source enumeration",
    "rect block generation",
    "budget exceeded",
    "require known free / allow unknown / ignore occupancy",
    "require unrestricted / missing registry / forbidden reject",
    "generation fingerprint",
    "deterministic subset",
    "proposed bindings no mutation",
    "reflow requests mutation-free",
    "no score/global leakage"
  ],
  "finality": "MODULARGRID_OCCUPANCY_COLLISION_REFLOW_AND_2D_CANDIDATE_OWNER_ONLY",
  "corrective_identity_rules": {
    "collisionRef": "hashes canonical row-major proposedCellRefs plus occupancyMapRef, cellSetRef, contentRef and excludeContentRef",
    "collision_order_invariance": "same semantic footprint with different input order => same collisionRef",
    "self_exclusion_identity": "excludeContentRef is part of collision identity because it can change collision result",
    "candidateSet_allowlist_order_invariance": "EXPLICIT_CELL_REFS and EXPLICIT_REGION_REFS are canonicalized before generation fingerprinting"
  }
}
ARCHITECTURE CHECKPOINT · 9.03 OWNS MODULARGRID CELL/REGION OCCUPANCY, DISCRETE GRID-OCCUPANCY COLLISION, MUTATION-FREE REFLOW HOOKS AND BOUNDED SEEDED DETERMINISTIC 2D PLACEMENT CANDIDATES. COMPLETE+ABSENCE=FREE; PARTIAL+ABSENCE=UNKNOWN; MISSING=N/A. DISTINCT CONTENTREF COUNT, NOT BINDING COUNT, DETERMINES OCCUPIED VS MULTI_OCCUPIED. REGION OCCUPANCY USES EXACT MEMBER CELLREFS, NEVER OUTER ENVELOPE. FORBIDDEN REMAINS 9.02: FORBIDDEN != OCCUPIED; UNRESTRICTED != FREE. COLLISION IS GRID CELL OCCUPANCY ONLY, NOT PIXEL/SHAPE INTERSECTION. SELF-EXCLUSION IS EXPLICIT AND NON-MUTATING. ONE CONTENTREF PER PLACEMENT REQUEST. ALL_CELLS / EXPLICIT_CELL_REFS / EXPLICIT_REGION_REFS / RECT_BLOCK ARE EXPLICIT SOURCES. RAW SPACE ABOVE BUDGET → BUDGET_EXCEEDED, NEVER SILENT PREFIX TRUNCATION. CANDIDATESETREF IS GENERATION-FINGERPRINTED. SEED PRIORITY != SCORE. PROPOSED BINDINGS != APPLIED OCCUPANCY. REFLOW REQUEST != MUTATION. VARIANTS/SCORING → 9.04. COLUMNGRID NODE OCCUPANCY REMAINS 8.02. NO BEAUTYSCORE.
VISITS / ...