COMPO · 22.04 · SCORING / CANDIDATES / TESTS

Asymmetry can be balanced.
The target must be explicit.

22.04 завершает Topic 22: оценивает только явно заданный local asymmetric-balance target по centroid, moment, regional-mass и counterweight families, выдаёт ровно один независимый composite vote и формирует bounded owner-routed review candidates только для failed applicable target items.

ModuleCompo 22.04
Scoringexplicit local target
Independent votesexactly 1
Candidatesfailed-item only
Mutationforbidden
Nextclosing audit

Descriptor lineage first, preference only by declaration

00 / contract
22.01 VisualCentroid
+ 22.02 torque-like axis descriptors
+ 22.03 regional mass + counterweight descriptors
+ explicit local target profile

→ item observations / target-band fits
→ four non-independent component MetricResults
→ one composite asymmetricBalance.system.localTargetProfileFit
→ failed-item-only owner-routed review candidates

NO default center
NO default equal-mass target
NO mirror requirement
NO beautyScore
NO direct layout mutation

One final Topic22 scoring owner

01 / ownership
OWNS

Compo22.04

Explicit target profiles, item evaluation, four component MetricResults, one composite vote, repair routes, bounded review candidates and final Topic22 tests.

DOES NOT OWN

22.00–22.03 identities

Subject/frame/mass bindings, centroid math, moment math, region membership and counterweight descriptors remain immutable foreign inputs.

Four source families, no universal ideal

02 / source adapters
SourceObserved valueHidden preference?
CENTROID_NORMALIZED_DISTANCEdistance to explicitly declared target point / explicit normalizationDistanceNo
AXIS_NET_MOMENT_RATIO|signedNetMoment| / absoluteMomentSumNo
REGION_MASS_SHAREexact regionalMassShareNo
COUNTERWEIGHT_COMPENSATIONexact compensationFractionNo

Off-center, unequal mass shares and non-zero moments remain valid descriptors. Whether they fit a composition is decided only by the explicit profile.

Local target profile

03 / target semantics
itemFit = 1 if observedValue ∈ [targetBand.min, targetBand.max], else 0

Bands are inclusive.
Weights are explicit.
APPLY family requires at least one explicit item.
IGNORE family weight = 0.

No hidden epsilon. No implicit “center is best”.

Composite-first scoring

04 / MetricResult
Metric keyCompositeIndependent vote
asymmetricBalance.target.componentFit.centroidfalsefalse
asymmetricBalance.target.componentFit.momentfalsefalse
asymmetricBalance.target.componentFit.regionalMassfalsefalse
asymmetricBalance.target.componentFit.counterweightfalsefalse
asymmetricBalance.system.localTargetProfileFittruetrue
component fit = explicit item-weighted mean
composite = explicit APPLY-family-weighted mean

Exactly one independent numeric vote.
scoringGroup = asymmetric-balance-local

Candidate means request, not mutation

05 / bounded generation
INPUT

Failed applicable items only

Every failed item must have an explicit owner-qualified repair route. No subject × action Cartesian product and no inferred owner.

OUTPUT

Owner-routed review request

Candidate contains owner, action and editableRef, but requestedMutation, predictedMetricValue and score remain null.

1 ≤ maxRoutes ≤ 512
1 ≤ maxCandidates ≤ 128
explicit seed required
overflow → N_A, zero candidates, no truncation
duplicate exact routes → deduplicate
ordering → seeded hash + canonical tie break

N_A remains different from zero

06 / status
OK

Explicit + compatible

Exact Topic22 lineage and target declarations are complete.

N_A

Evidence unavailable

Missing source, undefined compensation, missing route or bounded overflow. No guess.

INVALID

Broken contract

Malformed records, source lineage mismatch, unit mismatch or impossible numeric invariant.

Topic 22 closes here

07 / module map
22.00Asymmetric-balance root subject/frame/mass model.
22.01Visual center of mass.
22.02Torque-like signed moment descriptors.
22.03Counterweight and regional mass distribution.
22.04Explicit local scoring, bounded review candidates and final tests.
Topic23Radial balance / hub / rings / sectors. Separate owner and not started here.

