COMPO · 4.00 · VISUAL MASS MODEL / OWNERSHIP

Визуальная
масса и
ownership.

Entry point темы 4: cross-object VisualMassDescriptor, evidence stages и adapters, которые позволяют сравнивать point, line, shape и будущие object types без переопределения их локальных owner-метрик. Главная защита — stage-aware anti-double-context policy.

ModuleCompo 4.00
Scopemass schema / ownership
Owns metricsnone
Legacy owners1.01 / 2.06 retained
Topic4 · MASS
Next4.01

Visual mass — общий слой сравнения

00 / module api

4.00 не пытается ещё раз посчитать точку, линию или shape. Он задаёт единый cross-object contract, в который приходят owner-qualified mass evidence.

SCOPE

VisualMassDescriptor, evidence stages, adapters, anti-double-context policy и ownership map 4.01–4.04.

DOES NOT OWN

Area/occupancy/density, contextual mass value, mass relations, target scoring.

FINALITY

SCHEMA / STAGE / OWNERSHIP ONLY.

CALIBRATION BRIDGE. Raw point/line owner evidence and 4.01 shape evidence are calibrated by the frozen 4.04 profile before 4.02. Calibration may change numeric domain, but must preserve stage + upstream context lineage and attach explicit profileId@version.
VISUAL MASS ≠ BOUNDING BOX. Два объекта с одинаковым envelope могут иметь разную заполненность, opacity, stroke structure и perceptual contribution.

Размер и масса — разные сущности

01 / object-size vs mass

MAIN прямо требует отделить физический размер от воспринимаемой тяжести. Topic 4 становится слоем, на который позже смогут опираться balance и hierarchy, не сводя объект к bounds.

GEOMETRY

Envelope

width / height / bounds / path span. Факт занимаемого диапазона координат.

MASS EVIDENCE

Filled / stroked contribution

Фактическая заполненность, stroke mass, opacity, density и owner-local visual weight.

CONTEXT

Perceived contribution

Contrast, isolation, overlap и position могут менять заметность без изменения local geometry.

same bounds ≠ same filled area ≠ same opacity ≠ same local visual weight ≠ same contextual visual mass But: descriptor difference ≠ aesthetic quality difference

VisualMassDescriptor

02 / canonical shell

Descriptor хранит refs на authoritative metrics, а не копирует значения под новыми ключами без owner provenance.

Descriptor

VisualMassDescriptor {
  objectRef,
  sourceKind,

  intrinsicEvidenceRefs[],
  localContextualEvidenceRefs[],

  geometryMassRef?,
  baseMassRef?,
  contextualMassRef?,

  evidenceStage,
  calibrationProfileRef?,

  status,
  confidence,
  provenance,
  recomputeHooks[]
}

MassEvidenceRef

MassEvidenceRef {
  metricRef,
  owner,
  stage,
  valueDomain,
  confidence,
  derivedFrom[],
  provenance
}

metricRef must remain
owner-qualified.
REF, NOT COPY. `Point.visualWeightBase` остаётся метрикой 1.01. VisualMassDescriptor может ссылаться на неё, но 4.00 не публикует тот же number как «свою» локальную point weight metric.

Три стадии mass evidence

03 / evidence stages

Stage нужен в первую очередь для защиты от двойной contextualization.

StageMeaningAllowed next step
INTRINSICgeometry/paint/local object evidence до scene-contextможет быть contextualized в 4.02
LOCAL_CONTEXTUALIZEDobject owner уже применил declared local context signals4.02 обязан исключить те же evidence refs из повторного применения
CROSS_OBJECT_CONTEXTUALIZEDcanonical Topic4 contextual mass для cross-object comparisonидёт в 4.03 relations / later global consumers
NO DOUBLE CONTEXT. Если Line.contextualWeight уже содержит contrast/isolation/visible/crowding modifiers, 4.02 не имеет права умножить эту же линию на те же contrast/isolation inputs ещё раз.

Point: 1.01 остаётся owner

04 / existing owner adapter

