COMPO · 12.02 · PROTECTED RELATIONS + EXCEPTION BUDGETS

Protect what
must survive.

12.02 вводит две независимые hard-gating системы для намеренного нарушения сетки: явные ProtectedRelation, которые Topic12 не имеет права «выкупать» бюджетом, и явные ExceptionBudget, которые ограничивают количество/совокупную величину разрешённых исключений. Это не score, не preference и не генератор кандидатов.

ModuleCompo 12.02
Protectionhard only
Budgetexplicit
Mutationnone
Scorenone
NextSTOP

Intent is not permission

00 / contract

12.00 proves that the break was explicitly intended. 12.01 measures it. 12.02 answers two different questions: “what must not be broken?” and “how much explicit exception capacity remains?”.

HARD PROTECTION

Cannot be overridden by Topic12 budget.

BUDGET

Explicit finite capacity. Missing ≠ infinite.

LEDGER

Immutable accounting snapshot.

NO SCORE

Capacity is a gate, never preference.

VALID CONTROLLED-BREAK PATH: explicit RuleBreakIntent + explicit DeviationMeasurement + protection gate PASS + applicable budget WITHIN_BUDGET → may continue downstream NOT: REQUEST_BREAK → permission unused budget → invitation budget capacity → quality budget → permission to break protected relation

12.02 owns gates and accounting

01 / ownership

Grid/alignment owners continue to own relation geometry. 12.02 only adapts their identities/evaluations into explicit protection and capacity contracts.

OWNS

Protection

Protected relation adapters, explicit hard-protection policy and local gate evaluation.

OWNS

Budget

Scope, dimensions, usage adapters, immutable ledger accounting and hypothetical proposal evaluation.

DEFERS

12.03 / 12.04

Candidate generation, justification evidence, override scoring and final Topic12 decision.

No score ownership.

owns_metrics=[]. Count, magnitude usage, capacity and remaining budget are descriptors/constraints, not MetricResult votes.

ProtectedRelationEvidence

02 / owner-qualified adapter

A protected relation is never guessed from visual salience or break intent. It references an exact upstream relation/rule and its canonical owner.

ProtectedRelationEvidence {
  protectedRelationRef,

  relationRef,
  relationOwnerRef,
  relationModuleRef,
  relationSnapshotRef,

  relationFamily,
  subjectRefs[],

  canvasRef,
  coordinateFrame,
  sourceUnit,

  evidenceRefs[],
  confidence,
  provenance,
  status,

  mutationAllowed: false
}
Hard means hard locally.

In Topic12 v1.0 a declared protected relation is not “expensive”; it is non-overridable by the Topic12 exception budget.

No self-protection.

A generator or 12.02 itself cannot invent protection merely because a relation appears important. The declaration needs an explicit source/policy.

ProtectedRelationPolicy

03 / explicit declaration

Missing policy and explicit empty policy are different states.

ProtectedRelationPolicy {
  protectionPolicyRef,

  policySourceRef,
  policySourceOwnerRef,

  scopeRef,
  canvasRef,
  subjectRefs[],

  protectedRelationRefs[],

  policyMode: "HARD_PROTECT_ONLY",

  confidence,
  provenance,
  status,

  mutationAllowed: false
}
MISSING policy → protection gate = N_A EXPLICIT policy with: protectedRelationRefs = [] → gate may PASS → means "no hard-protected relations in this declared scope" This empty set must be explicitly sourced. It is not synthesized from missing evidence.

Relation impact stays owner-qualified

04 / impact adapter

12.02 does not re-run Topic8/9/10 geometry. It consumes an explicit evaluation of whether a protected relation survives the proposed/observed state.

ProtectedRelationImpactEvidence {
  impactEvidenceRef,

  protectedRelationRef,
  relationRef,

  impactEvaluationRef,
  impactEvaluationOwnerRef,
  impactSnapshotRef,

  impactState:
    PRESERVED
    BROKEN
    UNKNOWN,

  evidenceRefs[],
  confidence,
  provenance,
  status,

  mutationAllowed: false
}
Impact magnitude is not required here.

For the hard-protection gate the canonical fact is whether the upstream relation remains valid. Numeric relation diagnostics, if any, remain with their upstream owner.

Protection gate

05 / hard constraint

Budget never participates in this decision.

