Один финальный модуль — три обязанности
MAIN объединяет generator, scoring и tests в 3.06. Поэтому здесь они живут рядом, но с разными ownership-границами: search orchestration, aggregate local score и regression oracle.
Bounded orchestration owner-provided proposals; immutable lineage, dedupe, diversity pruning.
Aggregate only canonical primary votes 3.03/3.04 under explicit ShapeSystemTarget.
Consolidated Topic 3 regression 3.00–3.06; suite itself owns no design metric.
Generation intent и scoring target — разные вещи
Intent определяет search space. Target определяет, как интерпретировать уже измеренные owner metrics. Их нельзя смешивать.
ShapeGenerationIntent
{
intentId,
shapeRole,
allowedGeometryKinds[],
allowedPrimitiveFamilies?,
sourceShapeRefs?,
proposalProviderRefs[],
silhouetteTarget?,
regionTarget?,
transformVariantPolicy?,
hardConstraints[],
stylePresetRef?,
seed
}ShapeSystemTarget
{
targetId,
requiredGroups[],
optionalGroups[],
disabledGroups[],
silhouetteTarget?,
regionTarget?,
semanticMultipliers{},
styleMultipliers{},
groupVoteCaps{},
requiredEvidencePolicy,
hardConstraints[]
}localScore=null и rankEligible=false.ShapeCandidate
Каждый repair/edit создаёт новый candidate branch. Parent остаётся неизменным для audit и воспроизводимости.
Candidate
ShapeCandidate {
candidateId,
parentCandidateId?,
lineageRootId,
shapeRef,
proposalRefs[],
metrics[],
hardViolations[],
generationDepth,
repairDepth,
generationCost,
correctionCost,
diversityKey?,
canonicalSignature,
stableTieBreak,
provenance
}Lineage rule
root A
├─ A:primitive
│ ├─ A:r1 contour repair
│ └─ A:r2 region repair
└─ A:organic
└─ A:r1 feature repair
parent immutable
child gets deterministic fork
no in-place geometry mutationProposal providers
3.06 расширяет search space только через typed proposals владельцев. Именно это не даёт generator превратиться во второй geometry engine.
| Proposal kind | Owner | 3.06 action |
|---|---|---|
| primitive family / params | 3.01 | accept proposalRef → validate → new candidate |
| organic contour edit | 3.02 | accept path proposal / correction result |
| hole/fill/outline/compound change | 3.04 | accept region proposal |
| position/rotation/scale/reflection/skew | Core / 3.05 adapter | only when explicit transformVariantPolicy/provider exists |
| silhouette correction request | 3.03 → geometry owner | route desired effect, never move points itself |
GenerationBudget
Search должен заканчиваться по структуре, а не по удаче. Budget — implementation contract, не quality preference.
16
maxBaseCandidates — initial roots.
64
maxTotalCandidates after bounded expansion.
2
maxRepairDepth.
Bounded candidate orchestration
Полного Cartesian product нет. Каждый pass расширяет только уже существующие candidates конкретными provider proposals.
Hard filter до aesthetic score
Некорректная geometry не должна компенсироваться хорошим readability score.
| Violation source | Example | 3.06 |
|---|---|---|
| 3.01 | invalid primitive params | hard reject |
| 3.02 | broken required closed contour | hard reject / correction branch |
| 3.04 | ambiguous required compound fill semantics | hard reject if target requires resolved region |
| 3.05 | singular transform when invertibility required | hard reject |
| semantic constraint | candidate ShapeRole outside allowed role | hard reject |
Кто имеет право голосовать
Тема 3 уже подготовлена composite-first: только primary composites 3.03 и 3.04 являются canonical scoring inputs.
SILHOUETTE_READABILITY
shape.silhouette.localReadabilityScore owner: Compo3.03 composite: true componentOf: null
SHAPE_REGION_TOPOLOGY
shape.region.localTopologyFit owner: Compo3.04 composite: true componentOf: null
Suppression contract
Scorer не должен случайно дать отдельный голос компонентам composite или raw descriptors.
derivedFrom evidence lineage, а не по общему dependsOn.Score, confidence, coverage
Local score — агрегат owner interpretations для одного ShapeSystemTarget. Он ничего не говорит о global balance или visual mass.
requiredEvidencePolicy; scorer не подставляет ноль.Missing-evidence policy
Explicit policy не даёт implementation самостоятельно решать, можно ли ранжировать candidate с неполными owner metrics.
| Policy | Missing required group |
|---|---|
REQUIRE_ALL | status=insufficient_evidence, rankEligible=false |
DIAGNOSTIC_IF_MISSING | descriptors/breakdown available, localScore=null |
RANK_WITH_LOW_COVERAGE | score available owner evidence; coverage/confidence explicitly fall |
Local rank
Ranking — локальный факт Topic 3. Будущие mass/space/global owners могут предпочесть другого candidate и не имеют права переписывать этот local score.
Correction creates a child
3.03/3.04/3.05 могут запросить изменение. 3.06 маршрутизирует запрос и создаёт новую ветку только после ответа owner/provider.
Silhouette
Desired feature-scale/topology effect → 3.02/provider proposal.
Region
Hole/fill/convexity target mismatch → region/contour owner proposal.
Transform
Singular/invalid transform → Core transform owner.
ShapeCorrectionBranch {
parentCandidateId,
sourceCorrectionRequestId,
targetOwner,
proposalRef,
childCandidateId,
seedFork,
repairDepth,
dirtyOwners[],
provenance: "DERIVED"
}
Визуальная лаборатория search + score
Четыре candidates одной semantic задачи. Local scores показаны только как illustrative target-relative owner aggregates; mass/negative-space ещё не участвуют.
Topic 3 regression coverage
3.06 — test owner темы 3. Он проверяет публичные contracts, но не становится владельцем их geometry/metrics.
| Module | Contract | Regression barriers |
|---|---|---|
| 3.00 | schema / roles | role not inferred from geometry; no foreign mass/free-space score |
| 3.01 | primitive geometry | canonical aliases, validity, deterministic primitive proposal ownership |
| 3.02 | path contour | closure, reversal, self-intersection evidence, no score ownership |
| 3.03 | silhouette | target gate, composite primary vote, complex allowed counterexample |
| 3.04 | region topology | fill/hole/convexity target fit, convex ≠ universally better |
| 3.05 | transform | inverse/parity, local immutability, transform descriptors not scores |
| 3.06 | generator/scorer | budget, lineage, hard-filter, suppression, coverage, deterministic rank |
Детерминированные tests 3.00–3.06
Reference runner покрывает schema barriers, owner boundaries, generation determinism, hard filtering, target semantics и scoring aggregation.
DATA FOR LAYOUT ENGINE
Machine-readable финальный contract темы 3.
{
"module": "Compo 3.06",
"name": "shape_generator_scoring_and_tests",
"version": "1.0-canonical",
"scope": "BOUNDED_SHAPE_CANDIDATE_ORCHESTRATION_LOCAL_SCORING_AND_TOPIC3_REGRESSION",
"consumes": [
"Compo3.00.Shape / ShapeRole / ShapeGeometry contracts",
"Compo3.01.PrimitiveValidationResult / PrimitiveToPathResult / proposal adapters",
"Compo3.02.PathShapeGeometry / ContourIntersectionEvent[] / correction requests",
"Compo3.03.MetricResult[shape.silhouette.localReadabilityScore]",
"Compo3.03.SilhouetteCorrectionRequest[]",
"Compo3.04.MetricResult[shape.region.localTopologyFit]",
"Compo3.04.ShapeRegionCorrectionRequest[]",
"Compo3.05.ShapeTransformDescriptor / ShapeWorldGeometryView",
"Compo3.05.TransformCorrectionRequest[]",
"ShapeProposalProvider[]",
"ShapeSystemTarget",
"Compo0.seed / lineage"
],
"provides": [
"ShapeGenerationIntent",
"ShapeGenerationBudget",
"ShapeProposal",
"ShapeCandidate",
"ShapeCandidateLineage",
"ShapeSystemTarget",
"ShapeSystemScoreResult",
"ShapeSearchReport",
"ShapeCorrectionBranch",
"ShapeRegressionCase[]",
"ShapeRegressionSuite"
],
"owns_metrics": [
"shapeSystem.localScore",
"shapeSystem.localScoreConfidence"
],
"descriptors_only": [
"shapeSystem.targetCoverage",
"shapeSystem.evidenceCoverage",
"shapeSystem.groupBreakdown",
"shapeSystem.suppressionLog",
"shapeSystem.generationCost",
"shapeSystem.correctionCost",
"shapeSystem.localRankKey",
"shapeSystem.stableTieBreak",
"shapeSystem.lineage",
"shapeSystem.searchReport"
],
"candidate_schema": {
"candidateId": "string",
"parentCandidateId": "string|null",
"lineageRootId": "string",
"shapeRef": "canonical owner-produced shape snapshot/ref",
"proposalRefs": "string[]",
"metrics": "MetricResult[]",
"hardViolations": "HardConstraintViolation[]",
"generationDepth": "integer>=0",
"repairDepth": "integer>=0",
"generationCost": "number>=0 bookkeeping only",
"correctionCost": "number>=0 bookkeeping only",
"diversityKey": "string|null supplied by provider/adapter",
"canonicalSignature": "string",
"stableTieBreak": "string",
"provenance": "object"
},
"generation_intent": {
"intentId": "string",
"shapeRole": "ShapeRole",
"allowedGeometryKinds": "PRIMITIVE|PATH|COMPOUND[]",
"allowedPrimitiveFamilies": "optional explicit list",
"sourceShapeRefs": "optional immutable bases",
"proposalProviderRefs": "explicit provider refs",
"silhouetteTarget": "optional Compo3.03 target",
"regionTarget": "optional Compo3.04 target",
"transformVariantPolicy": "optional explicit policy; no default rotation/scale sweep",
"hardConstraints": "typed constraints",
"stylePresetRef": "optional",
"seed": "required deterministic seed"
},
"generation_budget": {
"maxBaseCandidates": 16,
"maxProposalsPerBase": 12,
"maxTotalCandidates": 64,
"maxRepairDepth": 2,
"maxCorrectionBranchesPerCandidate": 4,
"maxDiversityPerBucket": 8,
"maxRuntimeMs": "optional host budget"
},
"generation_policy": [
"normalize intent and explicit provider set",
"load immutable source/base seeds",
"request bounded proposals from owning adapters",
"expand without Cartesian product",
"validate via owner results",
"hard-filter before scoring",
"deduplicate by canonicalSignature",
"diversity-prune using explicit provider diversityKey",
"request 3.03/3.04 owner metrics",
"score locally under explicit ShapeSystemTarget",
"materialize bounded owner-routed correction branches",
"repeat until budget/depth/convergence stop"
],
"proposal_policy": {
"geometry_proposal_owner": "3.01/3.02/3.04 or explicit external owner",
"transform_proposal_owner": "Core/3.05 adapter",
"3.06_role": "orchestrates proposal refs; never directly mutates control points/primitive params/transform matrix",
"transform_variants": "generated only when explicit TransformVariantPolicy or provider proposals exist",
"generation_cost": "bookkeeping/tie-break only, never aesthetic score"
},
"target_schema": {
"targetId": "string",
"requiredGroups": "string[]",
"optionalGroups": "string[]",
"disabledGroups": "string[]",
"silhouetteTarget": "optional Compo3.03 target",
"regionTarget": "optional Compo3.04 target",
"semanticMultipliers": "map group->positive finite number",
"styleMultipliers": "map group->positive finite number",
"groupVoteCaps": "map group->positive finite number",
"requiredEvidencePolicy": "REQUIRE_ALL|DIAGNOSTIC_IF_MISSING|RANK_WITH_LOW_COVERAGE",
"hardConstraints": "typed constraints",
"stylePresetRef": "optional"
},
"allowed_primary_votes": {
"shape.silhouette.localReadabilityScore": {
"owner": "Compo3.03",
"scoringGroup": "SILHOUETTE_READABILITY"
},
"shape.region.localTopologyFit": {
"owner": "Compo3.04",
"scoringGroup": "SHAPE_REGION_TOPOLOGY"
}
},
"scoring_policy": {
"explicit_target_required": true,
"no_target": "DIAGNOSTIC_ONLY_LOCAL_SCORE_NULL",
"hard_filter_before_score": true,
"N_A": "EXCLUDE_NOT_ZERO",
"components_of_active_composite": "SUPPRESS",
"unknown_or_non_primary_metric": "DIAGNOSTIC_ONLY",
"dependsOn_alone": "NEVER_SUPPRESS",
"cross_group_direct_derivedFrom_overlap": "SUPPRESS_LOWER_PRIORITY_UNLESS_BOTH_EXPLICITLY_INDEPENDENT",
"group_value": "weighted mean of selected canonical primary votes inside group; currently one canonical primary per group",
"raw_group_weight": "baseWeight * semanticMultiplier * styleMultiplier",
"group_weight": "min(raw_group_weight, groupVoteCap)",
"effective_score_weight": "group_weight * MetricResult.confidence",
"localScore": "weighted mean groupValue by effective_score_weight",
"sceneConfidence": "weighted mean groupConfidence by group_weight",
"targetCoverage": "covered expected groups / expected groups",
"evidenceCoverage": "covered expected target weight / total expected target weight",
"localScoreConfidence": "sceneConfidence * evidenceCoverage",
"no_soft_aesthetic_penalty_layer": "owner fits already encode target interpretation; generation/correction cost remains non-aesthetic"
},
"ranking_policy": [
"hard-feasible candidates only",
"higher localScore outside scoreEpsilon",
"higher targetCoverage",
"higher localScoreConfidence outside confidenceEpsilon",
"lower correctionCost",
"lower generationCost",
"stableTieBreak lexical"
],
"initial_heuristics": {
"score_epsilon": {
"value": 0.015,
"provenance": "INITIAL_HEURISTIC"
},
"confidence_epsilon": {
"value": 0.03,
"provenance": "INITIAL_HEURISTIC"
},
"default_group_vote_cap": {
"value": 1.0,
"provenance": "INITIAL_HEURISTIC"
},
"default_base_group_weight": {
"value": 1.0,
"provenance": "INITIAL_HEURISTIC"
},
"max_base_candidates": {
"value": 16,
"provenance": "IMPLEMENTATION_HEURISTIC"
},
"max_proposals_per_base": {
"value": 12,
"provenance": "IMPLEMENTATION_HEURISTIC"
},
"max_total_candidates": {
"value": 64,
"provenance": "IMPLEMENTATION_HEURISTIC"
},
"max_repair_depth": {
"value": 2,
"provenance": "IMPLEMENTATION_HEURISTIC"
},
"max_correction_branches_per_candidate": {
"value": 4,
"provenance": "IMPLEMENTATION_HEURISTIC"
},
"max_diversity_per_bucket": {
"value": 8,
"provenance": "IMPLEMENTATION_HEURISTIC"
}
},
"hard_constraints": [
"candidate hard violations are evaluated before local scoring",
"candidate source snapshots are immutable; repair creates a child branch",
"no full Cartesian product of proposal dimensions",
"same intent+provider outputs+seed+versions produce same candidate ordering and lineage",
"3.06 must not recalculate raw primitive/path/region/transform geometry under new metric names",
"only canonical primary owner composites from 3.03 and 3.04 may vote in current Topic3 local score",
"MetricResult componentOf active composite is diagnostic-only",
"descriptor/raw complexity/area/bounds/transform magnitude cannot vote directly",
"missing required evidence follows explicit requiredEvidencePolicy; never inject zero",
"generationCost and correctionCost are not aesthetic scores",
"visual mass/occupancy metrics from Topic4 are not owned or synthesized here",
"positive/negative-space metrics from Topic5 are not owned or synthesized here",
"global balance/hierarchy/eye-flow are not owned here",
"no beautyScore"
],
"correction_policy": {
"foreign_mutation": "FORBIDDEN",
"silhouette_mismatch": "consume 3.03 SilhouetteCorrectionRequest and route to 3.02/3.06 provider",
"region_mismatch": "consume 3.04 ShapeRegionCorrectionRequest and route to 3.02/3.04 provider",
"transform_invalid": "consume 3.05 TransformCorrectionRequest and route to Core transform owner",
"new_branch": "immutable child candidate with parentCandidateId and deterministic seed fork",
"max_depth": "bounded by ShapeGenerationBudget.maxRepairDepth"
},
"regression_scope": {
"covers": [
"Compo3.00",
"Compo3.01",
"Compo3.02",
"Compo3.03",
"Compo3.04",
"Compo3.05",
"Compo3.06"
],
"owns_design_metrics": false,
"baseline_policy": "expected outputs change only with explicit contract migration reason",
"determinism": "same fixture/seed/version => same structural output"
},
"deferred_inputs": [
"Topic4 visual mass / silhouette area / occupancy / density factor",
"Topic5 positive and negative space",
"Core ObjectTransform final migration",
"global balance / hierarchy / eye-flow",
"future global pipeline / final scene scorer",
"style calibration datasets"
],
"recompute_when": [
"ShapeGenerationIntent or generation budget changes",
"proposal provider version/output changes",
"3.03/3.04 primary metric contract changes",
"ShapeSystemTarget changes",
"candidate hard-violation state changes",
"owner correction creates new candidate branch",
"Core transform version changes when candidate world evidence depends on it"
],
"finality": "TOPIC3_LOCAL_SEARCH_SCORING_AND_REGRESSION_ONLY"
}