Asymmetric balance is not “almost symmetry”

08 / firewalls
off-center centroid != defect
centered centroid != automatic success
unequal regional mass != defect
equal regional mass != required
nonzero moment != defect
compensationFraction < 1 != defect

target profile = local declaration, not law
component metric != independent vote
candidate ordinal != score
candidate != mutation
candidate != guaranteed improvement
Topic21 mirror semantics != Topic22
Topic23 radial semantics != Topic22

CANON → LAB → DATA → IDEAS

09 / mandatory hooks
IDEAS_REFS[]Asymmetric target presets and explainable route libraries.
DATA_CAPTURE[]Observed values, family fits, failures and candidate outcomes.
DEFERRED_SEMANTIC_INPUTS[]Desirability and final layout choice stay downstream.
HUMAN_FEEDBACK_HOOKS[]Target-band, weight and route corrections.
CONFLICT_PRIORITY_ASSUMPTIONS[]Explicit profile declarations; conflict yields N_A.
LAB_HOOKS[]Perceived balance versus centroid/moment/mass/counterweight descriptors.

22.04 final regression suite

10 / deterministic tests

Tests cover exact source adapters, explicit off-center/unequal-mass targets, MetricResult constitution, one-vote budget, N_A/zero semantics, owner-routed bounded candidate generation, no truncation, deterministic ordering, no mutation, Topic21/Topic23 firewalls and numeric sweeps over all four source families.

Tests not run yet.

DATA FOR LAYOUT ENGINE

