57 lines
2.3 KiB
Python
57 lines
2.3 KiB
Python
"""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"
|
|
),
|
|
}
|