367 lines
14 KiB
JSON
367 lines
14 KiB
JSON
{
|
||
"schema_version": "domain_truth_harness_spec_v1",
|
||
"scenario_id": "address_truth_harness_test2",
|
||
"domain": "address_mixed_followup",
|
||
"title": "Exact replay and truth review for test2 mixed follow-up chain",
|
||
"description": "Strict sequential replay of the exact user wording from test2.txt with human-answer and technical-debug review.",
|
||
"source_export": "C:\\Users\\DCTOUCH\\Desktop\\test2.txt",
|
||
"bindings": {},
|
||
"steps": [
|
||
{
|
||
"step_id": "step_01_chat_opening",
|
||
"title": "Casual opener",
|
||
"question": "йо чо как",
|
||
"criticality": "info",
|
||
"allowed_reply_types": [
|
||
"factual_with_explanation",
|
||
"factual"
|
||
],
|
||
"required_answer_patterns_any": [
|
||
"(?i)1с",
|
||
"(?i)помогаю",
|
||
"(?i)готов"
|
||
],
|
||
"notes": "Информационный шаг: важно не ломать живой режим, но это не главный бизнес-блокер."
|
||
},
|
||
{
|
||
"step_id": "step_02_receivables_march_2020",
|
||
"title": "Receivables at March 2020",
|
||
"question": "кто нам должен на март 2020",
|
||
"allowed_reply_types": [
|
||
"factual"
|
||
],
|
||
"expected_intents": [
|
||
"receivables_confirmed_as_of_date"
|
||
],
|
||
"expected_capability": "confirmed_receivables_as_of_date",
|
||
"expected_result_mode": "confirmed_balance",
|
||
"required_filters": {
|
||
"as_of_date": "2020-03-31",
|
||
"period_from": "2020-03-01",
|
||
"period_to": "2020-03-31"
|
||
},
|
||
"required_direct_answer_patterns_any": [
|
||
"31\\.03\\.2020",
|
||
"(?i)дебиторск"
|
||
],
|
||
"notes": "Базовый корневой финансовый вопрос должен отработать точно и задать март 2020 как carryover-якорь."
|
||
},
|
||
{
|
||
"step_id": "step_03_inventory_same_date",
|
||
"title": "Inventory on the same date",
|
||
"question": "остатки по складу на эту же дату",
|
||
"allowed_reply_types": [
|
||
"factual"
|
||
],
|
||
"expected_intents": [
|
||
"inventory_on_hand_as_of_date"
|
||
],
|
||
"expected_capability": "confirmed_inventory_on_hand_as_of_date",
|
||
"expected_result_mode": "confirmed_balance",
|
||
"required_filters": {
|
||
"as_of_date": "{{step_02_receivables_march_2020.filters.as_of_date}}",
|
||
"period_from": "{{step_02_receivables_march_2020.filters.period_from}}",
|
||
"period_to": "{{step_02_receivables_march_2020.filters.period_to}}"
|
||
},
|
||
"required_direct_answer_patterns_any": [
|
||
"31\\.03\\.2020",
|
||
"(?i)на складе"
|
||
],
|
||
"notes": "Смена контура receivables -> inventory должна сохранить ту же дату, без дополнительного ручного уточнения."
|
||
},
|
||
{
|
||
"step_id": "step_04_selected_item_seller",
|
||
"title": "Selected item purchase provenance",
|
||
"question": "По выбранному объекту \"Четки Пост (84*117)\": кто продавец",
|
||
"allowed_reply_types": [
|
||
"factual"
|
||
],
|
||
"expected_intents": [
|
||
"inventory_purchase_provenance_for_item"
|
||
],
|
||
"required_state_objects": [
|
||
"focus_object"
|
||
],
|
||
"required_carryover_invariants": [
|
||
"focus_object"
|
||
],
|
||
"forbidden_capabilities": [
|
||
"confirmed_inventory_on_hand_as_of_date"
|
||
],
|
||
"forbidden_recipes": [
|
||
"address_inventory_on_hand_as_of_date_v1"
|
||
],
|
||
"forbidden_filter_keys": [
|
||
"as_of_date",
|
||
"period_from",
|
||
"period_to"
|
||
],
|
||
"forbidden_direct_answer_patterns": [
|
||
"^На 31\\.03\\.2020 на складе",
|
||
"(?i)^сейчас не дам прямой адресный ответ"
|
||
],
|
||
"notes": "Выбранная позиция не должна реплеить складской срез; нужен именно ответ про поставщика/продавца."
|
||
},
|
||
{
|
||
"step_id": "step_05_selected_item_sale_trace",
|
||
"title": "Selected item buyer",
|
||
"question": "По выбранному объекту \"Четки Пост (84*117)\": кому мы продали эту хуйню",
|
||
"allowed_reply_types": [
|
||
"factual",
|
||
"partial_coverage"
|
||
],
|
||
"allowed_limited_reason_categories": [
|
||
"empty_match"
|
||
],
|
||
"expected_intents": [
|
||
"inventory_sale_trace_for_item"
|
||
],
|
||
"required_state_objects": [
|
||
"focus_object"
|
||
],
|
||
"required_carryover_invariants": [
|
||
"focus_object"
|
||
],
|
||
"forbidden_filter_keys": [
|
||
"as_of_date",
|
||
"period_from",
|
||
"period_to"
|
||
],
|
||
"forbidden_direct_answer_patterns": [
|
||
"(?i)^по текущим условиям в доступном срезе данных совпадений не нашлось",
|
||
"(?i)^сейчас не дам прямой адресный ответ"
|
||
],
|
||
"notes": "След продажи по выбранной позиции не должен быть зажат складским snapshot-окном. Если по live данным подтвержденных продаж нет, честный partial_coverage с empty_match допустим, но только при правильном sale-trace routing и сохраненном focus_object."
|
||
},
|
||
{
|
||
"step_id": "step_06_selected_item_purchase_followup",
|
||
"title": "Selected item purchase follow-up",
|
||
"question": "а купили у кого известно?",
|
||
"allowed_reply_types": [
|
||
"factual"
|
||
],
|
||
"expected_intents": [
|
||
"inventory_purchase_provenance_for_item"
|
||
],
|
||
"required_state_objects": [
|
||
"focus_object"
|
||
],
|
||
"required_carryover_invariants": [
|
||
"focus_object"
|
||
],
|
||
"forbidden_filter_keys": [
|
||
"as_of_date",
|
||
"period_from",
|
||
"period_to"
|
||
],
|
||
"forbidden_direct_answer_patterns": [
|
||
"(?i)^для такого формата запроса нужен более широкий аналитический контур",
|
||
"(?i)^сейчас не дам прямой адресный ответ"
|
||
],
|
||
"notes": "Короткий follow-up после выбранной позиции должен остаться в том же item-contour, а не свалиться в unknown."
|
||
},
|
||
{
|
||
"step_id": "step_07_inventory_july_2019",
|
||
"title": "Inventory at July 2019",
|
||
"question": "остатки на июль 2019",
|
||
"allowed_reply_types": [
|
||
"factual"
|
||
],
|
||
"expected_intents": [
|
||
"inventory_on_hand_as_of_date"
|
||
],
|
||
"expected_capability": "confirmed_inventory_on_hand_as_of_date",
|
||
"expected_result_mode": "confirmed_balance",
|
||
"required_filters": {
|
||
"as_of_date": "2019-07-31",
|
||
"period_from": "2019-07-01",
|
||
"period_to": "2019-07-31"
|
||
},
|
||
"required_direct_answer_patterns_any": [
|
||
"31\\.07\\.2019",
|
||
"(?i)на складе"
|
||
],
|
||
"forbidden_direct_answer_patterns": [
|
||
"(?i)^сейчас не дам прямой адресный ответ"
|
||
],
|
||
"notes": "После провала provenance-среза система все равно должна уметь коротко вернуть root inventory frame по явному месяцу."
|
||
},
|
||
{
|
||
"step_id": "step_08_inventory_september_2019",
|
||
"title": "Inventory at September 2019",
|
||
"question": "сентябрь 2019",
|
||
"allowed_reply_types": [
|
||
"factual"
|
||
],
|
||
"expected_intents": [
|
||
"inventory_on_hand_as_of_date"
|
||
],
|
||
"expected_capability": "confirmed_inventory_on_hand_as_of_date",
|
||
"expected_result_mode": "confirmed_balance",
|
||
"required_filters": {
|
||
"as_of_date": "2019-09-30",
|
||
"period_from": "2019-09-01",
|
||
"period_to": "2019-09-30"
|
||
},
|
||
"required_direct_answer_patterns_any": [
|
||
"30\\.09\\.2019",
|
||
"(?i)на складе"
|
||
],
|
||
"forbidden_direct_answer_patterns": [
|
||
"(?i)^сейчас не дам прямой адресный ответ"
|
||
],
|
||
"notes": "Короткое bare-month follow-up должно удерживать складской корень без дополнительной расшифровки."
|
||
},
|
||
{
|
||
"step_id": "step_09_inventory_march_2020",
|
||
"title": "Inventory at March 2020",
|
||
"question": "март 2020",
|
||
"allowed_reply_types": [
|
||
"factual"
|
||
],
|
||
"expected_intents": [
|
||
"inventory_on_hand_as_of_date"
|
||
],
|
||
"expected_capability": "confirmed_inventory_on_hand_as_of_date",
|
||
"expected_result_mode": "confirmed_balance",
|
||
"required_filters": {
|
||
"as_of_date": "2020-03-31",
|
||
"period_from": "2020-03-01",
|
||
"period_to": "2020-03-31"
|
||
},
|
||
"required_direct_answer_patterns_any": [
|
||
"31\\.03\\.2020",
|
||
"(?i)на складе"
|
||
],
|
||
"forbidden_direct_answer_patterns": [
|
||
"(?i)^сейчас не дам прямой адресный ответ"
|
||
],
|
||
"notes": "Возврат на март 2020 должен снова дать точный складской срез, а не unknown/partial."
|
||
},
|
||
{
|
||
"step_id": "step_10_inventory_same_date_negative_wording",
|
||
"title": "Inventory same date with noisy wording",
|
||
"question": "остатков на складе нет на эту дату?",
|
||
"allowed_reply_types": [
|
||
"factual"
|
||
],
|
||
"expected_intents": [
|
||
"inventory_on_hand_as_of_date"
|
||
],
|
||
"expected_capability": "confirmed_inventory_on_hand_as_of_date",
|
||
"expected_result_mode": "confirmed_balance",
|
||
"required_filters": {
|
||
"as_of_date": "{{step_09_inventory_march_2020.filters.as_of_date}}",
|
||
"period_from": "{{step_09_inventory_march_2020.filters.period_from}}",
|
||
"period_to": "{{step_09_inventory_march_2020.filters.period_to}}"
|
||
},
|
||
"forbidden_filter_values": {
|
||
"warehouse": [
|
||
"нет на эту дату"
|
||
]
|
||
},
|
||
"required_direct_answer_patterns_any": [
|
||
"31\\.03\\.2020",
|
||
"(?i)на складе"
|
||
],
|
||
"forbidden_direct_answer_patterns": [
|
||
"(?i)^сейчас не дам прямой адресный ответ"
|
||
],
|
||
"notes": "Разговорная частица `нет на эту дату` не должна становиться warehouse-anchor."
|
||
},
|
||
{
|
||
"step_id": "step_11_vat_same_date",
|
||
"title": "VAT on the same date",
|
||
"question": "ндс какой надо заплатить на эту же дату",
|
||
"allowed_reply_types": [
|
||
"factual"
|
||
],
|
||
"expected_intents": [
|
||
"vat_liability_confirmed_for_tax_period"
|
||
],
|
||
"expected_capability": "confirmed_vat_liability_for_tax_period",
|
||
"required_filters": {
|
||
"period_from": "{{step_09_inventory_march_2020.filters.period_from}}",
|
||
"period_to": "{{step_09_inventory_march_2020.filters.period_to}}"
|
||
},
|
||
"required_direct_answer_patterns_any": [
|
||
"(?i)ндс"
|
||
],
|
||
"notes": "Pivot inventory -> VAT по `на эту же дату` должен привязаться к марту 2020, а не к мусорному складскому anchor."
|
||
},
|
||
{
|
||
"step_id": "step_12_vat_may_2016",
|
||
"title": "VAT at May 2016",
|
||
"question": "а на май 2016",
|
||
"allowed_reply_types": [
|
||
"factual"
|
||
],
|
||
"expected_intents": [
|
||
"vat_liability_confirmed_for_tax_period"
|
||
],
|
||
"expected_capability": "confirmed_vat_liability_for_tax_period",
|
||
"forbidden_filter_values": {
|
||
"period_from": [
|
||
"{{step_11_vat_same_date.filters.period_from}}"
|
||
],
|
||
"period_to": [
|
||
"{{step_11_vat_same_date.filters.period_to}}"
|
||
]
|
||
},
|
||
"required_answer_patterns_any": [
|
||
"2016",
|
||
"(?i)налоговый период"
|
||
],
|
||
"required_direct_answer_patterns_any": [
|
||
"(?i)ндс"
|
||
],
|
||
"notes": "Короткий temporal follow-up внутри VAT-frame должен уйти с марта 2020 на май 2016."
|
||
},
|
||
{
|
||
"step_id": "step_13_receivables_same_date_after_vat_2016",
|
||
"title": "Receivables on the carried 2016 date",
|
||
"question": "кто нам должен денег на эту дату",
|
||
"allowed_reply_types": [
|
||
"factual"
|
||
],
|
||
"expected_intents": [
|
||
"receivables_confirmed_as_of_date"
|
||
],
|
||
"expected_capability": "confirmed_receivables_as_of_date",
|
||
"required_filter_within_previous_step_period": {
|
||
"as_of_date": "step_12_vat_may_2016"
|
||
},
|
||
"required_answer_patterns_any": [
|
||
"2016"
|
||
],
|
||
"required_direct_answer_patterns_any": [
|
||
"(?i)дебиторск"
|
||
],
|
||
"forbidden_direct_answer_patterns": [
|
||
"31\\.03\\.2020"
|
||
],
|
||
"notes": "Фраза `на эту дату` после VAT 2016 не должна откатываться обратно на март 2020."
|
||
},
|
||
{
|
||
"step_id": "step_14_receivables_today",
|
||
"title": "Receivables today",
|
||
"question": "а на сегодня",
|
||
"allowed_reply_types": [
|
||
"factual"
|
||
],
|
||
"expected_intents": [
|
||
"receivables_confirmed_as_of_date"
|
||
],
|
||
"expected_capability": "confirmed_receivables_as_of_date",
|
||
"required_filters": {
|
||
"as_of_date": "{{runtime.today_iso}}"
|
||
},
|
||
"required_direct_answer_patterns_any": [
|
||
"{{runtime.today_dot_regex}}",
|
||
"(?i)дебиторск"
|
||
],
|
||
"notes": "Последний шаг нужен как sanity-check: `на сегодня` должен честно пересчитать уже на текущую дату прогона."
|
||
}
|
||
]
|
||
}
|