Visual mass — общий слой сравнения
4.00 не пытается ещё раз посчитать точку, линию или shape. Он задаёт единый cross-object contract, в который приходят owner-qualified mass evidence.
VisualMassDescriptor, evidence stages, adapters, anti-double-context policy и ownership map 4.01–4.04.
Area/occupancy/density, contextual mass value, mass relations, target scoring.
SCHEMA / STAGE / OWNERSHIP ONLY.
profileId@version.Размер и масса — разные сущности
MAIN прямо требует отделить физический размер от воспринимаемой тяжести. Topic 4 становится слоем, на который позже смогут опираться balance и hierarchy, не сводя объект к bounds.
Envelope
width / height / bounds / path span. Факт занимаемого диапазона координат.
Filled / stroked contribution
Фактическая заполненность, stroke mass, opacity, density и owner-local visual weight.
Perceived contribution
Contrast, isolation, overlap и position могут менять заметность без изменения local geometry.
VisualMassDescriptor
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.Три стадии mass evidence
Stage нужен в первую очередь для защиты от двойной contextualization.
| Stage | Meaning | Allowed next step |
|---|---|---|
INTRINSIC | geometry/paint/local object evidence до scene-context | может быть contextualized в 4.02 |
LOCAL_CONTEXTUALIZED | object owner уже применил declared local context signals | 4.02 обязан исключить те же evidence refs из повторного применения |
CROSS_OBJECT_CONTEXTUALIZED | canonical Topic4 contextual mass для cross-object comparison | идёт в 4.03 relations / later global consumers |
Point: 1.01 остаётся owner
Point subsystem уже разделяет base и contextual visual weight. Topic 4 использует их как source evidence и не повторяет point formula.
Compo 1.01
Point.visualWeightBase Point.visualWeightContextual Point.weightStatus Point.weightComponents
Topic 4
sourceKind = "POINT" intrinsicEvidenceRefs: → Point.visualWeightBase optional local contextual: → Point.visualWeightContextual NO point-radius formula here.
Line: 2.06 остаётся owner
То же правило для stroke weight: width/path/opacity base model не мигрирует молча в Topic 4.
Compo 2.06
Line.widthN Line.baseWeight Line.contextualWeight Line.weightDescriptor
Topic 4
sourceKind = "LINE" intrinsicEvidenceRefs: → Line.baseWeight optional local contextual: → Line.contextualWeight NO width/path/opacity weight recomputation.
Shape становится главным новым потребителем 4.01
Именно Topic 3 подготовил geometry/topology/world view без area/mass ownership. Поэтому 4.01 впервые может канонически владеть silhouette area, occupancy и density factor.
Context provenance routing
Контекстная масса должна знать, какие сигналы уже были применены upstream.
Intrinsic route
base owner evidence
stage=INTRINSIC
↓
4.02 consumes:
contrastRef?
isolationRef?
positionRef?
overlapRef?
↓
contextualMassRef
stage=CROSS_OBJECT_CONTEXTUALIZEDPre-contextualized route
owner contextual evidence
stage=LOCAL_CONTEXTUALIZED
derivedFrom=[
contrastRef,
isolationRef,
...
]
↓
4.02:
suppress duplicated refs
apply only genuinely new
cross-object context channelsOwnership 4.00–4.04
4.00 специально остаётся без numeric mass metric, чтобы будущие файлы получили узкое и проверяемое ownership.
| Module | Domain | Owns |
|---|---|---|
| 4.00 | schema / stages / adapters | VisualMassDescriptor shell, evidence-stage and anti-double-context contracts |
| 4.01 | intrinsic geometry mass | silhouette area, occupancy, density factor, geometric/base mass for filled shape/region path |
| 4.02 | contextual mass | contrast/isolation/position/overlap contextual mass layer using owner-provided signals |
| 4.03 | relations | mass ratio/order/dominance/equivalence/group relational descriptors |
| 4.04 | calibration / scoring / tests | calibration profiles, target-aware mass fit and consolidated Topic4 regression |
Что 4.00 не имеет права подменить
Mass — важный input для будущего global composition, но не глобальный verdict.
Negative space
Free-space regions, breathing room, clearance.
Balance
Масса — input для balance, но не balance score.
Hierarchy
Высокая масса может поддерживать доминанту, но semantic hierarchy отдельна.
Importance
Важность объекта не равна его визуальной массе.
Recompute hooks
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
Примеры иллюстрируют разные evidence paths, но не задают ranking.
Ownership / staging tests
4.00 проверяет только schema и routing invariants. Numeric mass model появится начиная с 4.01.
DATA FOR LAYOUT ENGINE
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"
}
}