COMPO · 15.01 · SIZE / CONTRAST ENVELOPES

Measure explicitly.
Envelope by role.

15.01 принимает owner-qualified size/contrast measurements для кандидатов 15.00 и сопоставляет их с явными role-specific envelopes. Он не решает, «красиво» ли значение, не делает bbox равным visible area, не смешивает методы контраста и не превращает выход за envelope в штраф или hard reject.

ModuleCompo 15.01
Inputs15.00 candidates
Measuresowner-qualified
Envelopesexplicit
Metricsnone
NextSTOP

Observed scalar + explicit role envelope

00 / contract
15.00 candidate / role / form + owner-qualified SIZE / CONTRAST measurements + explicit MicroDetailRoleEnvelopeProfile → exact role-envelope bindings → channel fit descriptors → role fit descriptors → candidate fit descriptors → immutable 15.01 attachments NOT YET: distribution / density map → 15.02 labels / legends / tech noise → 15.03 hierarchy target score / generator → 15.04

Envelopes, not scores

01 / ownership
ADAPTS

Measurements

Numeric size/contrast evidence remains owner-qualified. 15.01 validates and binds, not re-measures.

OWNS

Role envelopes

Explicit channel ranges and categorical fit states per declared role.

NO METRIC

No scoring yet

owns_metrics=[]. Hierarchy damage and target scoring remain 15.04.

Measurement channels

02 / exact method identity
FamilyChannelDomain
SIZEVISIBLE_AREA_RATIO[0,+∞)
SIZEBBOX_AREA_RATIO_PROXY[0,+∞)
SIZEMAX_EXTENT_RATIO[0,+∞)
SIZEMIN_EXTENT_RATIO[0,+∞)
SIZETEXT_EM_HEIGHT_RATIO[0,+∞)
SIZESTROKE_WIDTH_RATIO[0,+∞)
SIZEEXPLICIT_SIZE_RESPONSE[0,1]
CONTRASTLOCAL_LUMINANCE_CONTRAST[0,+∞)
CONTRASTLOCAL_COLOR_DELTA[0,+∞)
CONTRASTLOCAL_EDGE_CONTRAST[0,+∞)
CONTRASTEXPLICIT_CONTRAST_RESPONSE[0,1]
Channels are not substitutes.

BBOX_AREA_RATIO_PROXY != VISIBLE_AREA_RATIO. Luminance, color and edge contrast remain separate methods.

MicroDetailMeasurementEvidence

03 / owner-qualified scalar
MicroDetailMeasurementEvidence {
  microDetailMeasurementEvidenceRef,

  scopeRef,
  microDetailCandidateRef,
  subjectRef,

  family:
    SIZE | CONTRAST,

  channelKey,
  value,
  unit,

  measurementMethodRef,
  referenceContextRef,
  responseContextRef?,

  evidenceSourceRef,
  evidenceSourceOwnerRef,

  confidence,
  provenance,
  snapshotRef,

  status,
  mutationAllowed: false
}
EXPLICIT_SIZE_RESPONSE EXPLICIT_CONTRAST_RESPONSE require: responseContextRef all other channels: responseContextRef = null confidence: source confidence only != fit != desirability != conflict winner

One exact scalar per candidate/channel

04 / measurement set
MicroDetailMeasurementSet {
  microDetailMeasurementSetRef,

  scopeRef,
  microDetailCandidateSetRef,

  measurementEvidenceRefs[],
  measurementIndex {},

  status,
  reasonCode,
  mutationAllowed: false
}
same candidate + family + channel: 0 evidence → missing 1 evidence → usable 2+ evidence → N_A conflict in v1 confidence does NOT pick a winner no fallback: bbox → visible area mass → size color delta → luminance contrast

Explicit inclusive bounds

05 / range constraint
MicroDetailEnvelopeRangeConstraint {
  family,
  channelKey,

  minInclusive?,
  maxInclusive?,

  measurementMethodRef,
  referenceContextRef,
  responseContextRef?
}
at least one bound required min only: value >= min max only: value <= max both: min <= value <= max No universal: smallness limit contrast minimum contrast maximum role threshold

MicroDetailRoleEnvelope

06 / role-specific admissible range
MicroDetailRoleEnvelope {
  microDetailRoleEnvelopeRef,

  roleKind,

  formApplicabilityMode:
    ALL_FORMS | EXPLICIT_FORMS,

  applicableFormKinds[],

  sizeConstraints[],
  contrastConstraints[],

  envelopeSourceRef,
  envelopeSourceOwnerRef,

  provenance,
  status,
  mutationAllowed: false
}

Envelope может отличаться для MICRO_ACCENT, TECHNICAL_MARK, DECORATIVE_MICROFORM и других ролей. Это явная profile data, а не закон композиции.

MicroDetailRoleEnvelopeProfile

07 / no implicit defaults
MicroDetailRoleEnvelopeProfile {
  microDetailRoleEnvelopeProfileRef,

  profileSourceRef,
  profileSourceOwnerRef,

  envelopes[],

  roleCoverageMode:
    MATCH_DECLARED_ROLES_WITH_AVAILABLE_ENVELOPES,

  multipleEnvelopePerRolePolicy:
    FORBID,

  unprofiledDeclaredRolePolicy:
    NO_ENVELOPE_NOT_ERROR,

  provenance,
  status,
  mutationAllowed: false
}
No implicit equal envelope.

