"""Read-model / proposal derived attention.""" from __future__ import annotations from steering.attention.context import AttentionEvalContext from steering.attention.contributors.registry import ( AttentionContributor, register_attention_contributor, ) from steering.proposals.gate_next_actions import gate_next_actions_attention_items from steering.proposals.intake_triage import intake_triage_attention_items from steering.proposals.sprint_commit import sprint_commit_attention_items from steering.read_models.epic_rollup import epic_rollup_attention_items def _epic_rollup(ctx: AttentionEvalContext) -> list[dict]: rollups = ctx.read_models.get("epic_rollup") if not rollups: return [] return epic_rollup_attention_items( initiative_id=ctx.initiative_id, rollups=rollups ) def _sprint_commit(ctx: AttentionEvalContext) -> list[dict]: proposals = ctx.proposals.get("sprint_commit") if not proposals: return [] return sprint_commit_attention_items( initiative_id=ctx.initiative_id, proposals=proposals, actions=ctx.actions, ) def _gate_next_actions(ctx: AttentionEvalContext) -> list[dict]: proposals = ctx.proposals.get("gate_next_actions") if not proposals: return [] return gate_next_actions_attention_items( initiative_id=ctx.initiative_id, proposals=proposals ) def _intake_triage(ctx: AttentionEvalContext) -> list[dict]: proposals = ctx.proposals.get("intake_triage") if not proposals: return [] return intake_triage_attention_items( initiative_id=ctx.initiative_id, proposals=proposals ) register_attention_contributor( AttentionContributor( key="epic_rollup", requires_elements=frozenset({"backlog_epic_hierarchy"}), contribute=_epic_rollup, ) ) register_attention_contributor( AttentionContributor( key="sprint_commit", requires_elements=frozenset({"work_cycle_scope"}), contribute=_sprint_commit, ) ) register_attention_contributor( AttentionContributor( key="gate_next_actions", requires_elements=frozenset({"gate_fulfillment"}), contribute=_gate_next_actions, ) ) register_attention_contributor( AttentionContributor( key="intake_triage", contribute=_intake_triage, ) )