Input stateGateMeaning
Explicit empty policyPASSNo hard-protected relation declared in exact scope.
All protected impacts PRESERVEDPASSBreak may continue to budget/justification gates.
Any protected impact BROKENREJECTTopic12 break is blocked.
Any required impact UNKNOWN/missingN_ACannot claim protected relations survive.
Lineage/conflict malformedINVALIDEvidence contract failed.
PROTECTION REJECT + 100% unused budget = still REJECT There is no exchange rate between: protected relation and exception budget.

ExceptionBudgetScope

06 / explicit applicability

No global “default exception pool” exists. Every budget declares where it applies.

ExceptionBudgetScope {
  budgetScopeRef,

  scopeSourceRef,
  scopeSourceOwnerRef,

  canvasRef,
  targetFamilies[],
  subjectRefs[],

  status,
  mutationAllowed: false
}
APPLICABLE usage: same canvas AND targetFamily ∈ scope.targetFamilies AND ( scope.subjectRefs is empty OR usage.subjectRefs ⊆ scope.subjectRefs ) NOT_APPLICABLE: explicit scope does not cover usage INVALID: malformed scope / unsupported family / broken lineage

Three explicit budget dimensions

07 / closed taxonomy

Budgets may constrain count, homogeneous metric magnitude, homogeneous normalized magnitude, or a combination. Every applicable usage must be charged by at least one declared dimension.

DimensionChargeSelector
EXCEPTION_COUNT1 per unique applicable usagenone
METRIC_MAGNITUDE_SUMmagnitudeMetricexact family + measurement kind + axis + metricContextRef + metricUnit
NORMALIZED_MAGNITUDE_SUMnormalizedMagnitudeexact family + measurement kind + axis + normalizationRef
ExceptionBudgetDimension {
  dimensionRef,
  dimensionKind,

  capacity,
  numericalEpsilon,

  selector?,

  provenance,
  status
}
Zero capacity is valid.

capacity = 0 explicitly means no capacity in that dimension. It is not N_A.

No arbitrary credits.

12.02 v1.0 does not introduce weighted “exception points”, beauty credits or family-specific hidden weights.

ExceptionBudgetPolicy

08 / finite explicit contract

Absence of a budget does not mean unlimited freedom.

ExceptionBudgetPolicy {
  exceptionBudgetRef,

  budgetSourceRef,
  budgetSourceOwnerRef,

  budgetScopeRef,
  dimensionRefs[],

  confidence,
  provenance,
  status,

  mutationAllowed: false
}
NO matching explicit budget → budget evaluation = N_A NOT: capacity = Infinity NOT: assume "one exception is probably fine" NOT: derive capacity from remaining whitespace, confidence, deviation magnitude, or request strength

ExceptionUsageEvidence

09 / charge input

12.02 can account committed state and evaluate hypothetical proposed usage, but it does not authorize either.

ExceptionUsageEvidence {
  usageRef,

  accountingState:
    COMMITTED
    PROPOSED,

  authorizationRef?,

  targetEvidenceRef,
  intentRef,
  targetFamily,
  subjectRefs[],

  deviationMeasurementRef?,

  metricContextRef?,
  normalizationRef?,
  measurementKind?,
  axis?,

  magnitudeMetric?,
  metricUnit?,
  normalizedMagnitude?,

  evidenceRefs[],
  confidence,
  status,

  mutationAllowed: false
}
COMMITTED

Requires an external authorizationRef. 12.02 records/accountants it but does not create the authorization.

PROPOSED

Hypothetical charge only. Evaluation does not mutate the committed ledger or reserve capacity.

Immutable ledger snapshot

10 / accounting

The ledger is derived from a canonical set of committed usages. Re-running with the same evidence yields the same identity and totals.

ExceptionBudgetLedgerSnapshot {
  ledgerRef,

  exceptionBudgetRef,
  committedUsageRefs[],

  dimensionAccounting[]: {
    dimensionRef,
    capacity,
    committedUsage,
    remainingBeforeProposal
  },

  status,
  reasonCode,

  derivedFrom[],
  mutationAllowed: false
}
FOR EACH dimension: committedUsage = Σ charge(applicable COMMITTED usage) remainingBeforeProposal = capacity - committedUsage Ledger construction: - unique usage refs only - COMMITTED only - every applicable usage must match ≥1 dimension - no mutation - no hidden dedupe of duplicate input refs