Если у multi-role candidate есть несколько профилированных ролей, применяются все соответствующие envelope contracts. Их порядок не создаёт приоритет и не превращается в веса.

Binding is applicability, not satisfaction

08 / role binding
MicroDetailRoleEnvelopeBinding {
  microDetailRoleEnvelopeBindingRef,

  microDetailCandidateRef,
  subjectRef,

  roleKind,
  microDetailRoleEnvelopeRef,
  microDetailRoleEnvelopeProfileRef,

  formKind,

  status,
  reasonCode,
  mutationAllowed: false
}

Categorical channel fit

09 / no numeric penalty
StateMeaning
WITHINValue is inside inclusive explicit bounds.
BELOWValue is below explicit min.
ABOVEValue is above explicit max.
N_AExact measurement/method/reference context unavailable or ambiguous.
INVALIDMeasurement or constraint contract invalid.
WITHIN != score 1 BELOW != penalty ABOVE != penalty N_A != zero

Role envelope fit

10 / categorical completeness
MicroDetailRoleEnvelopeFitDescriptor {
  microDetailRoleEnvelopeFitDescriptorRef,

  microDetailRoleEnvelopeBindingRef,
  channelFitRefs[],

  fitState:
    WITHIN_ALL
    | OUTSIDE_ONE_OR_MORE
    | N_A
    | INVALID,

  status,
  reasonCode,
  mutationAllowed: false
}
any INVALID → INVALID else any N_A → N_A else any BELOW / ABOVE → OUTSIDE_ONE_OR_MORE else → WITHIN_ALL No numeric averaging.

Multi-role candidates keep all applicable roles

11 / candidate fit
MicroDetailCandidateEnvelopeFitDescriptor {
  microDetailCandidateEnvelopeFitDescriptorRef,

  microDetailCandidateRef,
  microDetailRoleEnvelopeProfileRef,

  roleEnvelopeFitRefs[],

  declaredRoleKinds[],
  profiledRoleKinds[],

  fitState:
    WITHIN_ALL_APPLICABLE
    | OUTSIDE_ONE_OR_MORE
    | NO_APPLICABLE_ENVELOPE
    | N_A
    | INVALID,

  status,
  reasonCode,
  mutationAllowed: false
}

NO_APPLICABLE_ENVELOPE не означает ни успех, ни провал. Непрофилированная роль также не считается автоматически satisfied/failed.

MicroDetailSizeContrastSet

12 / one candidate descriptor each
MicroDetailSizeContrastSet {
  microDetailSizeContrastSetRef,

  scopeRef,
  microDetailCandidateSetRef,
  microDetailMeasurementSetRef,
  microDetailRoleEnvelopeProfileRef,

  candidateFitRefs[],

  status,
  reasonCode,
  mutationAllowed: false
}

Set не содержит density map, hierarchy score, ranking или independent vote.

Derived attachments, immutable 15.00 seeds

13 / attachments
MicroDetailDescriptorSizeContrastAttachment {
  microDetailDescriptorSizeContrastAttachmentRef,

  microDetailDescriptorSeedRef,
  microDetailCandidateEnvelopeFitDescriptorRef,
  microDetailMeasurementEvidenceRefs[],

  status,
  mutationAllowed: false
}

MicroDetailSystemSizeContrastAttachment {
  microDetailSystemSizeContrastAttachmentRef,

  microDetailSystemSeedRef,
  microDetailSizeContrastSetRef,
  descriptorAttachmentRefs[],

  status,
  mutationAllowed: false
}

Missing exact evidence stays N_A

14 / status semantics
CaseResult
Duplicate same candidate/channel evidenceN_A conflict; no confidence winner
Missing exact channelN_A
Method mismatchN_A
Reference-context mismatchN_A
Response-context mismatchN_A
Inside boundsOK + WITHIN
Below minOK + BELOW
Above maxOK + ABOVE
Candidate has no applicable role envelopeOK + NO_APPLICABLE_ENVELOPE

Method and reference identity matter

15 / comparability
Comparable only under: same channelKey same measurementMethodRef same referenceContextRef same responseContextRef when applicable same envelope profile compatible snapshot lineage Forbidden: bbox proxy == visible-area truth different contrast methods == same scalar cross-profile ranking role order == priority confidence == violation severity

Envelope violation is not a score

16 / firewalls
Forbidden shortcuts

small→valid; large→invalid; high contrast→accent; WITHIN→1; BELOW/ABOVE→penalty; unprofiled role→pass; candidate fit→hierarchy-safe.

Preserved

Explicit measurements, exact methods/references, explicit role envelopes, multi-role preservation, N_A semantics, no density/noise/scoring.

Topic15 ownership chain

17 / integration
OwnerCanonical role
15.00Microdetail eligibility, form/role taxonomy, candidates and root seeds.
15.01Owner-qualified size/contrast observations, explicit role envelopes and categorical fit.
15.02Distribution and local density.
15.03Labels, legends and technical noise.
15.04Generator, hierarchy-protection scoring and final tests.
Compo4Visual mass remains separate from size channels.
Compo13 / 13.01Dominance and attention interpretation remain separate.
Compo18Generic hierarchy graph remains separate.

