Figure-ground без выхода за MAIN
5.03 связывает EmptyRegion с object supports и границей domain. Он описывает enclosure и structural active/passive cues, но не вводит route/channel subsystem.
Figure-ground / active-passive space relations.
5.01 canonical masks/support attribution + 5.02 EmptyRegionSet.
FIGURE-GROUND / ACTIVE-PASSIVE RELATIONS ONLY.
Кому принадлежит граница пустоты
Один 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
Figure-ground relation отделяет object-facing boundary от domain-facing boundary.
FigureGroundRelation {
regionId,
contactObjectRefs[],
contactLengthByObjectRef,
uniqueObjectBoundaryLengthPx,
domainBoundaryLengthPx,
totalBoundaryLengthPx,
objectBoundaryFraction,
domainBoundaryFraction,
contactObjectCount,
enclosureClass,
activePassiveClass,
confidence,
provenance
}
Три exact relation classes
`FULL_DOMAIN_FREE` нельзя выводить только из отсутствия object contact: region должен действительно покрывать весь supplied domain.
| Class | Condition |
|---|---|
OBJECT_ENCLOSED_VOID | object boundary > 0; domain boundary = 0 |
DOMAIN_OPEN_REGION | object boundary > 0; domain boundary > 0 |
FULL_DOMAIN_FREE | object boundary = 0 and region covers entire domain |
N_A | invalid/missing attribution |
Active/passive — structural candidate class
Чтобы не выдавать топологию за психологический закон, 5.03 использует candidate semantics и не вводит arbitrary threshold.
| Class | Structural cue |
|---|---|
NEGATIVE_FIGURE_CANDIDATE | OBJECT_ENCLOSED_VOID: bounded negative-space shape может читаться как самостоятельная фигура |
BACKGROUND_FIELD_CANDIDATE | FULL_DOMAIN_FREE: чистое background field |
ACTIVE_PASSIVE_AMBIGUOUS | DOMAIN_OPEN_REGION одновременно формируется object boundary и открыт к domain |
N_A | недостаточно relation evidence |
Не переопределяем 5.01 и 5.02
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
Три canonical spatial situations без aesthetic verdict.
Reference relation tests
Проверяем attribution, overlap owners, exact enclosure conditions, active/passive candidate classes и ownership barriers.
DATA FOR LAYOUT ENGINE
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"
}