Explicit target profile is the only preference layer
Все upstream значения остаются descriptors. 24.04 может оценивать их только относительно явно заданного локального target profile.
One final Topic24 scoring owner
24.04 aggregates only via explicit target declarations and preserves all upstream ownership.
Target evaluation
Target items, family policies, item fits, component MetricResults and one composite metric.
Review generator
Explicit repair routes, seeded bounded ordering, candidate identity and immutable review requests.
Foreign geometry
Axis, object orientation, mass, tension evidence and physical layout edits stay with their owners.
Five channels, one declared composite
Пояснительная карта показывает, что “диагональная композиция” не сводится к одному углу.
1. Axis geometry
Main axis может быть крутой или пологой. 45° не является встроенным идеалом.
2. Object orientation
Object alignment contributes only when an explicit item points at a 24.01 descriptor.
3. Mass distribution
Imbalance, centroid or spread can be targeted, but none is automatically good or bad.
4. Counter geometry + tension
Crossing angle and owner-qualified tension channels stay separate until target profile combines them.
DESCRIPTORS
TARGET ITEMS
FITS
VOTE
Target items are explicit and owner-qualified
Каждый target item указывает конкретный sourceRef, семейство, target band и itemWeight.
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
}| Family | Example source | Normalization | Not implied |
|---|---|---|---|
| AXIS_GEOMETRY | main axis acute angle to frame horizontal | angle / 90° | 45° preferred |
| OBJECT_ORIENTATION | 24.01 undirected deviation | deviation / 90° | aligned better |
| MASS_DISTRIBUTION | |signedSideImbalance| | already [0,1] | balanced better |
| COUNTER_GEOMETRY | 24.03 normalizedAngularSeparation | already [0,1] | 90° preferred |
| TENSION_PROFILE | exact 24.03 tension channel | owner supplies [0,1] | high tension better |
Composite-first scoring with no double vote
Все family weights и item weights обязаны быть explicit. Компоненты существуют для provenance и диагностики, но голосует только composite.
| Metric key | Composite | Independent vote |
|---|---|---|
| diagonal.target.componentFit.axisGeometry | false | false |
| diagonal.target.componentFit.objectOrientation | false | false |
| diagonal.target.componentFit.massDistribution | false | false |
| diagonal.target.componentFit.counterGeometry | false | false |
| diagonal.target.componentFit.tensionProfile | false | false |
| diagonal.system.localTargetProfileFit | true | true |
Component diagnostics
Пример: четыре families совпали, tension target промахнулся. Компоненты показывают причину, но не голосуют отдельно.
One composite vote
При weights 1,1,1,1,2 результат будет 4/6 = 0.666…, а не “среднее пяти по умолчанию”.
Topic24 final descriptor keeps lineage intact
DiagonalCompositionDescriptor aggregates references, not foreign state.
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 != beautyScoreGenerator produces review requests, not layouts
Только failed applicable target items могут войти в generation. Для каждого нужен ровно один explicit repair route.
1..128 candidates
Overflow → N_A. Никакой silent truncation.
Deterministic ordering
Seed влияет на reproducible order, но не превращается в score.
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 = falseWhat a candidate means visually
Пояснительная графика отделяет “request to review” от автоматического перемещения объектов.
Failed counter-angle item
Observed crossing angle outside explicit target band generates a route to the counter-axis owner.
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.
N_A and INVALID never collapse to zero
Scoring only happens on fully valid applicable target items and valid upstream lineage.
Exact upstream lineage, valid target profile, resolved source value, valid explicit weights.
Missing source, unresolved evidence, missing repair route, overflow or upstream N_A. Value remains null.
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.
A high local target fit says only that explicit profile was matched.
Angles, mass imbalance and tension channels remain descriptors upstream.
Only diagonal.system.localTargetProfileFit may cast an independent numeric vote.
Diagonal axis composition is not a diagonal reading/flow template.
CANON → LAB → DATA → IDEAS
Target calibration remains empirically testable rather than promoted to universal law.
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.
DATA FOR LAYOUT ENGINE
Machine-readable contract for Topic24 final scoring/generation layer.
{
"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
}