Correction routes back to source/profile owner

18 / correction
MicroDetailSizeContrastCorrectionRequest {
  microDetailSizeContrastCorrectionRequestRef,

  targetOwnerRef,
  reasonCode,

  subjectRef?,
  roleKind?,
  channelKey?,

  evidenceRefs[],
  suggestedAction,

  status,
  mutationAllowed: false
}

CANON → LAB → DATA → IDEAS

19 / mandatory hooks
IDEAS_REFS[]7 current R&D directions retained.
DATA_CAPTURE[]Methods, references, envelopes and categorical fit states.
DEFERRED_SEMANTIC_INPUTS[]Penalty, hierarchy damage, density and noise remain downstream.
HUMAN_FEEDBACK_HOOKS[]Measurement and envelope correction reasons.
CONFLICT_PRIORITY_ASSUMPTIONS[]Role/profile order and confidence are not priority.
LAB_HOOKS[]Human role-envelope studies.

Visual laboratory hook

20 / same scalar, different role envelope
SAME OBSERVED VALUE · DIFFERENT EXPLICIT ROLE ENVELOPES MICRO_ACCENT envelope TECHNICAL_MARK envelope observed value The value does not change. Applicability comes from the explicit declared role and profile.

15.01 regression suite

21 / deterministic tests

Tests cover measurement domains, normalized response contexts, duplicate-channel conflicts, exact method/reference matching, role/form applicability, multi-role candidates, inclusive bounds, N_A propagation, immutable attachments and strict deferral of density/noise/scoring.

Tests not run yet.

DATA FOR LAYOUT ENGINE

