COMPO · 24.04 · SCORING / CANDIDATES / TESTS

Target fit.
Not universal beauty.

24.04 завершает Topic 24: explicit local target profile связывает axis geometry, object orientation, mass distribution, counter-diagonal geometry и tension channels в composite-first scoring. Компоненты не получают независимых голосов, а generator формирует только bounded owner-routed review requests без прямой мутации layout.

ModuleCompo 24.04
Components5
Composite voteexactly 1
Generatorbounded / seeded
Mutationnone
NextSTOP

Explicit target profile is the only preference layer

Все upstream значения остаются descriptors. 24.04 может оценивать их только относительно явно заданного локального target profile.

00 / contract
24.00 axis candidates + 24.01 orientation descriptors + 24.02 mass distribution descriptors + 24.03 main/counter relation + tension vector + explicit local target items + explicit family weights → item target fits → 5 non-independent component MetricResults → 1 composite diagonal.system.localTargetProfileFit → DiagonalCompositionDescriptor → failed-item-only owner-routed review candidates NO universal diagonal angle NO universal 45° preference NO default perpendicular counter-axis NO hidden equal weighting NO beautyScore NO direct layout mutation

One final Topic24 scoring owner

24.04 aggregates only via explicit target declarations and preserves all upstream ownership.

01 / ownership
OWNS

Target evaluation

Target items, family policies, item fits, component MetricResults and one composite metric.

OWNS

Review generator

Explicit repair routes, seeded bounded ordering, candidate identity and immutable review requests.

DOES NOT OWN

Foreign geometry

Axis, object orientation, mass, tension evidence and physical layout edits stay with their owners.

Five channels, one declared composite

Пояснительная карта показывает, что “диагональная композиция” не сводится к одному углу.

02 / visual map

1. Axis geometry

Main axis может быть крутой или пологой. 45° не является встроенным идеалом.

observed angletarget exists only if profile declares it

2. Object orientation

Object alignment contributes only when an explicit item points at a 24.01 descriptor.

deviation / 90° → [0,1]

3. Mass distribution

Imbalance, centroid or spread can be targeted, but none is automatically good or bad.

weighted centroid

4. Counter geometry + tension

Crossing angle and owner-qualified tension channels stay separate until target profile combines them.

angle descriptor≠ tension score
UPSTREAM
DESCRIPTORS
→
EXPLICIT
TARGET ITEMS
→
5 COMPONENT
FITS
→
1 COMPOSITE
VOTE

Target items are explicit and owner-qualified

Каждый target item указывает конкретный sourceRef, семейство, target band и itemWeight.

03 / targets
DiagonalTargetItem {
  targetItemRef,
  family: AXIS_GEOMETRY | OBJECT_ORIENTATION | MASS_DISTRIBUTION |
          COUNTER_GEOMETRY | TENSION_PROFILE,
  sourceKind,
  sourceRef,
  channelRef: null | exact ref,
  targetBand: {min,max},       // normalized observed value in [0,1]
  itemWeight: positive finite,
  targetOwnerRef,
  sourceRefForPolicy,
  provenance,
  status,
  mutationAllowed: false
}

DiagonalLocalTargetProfile {
  items[],
  familyPolicies: {
    FAMILY: {mode: APPLY | IGNORE, familyWeight}
  },
  profileSourceRef, profileSourceOwnerRef,
  status, mutationAllowed: false
}
FamilyExample sourceNormalizationNot implied
AXIS_GEOMETRYmain axis acute angle to frame horizontalangle / 90°45° preferred
OBJECT_ORIENTATION24.01 undirected deviationdeviation / 90°aligned better
MASS_DISTRIBUTION|signedSideImbalance|already [0,1]balanced better
COUNTER_GEOMETRY24.03 normalizedAngularSeparationalready [0,1]90° preferred
TENSION_PROFILEexact 24.03 tension channelowner supplies [0,1]high tension better

Composite-first scoring with no double vote

