Files
company-haness/.claude/hooks/orgos/planning/intake_classifier.py
T

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"
),
}