COMPO · 5.03 · FIGURE-GROUND / ACTIVE-PASSIVE SPACE RELATIONS

Figure-ground /
active-passive
space.

Канонический relation layer Topic 5 по MAIN: boundary attribution EmptyRegion↔objects/domain, enclosure classes и structural active/passive-space cues. Без отдельного corridor/channel subsystem, без eye-flow и без aesthetic score.

ModuleCompo 5.03
MAINexact scope
Ownsfigure-ground relations
Channelsdeferred
Topic5 · SPACE
Next5.04

Figure-ground без выхода за MAIN

00 / module api

5.03 связывает EmptyRegion с object supports и границей domain. Он описывает enclosure и structural active/passive cues, но не вводит route/channel subsystem.

CANONICAL TITLE

Figure-ground / active-passive space relations.

CONSUMES

5.01 canonical masks/support attribution + 5.02 EmptyRegionSet.

FINALITY

FIGURE-GROUND / ACTIVE-PASSIVE RELATIONS ONLY.

NO CHANNEL SUBSYSTEM. Corridor/channel routing не указан в Topic 5 MAIN и поэтому не получает ownership в 5.03.

Кому принадлежит граница пустоты

01 / boundary attribution

Один geometric boundary segment может быть связан с несколькими overlapping object owners, но его уникальная длина считается один раз.

Segment

{
  segmentRef,
  kind:
    OBJECT_CONTACT |
    DOMAIN_CONTACT,
  lengthPx,
  ownerObjectRefs[],
  confidence,
  provenance
}

Multiplicity

unique segment:
  count once

owner attribution:
  may contain A + B

Σ per-owner contact
  may exceed
unique object-boundary length

FigureGroundRelation

02 / figure-ground

Figure-ground relation отделяет object-facing boundary от domain-facing boundary.

FigureGroundRelation {
  regionId,
  contactObjectRefs[],
  contactLengthByObjectRef,

  uniqueObjectBoundaryLengthPx,
  domainBoundaryLengthPx,
  totalBoundaryLengthPx,

  objectBoundaryFraction,
  domainBoundaryFraction,
  contactObjectCount,

  enclosureClass,
  activePassiveClass,
  confidence,
  provenance
}
objectBoundaryFraction = L_object_unique / L_total domainBoundaryFraction = L_domain / L_total valid boundary: objectBoundaryFraction + domainBoundaryFraction = 1

Три exact relation classes

03 / enclosure

`FULL_DOMAIN_FREE` нельзя выводить только из отсутствия object contact: region должен действительно покрывать весь supplied domain.

ClassCondition
OBJECT_ENCLOSED_VOIDobject boundary > 0; domain boundary = 0
DOMAIN_OPEN_REGIONobject boundary > 0; domain boundary > 0
FULL_DOMAIN_FREEobject boundary = 0 and region covers entire domain
N_Ainvalid/missing attribution

Active/passive — structural candidate class

04 / active-passive

Чтобы не выдавать топологию за психологический закон, 5.03 использует candidate semantics и не вводит arbitrary threshold.

ClassStructural cue
NEGATIVE_FIGURE_CANDIDATEOBJECT_ENCLOSED_VOID: bounded negative-space shape может читаться как самостоятельная фигура
BACKGROUND_FIELD_CANDIDATEFULL_DOMAIN_FREE: чистое background field
ACTIVE_PASSIVE_AMBIGUOUSDOMAIN_OPEN_REGION одновременно формируется object boundary и открыт к domain
N_Aнедостаточно relation evidence
CANDIDATE, NOT CERTAINTY. Это structural cue для 5.04 и будущих perceptual modules, а не утверждение «пространство точно активно/пассивно».

Не переопределяем 5.01 и 5.02

05 / ownership firewall

5.03 relation layer ничего не знает о новом способе строить mask или clearance.

5.01

OccupiedMask / FreeMask / total fractions.

5.02

EmptyRegion topology / area / clearance.

5.03

Boundary attribution / enclosure / active-passive relation.

Visual Lab

06 / visual lab

Три canonical spatial situations без aesthetic verdict.

A · FULL DOMAIN FREE BACKGROUND_FIELD_CANDIDATE B · OBJECT-ENCLOSED VOID NEGATIVE_FIGURE_CANDIDATE C · OPEN + SHAPED BY OBJECT ACTIVE_PASSIVE_AMBIGUOUS objectBoundaryFraction / domainBoundaryFraction = one complement family active/passive class = structural candidate, not quality channel/corridor routes = deferred until MAIN explicitly allocates ownership target interpretation = 5.04

Reference relation tests