Все family weights и item weights обязаны быть explicit. Компоненты существуют для provenance и диагностики, но голосует только composite.

04 / MetricResult
Metric keyCompositeIndependent vote
diagonal.target.componentFit.axisGeometryfalsefalse
diagonal.target.componentFit.objectOrientationfalsefalse
diagonal.target.componentFit.massDistributionfalsefalse
diagonal.target.componentFit.counterGeometryfalsefalse
diagonal.target.componentFit.tensionProfilefalsefalse
diagonal.system.localTargetProfileFittruetrue
itemFit = 1 if observedValue ∈ [targetMin,targetMax], else 0 componentFit = Σ(itemFit × explicit itemWeight) / Σ(explicit itemWeight) compositeFit = Σ(componentFit × explicit familyWeight) / Σ(explicit familyWeight) scoringGroup = diagonal-composition-local Exactly one independent numeric vote. No hidden equal weighting.

Component diagnostics

Пример: четыре families совпали, tension target промахнулся. Компоненты показывают причину, но не голосуют отдельно.

AXIS
ORIENTATION
MASS
COUNTER
TENSION

One composite vote

При weights 1,1,1,1,2 результат будет 4/6 = 0.666…, а не “среднее пяти по умолчанию”.

explicit weighted composite ≈ 0.667component metrics → componentOf composite

Topic24 final descriptor keeps lineage intact

DiagonalCompositionDescriptor aggregates references, not foreign state.

05 / final output
DiagonalCompositionDescriptor {
  diagonalCompositionDescriptorRef,
  diagonalCompositionSeedRef,
  axisCandidateSetRef,
  orientationSetRef,
  massDistributionSetRef,
  tensionProfileSetRef,
  targetProfileRef,
  evaluationSetRef,
  componentMetricRefs[],
  compositeMetricRef: "diagonal.system.localTargetProfileFit",
  candidateSetRef: null | exact ref,
  status,
  mutationAllowed: false
}

Descriptor != final-layout rank
Descriptor != universal diagonal quality
Descriptor != beautyScore

Generator produces review requests, not layouts

Только failed applicable target items могут войти в generation. Для каждого нужен ровно один explicit repair route.

06 / bounded generator
BOUNDED

1..128 candidates

Overflow → N_A. Никакой silent truncation.

SEEDED

Deterministic ordering

Seed влияет на reproducible order, но не превращается в score.

NO CARTESIAN

One failed item → one route

No axis × object × mass × tension combinatorial expansion.

DiagonalRepairRoute {
  targetItemRef,
  actionKind,
  targetOwnerRef,
  editableRef,
  routeContextRef,
  status,
  mutationAllowed: false
}

Allowed review actions:
REVIEW_AXIS_DECLARATION
REVIEW_OBJECT_ORIENTATION
REVIEW_MASS_DISTRIBUTION
REVIEW_COUNTER_AXIS_ROLE
REVIEW_TENSION_CHANNEL
REVIEW_TARGET_PROFILE

candidate.score = null
candidate.newX/newY/newAngle = absent
candidate.mutationAllowed = false

What a candidate means visually

Пояснительная графика отделяет “request to review” от автоматического перемещения объектов.

07 / candidate viz

Failed counter-angle item

Observed crossing angle outside explicit target band generates a route to the counter-axis owner.

OUTSIDE TARGET → REVIEW_COUNTER_AXIS_ROLE

Review request is not mutation

Candidate references the owner and editableRef. It does not contain “rotate by 17°” unless that owner later creates a separate, valid proposal.

FAILED ITEMcounter angleOWNER ROUTEreview onlyNO direct geometry mutation

N_A and INVALID never collapse to zero

Scoring only happens on fully valid applicable target items and valid upstream lineage.

08 / status
OK

Exact upstream lineage, valid target profile, resolved source value, valid explicit weights.

N_A

Missing source, unresolved evidence, missing repair route, overflow or upstream N_A. Value remains null.

INVALID