Point subsystem уже разделяет base и contextual visual weight. Topic 4 использует их как source evidence и не повторяет point formula.

OWNER

Compo 1.01

Point.visualWeightBase
Point.visualWeightContextual
Point.weightStatus
Point.weightComponents
ADAPTER

Topic 4

sourceKind = "POINT"

intrinsicEvidenceRefs:
  → Point.visualWeightBase

optional local contextual:
  → Point.visualWeightContextual

NO point-radius formula here.
If point contextual evidence is selected: stage = LOCAL_CONTEXTUALIZED lineage = Point.weightComponents 4.02 excludes already-used modifiers If only base evidence is selected: stage = INTRINSIC 4.02 may consume available context owner signals once

Line: 2.06 остаётся owner

05 / existing owner adapter

То же правило для stroke weight: width/path/opacity base model не мигрирует молча в Topic 4.

OWNER

Compo 2.06

Line.widthN
Line.baseWeight
Line.contextualWeight
Line.weightDescriptor
ADAPTER

Topic 4

sourceKind = "LINE"

intrinsicEvidenceRefs:
  → Line.baseWeight

optional local contextual:
  → Line.contextualWeight

NO width/path/opacity
weight recomputation.
LEGACY/LOCAL vs CROSS-OBJECT. Local line weight может быть хорошей оценкой заметности внутри line subsystem; Topic 4 строит поверх owner evidence scene-comparable mass model, не присваивая себе ownership исходной метрики.

Shape становится главным новым потребителем 4.01

06 / new geometry path

Именно Topic 3 подготовил geometry/topology/world view без area/mass ownership. Поэтому 4.01 впервые может канонически владеть silhouette area, occupancy и density factor.

Topic 3: ShapeGeometry region topology outline geometry world transform view ↓ 4.01: silhouette area occupancy density factor intrinsic geometric/base mass evidence ↓ 4.02: cross-object context weighting ↓ 4.03: mass relations ↓ 4.04: calibration / target-aware scoring / tests
NO BACK-MIGRATION. Topic 3 остаётся geometry/topology owner. Topic 4 потребляет region geometry, но не переопределяет contour/holes/transform contracts.

Context provenance routing

07 / anti-double-context

Контекстная масса должна знать, какие сигналы уже были применены upstream.

Intrinsic route

base owner evidence
  stage=INTRINSIC
    ↓
4.02 consumes:
  contrastRef?
  isolationRef?
  positionRef?
  overlapRef?
    ↓
contextualMassRef
stage=CROSS_OBJECT_CONTEXTUALIZED

Pre-contextualized route

owner contextual evidence
  stage=LOCAL_CONTEXTUALIZED
  derivedFrom=[
    contrastRef,
    isolationRef,
    ...
  ]
    ↓
4.02:
  suppress duplicated refs
  apply only genuinely new
  cross-object context channels
UNKNOWN LINEAGE = NO GUESS. Если upstream contextual weight не сообщает, что именно уже использовано, 4.02 не должен молча добавлять похожие modifiers. Такой path становится partial/diagnostic до явного provenance.

Ownership 4.00–4.04

08 / topic map

4.00 специально остаётся без numeric mass metric, чтобы будущие файлы получили узкое и проверяемое ownership.

ModuleDomainOwns
4.00schema / stages / adaptersVisualMassDescriptor shell, evidence-stage and anti-double-context contracts
4.01intrinsic geometry masssilhouette area, occupancy, density factor, geometric/base mass for filled shape/region path
4.02contextual masscontrast/isolation/position/overlap contextual mass layer using owner-provided signals
4.03relationsmass ratio/order/dominance/equivalence/group relational descriptors
4.04calibration / scoring / testscalibration profiles, target-aware mass fit and consolidated Topic4 regression

Что 4.00 не имеет права подменить

09 / what is not mass

Mass — важный input для будущего global composition, но не глобальный verdict.

TOPIC 5

Negative space

Free-space regions, breathing room, clearance.

GLOBAL

Balance

Масса — input для balance, но не balance score.

GLOBAL

Hierarchy