Hypothetical budget evaluation

11 / proposed usage

A proposal is evaluated against a ledger snapshot. The result is a capacity decision, not a quality estimate.

ExceptionBudgetEvaluation {
  budgetEvaluationRef,

  exceptionBudgetRef,
  ledgerRef,
  proposedUsageRefs[],

  dimensionAccounting[]: {
    dimensionRef,

    capacity,
    committedUsage,
    proposedUsage,
    resultingUsage,
    remainingAfterProposal,

    withinCapacity
  },

  status,
  decision:
    WITHIN_BUDGET
    EXCEEDS_BUDGET,

  reasonCode,
  mutationAllowed: false
}
resultingUsage = committedUsage + proposedUsage WITHIN dimension iff: resultingUsage <= capacity + numericalEpsilon Budget decision: WITHIN_BUDGET iff every declared dimension remains within capacity EXCEEDS_BUDGET iff at least one dimension exceeds capacity numericalEpsilon: computational tolerance only != additional design allowance

Multiple budgets: all applicable constraints survive

12 / bundle gate

List order does not create priority. If several explicit budgets cover the same proposal, each constrains it.

0 applicable budgets → N_A all applicable evaluations WITHIN_BUDGET → PASS any applicable evaluation EXCEEDS_BUDGET → REJECT any applicable evaluation INVALID → INVALID NOT: choose the most generous budget choose the first budget average capacities turn remaining capacity into a score

Identity is policy + evidence + immutable state

13 / deterministic lineage

Set-like arrays are canonicalized. Confidence and presentation metadata never affect identity.

protectedRelationRef = hash( upstream relation identity/snapshot, family, canonical subjects, canvas/frame/unit, canonical evidence refs ) dimensionRef = hash( kind, capacity, numericalEpsilon, canonical selector ) exceptionBudgetRef = hash( budget source/owner, budgetScopeRef, canonical dimension refs ) usageRef = hash( accountingState, authorizationRef?, targetEvidenceRef, intentRef, targetFamily, canonical subjects, deviationMeasurementRef?, canonical evidence refs ) ledgerRef = hash( exceptionBudgetRef, canonical committed usage refs, computed dimension accounting )

Budget must not become a hidden aesthetic optimizer

14 / firewalls

The module separates permission capacity from quality or desirability.

Forbidden shortcuts

unused budget → generate more breaks; large budget → better; remaining → score; REQUEST_BREAK → bypass; budget → break protected relation; missing → unlimited.

Preserved invariants

N_A != 0; descriptor != score; local != global; one owner per contract; module order != priority; proposed usage != committed mutation.

Topic12 chain remains separated

15 / integration

Each submodule owns one stage of the controlled-break contract.

OwnerContract
12.00Target evidence + explicit break intent. No permission from observed deviation.
12.01Deviation magnitude descriptors. No budget charge semantics.
12.02Hard-protection gate + explicit exception-capacity accounting.
12.03Bounded rule-break candidates + candidate-specific justification evidence.
12.04Override/local controlled-break scoring/tests and consolidated Topic12 evaluation.
8/9/10Continue to own grid/alignment geometry and relation validity.

Wrong policy/evidence → correction request

16 / non-mutating repair

12.02 never edits upstream relations, budget sources or authorization state.

RuleBreakProtectionBudgetCorrectionRequest {
  requestRef,
  targetOwnerRef,

  reasonCode,
  evidenceRefs[],
  suggestedAction,

  status,
  mutationAllowed: false
}

CANON → LAB → DATA → IDEAS

17 / cross-cutting hooks

How strict budgets should be is an empirical/style question unless an explicit policy says otherwise. 12.02 provides the hooks without inventing universal thresholds.

IDEAS_REFS[]7 project-level R&D refs retained.
DATA_CAPTURE[]protection, impact, capacity, usage and remaining values.
DEFERRED_SEMANTIC_INPUTS[]semantic reason for protection remains external.
HUMAN_FEEDBACK_HOOKS[]protection/scope/dimension/charge correction reasons.
CONFLICT_PRIORITY_ASSUMPTIONS[]hard protection and budget gates do not become global priority.
LAB_HOOKS[]study perception without auto-mutating canon.

Preserve why humans disagree

18 / feedback evidence

