All checks were successful
Deploy Development / deploy (push) Successful in 47s
Test Suite / pytest-backend (push) Successful in 4m11s
Test Suite / lint-backend (push) Successful in 2s
Test Suite / compose-smoke (push) Has been skipped
Test Suite / k6 /api/health Baseline (push) Successful in 18s
Test Suite / playwright-smoke (push) Successful in 15s
Erweitert evaluate_steering um read_models und proposals, migriert epic_rollup auf Registry, liefert sprint_commit-Vorschlaege und UI auf Plan-Sprint. Co-authored-by: Cursor <cursoragent@cursor.com>
61 lines
1.6 KiB
Python
61 lines
1.6 KiB
Python
"""Proposal provider registry — K-Ext-1 / P6."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
from typing import Any, Callable
|
|
|
|
from steering.eval_context import SteeringEvalContext
|
|
|
|
ProposalCompute = Callable[[SteeringEvalContext, dict[str, Any]], Any]
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class ProposalProvider:
|
|
key: str
|
|
requires_elements: frozenset[str]
|
|
requires_data_slices: frozenset[str]
|
|
compute: ProposalCompute
|
|
|
|
|
|
_PROVIDERS: list[ProposalProvider] = []
|
|
|
|
|
|
def register_proposal(provider: ProposalProvider) -> None:
|
|
_PROVIDERS.append(provider)
|
|
|
|
|
|
def compute_proposals(
|
|
ctx: SteeringEvalContext,
|
|
*,
|
|
read_models: dict[str, Any],
|
|
) -> dict[str, Any]:
|
|
elements = ctx.steering_elements
|
|
slices = frozenset(ctx.data_slices)
|
|
result: dict[str, Any] = {}
|
|
|
|
for provider in _PROVIDERS:
|
|
if provider.requires_elements and not provider.requires_elements <= elements:
|
|
continue
|
|
if provider.requires_data_slices and not provider.requires_data_slices <= slices:
|
|
continue
|
|
result[provider.key] = provider.compute(ctx, read_models)
|
|
|
|
return result
|
|
|
|
|
|
def _register_builtin_proposals() -> None:
|
|
from steering.proposals.sprint_commit import propose_sprint_commit
|
|
|
|
register_proposal(
|
|
ProposalProvider(
|
|
key="sprint_commit",
|
|
requires_elements=frozenset({"work_cycle_scope"}),
|
|
requires_data_slices=frozenset({"backlog", "work_cycles"}),
|
|
compute=lambda ctx, _read_models: propose_sprint_commit(ctx),
|
|
)
|
|
)
|
|
|
|
|
|
_register_builtin_proposals()
|