{ "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: `на сегодня` должен честно пересчитать уже на текущую дату прогона." } ] }