Budget calibration is useless if corrections are stored only as accept/reject.

ReasonMeaning
RELATION_SHOULD_BE_HARD_PROTECTEDA relation should have been protected.
RELATION_SHOULD_NOT_BE_HARD_PROTECTEDProtection declaration was too strict/wrong.
PROTECTION_IMPACT_EVALUATED_WRONGPreserved/Broken/Unknown evaluation is wrong.
BUDGET_TOO_LARGEExplicit capacity feels too permissive.
BUDGET_TOO_SMALLExplicit capacity feels too restrictive.
BUDGET_SCOPE_WRONGCanvas/family/subject scope is wrong.
BUDGET_DIMENSION_WRONGCount/metric/normalized constraint is inappropriate.
EXCEPTION_CHARGED_WRONGUsage was charged to the wrong dimension/budget.
EXCEPTION_NOT_CHARGEDAn applicable usage escaped accounting.
TENSION_READS_AS_ERROREven policy-compliant break reads as accidental/error-like.

Visual laboratory hook

19 / protection vs capacity

Protection and budget are intentionally visualized as orthogonal gates.

A · HARD PROTECTION protected relation survives → PASS B · EXCEPTION BUDGET committed + proposed usage ≤ explicit capacity → WITHIN_BUDGET THE TWO GATES DO NOT TRADE. A broken hard-protected relation remains REJECT even when the budget is completely unused. Unused budget is remaining capacity only; it is not a reward or an instruction to add tension. 12.03 may later generate bounded candidates and their proposed usage. 12.04 will own override scoring/tests.

12.02 regression suite

20 / deterministic tests

Tests cover protection identity/gating, explicit empty policy, missing-policy N_A, budget scope, all three budget dimensions, immutable ledgers, proposal evaluation, multiple-budget bundles, zero-capacity semantics, lineage, no-mutation and Topic12 firewalls.

Tests not run yet.

DATA FOR LAYOUT ENGINE

21 / machine contract

Machine-readable 12.02 canonical contract.