07 / deterministic tests

Проверяем attribution, overlap owners, exact enclosure conditions, active/passive candidate classes и ownership barriers.

Tests not run yet.

DATA FOR LAYOUT ENGINE

08 / machine contract

Corrected canonical 5.03 contract.

{
  "module": "Compo 5.03",
  "name": "figure_ground_and_active_passive_space_relations",
  "version": "1.1-corrective",
  "canonical_main_title": "Figure-ground / active-passive space relations",
  "scope": "BOUNDARY_ATTRIBUTED_FIGURE_GROUND_AND_ACTIVE_PASSIVE_SPACE_RELATIONS",
  "consumes": [
    "Compo5.01.SpaceMaskPairResult / canonical OccupiedMask / FreeMask",
    "Compo5.01.ObjectSupportSet + object-specific support attribution adapter",
    "Compo5.02.EmptyRegionSet / EmptyRegion[]",
    "CompositionSpaceDomain boundary"
  ],
  "provides": [
    "BoundaryAttributionAdapter contract",
    "RegionBoundaryContactDescriptor",
    "RegionObjectAdjacency[]",
    "FigureGroundRelation",
    "ActivePassiveSpaceRelation",
    "MetricResult[space.figureGround.objectBoundaryFraction]",
    "MetricResult[space.figureGround.domainBoundaryFraction]",
    "MetricResult[space.figureGround.contactObjectCount]",
    "MetricResult[space.relation.confidence]",
    "SpaceRelationCorrectionRequest[]"
  ],
  "owns_metrics": [
    "space.figureGround.objectBoundaryFraction",
    "space.figureGround.domainBoundaryFraction",
    "space.figureGround.contactObjectCount",
    "space.relation.confidence"
  ],
  "descriptors_only": [
    "space.figureGround.regionId",
    "space.figureGround.contactObjectRefs[]",
    "space.figureGround.contactLengthByObjectRef",
    "space.figureGround.uniqueObjectBoundaryLengthPx",
    "space.figureGround.domainBoundaryLengthPx",
    "space.figureGround.totalBoundaryLengthPx",
    "space.figureGround.enclosureClass",
    "space.figureGround.activePassiveClass",
    "space.figureGround.boundaryOwnerMultiplicityWarnings[]",
    "space.figureGround.status"
  ],
  "boundary_attribution_contract": {
    "purpose": "attribute free-region boundary to domain boundary or one/more object supports without rebuilding 5.01 union masks",
    "segment_record": {
      "segmentRef": "string",
      "kind": "OBJECT_CONTACT|DOMAIN_CONTACT",
      "lengthPx": "finite >=0",
      "ownerObjectRefs": "[] for domain; one or more refs for object contact",
      "confidence": "0..1",
      "provenance": "object"
    },
    "overlap_rule": "unique geometric boundary length counted once even if overlapping supports expose multiple owner refs",
    "per_object_lengths": "may overlap across owners and must not be summed to reconstruct unique object-boundary length"
  },
  "figure_ground_schema": {
    "regionId": "Compo5.02 EmptyRegion ref",
    "contactObjectRefs": "unique refs",
    "contactLengthByObjectRef": "owner-specific contact lengths; potentially non-additive",
    "uniqueObjectBoundaryLengthPx": "unique free/occupied interface",
    "domainBoundaryLengthPx": "free/domain-outside interface",
    "totalBoundaryLengthPx": "sum of unique object + domain boundary lengths",
    "objectBoundaryFraction": "uniqueObjectBoundaryLengthPx/totalBoundaryLengthPx",
    "domainBoundaryFraction": "domainBoundaryLengthPx/totalBoundaryLengthPx",
    "contactObjectCount": "unique owner refs count",
    "enclosureClass": "OBJECT_ENCLOSED_VOID|DOMAIN_OPEN_REGION|FULL_DOMAIN_FREE|N_A",
    "activePassiveClass": "NEGATIVE_FIGURE_CANDIDATE|BACKGROUND_FIELD_CANDIDATE|ACTIVE_PASSIVE_AMBIGUOUS|N_A",
    "confidence": "0..1",
    "provenance": "object"
  },
  "enclosure_semantics": {
    "OBJECT_ENCLOSED_VOID": "positive object-boundary contact and zero domain-boundary contact",
    "DOMAIN_OPEN_REGION": "positive domain-boundary contact and positive object-boundary contact",
    "FULL_DOMAIN_FREE": "region covers the whole supplied domain, object-boundary contact is zero, and no occupied support exists in that domain",
    "N_A": "missing/invalid attribution or degenerate boundary"
  },
  "active_passive_semantics": {
    "NEGATIVE_FIGURE_CANDIDATE": "OBJECT_ENCLOSED_VOID; bounded negative-space shape can act as a figure candidate",
    "BACKGROUND_FIELD_CANDIDATE": "FULL_DOMAIN_FREE; open field with no object boundary",
    "ACTIVE_PASSIVE_AMBIGUOUS": "DOMAIN_OPEN_REGION; the same free component participates as background field while being shaped by object boundaries",
    "N_A": "insufficient relation evidence",
    "candidate_wording": "classes are structural figure-ground cues, not a perceptual certainty or quality judgment",
    "no_thresholds": "no arbitrary objectBoundaryFraction threshold is used for the canonical class"
  },
  "metric_policy": {
    "objectBoundaryFraction": "relation descriptor only",
    "domainBoundaryFraction": "its algebraic complement on valid attributed boundary",
    "contactObjectCount": "adjacency descriptor only",
    "direct_scoring": "FORBIDDEN in 5.03",
    "independent_vote_warning": "object/domain boundary fractions are one evidence degree of freedom",
    "more_enclosed_is_better": "FORBIDDEN",
    "active_is_better": "FORBIDDEN",
    "target_interpretation": "deferred to 5.04"
  },
  "hard_constraints": [
    "one metric = one owner",
    "5.03 consumes canonical 5.01 masks and 5.02 regions; it must not rebuild either",
    "boundary attribution may inspect object-specific supports but cannot mutate/redefine the union mask",
    "unique object-boundary length is counted once under overlapping owners",
    "per-object contact lengths may overlap and are not additive evidence",
    "objectBoundaryFraction + domainBoundaryFraction = 1 on valid nondegenerate attributed boundary",
    "FULL_DOMAIN_FREE requires region coverage of the entire domain; objectBoundaryLength=0 alone is insufficient",
    "isInteriorPocket remains owned by 5.02 and is not re-published as a 5.03 metric",
    "activePassiveClass is a structural candidate class, not an aesthetic score or semantic importance label",
    "no threshold-based active/passive classification is canonicalized in 5.03",
    "channel/corridor routing is outside canonical Topic5 MAIN scope and remains deferred until explicitly allocated",
    "free-space relation must not become eye-flow",
    "5.04 owns explicit-target scoring",
    "visual mass remains Topic4",
    "canvas normalization/domain ownership remains external/future Topic6",
    "grid occupancy remains Topic8",
    "global balance/hierarchy/eye-flow remain future owners",
    "N/A != 0",
    "no beautyScore"
  ],
  "initial_heuristics": {
    "boundary_length_tolerance_px": {
      "value": 1e-07,
      "provenance": "IMPLEMENTATION_HEURISTIC"
    }
  },
  "correction_policy": {
    "foreign_mask_region_geometry_mutation": "FORBIDDEN",
    "boundary_attribution_missing": "request 5.01 object-support attribution adapter",
    "region_topology_issue": "route to 5.02",
    "desired_figure_ground_change": "emit relation correction intent only; actual geometry/layout belongs to solver/owners",
    "target_preference_issue": "route to 5.04"
  },
  "deferred_inputs": [
    "5.04 explicit-target scoring/corrections/tests",
    "any corridor/channel route model pending explicit MAIN allocation",
    "Topic6 canonical canvas/format normalization",
    "Topic8 grid occupancy",
    "future global balance/hierarchy/eye-flow"
  ],
  "recompute_when": [
    "5.01 occupied/free mask or object-support attribution changes",
    "5.02 EmptyRegionSet changes",
    "CompositionSpaceDomain boundary changes",
    "boundary attribution backend/tolerance changes"
  ],
  "finality": "FIGURE_GROUND_AND_ACTIVE_PASSIVE_RELATIONS_ONLY"
}
ARCHITECTURE CHECKPOINT · 5.03 MATCHES MAIN: FIGURE-GROUND / ACTIVE-PASSIVE SPACE RELATIONS. IT OWNS BOUNDARY ATTRIBUTION RELATION METRICS AND STRUCTURAL CANDIDATE CLASSES ONLY. 5.01 MASKS AND 5.02 REGIONS/CLEARANCE REMAIN UPSTREAM OWNERS. FULL_DOMAIN_FREE REQUIRES WHOLE-DOMAIN COVERAGE. CHANNEL/CORRIDOR ROUTING IS DEFERRED UNTIL EXPLICIT MAIN ALLOCATION. NO EYE-FLOW, NO WHITESPACE SCORE, NO BEAUTYSCORE.
VISITS / ...