ДОМЕНЫ - ВОПРОСЫ - СКЛАД - Починить selected-object follow-up по складу и включить разговорные/UI-варианты в обязательный domain-loop
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from scripts.domain_case_loop import carry_forward_analysis_context, merge_scenario_date_scope
|
||||
|
||||
|
||||
def test_carry_forward_analysis_context_preserves_followup_anchor() -> None:
|
||||
scenario_state = {
|
||||
"semantic_memory": {
|
||||
"date_scope": {"as_of_date": "2020-03-31"},
|
||||
}
|
||||
}
|
||||
analysis_context = {"as_of_date": "2026-04-13", "source": "current_analysis"}
|
||||
|
||||
carried = carry_forward_analysis_context(scenario_state, analysis_context)
|
||||
|
||||
assert carried["as_of_date"] == "2026-04-13"
|
||||
assert carried["source"] == "current_analysis"
|
||||
|
||||
|
||||
def test_carry_forward_analysis_context_fills_missing_anchor() -> None:
|
||||
scenario_state = {
|
||||
"semantic_memory": {
|
||||
"date_scope": {"as_of_date": "2020-03-31"},
|
||||
}
|
||||
}
|
||||
|
||||
carried = carry_forward_analysis_context(scenario_state, {})
|
||||
|
||||
assert carried["as_of_date"] == "2020-03-31"
|
||||
assert carried["source"] == "scenario_state_carryover"
|
||||
|
||||
|
||||
def test_merge_scenario_date_scope_preserves_historical_anchor_on_followup() -> None:
|
||||
previous_date_scope = {"as_of_date": "2020-03-31", "source": "exact_anchor"}
|
||||
current_date_scope = {"as_of_date": "2026-04-13", "source": "current_analysis"}
|
||||
|
||||
merged = merge_scenario_date_scope(
|
||||
previous_date_scope,
|
||||
current_date_scope,
|
||||
depends_on=["step_01_anchor"],
|
||||
)
|
||||
|
||||
assert merged["as_of_date"] == "2020-03-31"
|
||||
assert merged["source"] == "current_analysis"
|
||||
@@ -70,3 +70,9 @@ def test_route_guard_trend_to_store_feature_risk() -> None:
|
||||
result = choose_route(_flags(), _suff(), parsed_as_trend_or_risk=True)
|
||||
assert result.chosen_route == "store_feature_risk"
|
||||
|
||||
|
||||
def test_route_guard_inventory_exact_trace_stays_live() -> None:
|
||||
flags = _flags()
|
||||
flags.needs_exact_object_trace = True
|
||||
result = choose_route(flags, _suff(), parsed_as_trend_or_risk=False)
|
||||
assert result.chosen_route == "live_mcp_drilldown"
|
||||
|
||||
@@ -41,3 +41,33 @@ def test_classifier_cross_entity_causal_flags() -> None:
|
||||
assert flags.needs_causal_chain is True
|
||||
assert flags.needs_exact_object_trace is False
|
||||
|
||||
|
||||
def test_classifier_inventory_stock_provenance_flags() -> None:
|
||||
flags = classify_query_for_route(
|
||||
"От какого поставщика куплен товар Диван трехместный из текущего остатка на складе Основной склад",
|
||||
{"question_class": "simple_factual"},
|
||||
_store_meta(),
|
||||
)
|
||||
assert flags.needs_exact_object_trace is True
|
||||
assert flags.needs_runtime_truth is True
|
||||
|
||||
|
||||
def test_classifier_inventory_account_on_date_flags() -> None:
|
||||
flags = classify_query_for_route(
|
||||
"Какие товары числятся на 41 счете на дату 2020-03-31",
|
||||
{"question_class": "unknown"},
|
||||
_store_meta(),
|
||||
)
|
||||
assert flags.needs_exact_object_trace is True
|
||||
assert flags.needs_runtime_truth is True
|
||||
|
||||
|
||||
def test_classifier_inventory_sale_chain_flags() -> None:
|
||||
flags = classify_query_for_route(
|
||||
"Есть ли документально подтвержденная цепочка: поставщик Гамма-мебель, ООО -> товар Шкаф картотечный -> покупатель",
|
||||
{"question_class": "cross_entity"},
|
||||
_store_meta(),
|
||||
)
|
||||
assert flags.needs_exact_object_trace is True
|
||||
assert flags.needs_causal_chain is True
|
||||
assert flags.needs_cross_entity_join is True
|
||||
|
||||
Reference in New Issue
Block a user