{
  "module": "Compo 12.02",
  "name": "protected_relations_and_exception_budgets",
  "version": "1.0-canonical",
  "canonical_main_title": "Protected relations and exception budgets",
  "topic": "12_НАРУШЕНИЕ_СЕТКИ_И_КОНТРОЛИРУЕМОЕ_НАПРЯЖЕНИЕ",
  "scope": "EXPLICIT_HARD_PROTECTION_AND_IMMUTABLE_EXCEPTION_BUDGET_ACCOUNTING_ONLY",
  "main_topic_contract": {
    "topic_title": "Нарушение сетки и контролируемое напряжение",
    "topic_goal": "formalize intentional breaking of grid and alignment: deviation magnitude, protected relations, exception budget and justification so controlled tension is distinguishable from error",
    "expected_output": "RuleBreakIntent, deviation metrics, exception budget, evidence",
    "planned_files": [
      "12.00 Grid-break taxonomy and intent",
      "12.01 Deviation magnitude",
      "12.02 Protected relations and exception budgets",
      "12.03 Rule-break candidates and justification",
      "12.04 Override scoring and tests"
    ]
  },
  "ownership": {
    "owner": "Compo12.02",
    "owns": [
      "ProtectedRelationEvidence adapter schema",
      "ProtectedRelationPolicy",
      "ProtectedRelationImpactEvidence adapter schema",
      "ProtectedRelationGateEvaluation",
      "ExceptionBudgetScope",
      "ExceptionBudgetDimension",
      "ExceptionBudgetPolicy",
      "ExceptionUsageEvidence adapter schema",
      "ExceptionBudgetLedgerSnapshot",
      "ExceptionBudgetEvaluation",
      "ExceptionBudgetBundleEvaluation",
      "RuleBreakProtectionBudgetCorrectionRequest",
      "serializable protection/budget observation record"
    ],
    "does_not_own": [
      "RuleBreakIntent taxonomy/source/target evidence — Compo12.00",
      "deviation magnitude, metric conversion or normalization — Compo12.01",
      "upstream grid/alignment relation geometry or validation — Topics8/9/10",
      "rule-break candidate generation or justification — Compo12.03",
      "override scoring or final Topic12 vote — Compo12.04",
      "global conflict priority",
      "foreign mutation or budget authorization state"
    ]
  },
  "consumes": [
    "valid Compo12.00 RuleBreakTargetEvidence",
    "valid Compo12.00 RuleBreakIntent",
    "owner-qualified upstream relation identities for protection",
    "owner-qualified relation-impact evidence",
    "valid Compo12.01 RuleBreakDeviationMeasurement where a magnitude-based budget dimension is used",
    "explicit budget source/policy evidence",
    "optional externally authorized committed exception usage refs",
    "optional opaque semanticIntentRefs[]",
    "optional human feedback reason codes"
  ],
  "provides": [
    "ProtectedRelationEvidence",
    "ProtectedRelationPolicy",
    "ProtectedRelationImpactEvidence",
    "ProtectedRelationGateEvaluation",
    "ExceptionBudgetScope",
    "ExceptionBudgetDimension",
    "ExceptionBudgetPolicy",
    "ExceptionUsageEvidence",
    "ExceptionBudgetLedgerSnapshot",
    "ExceptionBudgetEvaluation",
    "ExceptionBudgetBundleEvaluation",
    "RuleBreakProtectionBudgetCorrectionRequest",
    "Topic12.02 observation record"
  ],
  "owns_metrics": [],
  "metric_ownership_note": "12.02 owns capacities, charges and remaining-budget descriptors; none is a MetricResult score or independent vote.",
  "target_families": [
    "COLUMN_GRID",
    "MODULAR_GRID",
    "PAIRWISE_ALIGNMENT",
    "TEXT_BASELINE_ALIGNMENT",
    "SHARED_AXIS_ALIGNMENT"
  ],
  "protection_contract": {
    "canonical_mode_v1": "HARD_PROTECT_ONLY",
    "meaning": "A protected relation is a hard local constraint for Topic12. A Topic12 exception budget cannot buy permission to break it.",
    "explicit_empty_policy": "A valid ProtectedRelationPolicy may explicitly declare an empty protectedRelationRefs[] set; this means no hard-protected relations in that exact scope, not missing evidence.",
    "missing_policy": "N_A, never silently interpreted as an empty policy.",
    "impact_states": {
      "PRESERVED": "upstream owner-qualified impact evidence says the relation remains valid",
      "BROKEN": "upstream owner-qualified impact evidence says the relation would/does fail",
      "UNKNOWN": "impact cannot be established from current evidence"
    },
    "gate": {
      "PASS": "all explicitly protected relations are PRESERVED, or explicit policy set is empty",
      "REJECT": "one or more explicitly protected relations are BROKEN",
      "N_A": "policy/required impact evidence is missing or UNKNOWN",
      "INVALID": "malformed, conflicting or lineage-incompatible protection evidence"
    }
  },
  "protected_relation_evidence_schema": {
    "protectedRelationRef": "stable 12.02 adapter identity",
    "relationRef": "exact upstream relation/rule identity",
    "relationOwnerRef": "canonical upstream owner",
    "relationModuleRef": "exact upstream module/service ref",
    "relationSnapshotRef": "exact upstream version/snapshot identity",
    "relationFamily": "one of Topic12 supported target families",
    "subjectRefs": "one or more canonical subjects participating in the protected relation",
    "canvasRef": "explicit canvas/domain identity",
    "coordinateFrame": "explicit coordinate-frame identity",
    "sourceUnit": "explicit upstream geometric unit",
    "evidenceRefs": "one or more owner-qualified refs supporting relation existence/protection eligibility",
    "confidence": "0..1 evidence quality only",
    "provenance": "canonical provenance class",
    "status": "OK|N_A|INVALID",
    "mutationAllowed": false
  },
  "protected_relation_policy_schema": {
    "protectionPolicyRef": "stable policy identity",
    "policySourceRef": "explicit source of hard-protection declaration",
    "policySourceOwnerRef": "owner of declaration",
    "scopeRef": "explicit policy scope identity",
    "canvasRef": "required",
    "subjectRefs": "optional exact/set-like scope; empty means canvas-wide within declared relation set",
    "protectedRelationRefs": "explicit set; may be empty only when the policy source explicitly declares no hard protections",
    "policyMode": "HARD_PROTECT_ONLY",
    "confidence": "0..1 evidence quality only",
    "provenance": "canonical provenance class",
    "status": "OK|INVALID",
    "mutationAllowed": false
  },
  "protected_relation_impact_schema": {
    "impactEvidenceRef": "stable 12.02 adapter identity",
    "protectedRelationRef": "exact protected relation adapter ref",
    "relationRef": "must match protected relation evidence",
    "impactEvaluationRef": "required owner-qualified evaluation identity",
    "impactEvaluationOwnerRef": "owner/evaluator of relation impact",
    "impactSnapshotRef": "observed/predicted scene snapshot identity",
    "impactState": "PRESERVED|BROKEN|UNKNOWN",
    "evidenceRefs": "one or more refs",
    "confidence": "0..1 evidence quality only",
    "provenance": "canonical provenance class",
    "status": "OK|N_A|INVALID",
    "mutationAllowed": false
  },
  "budget_scope_schema": {
    "budgetScopeRef": "stable identity",
    "scopeSourceRef": "explicit source identity",
    "scopeSourceOwnerRef": "owner of scope declaration",
    "canvasRef": "required",
    "targetFamilies": "one or more distinct supported target families",
    "subjectRefs": "optional scope; empty means any subject on canvas within targetFamilies",
    "status": "OK|INVALID",
    "mutationAllowed": false
  },
  "budget_dimension_taxonomy": {
    "EXCEPTION_COUNT": "charges 1 for every applicable unique ExceptionUsageEvidence",
    "METRIC_MAGNITUDE_SUM": "charges magnitudeMetric only when an exact declared measurement signature matches",
    "NORMALIZED_MAGNITUDE_SUM": "charges normalizedMagnitude only when exact normalizationRef and declared measurement signature match"
  },
  "budget_dimension_schema": {
    "dimensionRef": "stable identity",
    "dimensionKind": "EXCEPTION_COUNT|METRIC_MAGNITUDE_SUM|NORMALIZED_MAGNITUDE_SUM",
    "capacity": "finite >=0; integer for EXCEPTION_COUNT",
    "numericalEpsilon": "finite >=0; 0 for EXCEPTION_COUNT; computational comparison tolerance only",
    "selector": {
      "EXCEPTION_COUNT": "null",
      "METRIC_MAGNITUDE_SUM": "targetFamily + measurementKind + axis + metricContextRef + metricUnit",
      "NORMALIZED_MAGNITUDE_SUM": "targetFamily + measurementKind + axis + normalizationRef"
    },
    "zero_capacity": "legal explicit budget; distinct from missing budget",
    "provenance": "canonical provenance class",
    "status": "OK|INVALID"
  },
  "budget_policy_schema": {
    "exceptionBudgetRef": "stable budget identity",
    "budgetSourceRef": "explicit source identity",
    "budgetSourceOwnerRef": "owner of the budget declaration",
    "budgetScopeRef": "exact ExceptionBudgetScope ref",
    "dimensionRefs": "one or more unique explicit dimensions",
    "confidence": "0..1 evidence quality only",
    "provenance": "canonical provenance class",
    "status": "OK|INVALID",
    "mutationAllowed": false,
    "default": "NONE — no implicit infinite budget"
  },
  "exception_usage_schema": {
    "usageRef": "stable identity",
    "accountingState": "COMMITTED|PROPOSED",
    "authorizationRef": "required for COMMITTED; 12.02 does not create authorization",
    "targetEvidenceRef": "exact 12.00 target ref",
    "intentRef": "exact 12.00 intent ref",
    "targetFamily": "copied for auditability",
    "subjectRefs": "canonical intent subject set",
    "deviationMeasurementRef": "optional for count-only budgets; required when magnitude dimension applies",
    "metricContextRef": "copied when measurement is present",
    "normalizationRef": "copied when measurement is present",
    "measurementKind": "copied when measurement is present",
    "axis": "copied when measurement is present",
    "magnitudeMetric": "copied only from valid 12.01 measurement",
    "metricUnit": "copied only from valid 12.01 measurement",
    "normalizedMagnitude": "copied only from valid 12.01 measurement",
    "evidenceRefs": "explicit lineage refs",
    "confidence": "0..1 evidence quality only",
    "status": "OK|INVALID",
    "mutationAllowed": false
  },
  "budget_accounting": {
    "applicability": "usage is applicable when canvas/targetFamily and optional subject scope match the explicit ExceptionBudgetScope",
    "dimension_charge": {
      "EXCEPTION_COUNT": "1",
      "METRIC_MAGNITUDE_SUM": "magnitudeMetric for exact selector match",
      "NORMALIZED_MAGNITUDE_SUM": "normalizedMagnitude for exact selector match"
    },
    "unaccounted_usage": "If an applicable usage matches no budget dimension, evaluation is INVALID; 12.02 never silently grants a free exception.",
    "ledger": "immutable snapshot computed only from unique applicable COMMITTED usages",
    "proposal": "PROPOSED usages are evaluated hypothetically against the immutable ledger; they do not mutate or spend it",
    "decision": {
      "WITHIN_BUDGET": "all resulting dimension usage <= capacity + explicit numerical epsilon",
      "EXCEEDS_BUDGET": "at least one dimension exceeds capacity beyond numerical epsilon",
      "N_A": "no explicit applicable budget or no applicable proposed usage for that evaluation",
      "INVALID": "malformed policy, duplicate/overlapping usage identities, unaccounted applicable usage, incompatible measurement lineage or units"
    }
  },
  "bundle_policy": {
    "multiple_applicable_budgets": "all explicitly applicable budgets constrain the usage; no priority is inferred from order",
    "decision": {
      "PASS": "at least one budget applies and every applicable budget evaluation is WITHIN_BUDGET",
      "REJECT": "at least one applicable budget evaluation EXCEEDS_BUDGET",
      "N_A": "no budget applies",
      "INVALID": "any applicable budget evaluation is invalid or budget identity collision exists"
    },
    "firewall": "budget bundle decision is a hard capacity gate only, not a score"
  },
  "identity_policy": {
    "protectedRelationRef": "hash(relationRef, relationOwnerRef, relationModuleRef, relationSnapshotRef, relationFamily, canonical subjects, canvas/frame/unit, evidence refs)",
    "protectionPolicyRef": "hash(policy source/owner, scope, canvas, canonical subjects, canonical protected relation refs, mode)",
    "impactEvidenceRef": "hash(protectedRelationRef, relationRef, evaluator refs, snapshot, impactState, evidence refs)",
    "budgetScopeRef": "hash(scope source/owner, canvas, canonical target families, canonical subject refs)",
    "dimensionRef": "hash(kind, capacity, numericalEpsilon, canonical selector)",
    "exceptionBudgetRef": "hash(budget source/owner, budgetScopeRef, canonical dimension refs)",
    "usageRef": "hash(accountingState, authorizationRef?, targetEvidenceRef, intentRef, targetFamily, canonical subjects, deviationMeasurementRef?, evidence refs)",
    "ledgerRef": "hash(exceptionBudgetRef, canonical committed usage refs, resulting per-dimension accounting)",
    "budgetEvaluationRef": "hash(exceptionBudgetRef, ledgerRef, canonical proposed usage refs, resulting accounting)",
    "set_semantics": "all set-like ref arrays are lexically canonicalized",
    "excluded_from_identity": [
      "display label",
      "display color",
      "free-form human comment",
      "confidence"
    ]
  },
  "status_policy": {
    "protection_gate": "OK+PASS | OK+REJECT | N_A | INVALID",
    "budget_evaluation": "OK+WITHIN_BUDGET | OK+EXCEEDS_BUDGET | N_A | INVALID",
    "bundle_evaluation": "OK+PASS | OK+REJECT | N_A | INVALID",
    "zero_capacity": "valid explicit capacity, not N_A",
    "zero_usage": "valid numeric usage, not N_A",
    "missing_budget": "N_A, not infinite capacity"
  },
  "critical_firewalls": [
    "protected relation != ordinary break target permission",
    "protected relation break cannot be purchased with exception budget",
    "REQUEST_BREAK does not override hard protection",
    "REQUEST_BREAK does not override exhausted budget",
    "protection confidence != protection strength",
    "budget capacity != score",
    "remaining budget != preference",
    "unused budget != invitation to create exceptions",
    "larger budget != better composition",
    "larger deviation does not receive more budget automatically",
    "budget numerical epsilon != extra design allowance",
    "zero capacity != N_A",
    "zero usage != N_A",
    "missing budget != unlimited budget",
    "proposed usage does not mutate committed ledger",
    "COMMITTED requires external authorizationRef",
    "12.02 does not create authorization",
    "12.02 does not generate candidates",
    "12.02 does not produce justification",
    "12.02 does not score override quality",
    "budget order != priority",
    "module execution order != rule priority",
    "correction request != foreign mutation",
    "N_A != 0",
    "no universal beautyScore",
    "IDEA != CANON",
    "EXPERIMENT != CANON"
  ],
  "deferred_downstream": {
    "12.03": [
      "bounded rule-break candidate generation",
      "candidate-specific protected-relation impact production/collection",
      "candidate-specific proposed exception usage production",
      "explicit justification evidence and verdict"
    ],
    "12.04": [
      "override/local controlled-break evaluation",
      "Topic12 independent vote if canonically introduced",
      "final combination of intent, deviation, protection, budget and justification",
      "consolidated Topic12 tests"
    ]
  },
  "correction_request_schema": {
    "requestRef": "stable request identity",
    "targetOwnerRef": "owner whose protection/budget/impact/source evidence must be reviewed",
    "reasonCode": "explicit",
    "evidenceRefs": "canonicalized refs",
    "suggestedAction": "non-mutating suggestion",
    "status": "OPEN|INVALID",
    "mutationAllowed": false
  },
  "IDEAS_REFS": [
    "IDEA-01 full human test after all 72 topics; collect where protected relations feel essential",
    "IDEA-02 semantics required before placement; semanticIntentRefs remain opaque/deferred",
    "IDEA-03 explicit rule priorities; protected/budget gates must not become 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",
    "IDEA-07 graphics-for-post-text research remains downstream/separate"
  ],
  "DATA_CAPTURE": [
    "sceneRef",
    "protectionPolicyRef",
    "protectedRelationRefs[]",
    "impactEvidenceRefs[]",
    "protectionGateStatus",
    "protectionGateDecision",
    "exceptionBudgetRefs[]",
    "budgetScopeRefs[]",
    "budgetDimensionRefs[]",
    "committedUsageRefs[]",
    "proposedUsageRefs[]",
    "ledgerRefs[]",
    "budgetEvaluationRefs[]",
    "bundleDecision",
    "dimensionUsageBefore",
    "dimensionUsageProposed",
    "dimensionUsageAfter",
    "dimensionRemaining",
    "humanReasonCodes[]",
    "future candidateRef",
    "future justificationEvidenceRef",
    "future overrideEvaluationRef"
  ],
  "DEFERRED_SEMANTIC_INPUTS": [
    "semanticIntentRefs[]",
    "semantic reason a relation must be protected",
    "meaning/hierarchy rationale",
    "brand/editorial tolerance rationale",
    "future conflict-priority policy refs"
  ],
  "HUMAN_FEEDBACK_HOOKS": [
    "RELATION_SHOULD_BE_HARD_PROTECTED",
    "RELATION_SHOULD_NOT_BE_HARD_PROTECTED",
    "PROTECTION_IMPACT_EVALUATED_WRONG",
    "BUDGET_TOO_LARGE",
    "BUDGET_TOO_SMALL",
    "BUDGET_SCOPE_WRONG",
    "BUDGET_DIMENSION_WRONG",
    "EXCEPTION_CHARGED_WRONG",
    "EXCEPTION_NOT_CHARGED",
    "TENSION_READS_AS_ERROR"
  ],
  "CONFLICT_PRIORITY_ASSUMPTIONS": [
    "module execution order is not priority",
    "hard protected relation cannot be overridden by Topic12 budget",
    "budget exhaustion is a capacity gate, not a score penalty",
    "multiple applicable budgets all constrain; list order is non-semantic",
    "REQUEST_BREAK does not gain priority over protection/budget gates",
    "future reviewed global conflict-priority owner remains authoritative"
  ],
  "LAB_HOOKS": [
    "human A/B: same break with/without one hard-protected relation preserved",
    "human A/B: different explicit exception-count budgets",
    "compare count-only vs normalized-magnitude budget policies",
    "measure whether users interpret unused budget as invitation to overuse exceptions",
    "collect disagreement reason codes for protection and budget scope",
    "test budget policy transfer across formats without writing thresholds into canon"
  ],
  "observation_record": {
    "moduleRef": "Compo12.02",
    "metricResults": [],
    "candidateRefs": [],
    "justificationRefs": [],
    "overrideEvaluationRefs": []
  }
}
VISITS / ...