11 / machine contract
{
  "module": "Compo 22.04",
  "name": "scoring_candidates_and_tests",
  "version": "1.0-canonical",
  "canonical_main_title": "Scoring, candidates and tests",
  "topic": "22_АСИММЕТРИЧНЫЙ_БАЛАНС",
  "scope": "EXPLICIT_LOCAL_ASYMMETRIC_BALANCE_TARGET_PROFILE_SCORING_ONE_COMPOSITE_METRICRESULT_AND_BOUNDED_OWNER_ROUTED_NONMUTATING_CANDIDATES_OVER_VALID_22_00_TO_22_03_LINEAGE_ONLY",
  "main_topic_contract": {
    "topic_title": "Асимметричный баланс",
    "topic_goal": "Описывает асимметричный баланс через visual center of mass, moments/плечи, regional distribution и counterweights, не требуя зеркального соответствия.",
    "expected_output": "VisualCentroid, mass moments, balance descriptors",
    "planned_files": [
      "22.00 Asymmetric balance model",
      "22.01 Visual center of mass",
      "22.02 Torque-like moment descriptors",
      "22.03 Counterweight and regional mass distribution",
      "22.04 Scoring, candidates and tests"
    ]
  },
  "ownership": {
    "owner": "Compo22.04",
    "owns": [
      "AsymmetricBalanceTargetSourceKind taxonomy",
      "AsymmetricBalanceTargetFamily taxonomy",
      "AsymmetricBalanceLocalTargetItem",
      "AsymmetricBalanceLocalTargetProfile",
      "AsymmetricBalanceTargetItemEvaluation",
      "four Topic22 component MetricResults",
      "one composite MetricResult asymmetricBalance.system.localTargetProfileFit",
      "AsymmetricBalanceLocalEvaluationSet",
      "AsymmetricBalanceScoringAttachment",
      "AsymmetricBalanceRepairActionKind taxonomy",
      "AsymmetricBalanceRepairRoute",
      "AsymmetricBalanceRepairCandidatePolicy",
      "AsymmetricBalanceRepairCandidate",
      "AsymmetricBalanceRepairCandidateSet",
      "explicit local target evaluation over 22.01/22.02/22.03 descriptors",
      "Topic22 independent numeric vote budget",
      "bounded deterministic failed-item-only owner-routed candidate generation",
      "final Topic22 regression tests"
    ],
    "does_not_own": [
      "AsymmetricBalanceModel / subject / frame / position / mass binding identities — Compo22.00",
      "VisualCentroid or contribution evidence resolution — Compo22.01",
      "reference axes / signed arms / torque-like moment descriptors — Compo22.02",
      "region identity / membership / counterweight pair descriptors — Compo22.03",
      "visual-mass extraction or semantics — Compo4 / foreign owner",
      "mirror symmetry — Topic21",
      "radial balance — Topic23",
      "dominance / hierarchy / focal ranking",
      "global beautyScore",
      "final-layout ranking",
      "automatic physical layout mutation",
      "foreign geometry/mass/style/semantic mutation"
    ]
  },
  "source_kinds": [
    "CENTROID_NORMALIZED_DISTANCE",
    "AXIS_NET_MOMENT_RATIO",
    "REGION_MASS_SHARE",
    "COUNTERWEIGHT_COMPENSATION"
  ],
  "families": [
    "CENTROID",
    "MOMENT",
    "REGIONAL_MASS",
    "COUNTERWEIGHT"
  ],
  "source_to_family": {
    "CENTROID_NORMALIZED_DISTANCE": "CENTROID",
    "AXIS_NET_MOMENT_RATIO": "MOMENT",
    "REGION_MASS_SHARE": "REGIONAL_MASS",
    "COUNTERWEIGHT_COMPENSATION": "COUNTERWEIGHT"
  },
  "target_semantics": {
    "CENTROID_NORMALIZED_DISTANCE": "distance from explicitly declared target point divided by explicitly declared positive normalizationDistance; no default center",
    "AXIS_NET_MOMENT_RATIO": "abs(signedNetMoment)/absoluteMomentSum; exact zero denominator with zero net resolves to 0",
    "REGION_MASS_SHARE": "uses exact Compo22.03 regionalMassShare",
    "COUNTERWEIGHT_COMPENSATION": "uses exact Compo22.03 compensationFraction; null stays N_A and is never coerced to 0",
    "fit": "inclusive membership in an explicit targetBand; no hidden ideal or tolerance"
  },
  "metric_contract": {
    "component_keys": [
      "asymmetricBalance.target.componentFit.centroid",
      "asymmetricBalance.target.componentFit.moment",
      "asymmetricBalance.target.componentFit.regionalMass",
      "asymmetricBalance.target.componentFit.counterweight"
    ],
    "composite_key": "asymmetricBalance.system.localTargetProfileFit",
    "owner": "Compo22.04",
    "scoringGroup": "asymmetric-balance-local",
    "component_metrics": {
      "composite": false,
      "independentVoteAllowed": false,
      "componentOf": "asymmetricBalance.system.localTargetProfileFit"
    },
    "composite_metric": {
      "composite": true,
      "independentVoteAllowed": true,
      "componentOf": null
    },
    "component_value": "explicit item-weighted mean of binary inclusive target-band fits for one APPLY family",
    "composite_value": "explicit family-weighted mean of applicable component MetricResults",
    "cross_profile_comparison": "forbidden unless a foreign comparison owner explicitly defines it"
  },
  "owns_metrics": [
    "asymmetricBalance.target.componentFit.centroid",
    "asymmetricBalance.target.componentFit.moment",
    "asymmetricBalance.target.componentFit.regionalMass",
    "asymmetricBalance.target.componentFit.counterweight",
    "asymmetricBalance.system.localTargetProfileFit"
  ],
  "independent_numeric_votes": {
    "count": 1,
    "key": "asymmetricBalance.system.localTargetProfileFit",
    "owner": "Compo22.04",
    "scoringGroup": "asymmetric-balance-local",
    "component_metrics_independentVoteAllowed": false,
    "composite_independentVoteAllowed": true
  },
  "candidate_generation": {
    "selection": "FAILED_APPLICABLE_TARGET_ITEMS_ONLY",
    "routes": "EXPLICIT_ROUTE_RECORDS_ONLY",
    "seed": "required explicit deterministic seed",
    "bounds": {
      "maxRoutes": "1..512",
      "maxCandidates": "1..128"
    },
    "overflow": "N_A_NO_TRUNCATION",
    "dedupe": "exact canonical route identity",
    "ordering": "stable seed hash + canonical tie break",
    "fullCartesian": false,
    "autoRouteInference": false,
    "autoGeometryMutation": false,
    "candidateScore": null,
    "candidateMutationAllowed": false,
    "candidateMeaning": "owner-routed review request, not a physical edit and not a promise of improvement"
  },
  "repair_action_kinds": [
    "REVIEW_POSITION",
    "REVIEW_VISUAL_MASS",
    "REVIEW_REFERENCE_AXIS",
    "REVIEW_REGION_ASSIGNMENT",
    "REVIEW_COUNTERWEIGHT_CONFIGURATION",
    "REVIEW_TARGET_PROFILE"
  ],
  "status_semantics": {
    "OK": "valid exact Topic22 lineage + explicit compatible target profile; candidate set OK when every failed applicable item has an explicit valid route and bounds hold",
    "N_A": "missing source, upstream N_A, target family IGNORE, counterweight compensation null, missing repair route, or bounded overflow; no guessing/truncation/coercion",
    "INVALID": "malformed profile/route/policy, source lineage mismatch, invalid upstream descriptor, unit mismatch, or impossible numeric invariant",
    "zero_note": "centroid distance 0, net-moment ratio 0, mass share 0, compensation 0 and metric fit 0 are valid numbers; N_A != 0"
  },
  "firewalls": [
    "off-center centroid is not automatically bad",
    "centered centroid is not automatically good",
    "unequal regional mass shares are not automatically bad",
    "equal regional mass shares are not automatically required",
    "nonzero net moment is not automatically bad",
    "counterweight compensation below 1 is not automatically bad",
    "target profile is local and explicit, not a universal asymmetry law",
    "component MetricResults are not independent votes",
    "exactly one Topic22 independent numeric vote",
    "candidate ordinal is not score",
    "candidate != mutation",
    "candidate != guaranteed improvement",
    "no mirror-pair requirement from Topic21",
    "no radial semantics from Topic23",
    "no global beautyScore",
    "no final-layout rank"
  ],
  "metric_result_fields": [
    "key",
    "owner",
    "value",
    "applicability",
    "confidence",
    "status",
    "provenance",
    "composite",
    "componentOf",
    "dependsOn[]",
    "derivedFrom[]",
    "scoringGroup",
    "independentVoteAllowed",
    "evidence",
    "repairHints[]"
  ],
  "hooks": {
    "IDEAS_REFS[]": [
      "asymmetric target presets by layout class",
      "learned explicit target profiles after LAB validation",
      "counterweight route libraries",
      "human-reviewed off-center balance corpora",
      "local balance explainability"
    ],
    "DATA_CAPTURE[]": [
      "target item observations",
      "family fits",
      "composite local target fit",
      "failed item lineage",
      "repair route selections",
      "candidate outcomes after external application"
    ],
    "DEFERRED_SEMANTIC_INPUTS[]": [
      "whether a specific asymmetric target is desirable",
      "whether candidate application improves task outcome",
      "cross-profile preference",
      "final layout selection"
    ],
    "HUMAN_FEEDBACK_HOOKS[]": [
      "target band correction",
      "family weight correction",
      "repair route approval",
      "candidate rejection reason"
    ],
    "CONFLICT_PRIORITY_ASSUMPTIONS[]": [
      "explicit profile declarations outrank implementation heuristics; conflicting exact declarations yield N_A rather than averaging"
    ],
    "LAB_HOOKS[]": [
      "perceived asymmetric balance versus centroid displacement",
      "moment-ratio perception",
      "regional mass asymmetry tolerance",
      "counterweight compensation perception"
    ]
  },
  "topic22ProgressAfterThisModule": "5/5 local",
  "next_step": "TOPIC22_CLOSING_AUDIT_SEPARATE_STEP",
  "topic23_started": false,
  "publication": "NOT_VERIFIED"
}
VISITS / ...