Malformed target, impossible bounds, invalid ownership/ref lineage or upstream INVALID. Value remains null.

Critical firewalls

Topic24 closes without leaking into Topic25 flow-template semantics.

09 / guardrails
Local ≠ global

A high local target fit says only that explicit profile was matched.

Descriptor ≠ score

Angles, mass imbalance and tension channels remain descriptors upstream.

No beautyScore

Only diagonal.system.localTargetProfileFit may cast an independent numeric vote.

No Topic25

Diagonal axis composition is not a diagonal reading/flow template.

45° != universal ideal perpendicular counter != universal ideal aligned objects != universal ideal mass symmetry != universal ideal high tension != universal ideal candidate ordinal != rank repair request != mutation N_A != 0 INVALID != 0

CANON → LAB → DATA → IDEAS

Target calibration remains empirically testable rather than promoted to universal law.

10 / hooks
IDEAS_REFS[]Style-specific preferred crossing-angle bands.
DATA_CAPTURE[]Target items, fits, weights, failed routes, composite lineage.
DEFERRED_SEMANTIC_INPUTS[]Genre/style intent and task-specific dynamism profile.
HUMAN_FEEDBACK_HOOKS[]Target-band corrections and repair-route approval.
CONFLICT_PRIORITY_ASSUMPTIONS[]Confidence never overrides ownership or explicit weights.
LAB_HOOKS[]Diagonal tension perception and target-profile calibration.

24.04 regression suite

Tests cover exact five-family source lookup, explicit weights, component/composite vote discipline, N_A/INVALID propagation, immutable final descriptor, bounded seeded candidates, owner routing, no mutation and Topic25 firewall.

11 / deterministic tests
Tests not run yet.

DATA FOR LAYOUT ENGINE

Machine-readable contract for Topic24 final scoring/generation layer.