Высокая масса может поддерживать доминанту, но semantic hierarchy отдельна.

SEMANTIC

Importance

Важность объекта не равна его визуальной массе.

large visual mass ≠ important ≠ balanced ≠ beautiful ≠ correct mass = measurable / calibratable evidence for later relational/global reasoning

Recompute hooks

10 / dirty graph

Mass меняется при geometry/paint/context changes, но пересчёт должен идти по stage-aware dirty graph.

MassRecomputeHook {
  triggerRef,
  dirtyStages[],
  reason,
  epsilon?,
  provenance
}

Examples:

Shape geometry/outline changed
  → dirty 4.01, 4.02, 4.03, 4.04

Only new contrast signal changed
  → keep 4.01
  → dirty 4.02, 4.03, 4.04

Only pair comparison target changed
  → keep 4.01 / 4.02
  → dirty 4.03 / 4.04

Point owner contextualWeight changed
  → re-adapt stage
  → do not rerun Point formula inside Topic4

Visual Lab: same bounds ≠ same mass

11 / visual lab

Примеры иллюстрируют разные evidence paths, но не задают ranking.

A · SAME BOUNDS / DIFFERENT FILL filled shape outline-only B · POINT / LINE LOCAL OWNERS 1.01 → Point.visualWeight* 2.06 → Line.*Weight C · STAGE ROUTING INTRINSIC owner / 4.01 evidence LOCAL_CONTEXTUALIZED may already contain signals CROSS_OBJECT_CONTEXTUALIZED 4.02 canonical comparison layer anti-double-context: same evidence ref may affect canonical path once VisualMassDescriptor stores owner refs; 4.00 owns no numeric mass score 4.03 compares masses · later global balance/hierarchy consume relations

Ownership / staging tests

12 / deterministic tests

4.00 проверяет только schema и routing invariants. Numeric mass model появится начиная с 4.01.

Tests not run yet.

DATA FOR LAYOUT ENGINE

13 / machine contract

Machine-readable entrypoint Topic 4.

