Роль выбирает policy, но не создаётся здесь
7.04 — dispatch layer между explicit semantic role и уже определёнными edge-policy contracts 7.01–7.03.
Owner-qualified semantic role + explicit policy set.
Resolved directive + mutation-free downstream requests.
None.
SemanticRoleAssignment
Role taxonomy и сам факт присвоения роли принадлежат внешнему semantic owner.
SemanticRoleAssignment {
assignmentRef,
contentRef,
roleRef,
roleNamespaceRef,
roleOwnerRef,
confidence,
provenance
}
Rule selector только explicit
Matching не использует название объекта, regex по contentRef или визуальные признаки.
EXACT_ROLE
Один exact external `roleRef`.
ROLE_SET
Explicit перечисление нескольких role refs.
DEFAULT_SELECTOR
Явно объявленный fallback внутри policy set.
Один directive — три независимых request-family
7.04 не копирует downstream computations: он формирует только owner-qualified requests/templates.
SAFE
NO_REQUEST or REQUEST_PROTECTION_BINDING hardSafePolicyRef protectionMode geometryTemplateRef
BLEED
NO_REQUEST or REQUEST_BLEED_BINDING bleedIntentPolicyRef intentKind geometryMode geometryTemplateRef
CLEARANCE
NO_REQUEST or REQUEST_CLEARANCE_QUERY referenceRef edges[] geometryMode normalizationMode tensionModelRef?
NO_REQUEST не равен запрету
Это важный firewall при наличии нескольких explicit policy owners.
Rule выбирается целиком
Lower-priority rules не подмешивают отдельные поля в winning directive.
RoleEdgePolicyRule {
ruleRef,
selector,
resolutionPriority:
integer,
directive:
complete RoleEdgeDirective,
enabled,
confidence,
provenance
}
Никакого hidden specificity
Exact-role rule не выигрывает у default автоматически — если автор policy хочет это, он задаёт priority явно.
Конфликт нельзя скрыть lexical tie-break
Determinism здесь означает одинаково обнаруживать конфликт, а не одинаково выбирать случайного победителя.
Same payload
Две rules одинакового priority с canonical-equivalent directive можно de-duplicate, сохранив обе `selectedRuleRefs`.
Different payload
AMBIGUOUS_POLICY_MATCH. Policy-set owner должен исправить конфликт.
7.01–7.03 остаются owners
Resolved directive превращается в requests, а не в готовые чужие результаты.
Role-dependent protection
7.04 может решить, что для данной explicit role нужно запросить protected binding, но containment остаётся 7.01.
ProtectedContentBindingRequest {
requestRef,
targetOwner: "Compo7.01",
contentRef,
hardSafePolicyRef,
protectionMode,
geometryTemplateRef,
sourceAssignmentRef,
sourceRuleRefs[],
mutationAllowed: false
}
Role-dependent edge exit
Например, explicit background-role policy может выбрать заранее определённый 7.02 bleed policy — но сама роль не даёт permission без rule.
BleedIntentBindingRequest {
requestRef,
targetOwner: "Compo7.02",
contentRef,
bleedIntentPolicyRef,
intentKind,
geometryMode,
geometryTemplateRef,
sourceAssignmentRef,
sourceRuleRefs[],
mutationAllowed: false
}
Role-dependent measurement target
Role policy может выбрать, какие edges/reference/tension model измерять, но численное значение clearance вычисляет 7.03.
EdgeClearanceQueryRequest {
requestRef,
targetOwner: "Compo7.03",
contentRef,
referenceRef,
edges[],
geometryMode,
normalizationMode,
tensionModelRef?,
geometryTemplateRef,
sourceAssignmentRef,
sourceRuleRefs[],
mutationAllowed: false
}
Не смешиваем роли внутри namespace
Скрытый merge `TITLE + BRAND + DECORATIVE` делает policy provenance непроверяемым.
7.05 может менять geometry, не role logic
Role policy может ссылаться на versioned reference, который поставляет 7.05, но activation state остаётся там.
Role-dependent не означает универсальный policy owner
Каждый downstream module сохраняет собственную семантику.
| Question | Owner |
|---|---|
| Какая semantic role у content? | external semantic owner |
| Containment hard-safe? | 7.01 |
| Trim crossing / bleed compliance? | 7.02 |
| Signed clearance / tension? | 7.03 |
| Какую edge policy выбрать по explicit role? | 7.04 |
| Dynamic platform geometry/lifecycle? | 7.05 |
| Violation / repair / scoring? | 7.06 |
Visual Lab
Разные explicit roles могут маршрутизироваться в разные downstream owners без aesthetic ranking.
Role-policy regression
Проверяем explicit assignment, selector/default, priorities, ambiguous ties, de-duplication, request routing, multi-role firewall и отсутствие semantic/scoring leakage.
DATA FOR LAYOUT ENGINE
Machine-readable 7.04 contract.
{
"module": "Compo 7.04",
"name": "role_dependent_edge_policy",
"version": "1.1-final",
"canonical_main_title": "Role-dependent edge policy",
"topic": "07_ПОЛЯ_SAFE_ZONES_И_BLEED",
"scope": "EXPLICIT_ROLE_TO_EDGE_POLICY_RESOLUTION_AND_MUTATION_FREE_DOWNSTREAM_REQUEST_ROUTING",
"consumes": [
"owner-qualified SemanticRoleAssignment",
"RoleEdgePolicySet",
"references to Compo7.01.HardSafePolicy",
"references to Compo7.02.BleedIntentPolicy",
"references to Compo7.03 RectKeepInBoundaryRef / EdgeTensionModel",
"optional versioned 7.05 dynamic reference refs without owning overlay lifecycle"
],
"provides": [
"SemanticRoleAssignment contract adapter",
"RoleEdgeDirective",
"RoleEdgePolicyRule",
"RoleEdgePolicySet",
"RoleResolvedEdgeDirective",
"RolePolicyResolutionSet",
"ProtectedContentBindingRequest -> Compo7.01",
"BleedIntentBindingRequest -> Compo7.02",
"EdgeClearanceQueryRequest -> Compo7.03",
"RolePolicyDiagnostic[]",
"roleEdgePolicyRef for downstream Compo7.06"
],
"owns_metrics": [],
"descriptors_only": [
"edge.role.assignmentRef",
"edge.role.roleRef",
"edge.role.roleNamespaceRef",
"edge.role.policySetRef",
"edge.role.selectedRuleRef",
"edge.role.resolutionPriority",
"edge.role.safeRequestMode",
"edge.role.bleedRequestMode",
"edge.role.clearanceRequestMode",
"edge.role.resolutionStatus",
"edge.role.confidence"
],
"semantic_role_assignment_schema": {
"assignmentRef": "stable ref",
"contentRef": "owner-qualified content/object ref",
"roleRef": "explicit semantic role ref",
"roleNamespaceRef": "owner/version namespace for role semantics",
"roleOwnerRef": "module/system that assigned the role",
"confidence": "0..1",
"provenance": "object",
"important": "7.04 does not define the role taxonomy and does not derive roleRef from content"
},
"selector_schema": {
"EXACT_ROLE": {
"roleRef": "one exact external role ref"
},
"ROLE_SET": {
"roleRefs": "non-empty explicit set"
},
"DEFAULT_SELECTOR": {
"meaning": "explicit fallback inside this policy set if no non-default selector matches"
},
"no_pattern_guessing": "no substring, regex, content-name or visual-feature role inference"
},
"role_edge_directive_schema": {
"safe": {
"requestMode": "NO_REQUEST|REQUEST_PROTECTION_BINDING",
"hardSafePolicyRef": "required when requesting",
"protectionMode": "FULL_SUPPORT|BOUNDING_BOX|ANCHOR_SET|CUSTOM_REGION when requesting",
"geometryTemplateRef": "owner-qualified geometry binding template/ref"
},
"bleed": {
"requestMode": "NO_REQUEST|REQUEST_BLEED_BINDING",
"bleedIntentPolicyRef": "required when requesting",
"intentKind": "PRINT_BLEED|INTENTIONAL_CROP|BACKGROUND_CONTINUATION|DECORATIVE_EDGE_EXIT|CUSTOM",
"geometryMode": "FULL_SUPPORT|BOUNDING_BOX|CUSTOM_REGION when requesting",
"geometryTemplateRef": "owner-qualified geometry binding template/ref"
},
"clearance": {
"requestMode": "NO_REQUEST|REQUEST_CLEARANCE_QUERY",
"referenceRef": "required when requesting",
"edges": "non-empty subset TOP|RIGHT|BOTTOM|LEFT",
"geometryMode": "FULL_SUPPORT|BOUNDING_BOX|ANCHOR_SET|CUSTOM_REGION",
"normalizationMode": "RAW_ONLY|RAW_AND_SHORT_N",
"tensionModelRef": "optional explicit Compo7.03 model ref",
"geometryTemplateRef": "owner-qualified geometry/query template/ref"
},
"no_request_semantics": "NO_REQUEST means emit nothing from this policy set; it does not revoke another owner's explicit request"
},
"role_edge_policy_rule_schema": {
"ruleRef": "stable unique ref",
"selector": "EXACT_ROLE|ROLE_SET|DEFAULT_SELECTOR",
"resolutionPriority": "integer; larger value wins among matching rules",
"directive": "complete RoleEdgeDirective; no implicit merge with lower-priority rules",
"enabled": "boolean",
"confidence": "0..1",
"provenance": "STANDARD|EMPIRICAL|INITIAL_HEURISTIC|IMPLEMENTATION_HEURISTIC|STYLE_PRESET",
"important": "priority is policy-resolution metadata, not semantic importance or composition hierarchy"
},
"role_edge_policy_set_schema": {
"policySetRef": "stable versioned ref",
"roleNamespaceRef": "must match incoming assignments",
"rules": "RoleEdgePolicyRule[]",
"noMatchPolicy": "N_A|INVALID",
"allowExplicitDefault": "boolean",
"status": "READY|INVALID",
"confidence": "0..1",
"provenance": "object",
"duplicateRuleRef": "INVALID"
},
"resolution_algorithm": {
"step_1": "validate role assignment and policy set namespace compatibility",
"step_2": "collect enabled non-default rules whose selector explicitly matches roleRef",
"step_3": "if none match and allowExplicitDefault=true, collect enabled DEFAULT_SELECTOR rules",
"step_4": "take maximum explicit resolutionPriority",
"step_5": "if one highest-priority rule -> RESOLVED",
"step_6": "if multiple highest-priority rules have canonical-equivalent directives -> deterministic de-duplication; selectedRuleRefs[] preserved",
"step_7": "if highest-priority directives differ -> AMBIGUOUS_POLICY_MATCH / INVALID",
"step_8": "if no rule -> N_A or INVALID per noMatchPolicy",
"forbidden": "implicit specificity weighting, lexical winner, role-name guessing, partial merge across priorities"
},
"request_routing": {
"safe": "REQUEST_PROTECTION_BINDING creates a mutation-free request for a Compo7.01 ProtectedSemanticContentBinding using the selected HardSafePolicy ref; 7.01 remains evaluator/owner",
"bleed": "REQUEST_BLEED_BINDING creates a mutation-free request for a Compo7.02 BleedIntentBinding; 7.02 remains trim-crossing/compliance owner",
"clearance": "REQUEST_CLEARANCE_QUERY creates a mutation-free request for a Compo7.03 EdgeClearanceQuery and optional EdgeTensionModel ref; 7.03 remains metric owner",
"no_request": "emits no request in that family and does not cancel other owner-authored requests"
},
"multi_role_policy": {
"canonical_rule": "one active roleRef per contentRef per roleNamespaceRef in one resolution pass",
"reason": "prevents hidden cross-role directive merging and ambiguous ownership",
"composite_role": "if upstream semantics need TITLE_AND_BRAND_MARK or another compound role, upstream role owner must emit an explicit composite roleRef",
"same_content_different_namespace": "may be processed in separate policy sets with distinct lineage; downstream conflict resolution remains explicit"
},
"policy_conflict_semantics": {
"same_priority_same_directive": "RESOLVED_DEDUPLICATED",
"same_priority_different_directive": "AMBIGUOUS_POLICY_MATCH",
"different_priority": "highest explicit priority wins; lower rules are not merged",
"downstream_safe_vs_bleed_conflict": "7.04 preserves emitted requests; 7.06/upstream policy owner resolves incompatibility rather than 7.04 silently dropping one"
},
"ownership_map": {
"semantic_role_owner": "assigns roleRef / role taxonomy; external to 7.04",
"7.01": "hard-safe binding semantics and containment",
"7.02": "bleed-intent binding semantics and trim-crossing compliance",
"7.03": "signed clearance metrics and tension classification",
"7.04": "role-dependent selection/routing of explicit edge directives",
"7.05": "platform overlays and dynamic safe/reference geometry lifecycle",
"7.06": "violations, repair, target-aware scoring and Topic7 regression"
},
"semantic_firewalls": {
"role_vs_visual_hierarchy": "semantic role assignment is not visual hierarchy score",
"resolution_priority_vs_design_priority": "resolutionPriority resolves policy conflicts only",
"no_request_vs_prohibition": "NO_REQUEST is absence of a 7.04 emission, not a hard prohibition",
"policy_selection_vs_evaluation": "7.04 selects refs/templates; 7.01–7.03 evaluate their own semantics",
"role_policy_vs_platform_lifecycle": "7.05 may change reference geometry state; 7.04 does not activate/deactivate platform overlays",
"role_policy_vs_scoring": "7.06 may score explicit target compliance; 7.04 does not"
},
"metric_policy": {
"role_resolution": "descriptor/dispatch only",
"resolution_priority": "administrative integer, not score",
"direct_scoring": "FORBIDDEN in 7.04",
"protected_roles_are_better": "FORBIDDEN",
"higher_priority_role_is_more_important": "FORBIDDEN",
"more_edge_rules_is_better": "FORBIDDEN"
},
"hard_constraints": [
"7.04 owns mapping from explicit semantic-role assignments to downstream edge-policy/binding/query requests; it does not own semantic role inference itself.",
"Every SemanticRoleAssignment must be owner-qualified and explicit; content names, text strings, object types, size, visual mass or position must not be used to infer role.",
"Within one roleNamespaceRef, one contentRef must have one active roleRef for one resolution pass; multi-role semantics require an explicit composite role upstream.",
"RoleEdgePolicyRule resolution uses explicit resolutionPriority only; priority is administrative policy resolution metadata, not visual hierarchy or design score.",
"If multiple highest-priority matching rules have semantically identical directives, they may be de-duplicated deterministically.",
"If multiple highest-priority matching rules have different directives, resolution is AMBIGUOUS_POLICY_MATCH; no lexical winner may silently decide policy.",
"DEFAULT_SELECTOR is an explicit fallback rule, not a hidden default.",
"No matching rule yields N_A or INVALID according RoleEdgePolicySet.noMatchPolicy; no implicit protection/bleed/clearance behavior is invented.",
"A NO_REQUEST directive means this policy set emits no downstream request; it does not cancel a binding/policy created by another explicit owner.",
"7.04 may select/generate request payloads for 7.01 protected binding, 7.02 bleed-intent binding and 7.03 clearance query/tension model, but downstream semantic evaluation remains owned by those modules.",
"7.04 must not copy 7.01 containment, 7.02 trim-crossing or 7.03 clearance metrics under new names.",
"Downstream requests are mutation-free and carry source rule/assignment lineage.",
"A role-policy request may reference a 7.05 dynamic zone/reference source, but 7.04 does not own platform overlay activation/lifecycle.",
"Policy selection must preserve policyRef/modelRef versions and must not silently replace them after resolution.",
"Role policy may differ across explicit policy-set versions or contexts; this is not a contradiction if lineage is distinct.",
"7.04 does not construct canonical Violation, repair or scoring objects; 7.06 owns them.",
"7.04 does not mutate content geometry.",
"N/A != 0.",
"No beautyScore."
],
"hard_rules": [
"7.04 owns mapping from explicit semantic-role assignments to downstream edge-policy/binding/query requests; it does not own semantic role inference itself.",
"Every SemanticRoleAssignment must be owner-qualified and explicit; content names, text strings, object types, size, visual mass or position must not be used to infer role.",
"Within one roleNamespaceRef, one contentRef must have one active roleRef for one resolution pass; multi-role semantics require an explicit composite role upstream.",
"RoleEdgePolicyRule resolution uses explicit resolutionPriority only; priority is administrative policy resolution metadata, not visual hierarchy or design score.",
"If multiple highest-priority matching rules have semantically identical directives, they may be de-duplicated deterministically.",
"If multiple highest-priority matching rules have different directives, resolution is AMBIGUOUS_POLICY_MATCH; no lexical winner may silently decide policy.",
"DEFAULT_SELECTOR is an explicit fallback rule, not a hidden default.",
"No matching rule yields N_A or INVALID according RoleEdgePolicySet.noMatchPolicy; no implicit protection/bleed/clearance behavior is invented.",
"A NO_REQUEST directive means this policy set emits no downstream request; it does not cancel a binding/policy created by another explicit owner.",
"7.04 may select/generate request payloads for 7.01 protected binding, 7.02 bleed-intent binding and 7.03 clearance query/tension model, but downstream semantic evaluation remains owned by those modules.",
"7.04 must not copy 7.01 containment, 7.02 trim-crossing or 7.03 clearance metrics under new names.",
"Downstream requests are mutation-free and carry source rule/assignment lineage.",
"A role-policy request may reference a 7.05 dynamic zone/reference source, but 7.04 does not own platform overlay activation/lifecycle.",
"Policy selection must preserve policyRef/modelRef versions and must not silently replace them after resolution.",
"Role policy may differ across explicit policy-set versions or contexts; this is not a contradiction if lineage is distinct.",
"7.04 does not construct canonical Violation, repair or scoring objects; 7.06 owns them.",
"7.04 does not mutate content geometry.",
"N/A != 0.",
"No beautyScore."
],
"soft_constraints": [],
"preferences": [],
"overrides_allowed_by": [
"a newer explicit RoleEdgePolicySet version may supersede an older set for future resolutions",
"upstream semantic owner may change role assignment version",
"resolved historical outputs remain tied to their original assignmentRef/policySetRef and are not retroactively mutated"
],
"initial_heuristics": {},
"style_preset_values": [],
"candidate_generation": {
"layout_candidates": "NONE",
"policy_candidates": "NONE",
"reason": "7.04 deterministically resolves explicit rules; ambiguous top-priority rules are errors, not candidate branches"
},
"correction_policy": {
"foreign_content_mutation": "FORBIDDEN",
"missing_role_assignment": "route to upstream semantic-role owner",
"role_namespace_mismatch": "route to semantic/policy-set owner",
"ambiguous_highest_priority_rules": "request policy-set correction; do not choose lexically",
"missing_downstream_policy_ref": "request RoleEdgePolicySet author correction",
"hard_safe_evaluation": "route to Compo7.01",
"bleed_evaluation": "route to Compo7.02",
"clearance_tension_evaluation": "route to Compo7.03",
"platform_overlay_lifecycle": "route to Compo7.05",
"violation_repair_scoring": "route to Compo7.06"
},
"deferred_inputs": [
"Compo7.05 platform overlays/dynamic safe zones",
"Compo7.06 violations/repair/scoring/tests",
"future canonical semantic-role owner/taxonomy"
],
"recompute_when": [
"SemanticRoleAssignment changes",
"roleNamespaceRef changes",
"RoleEdgePolicySet version/rules change",
"selected downstream policy/model/reference refs change",
"rule enabled/priority/directive changes"
],
"tests": [
"explicit role only",
"namespace match",
"exact selector",
"role-set selector",
"explicit default",
"priority",
"same-priority dedupe",
"same-priority conflict",
"no-match N_A/INVALID",
"NO_REQUEST semantics",
"request routing",
"multi-role same namespace rejection",
"deterministic resolution",
"no metric/scoring/platform/role inference leakage"
],
"finality": "ROLE_DEPENDENT_EDGE_POLICY_RESOLUTION_AND_ROUTING_ONLY"
}