12 / machine contract
{
  "module": "Compo 24.04",
  "name": "scoring_candidates_and_tests",
  "version": "1.0-canonical",
  "canonical_main_title": "Scoring, candidates and tests",
  "topic": "24_ДИАГОНАЛЬНАЯ_КОМПОЗИЦИЯ",
  "scope": "EXPLICIT_LOCAL_TARGET_PROFILE_FIT_OVER_TOPIC24_AXIS_ORIENTATION_MASS_COUNTER_GEOMETRY_AND_TENSION_DESCRIPTORS_WITH_COMPOSITE_FIRST_SCORING_ONE_INDEPENDENT_VOTE_FINAL_DIAGONAL_COMPOSITION_DESCRIPTOR_AND_BOUNDED_OWNER_ROUTED_REVIEW_CANDIDATES_ONLY",
  "main_topic_contract": {
    "topic_title": "Диагональная композиция",
    "topic_goal": "Описывает диагональную структуру всей сцены: main diagonal, counter-diagonal, проекции масс на ось и controlled diagonal tension.",
    "expected_output": "DiagonalCompositionDescriptor, main/counter axes, projection distribution",
    "planned_files": ["24.00 Diagonal axis candidates","24.01 Object orientation vs diagonal","24.02 Mass distribution along diagonal","24.03 Counter-diagonal and tension profiles","24.04 Scoring, candidates and tests"]
  },
  "ownership": {
    "owner": "Compo24.04",
    "owns": ["DiagonalTargetFamily taxonomy","DiagonalTargetSourceKind taxonomy","DiagonalTargetItem","DiagonalLocalTargetProfile","DiagonalTargetItemEvaluation","DiagonalLocalEvaluationSet","five Topic24 component MetricResults","one composite MetricResult diagonal.system.localTargetProfileFit","DiagonalCompositionDescriptor","DiagonalRepairRoute","DiagonalGeneratorPolicy","DiagonalLayoutReviewCandidate","DiagonalLayoutReviewCandidateSet","DiagonalScoringAttachment","explicit local target fit with explicit item and family weights","bounded seeded deterministic owner-routed review generation","identity/status/provenance rules for Topic24 final layer"],
    "does_not_own": ["24.00 axis candidate identity","24.01 object orientation evidence or relation identity","24.02 mass evidence/projection/distribution identity","24.03 main/counter role assignment or tension-channel evidence identity","universal diagonal-angle preference","universal counter-axis preference","beautyScore or final-layout rank","Topic25 flow-template selection/scoring","foreign geometry/style/semantic mutation"]
  },
  "target_families": ["AXIS_GEOMETRY","OBJECT_ORIENTATION","MASS_DISTRIBUTION","COUNTER_GEOMETRY","TENSION_PROFILE"],
  "source_kinds": ["MAIN_AXIS_ANGLE_NORMALIZED","OBJECT_AXIS_DEVIATION_NORMALIZED","MASS_ABS_SIDE_IMBALANCE","COUNTER_ANGLE_NORMALIZED","TENSION_CHANNEL_VALUE"],
  "scoring": {
    "component_keys": ["diagonal.target.componentFit.axisGeometry","diagonal.target.componentFit.objectOrientation","diagonal.target.componentFit.massDistribution","diagonal.target.componentFit.counterGeometry","diagonal.target.componentFit.tensionProfile"],
    "composite_key": "diagonal.system.localTargetProfileFit",
    "owner": "Compo24.04",
    "scoringGroup": "diagonal-composition-local",
    "component": {"composite": false,"independentVoteAllowed": false,"componentOf": "diagonal.system.localTargetProfileFit"},
    "composite": {"composite": true,"independentVoteAllowed": true,"componentOf": null},
    "component_value": "explicit item-weighted mean of binary in-band item fits",
    "composite_value": "explicit APPLY-family-weighted mean of applicable component MetricResults",
    "implicit_equal_weighting": false,
    "universal_target": false
  },
  "owns_metrics": ["diagonal.target.componentFit.axisGeometry","diagonal.target.componentFit.objectOrientation","diagonal.target.componentFit.massDistribution","diagonal.target.componentFit.counterGeometry","diagonal.target.componentFit.tensionProfile","diagonal.system.localTargetProfileFit"],
  "independent_numeric_votes": 1,
  "independent_vote": {"key":"diagonal.system.localTargetProfileFit","owner":"Compo24.04","scoringGroup":"diagonal-composition-local","component_metrics_independentVoteAllowed":false,"composite_independentVoteAllowed":true},
  "generator": {"selectionMode":"FAILED_APPLICABLE_TARGET_ITEMS_ONLY","routeMode":"EXPLICIT_ROUTE_RECORDS_ONLY","seed":"EXPLICIT_REQUIRED","maxRoutes":"1..512","maxCandidates":"1..128","overflowMode":"N_A_NO_TRUNCATION","fullCartesian":false,"autoRouteInference":false,"autoGeometryMutation":false,"candidateScore":null},
  "status_semantics": {"OK":"valid exact lineage and explicit target policy","N_A":"missing/unresolved source, overflow, missing/ambiguous route or upstream N_A; never numeric zero","INVALID":"malformed target/weights/lineage or upstream INVALID; never numeric zero"},
  "firewalls": ["45 degrees != universal ideal","perpendicular counter axis != universal ideal","aligned object orientation != universal ideal","mass balance != universal ideal","high tension != universal ideal","component MetricResults are not independent votes","composite local target fit != beautyScore","candidate ordinal != score or rank","repair request != mutation","Topic24 diagonal composition != Topic25 diagonal flow template","N_A != 0","INVALID != 0","local != global"],
  "visual_explanation": {"diagrams":["axis-angle target without 45-degree default","object orientation deviation","mass distribution and centroid","main/counter crossing geometry","component-to-composite scoring flow","failed-item owner-routed candidate flow"]},
  "api": "COMPO_24_04",
  "topic24ProgressAfterThisModule": "5/5 local",
  "next_step": "CLOSING_AUDIT_TOPIC24",
  "topic25_started": false
}
VISITS / ...