rule_id: peer_positioning_recommendation
name: Peer Positioning Recommendation Framework
type: interpretation
domain: all
applies_to:
agent: output_ingestion
triggers:
- finding type is "peer_comparison"
- comparison method was "peer_benchmark"
- peer set size >= 2
- framework_used contains "peer-positioning" or "peer_positioning"
conditions:
- if entity is more than 1.5 std dev above peer mean -> recommendation = "outperformer, monitor for sustainability"
- if entity is more than 1.5 std dev below peer mean -> recommendation = "underperformer, investigate drivers"
- if entity is within 0.5 std dev of peer mean -> recommendation = "in-line with peers, no immediate action"
- if entity is between 0.5 and 1.5 std dev from peer mean -> recommendation = "moderate divergence, contextual review suggested"
action:
recommendation_type: peer_positioning
required_fields:
- entity_identifier
- peer_set_composition
- statistical_position
- suggested_action_category
language: factual, non-causal
severity_mapping:
outperformer: normal
underperformer: material
in-line: low
moderate-divergence: normal
confidence_framework:
base_confidence: inherited from upstream comparison confidence
adjustments:
- if peer set size < 4 -> subtract 0.10
- if statistical significance below 95% -> subtract 0.15
- if all underlying insights are isInference=true -> subtract 0.10
rationale: |
Peer positioning is a standard interpretation pattern. This rule produces neutral
recommendations grounded in statistical position relative to peers, without claiming
causation. SMEs should encode domain-specific variants where industry norms differ
(e.g., banking peer sets typically size 6-10, wealth management peer sets typically 4-6).
declared_by: framework_foundation
declared_date: 2026-05-26
last_reviewed: 2026-05-26
status: active
notes: |
This rule is intentionally domain-agnostic. Domain SMEs should encode variants for
cases where the std-dev thresholds, peer-set sizing, or severity mapping differ in
their industry. When a more specific (domain-tagged) variant exists, rule precedence
picks it over this cross-domain default.