"""Deterministic request classifier: light operational, substantial, or strategic.""" from __future__ import annotations from typing import Any from .coverage_model import tokens STRATEGIC = { "strategy", "portfolio", "pricing", "budget", "roadmap", "acquisition", "partnership", "compliance", "legal", "production", "customer", "revenue", "one-way", "irreversible", "전략", "포트폴리오", "가격", "예산", "로드맵", "인수", "법무", "규제", "매출", "고객", } LIGHT = { "typo", "spelling", "docs", "comment", "rename", "format", "config", "test", "small", "오탈자", "문서", "주석", "이름", "포맷", "설정", "테스트", "작은", } SUBSTANTIAL = { "feature", "refactor", "migration", "architecture", "api", "database", "security", "design", "기능", "리팩터", "마이그레이션", "아키텍처", "데이터베이스", "보안", "설계", } def classify_request(request: str, facts: dict[str, Any] | None = None) -> dict[str, Any]: facts = facts or {} observed = tokens(request) | tokens(facts) searchable = (request + " " + str(facts)).lower() strategic_hits = sorted({term for term in STRATEGIC if term in observed or term in searchable}) substantial_hits = sorted({term for term in SUBSTANTIAL if term in observed or term in searchable}) light_hits = sorted({term for term in LIGHT if term in observed or term in searchable}) if facts.get("one-way-door") or facts.get("blast-radius") == "production-customer-revenue" or strategic_hits: route = "strategic" plan = "cascade" executive = True elif substantial_hits or facts.get("cross-team"): route = "substantial" plan = "cascade" executive = False else: route = "light-operational" plan = "light" executive = False return { "classification": route, "plan": plan, "executive-required": executive, "signals": { "strategic": strategic_hits, "substantial": substantial_hits, "light": light_hits, }, "reason": ( "decision authority or high-blast signal" if executive else "substantial implementation/design signal" if route == "substantial" else "reversible owner-scoped task" ), }