22 / machine contract
{
  "module": "Compo 15.01",
  "name": "size_contrast_envelopes",
  "version": "1.0-canonical",
  "canonical_main_title": "Size/contrast envelopes",
  "topic": "15_МАЛЫЕ_ФОРМЫ_АКЦЕНТЫ_И_МИКРОДЕТАЛИ",
  "scope": "OWNER_QUALIFIED_SIZE_CONTRAST_MEASUREMENT_ADAPTERS_EXPLICIT_ROLE_ENVELOPES_BINDING_AND_NONSCORING_ENVELOPE_FIT_DESCRIPTORS_ONLY",
  "main_topic_contract": {
    "topic_title": "Малые формы, акценты и микродетали",
    "topic_goal": "Управляет микродеталями, technical marks и мелкими акцентами: их плотностью, контрастом, размером и вкладом без разрушения основной иерархии.",
    "expected_output": "MicroDetailDescriptor[], density maps, role envelopes",
    "planned_files": [
      "15.00 Microdetail taxonomy and roles",
      "15.01 Size/contrast envelopes",
      "15.02 Distribution and local density",
      "15.03 Labels, legends, technical noise",
      "15.04 Generator, scoring and tests"
    ]
  },
  "ownership": {
    "owner": "Compo15.01",
    "owns": [
      "MicroDetailSizeChannel taxonomy",
      "MicroDetailContrastChannel taxonomy",
      "MicroDetailMeasurementEvidence adapter",
      "MicroDetailMeasurementSet",
      "MicroDetailEnvelopeRangeConstraint",
      "MicroDetailRoleEnvelope",
      "MicroDetailRoleEnvelopeProfile",
      "MicroDetailRoleEnvelopeBinding",
      "MicroDetailEnvelopeChannelFitState taxonomy",
      "MicroDetailEnvelopeChannelFitDescriptor",
      "MicroDetailRoleEnvelopeFitDescriptor",
      "MicroDetailCandidateEnvelopeFitDescriptor",
      "MicroDetailSizeContrastSet",
      "MicroDetailDescriptorSizeContrastAttachment",
      "MicroDetailSystemSizeContrastAttachment",
      "same-method/reference/profile comparability contract",
      "identity/status/provenance rules for Topic15 size/contrast layer",
      "non-mutating correction request for size/contrast measurements or role-envelope policy"
    ],
    "does_not_own": [
      "microdetail eligibility / form / role taxonomy — Compo15.00",
      "MicroDetailCandidateSet / descriptor seeds / system seed — Compo15.00",
      "subject geometry / bounding boxes / positions — upstream geometry owners",
      "visual mass calculation — Compo4",
      "attention factor interpretation — Compo13.01",
      "dominance / focal ranking — Compo13",
      "secondary-mass support — Topic14",
      "generic hierarchy/subordination graph — Compo18",
      "distribution / local density / density maps — Compo15.02",
      "labels / legends / technical-noise evaluation — Compo15.03",
      "semantic interpretation of labels/legends — semantic owner / Compo15.03 adapter",
      "hierarchy damage evaluation — Compo15.04",
      "target scoring / MetricResult ownership — Compo15.04",
      "generator / repair-candidate search — Compo15.04",
      "global hierarchy priority",
      "global balance ownership",
      "foreign geometry/style mutation"
    ]
  },
  "consumes": [
    "valid Compo15.00 MicroDetailCandidateSet",
    "valid Compo15.00 MicroDetailDescriptorSeed[] / MicroDetailSystemSeed",
    "owner-qualified size measurements from geometry/typography/feature owners",
    "owner-qualified contrast measurements from appearance/feature owners",
    "explicit MicroDetailRoleEnvelopeProfile"
  ],
  "provides": [
    "MicroDetailMeasurementSet",
    "MicroDetailRoleEnvelopeProfile",
    "MicroDetailRoleEnvelopeBinding[]",
    "MicroDetailEnvelopeChannelFitDescriptor[]",
    "MicroDetailRoleEnvelopeFitDescriptor[]",
    "MicroDetailCandidateEnvelopeFitDescriptor[]",
    "MicroDetailSizeContrastSet",
    "descriptor/system size-contrast attachments",
    "Topic15.01 observation record"
  ],
  "owns_metrics": [],
  "metric_ownership_note": "15.01 owns numeric observations and categorical envelope-fit descriptors, but no MetricResult, no support/hierarchy score, no target-fit score and no independent numeric vote.",
  "size_channel_taxonomy": {
    "VISIBLE_AREA_RATIO": "Owner-qualified visible-area ratio to an explicit reference area. No universal maximum.",
    "BBOX_AREA_RATIO_PROXY": "Owner-qualified bbox-area proxy ratio to an explicit reference area. Proxy must not be treated as visible area.",
    "MAX_EXTENT_RATIO": "Owner-qualified maximum subject extent relative to an explicit reference extent.",
    "MIN_EXTENT_RATIO": "Owner-qualified minimum subject extent relative to an explicit reference extent.",
    "TEXT_EM_HEIGHT_RATIO": "Owner-qualified text em-height relative to an explicit reference extent; typography owner remains authoritative.",
    "STROKE_WIDTH_RATIO": "Owner-qualified stroke/line width relative to an explicit reference extent.",
    "EXPLICIT_SIZE_RESPONSE": "Owner-defined normalized size response with explicit responseContextRef and domain [0,1]."
  },
  "contrast_channel_taxonomy": {
    "LOCAL_LUMINANCE_CONTRAST": "Owner-qualified local luminance contrast against an explicit reference neighborhood.",
    "LOCAL_COLOR_DELTA": "Owner-qualified local color-difference response against an explicit reference neighborhood.",
    "LOCAL_EDGE_CONTRAST": "Owner-qualified local edge/structural contrast response against an explicit reference neighborhood.",
    "EXPLICIT_CONTRAST_RESPONSE": "Owner-defined normalized contrast response with explicit responseContextRef and domain [0,1]."
  },
  "measurement_evidence_schema": {
    "microDetailMeasurementEvidenceRef": "stable identity",
    "scopeRef": "Topic15 scope",
    "microDetailCandidateRef": "exact 15.00 candidate",
    "subjectRef": "candidate subject",
    "family": "SIZE|CONTRAST",
    "channelKey": "one channel from the matching taxonomy",
    "value": "finite numeric",
    "unit": "RATIO|NORMALIZED_RESPONSE",
    "measurementMethodRef": "explicit source method",
    "referenceContextRef": "explicit geometric/local contrast/reference context",
    "responseContextRef": "required for EXPLICIT_*_RESPONSE, otherwise null",
    "evidenceSourceRef": "explicit measurement source",
    "evidenceSourceOwnerRef": "canonical owner",
    "confidence": "finite [0,1] source confidence only",
    "provenance": "canonical provenance",
    "snapshotRef": "exact observation snapshot",
    "status": "OK|INVALID",
    "mutationAllowed": false,
    "firewall": "15.01 adapts the scalar; it does not recompute geometry, typography, appearance or attention."
  },
  "measurement_domain_contract": {
    "SIZE_NONNEGATIVE_CHANNELS": [
      "VISIBLE_AREA_RATIO",
      "BBOX_AREA_RATIO_PROXY",
      "MAX_EXTENT_RATIO",
      "MIN_EXTENT_RATIO",
      "TEXT_EM_HEIGHT_RATIO",
      "STROKE_WIDTH_RATIO"
    ],
    "SIZE_NORMALIZED_CHANNELS": [
      "EXPLICIT_SIZE_RESPONSE"
    ],
    "CONTRAST_NONNEGATIVE_CHANNELS": [
      "LOCAL_LUMINANCE_CONTRAST",
      "LOCAL_COLOR_DELTA",
      "LOCAL_EDGE_CONTRAST"
    ],
    "CONTRAST_NORMALIZED_CHANNELS": [
      "EXPLICIT_CONTRAST_RESPONSE"
    ],
    "nonnegative_domain": "[0,+∞)",
    "normalized_domain": "[0,1]",
    "firewall": "Numeric domains validate data shape only. They are not desirability thresholds."
  },
  "measurement_set_schema": {
    "microDetailMeasurementSetRef": "stable identity",
    "scopeRef": "scope",
    "microDetailCandidateSetRef": "exact 15.00 set",
    "measurementEvidenceRefs": "canonical unique refs",
    "measurementIndex": "candidateRef -> family/channel -> exact evidence ref",
    "status": "OK|N_A|INVALID",
    "reasonCode": "explicit",
    "mutationAllowed": false,
    "duplicate_policy": "more than one evidence item for the same candidate+family+channel is CONFLICT/N_A in v1; confidence does not pick a winner",
    "firewall": "Missing channel stays missing. No implicit fallback from bbox to visible area, size to mass, or one contrast method to another."
  },
  "envelope_range_constraint_schema": {
    "channelKey": "exact size/contrast channel",
    "family": "SIZE|CONTRAST",
    "minInclusive": "finite or null",
    "maxInclusive": "finite or null",
    "measurementMethodRef": "required exact method identity",
    "referenceContextRef": "required exact reference context",
    "responseContextRef": "required exact response context for EXPLICIT_*_RESPONSE, otherwise null",
    "atLeastOneBoundRequired": true,
    "firewall": "Bounds are explicit profile data. No universal microdetail threshold exists."
  },
  "role_envelope_schema": {
    "microDetailRoleEnvelopeRef": "stable identity",
    "roleKind": "one explicit Compo15.00 role except UNSPECIFIED",
    "formApplicabilityMode": "ALL_FORMS|EXPLICIT_FORMS",
    "applicableFormKinds": "empty when ALL_FORMS; explicit non-empty unique set otherwise",
    "sizeConstraints": "unique channel constraints",
    "contrastConstraints": "unique channel constraints",
    "atLeastOneConstraintRequired": true,
    "envelopeSourceRef": "explicit source",
    "envelopeSourceOwnerRef": "owner",
    "provenance": "canonical provenance",
    "status": "OK|INVALID",
    "mutationAllowed": false,
    "firewall": "A role envelope is an explicit admissible range contract, not a score, perceptual law or proof of hierarchy safety."
  },
  "role_envelope_profile_schema": {
    "microDetailRoleEnvelopeProfileRef": "stable identity",
    "profileSourceRef": "explicit source",
    "profileSourceOwnerRef": "owner",
    "envelopes": "non-empty canonical set",
    "roleCoverageMode": "MATCH_DECLARED_ROLES_WITH_AVAILABLE_ENVELOPES",
    "multipleEnvelopePerRolePolicy": "FORBID in v1",
    "unprofiledDeclaredRolePolicy": "NO_ENVELOPE_NOT_ERROR",
    "provenance": "canonical provenance",
    "status": "OK|INVALID",
    "mutationAllowed": false,
    "default": "NONE — no implicit role envelope profile",
    "firewall": "Profile order is serialization only. Role order is not priority."
  },
  "role_envelope_binding_schema": {
    "microDetailRoleEnvelopeBindingRef": "stable identity",
    "microDetailCandidateRef": "candidate",
    "subjectRef": "subject",
    "roleKind": "declared candidate role",
    "microDetailRoleEnvelopeRef": "exact envelope",
    "microDetailRoleEnvelopeProfileRef": "profile",
    "formKind": "candidate form",
    "status": "OK|N_A|INVALID",
    "reasonCode": "explicit",
    "mutationAllowed": false,
    "firewall": "Binding means profile applicability only. It does not mean the candidate is inside the envelope."
  },
  "channel_fit_state_taxonomy": {
    "WITHIN": "Observed value is inside the explicit inclusive bounds.",
    "BELOW": "Observed value is below explicit minInclusive.",
    "ABOVE": "Observed value is above explicit maxInclusive.",
    "N_A": "Required exact measurement/method/reference is unavailable or ambiguous.",
    "INVALID": "Evidence/constraint contract is invalid."
  },
  "channel_fit_descriptor_schema": {
    "microDetailEnvelopeChannelFitDescriptorRef": "stable identity",
    "microDetailRoleEnvelopeBindingRef": "binding",
    "microDetailMeasurementEvidenceRef": "exact measurement or null for N_A",
    "family": "SIZE|CONTRAST",
    "channelKey": "constraint channel",
    "observedValue": "numeric or null",
    "minInclusive": "copied bound",
    "maxInclusive": "copied bound",
    "fitState": "WITHIN|BELOW|ABOVE|N_A|INVALID",
    "status": "OK|N_A|INVALID",
    "reasonCode": "explicit",
    "dependsOn": "exact candidate/envelope/measurement lineage",
    "mutationAllowed": false,
    "firewall": "Fit state is categorical descriptor only. BELOW/ABOVE are not penalties and WITHIN is not score 1."
  },
  "role_envelope_fit_schema": {
    "microDetailRoleEnvelopeFitDescriptorRef": "stable identity",
    "microDetailRoleEnvelopeBindingRef": "binding",
    "channelFitRefs": "all size/contrast channel fits",
    "fitState": "WITHIN_ALL|OUTSIDE_ONE_OR_MORE|N_A|INVALID",
    "status": "OK|N_A|INVALID",
    "reasonCode": "explicit",
    "mutationAllowed": false,
    "firewall": "Role fit aggregates categorical completeness only; it owns no numeric score and no cross-role priority."
  },
  "candidate_envelope_fit_schema": {
    "microDetailCandidateEnvelopeFitDescriptorRef": "stable identity",
    "microDetailCandidateRef": "candidate",
    "microDetailRoleEnvelopeProfileRef": "profile",
    "roleEnvelopeFitRefs": "one per applicable declared role envelope",
    "declaredRoleKinds": "candidate roles",
    "profiledRoleKinds": "roles that found applicable envelopes",
    "fitState": "WITHIN_ALL_APPLICABLE|OUTSIDE_ONE_OR_MORE|NO_APPLICABLE_ENVELOPE|N_A|INVALID",
    "status": "OK|N_A|INVALID",
    "reasonCode": "explicit",
    "mutationAllowed": false,
    "firewall": "Candidate fit does not collapse unprofiled roles into success/failure and does not convert multiple roles into a weighted score."
  },
  "size_contrast_set_schema": {
    "microDetailSizeContrastSetRef": "stable identity",
    "scopeRef": "scope",
    "microDetailCandidateSetRef": "15.00 candidate set",
    "microDetailMeasurementSetRef": "measurement set",
    "microDetailRoleEnvelopeProfileRef": "explicit profile",
    "candidateFitRefs": "one per candidate",
    "status": "OK|N_A|INVALID",
    "reasonCode": "explicit",
    "mutationAllowed": false,
    "firewall": "Set owns no density, no hierarchy damage score, no candidate ranking and no independent vote."
  },
  "descriptor_attachment_schema": {
    "microDetailDescriptorSizeContrastAttachmentRef": "stable identity",
    "microDetailDescriptorSeedRef": "exact 15.00 seed",
    "microDetailCandidateEnvelopeFitDescriptorRef": "15.01 descriptor",
    "microDetailMeasurementEvidenceRefs": "used candidate measurements",
    "status": "OK",
    "mutationAllowed": false,
    "firewall": "Derived attachment never mutates sizeContrastEnvelopeAttachmentRef on the 15.00 seed."
  },
  "system_attachment_schema": {
    "microDetailSystemSizeContrastAttachmentRef": "stable identity",
    "microDetailSystemSeedRef": "exact 15.00 system seed",
    "microDetailSizeContrastSetRef": "15.01 set",
    "descriptorAttachmentRefs": "canonical attachments",
    "status": "OK",
    "mutationAllowed": false,
    "firewall": "Derived attachment never mutates sizeContrastEnvelopeSetAttachmentRef on the 15.00 system seed."
  },
  "status_policy": {
    "invalidMeasurementEvidence": "INVALID",
    "duplicateSameChannelEvidence": "N_A conflict; no confidence winner",
    "missingExactMeasurementForConstraint": "N_A",
    "methodMismatch": "N_A",
    "referenceContextMismatch": "N_A",
    "responseContextMismatch": "N_A",
    "withinBounds": "OK + WITHIN",
    "belowMin": "OK + BELOW",
    "aboveMax": "OK + ABOVE",
    "roleFitAnyInvalid": "INVALID",
    "roleFitAnyNA": "N_A",
    "roleFitAnyOutside": "OK + OUTSIDE_ONE_OR_MORE",
    "roleFitAllWithin": "OK + WITHIN_ALL",
    "candidateNoApplicableEnvelope": "OK + NO_APPLICABLE_ENVELOPE",
    "candidateFitAnyInvalid": "INVALID",
    "candidateFitAnyNA": "N_A",
    "candidateFitAnyOutside": "OK + OUTSIDE_ONE_OR_MORE",
    "candidateFitAllApplicableWithin": "OK + WITHIN_ALL_APPLICABLE",
    "N_A_not_zero": true
  },
  "comparability_contract": {
    "requires": [
      "same channelKey",
      "same measurementMethodRef",
      "same referenceContextRef",
      "same responseContextRef when applicable",
      "same MicroDetailRoleEnvelopeProfileRef",
      "compatible snapshot lineage"
    ],
    "forbids": [
      "comparing bbox proxy as visible-area truth",
      "comparing different contrast methods as the same scalar",
      "cross-profile envelope-fit ranking",
      "using role order as priority",
      "using confidence as fit severity",
      "treating WITHIN as universal quality"
    ]
  },
  "critical_firewalls": [
    "15.01 consumes explicit Compo15.00 candidates only",
    "size measurement != microdetail eligibility",
    "contrast measurement != microdetail eligibility",
    "small observed size != automatically valid microdetail",
    "large observed size != automatically invalid microdetail",
    "high contrast != automatically micro accent",
    "low contrast != automatically support detail",
    "size channel != visual mass",
    "BBOX_AREA_RATIO_PROXY != VISIBLE_AREA_RATIO",
    "text em height != bbox extent",
    "stroke width != element size",
    "contrast channel methods are not interchangeable",
    "LOCAL_LUMINANCE_CONTRAST != LOCAL_COLOR_DELTA",
    "LOCAL_COLOR_DELTA != LOCAL_EDGE_CONTRAST",
    "EXPLICIT_SIZE_RESPONSE requires explicit response context",
    "EXPLICIT_CONTRAST_RESPONSE requires explicit response context",
    "measurement confidence != desirability",
    "measurement confidence != fit severity",
    "measurement confidence cannot resolve duplicate channel conflict",
    "role envelope must be explicit",
    "no universal microdetail size threshold",
    "no universal microdetail contrast threshold",
    "no universal role envelope",
    "no implicit equal envelope across roles",
    "role envelope != score",
    "role envelope != hierarchy-safety proof",
    "role envelope order != role priority",
    "multi-role candidate keeps all applicable envelopes",
    "multi-role candidate fit is not weighted by role count",
    "unprofiled declared role != satisfied role",
    "unprofiled declared role != failed role",
    "binding != satisfaction",
    "WITHIN != score 1",
    "BELOW != numeric penalty",
    "ABOVE != numeric penalty",
    "OUTSIDE_ONE_OR_MORE != hard reject",
    "NO_APPLICABLE_ENVELOPE != score 0",
    "N_A != BELOW",
    "N_A != ABOVE",
    "N_A != 0",
    "INVALID != 0",
    "missing measurement != zero",
    "method mismatch => N_A, not zero",
    "reference mismatch => N_A, not zero",
    "response-context mismatch => N_A, not zero",
    "candidate fit != MetricResult",
    "candidate fit != hierarchy-damage score",
    "candidate fit != global quality",
    "candidate count != density",
    "measurement count != density",
    "no density map in 15.01",
    "no local density score in 15.01",
    "no label/legend/noise evaluation in 15.01",
    "no microdetail target score in 15.01",
    "no generator in 15.01",
    "15.01 owns no MetricResult",
    "15.01 owns no independent numeric vote",
    "microdetail role ownership remains Compo15.00",
    "visual mass ownership remains Compo4",
    "attention factor interpretation remains Compo13.01",
    "dominance ownership remains Compo13",
    "secondary-mass support ownership remains Topic14",
    "generic hierarchy/subordination graph remains Compo18 territory",
    "hierarchy protection binding remains Compo15.00 adapter",
    "descriptor attachment != seed mutation",
    "system attachment != seed mutation",
    "local != global",
    "geometry != interpretation",
    "descriptor != score",
    "heuristic != law",
    "one metric = one owner",
    "module execution order != rule priority",
    "correction request != foreign mutation",
    "no universal beautyScore",
    "IDEA != CANON",
    "EXPERIMENT != CANON"
  ],
  "identity_policy": {
    "microDetailMeasurementEvidenceRef": "hash(scope, candidate, subject, family/channel, value/unit, method/reference/response contexts, source/owner, confidence, provenance, snapshot, status)",
    "microDetailMeasurementSetRef": "hash(scope, candidate set, canonical measurement refs/index, status)",
    "microDetailRoleEnvelopeRef": "hash(role, form applicability, canonical constraints, source/owner, provenance, status)",
    "microDetailRoleEnvelopeProfileRef": "hash(source/owner, canonical envelope refs, coverage policies, provenance, status)",
    "microDetailRoleEnvelopeBindingRef": "hash(candidate, subject, role, envelope, profile, form, status)",
    "microDetailEnvelopeChannelFitDescriptorRef": "hash(binding, measurement, family/channel, observed value, bounds, fit state, status, lineage)",
    "microDetailRoleEnvelopeFitDescriptorRef": "hash(binding, canonical channel fits, fit state, status)",
    "microDetailCandidateEnvelopeFitDescriptorRef": "hash(candidate, profile, role fits, declared/profiled roles, fit state, status)",
    "microDetailSizeContrastSetRef": "hash(scope, candidate set, measurement set, profile, candidate fits, status)",
    "microDetailDescriptorSizeContrastAttachmentRef": "hash(descriptor seed, candidate fit, used measurement refs)",
    "microDetailSystemSizeContrastAttachmentRef": "hash(system seed, size-contrast set, descriptor attachments)",
    "excluded_from_identity": [
      "display label",
      "display color",
      "free-form comment",
      "serialization order where canonical sets are defined"
    ]
  },
  "correction_request_schema": {
    "microDetailSizeContrastCorrectionRequestRef": "stable identity",
    "targetOwnerRef": "measurement owner or envelope-profile owner",
    "reasonCode": "SIZE_MEASUREMENT_WRONG|CONTRAST_MEASUREMENT_WRONG|METHOD_REF_WRONG|REFERENCE_CONTEXT_WRONG|RESPONSE_CONTEXT_WRONG|ROLE_ENVELOPE_WRONG|SIZE_BOUND_WRONG|CONTRAST_BOUND_WRONG|FORM_APPLICABILITY_WRONG|DUPLICATE_MEASUREMENT_CONFLICT",
    "subjectRef": "subject or null for profile issue",
    "roleKind": "role or null",
    "channelKey": "channel or null",
    "evidenceRefs": "canonical refs",
    "suggestedAction": "non-mutating review request",
    "status": "OPEN|INVALID",
    "mutationAllowed": false
  },
  "deferred_downstream": {
    "15.02": [
      "distribution descriptors",
      "local density calculation",
      "density maps",
      "regional density envelopes",
      "spacing/clustering descriptors"
    ],
    "15.03": [
      "labels and legends classification",
      "technical-mark overload",
      "technical noise descriptors",
      "annotation readability/noise relations"
    ],
    "15.04": [
      "explicit hierarchy-protection target profile",
      "component/composite scoring",
      "MetricResult ownership",
      "generator / bounded repair candidates",
      "final Topic15 regression tests"
    ]
  },
  "IDEAS_REFS": [
    "IDEA-01 full human test after all 72 topics; compare role-specific size/contrast envelope violations with human hierarchy judgments",
    "IDEA-02 semantics needed before placement; role identity comes from 15.00 and label/legend meaning remains deferred to 15.03",
    "IDEA-03 explicit rule priorities; envelope/role order never becomes hidden global priority",
    "IDEA-04 collect structured data for future composition model",
    "IDEA-05 preserve reasons for human corrections",
    "IDEA-06 structured machine-readable layer for website",
    "IDEA-07 graphics-for-post-text research remains downstream/separate"
  ],
  "DATA_CAPTURE": [
    "sceneRef",
    "scopeRef",
    "snapshotRef",
    "microDetailCandidateSetRef",
    "microDetailCandidateRefs[]",
    "microDetailMeasurementEvidenceRefs[]",
    "measurementFamilyByRef",
    "measurementChannelByRef",
    "measurementValueByRef",
    "measurementMethodRefByEvidence",
    "referenceContextRefByEvidence",
    "responseContextRefByEvidence",
    "measurementOwnerByEvidence",
    "microDetailMeasurementSetRef",
    "duplicateMeasurementConflicts[]",
    "microDetailRoleEnvelopeProfileRef",
    "microDetailRoleEnvelopeRefs[]",
    "roleEnvelopeByRole",
    "sizeConstraintsByRole",
    "contrastConstraintsByRole",
    "formApplicabilityByRole",
    "microDetailRoleEnvelopeBindingRefs[]",
    "microDetailEnvelopeChannelFitDescriptorRefs[]",
    "channelFitStateByCandidateRoleChannel",
    "microDetailRoleEnvelopeFitDescriptorRefs[]",
    "roleFitStateByCandidateRole",
    "microDetailCandidateEnvelopeFitDescriptorRefs[]",
    "candidateFitStateBySubject",
    "profiledRoleKindsBySubject",
    "unprofiledRoleKindsBySubject",
    "microDetailSizeContrastSetRef",
    "descriptorAttachmentRefs[]",
    "systemAttachmentRef",
    "humanReasonCodes[]",
    "futureDensityRefs[]",
    "futureNoiseRefs[]",
    "futureMetricResultRefs[]"
  ],
  "DEFERRED_SEMANTIC_INPUTS": [
    "whether an envelope violation should be penalized",
    "whether a role envelope is appropriate for a specific style",
    "hierarchy-damage tolerance",
    "desired local density by region/role",
    "whether technical marks are necessary or noisy",
    "label/legend semantic importance",
    "global hierarchy priority",
    "final microdetail target profile"
  ],
  "HUMAN_FEEDBACK_HOOKS": [
    "SIZE_MEASUREMENT_WRONG",
    "SIZE_METHOD_WRONG",
    "SIZE_REFERENCE_WRONG",
    "CONTRAST_MEASUREMENT_WRONG",
    "CONTRAST_METHOD_WRONG",
    "CONTRAST_REFERENCE_WRONG",
    "NORMALIZED_RESPONSE_CONTEXT_WRONG",
    "BBOX_PROXY_SHOULD_NOT_BE_USED",
    "VISIBLE_AREA_MEASURE_NEEDED",
    "ROLE_ENVELOPE_TOO_TIGHT",
    "ROLE_ENVELOPE_TOO_LOOSE",
    "SIZE_MIN_TOO_HIGH",
    "SIZE_MAX_TOO_LOW",
    "CONTRAST_MIN_TOO_HIGH",
    "CONTRAST_MAX_TOO_LOW",
    "FORM_APPLICABILITY_WRONG",
    "ROLE_SHOULD_HAVE_NO_ENVELOPE",
    "ROLE_NEEDS_ENVELOPE",
    "MULTIROLE_ENVELOPES_CONFLICT_PERCEPTUALLY",
    "WITHIN_ENVELOPE_STILL_HARMS_HIERARCHY",
    "OUTSIDE_ENVELOPE_STILL_LOOKS_CORRECT",
    "UNPROFILED_ROLE_SHOULD_BE_PROFILED",
    "DUPLICATE_MEASUREMENT_IS_REAL_CONFLICT",
    "DUPLICATE_MEASUREMENT_SHOULD_RESOLVE"
  ],
  "CONFLICT_PRIORITY_ASSUMPTIONS": [
    "module execution order is not priority",
    "measurement confidence is not fit priority",
    "role-envelope order is not role priority",
    "candidate order is not visual priority",
    "multiple declared roles remain co-applicable unless a later explicit target contract says otherwise",
    "envelope violation direction is not severity ranking",
    "future reviewed global conflict-priority owner remains authoritative"
  ],
  "LAB_HOOKS": [
    "human study: acceptable size envelopes by declared microdetail role",
    "human study: acceptable contrast envelopes by declared microdetail role",
    "compare visible-area and bbox-proxy judgments",
    "compare luminance/color/edge contrast channels without treating them as interchangeable",
    "collect multi-role candidates whose envelopes conflict perceptually",
    "collect cases within envelope that still damage hierarchy",
    "collect cases outside envelope that remain visually acceptable",
    "measure whether envelope judgments shift by form kind",
    "evaluate stability of normalized response contexts across scenes"
  ],
  "observation_record": {
    "moduleRef": "Compo15.01",
    "metricResults": [],
    "futureMicroDetailEvaluationRefs": []
  },
  "stop_condition": "STOP after 15.01. Do not create 15.02 in this module."
}
VISITS / ...