{
  "module": "Compo 4.00",
  "name": "visual_mass_model_and_ownership",
  "version": "1.1-corrective",
  "scope": "CROSS_OBJECT_VISUAL_MASS_SCHEMA_STAGE_MODEL_AND_OWNERSHIP",
  "topic": "04_MASS_AND_VISUAL_WEIGHT",
  "planned_files": [
    "4.00",
    "4.01",
    "4.02",
    "4.03",
    "4.04"
  ],
  "consumes": [
    "Compo1.01.Point.visualWeightBase / Point.visualWeightContextual? as owner evidence",
    "Compo2.06.Line.baseWeight / Line.contextualWeight? as owner evidence",
    "Compo3.00.Shape / ShapeGeometry",
    "Compo3.04.ShapePaintRef / region topology?",
    "Compo3.05.ShapeWorldGeometryView / world bounds?",
    "external object-type mass adapters for future Text/Image/etc",
    "Canvas normalization context",
    "StylePreset.massCalibration?"
  ],
  "provides": [
    "VisualMassDescriptor schema",
    "MassEvidenceRef",
    "MassEvidenceStage",
    "MassSourceAdapter contract",
    "MassContextPolicy",
    "MassRecomputeHook contract",
    "Topic4 ownership map",
    "MassCalibrationHandoff contract"
  ],
  "owns_contracts": [
    "cross-object VisualMassDescriptor shell",
    "mass evidence staging semantics",
    "cross-object adapter contract",
    "anti-double-context policy",
    "topic-4 decomposition and ownership routing"
  ],
  "owns_metrics": [],
  "descriptors_only": [
    "visualMass.sourceKind",
    "visualMass.evidenceStage",
    "visualMass.baseMassRef",
    "visualMass.contextualMassRef",
    "visualMass.calibrationProfileRef",
    "visualMass.status",
    "visualMass.confidence",
    "visualMass.recomputeHooks"
  ],
  "mass_evidence_stages": [
    "INTRINSIC",
    "LOCAL_CONTEXTUALIZED",
    "CROSS_OBJECT_CONTEXTUALIZED"
  ],
  "descriptor_schema": {
    "objectRef": "string",
    "sourceKind": "POINT|LINE|SHAPE|TEXT|IMAGE|GROUP|CUSTOM",
    "intrinsicEvidenceRefs": "MassEvidenceRef[]",
    "localContextualEvidenceRefs": "MassEvidenceRef[]",
    "geometryMassRef": "optional metric ref, typically Compo4.01",
    "baseMassRef": "optional canonical cross-object base mass metric ref, owned downstream",
    "contextualMassRef": "optional canonical cross-object contextual mass metric ref, owned downstream",
    "evidenceStage": "INTRINSIC|LOCAL_CONTEXTUALIZED|CROSS_OBJECT_CONTEXTUALIZED",
    "calibrationProfileRef": "optional static profile ref after calibration; must propagate downstream when present",
    "status": "READY|BASE_ONLY|CONTEXT_READY|PARTIAL|N_A|INVALID",
    "confidence": "0..1",
    "provenance": "object",
    "recomputeHooks": "MassRecomputeHook[]",
    "selectedBaseEvidenceRef": "optional owner-qualified evidence selected for calibration/contextualization"
  },
  "evidence_ref_schema": {
    "metricRef": "owner-qualified metric key/ref",
    "owner": "module id",
    "stage": "INTRINSIC|LOCAL_CONTEXTUALIZED|CROSS_OBJECT_CONTEXTUALIZED",
    "valueDomain": "declared by owner; adapter maps only through calibration contract",
    "confidence": "0..1",
    "derivedFrom": "refs[]",
    "provenance": "DERIVED|STANDARD|EMPIRICAL|INITIAL_HEURISTIC|STYLE_PRESET|DEFERRED"
  },
  "source_adapters": {
    "POINT": {
      "owner_evidence": [
        "Compo1.01 Point.visualWeightBase",
        "Compo1.01 Point.visualWeightContextual?"
      ],
      "rule": "consume; never recompute point radius/fill/opacity weight formula in Topic4",
      "context_rule": "if contextualWeight is selected as authoritative evidence, do not reapply the same local context signals"
    },
    "LINE": {
      "owner_evidence": [
        "Compo2.06 Line.baseWeight",
        "Compo2.06 Line.contextualWeight?"
      ],
      "rule": "consume; never recompute line width/path/opacity weight formula in Topic4",
      "context_rule": "if contextualWeight is selected as authoritative evidence, do not reapply the same local context signals"
    },
    "SHAPE": {
      "owner_evidence": [
        "Compo3 geometry/topology/world-view descriptors"
      ],
      "rule": "4.01 will own silhouette area/occupancy/density-factor and shape base-mass evidence",
      "context_rule": "4.02 will own cross-object context weighting"
    },
    "FUTURE_OBJECT": {
      "rule": "must register an explicit MassSourceAdapter with owner-qualified evidence; no fallback from bounding-box area alone"
    }
  },
  "anti_double_context_policy": {
    "principle": "a context signal may affect one canonical mass path once unless explicit independent evidence is documented",
    "LOCAL_CONTEXTUALIZED_input": "treat owner contextual metric as already containing its declared local modifiers; do not reapply those same evidence refs in 4.02",
    "INTRINSIC_input": "4.02 may apply available owner-provided context signals once",
    "CROSS_OBJECT_CONTEXTUALIZED_input": "final contextual mass for Topic4 comparison; downstream must not contextualize again under a new alias",
    "insufficient_lineage": "diagnostic-only until context provenance can be separated"
  },
  "topic_ownership": {
    "4.00": "VisualMassDescriptor / stage model / adapter and ownership contracts only",
    "4.01": "silhouette area, occupancy, density factor and intrinsic geometric/base mass model for filled shapes/generic regions",
    "4.02": "cross-object contextual mass from contrast/isolation/position/overlap owner signals with anti-double-context safeguards",
    "4.03": "mass ratios, ordering, pair/group relations and relational descriptors",
    "4.04": "calibration profiles, target-aware mass scoring and Topic4 regression tests"
  },
  "legacy_owner_boundaries": {
    "Compo1.01": "retains point.size_class / point.visual_weight_base / point.visual_weight_contextual",
    "Compo2.06": "retains line width normalization / baseWeight / contextualWeight / local line weight fit",
    "Topic4": "does not rename those local metrics as its own; it builds a cross-object comparison layer from owner-qualified evidence"
  },
  "hard_constraints": [
    "one metric = one owner",
    "VisualMassDescriptor is a contract shell, not a universal beauty score",
    "point/line local visual-weight formulas are never reimplemented in Topic4",
    "already-contextualized owner evidence must not receive the same context modifiers twice",
    "bounding-box area alone is not visual mass",
    "silhouette area/occupancy/density belong to Compo4.01, not 4.00",
    "contextual mass belongs to Compo4.02, not 4.00",
    "mass relations belong to Compo4.03, not 4.00",
    "target-aware mass fit/scoring belongs to Compo4.04, not 4.00",
    "negative-space/free-space ownership remains Topic5",
    "global balance/hierarchy/eye-flow remain future global owners",
    "semantic importance is not mass unless an explicit future owner maps it through a separate contract",
    "N/A != 0",
    "descriptor != score",
    "no beautyScore",
    "cross-object comparable evidence entering 4.02 must carry an explicit calibrationProfileRef/profile version, even for identity mapping",
    "calibration must preserve MassEvidenceStage and upstream context lineage so anti-double-context remains enforceable"
  ],
  "initial_heuristics": {
    "mass_recompute_epsilon": {
      "value": 0.01,
      "provenance": "INITIAL_HEURISTIC",
      "note": "Topic-level dirty threshold placeholder; final calibration belongs to 4.04"
    }
  },
  "deferred_inputs": [
    "Compo4.01 geometric mass descriptors",
    "Compo4.02 contextual mass",
    "Compo4.03 mass relations",
    "Compo4.04 calibration/scoring/tests",
    "Topic5 positive/negative space",
    "future hierarchy/balance/global scene solver",
    "future Text/Image/Group mass adapters"
  ],
  "recompute_when": [
    "authoritative owner evidence changes",
    "evidence-stage selection changes",
    "mass calibration profile changes",
    "source adapter version changes",
    "context provenance changes enough to alter anti-double-context routing"
  ],
  "finality": "TOPIC4_SCHEMA_STAGE_AND_OWNERSHIP_ONLY",
  "calibration_bridge": {
    "owner": "Compo4.04 static MassCalibrationProfile provider",
    "position_in_pipeline": "after source-owner evidence selection / after 4.01 raw shape mass; before 4.02 contextualization",
    "required_preservation": [
      "source metric owner/ref",
      "MassEvidenceStage",
      "derivedFrom context lineage",
      "alreadyAppliedContextRefs/channels",
      "confidence",
      "provenance"
    ],
    "rule": "calibration changes numeric domain only; it must not erase stage or upstream context lineage",
    "identity_case": "even identity mapping carries explicit profileId/version when cross-object comparability is required"
  }
}
ARCHITECTURE CHECKPOINT · 4.00 OWNS ONLY CROSS-OBJECT VISUALMASSDESCRIPTOR / EVIDENCE-STAGE / ADAPTER / ANTI-DOUBLE-CONTEXT CONTRACTS. COMPO1.01 RETAINS POINT VISUAL-WEIGHT OWNERSHIP; COMPO2.06 RETAINS LINE VISUAL-WEIGHT OWNERSHIP. 4.01 WILL OWN SILHOUETTE AREA / OCCUPANCY / DENSITY AND SHAPE GEOMETRIC MASS. 4.02 WILL OWN CROSS-OBJECT CONTEXTUAL MASS. 4.03 RELATIONS. 4.04 CALIBRATION / TARGET SCORING / TESTS. TOPIC5 OWNS FREE SPACE. GLOBAL BALANCE/HIERARCHY REMAIN DEFERRED. NO BEAUTYSCORE.
VISITS / ...