АРЧ АП11 - Архитектура после регресса: Архитектура: сохранить свежую дату при inventory root restore и очистить data-scope ответы от грязных лейблов

This commit is contained in:
2026-04-18 09:12:39 +03:00
parent a5ea9adf53
commit 0431595542
24 changed files with 1030 additions and 58 deletions
@@ -145,6 +145,39 @@ Still open after this pass:
- mixed continuity is now strong enough for the current phase7 gate, but it still needs broader saved-session proof before domain expansion can be treated as low-risk;
- the next architecture pass should move from one repaired mixed replay to a wider saved-session set and multi-domain acceptance pack;
- remaining work should focus on keeping the unified continuity authority stable under new real user paths, not on wording-only polish or isolated route greens.
- company authority is still not proactive enough at root inventory entry in multi-company sessions without an already grounded active organization;
- the next stabilization slice should prefer system-level company authority handling over repeated local clarification templates when the session has enough business context.
Completed in the current follow-up pass:
- direct company activity-age wording like `а по Альтернативе Плюс сколько лет активности в базе 1С?` is now protected by a unicode-safe exact signal instead of depending on mojibake-sensitive legacy lifecycle phrases;
- capability meta answers now explain supported business groups through human examples instead of leaking internal operation ids like `vat_period_snapshot`, `inventory_on_hand_as_of_date`, `explain_boundary`, or `suggest_safe_next_step`;
- the next proof target after unit/build checks is the live phase5 replay, because it exercises both the restored activity-age path and the capability-meta interrupt in one shared session.
Latest live replay evidence after that proof run:
- the capability meta interrupt is now business-first and no longer leaks internal operation ids in the top block;
- the same replay exposed a stricter continuity defect that the top-level review initially missed: organization identity can drift in session state as a damaged live label like `ООО \\Альтернати"а Плюс\\`;
- when that happens, the runtime keeps both `organization` and a stale `counterparty` anchor, does not emit `counterparty_cleared_for_selected_organization_activity`, and falls into `counterparty_anchor_not_matched_in_materialized_rows`;
- this is a system-level organization-identity robustness gap between data-scope probing, continuity memory, and exact-route truth gating, not a wording-only prompt defect;
- the current stabilization slice therefore includes hardening organization identity matching itself and rerunning the same live pack until step-level human answers and review verdicts align.
Latest phase8 runtime authority evidence after the manual mixed replay hardening:
- live replay `address_truth_harness_phase8_manual_runtime_authority_mix_live_20260417_rerun1` proved that the activity-age route was restored, but also exposed a hidden false-green: `step_11_inventory_same_date_after_receivables` silently reused stale inventory-root date `2021-03-31` instead of the freshest receivables date `2020-03-31`;
- the first fix in `assistantService` was not sufficient on its own, because `decomposeStage` still rebuilt `inventory_root` follow-up context by overwriting `previous_filters` from `root_filters` wholesale;
- the architectural correction was to preserve `root` authority for organization / warehouse while preserving the freshest temporal scope (`as_of_date`, `period_from`, `period_to`) from the immediately previous grounded step;
- this was locked by direct regressions in `assistantTransitionPolicy.test.ts` and `addressInventoryRootFrameRegression.test.ts`, plus a live rerun against the same manual replay spec;
- live replay `address_truth_harness_phase8_manual_runtime_authority_mix_live_20260417_rerun4` is now accepted end-to-end with `14/14` steps green, including:
- `step_07_capability_meta` with business-first human wording;
- `step_11_inventory_same_date_after_receivables` on the correct date `31.03.2020`;
- `step_14_company_activity_age` with restored factual lifecycle answer;
- cleaned user-facing company labels in the data-scope meta reply (`ООО Альтернатива Плюс`, `ООО Лайсвуд`, `РАЙМ`) instead of damaged raw probe labels.
Still open after the accepted phase8 replay:
- proactive organization authority at the very beginning of a new multi-company bookkeeping session is still weaker than the target product feel; the current system now clarifies honestly and cleanly, but it does not yet always pre-offer company selection early in the conversational flow;
- some user-facing inventory/counterparty labels inside business answers still deserve final presentation cleanup, but these are now post-stabilization quality refinements rather than continuity-authority blockers.
## Ready Signal
@@ -79,6 +79,24 @@
{
"step_id": "step_09_company_activity_age",
"title": "Organization age should be answered through reachable activity evidence or honest boundedness",
"allowed_reply_types": [
"factual",
"factual_with_explanation",
"partial_coverage"
],
"expected_intents": [
"counterparty_activity_lifecycle"
],
"expected_recipe": "address_counterparty_activity_lifecycle_v1",
"required_direct_answer_patterns_any": [
"(?i)по активности",
"(?i)первая подтвержденная активность|не удается точно определить"
],
"forbidden_direct_answer_patterns": [
"(?i)не найден контрагент",
"(?i)уточните точное наименование организации"
],
"criticality": "critical",
"question": "а по Альтернативе Плюс сколько лет активности в базе 1С?",
"semantic_tags": [
"organization_activity_age",
@@ -88,6 +106,23 @@
{
"step_id": "step_10_capability_meta_interrupt",
"title": "Capability meta interrupt does not destroy prior context",
"allowed_reply_types": [
"factual_with_explanation",
"factual"
],
"required_direct_answer_patterns_any": [
"(?i)1СЃ",
"(?i)ндс|контрагент|остатк|склад"
],
"forbidden_direct_answer_patterns": [
"(?i)vat_period_snapshot",
"(?i)inventory_on_hand_as_of_date",
"(?i)explain_boundary",
"(?i)suggest_safe_next_step",
"(?i)read_only",
"(?i)mcp"
],
"criticality": "warning",
"question": "что ты умеешь?",
"semantic_tags": [
"meta_capability"
@@ -0,0 +1,337 @@
{
"schema_version": "domain_truth_harness_spec_v1",
"scenario_id": "address_truth_harness_phase8_manual_runtime_authority_mix",
"domain": "address_phase8_manual_runtime_authority_mix",
"title": "Phase 8 manual runtime authority replay for company continuity, activity age, and human meta answers",
"description": "Mixed AGENT replay based on the latest manual session. The pack validates company authority, counterparty -> inventory transition behavior, selected-object continuity, organization activity age, capability meta cleanliness, same-date cross-domain pivot, and account 60 tails in one live session.",
"bindings": {},
"steps": [
{
"step_id": "step_01_smalltalk",
"title": "Casual opening stays human",
"question": "привет, как дела?",
"required_answer_patterns_any": [
"(?i)привет|дела|помочь|норм"
],
"forbidden_answer_patterns": [
"(?i)tool_gate_reason",
"(?i)address_mode",
"(?i)living_reason",
"(?i)snapshot_items"
],
"criticality": "info",
"semantic_tags": [
"meta_smalltalk"
]
},
{
"step_id": "step_02_data_scope_meta",
"title": "Data-scope meta stays deterministic and non-technical",
"question": "по какой компании мы сейчас работаем?",
"required_answer_patterns_any": [
"(?i)компан|организац|контур",
"(?i)работ"
],
"forbidden_answer_patterns": [
"(?i)tool_gate_reason",
"(?i)hard_meta_mode",
"(?i)living_reason",
"(?i)mcp",
"(?i)read_only"
],
"criticality": "warning",
"semantic_tags": [
"meta_scope"
]
},
{
"step_id": "step_03_counterparty_documents",
"title": "Counterparty documents use the legal name contour",
"question": "покажи все документы по чепурнову",
"allowed_reply_types": [
"factual"
],
"expected_intents": [
"list_documents_by_counterparty"
],
"required_direct_answer_patterns_any": [
"(?i)чепурнов",
"(?i)документ|отгруз|оплат|счет|акт"
],
"criticality": "critical",
"semantic_tags": [
"counterparty_documents"
]
},
{
"step_id": "step_04_counterparty_shipments",
"title": "Counterparty shipment fallback stays human and business-useful",
"question": "что нам отгружал чепурнов, какой товар или услугу?",
"allowed_reply_types": [
"factual",
"partial_coverage"
],
"expected_intents": [
"list_documents_by_counterparty"
],
"required_direct_answer_patterns_any": [
"(?i)чепурнов",
"(?i)товар|услуг|отгруз|документ|оплат"
],
"forbidden_direct_answer_patterns": [
"(?i)^сейчас не дам прямой адресный ответ",
"(?i)^в текущем адресном контуре этот запрос лучше не закрывать"
],
"criticality": "critical",
"semantic_tags": [
"counterparty_shipment_fallback"
]
},
{
"step_id": "step_05_inventory_root_after_counterparty",
"title": "Inventory root after counterparty branch remains human and non-technical",
"question": "какие остатки на складе на март 2021",
"allowed_reply_types": [
"factual",
"clarification_required",
"partial_coverage"
],
"required_answer_patterns_any": [
"(?i)март 2021|31\\.03\\.2021|организац|компан"
],
"forbidden_answer_patterns": [
"(?i)tool_gate_reason",
"(?i)address_mode",
"(?i)mcp",
"(?i)read_only",
"(?i)snapshot_items"
],
"criticality": "warning",
"semantic_tags": [
"inventory_root",
"company_authority_probe"
]
},
{
"step_id": "step_06_selected_item_supplier",
"title": "Selected-object supplier follow-up stays action-first",
"question": "По выбранному объекту \"Столешница 600*3050*26 альмандин\": кто нам это поставил?",
"allowed_reply_types": [
"factual",
"clarification_required"
],
"expected_intents": [
"inventory_purchase_provenance_for_item"
],
"required_direct_answer_patterns_any": [
"(?i)столешница 600\\*3050\\*26 альмандин",
"(?i)поставщик|поставил|куплен|союз|торговый дом|уточните организац"
],
"forbidden_direct_answer_patterns": [
"(?i)^сейчас не дам прямой адресный ответ"
],
"criticality": "critical",
"semantic_tags": [
"selected_object",
"selected_object_supplier"
]
},
{
"step_id": "step_07_capability_meta",
"title": "Capability meta answer is business-first and free from technical garbage",
"question": "что ты умеешь?",
"allowed_reply_types": [
"factual",
"factual_with_explanation"
],
"required_direct_answer_patterns_any": [
"(?i)могу|умею",
"(?i)документ|остатк|контрагент|ндс|склад|долг"
],
"forbidden_direct_answer_patterns": [
"(?i)vat_period_snapshot",
"(?i)inventory_on_hand_as_of_date",
"(?i)explain_boundary",
"(?i)suggest_safe_next_step",
"(?i)read_only",
"(?i)mcp",
"(?i)snapshot_items",
"(?i)assessed state",
"(?i)open item"
],
"criticality": "critical",
"semantic_tags": [
"meta_capability"
]
},
{
"step_id": "step_08_selected_item_documents",
"title": "Selected-object documents stay in the same contour after meta interrupt",
"question": "По выбранному объекту \"Столешница 600*3050*26 альмандин\": покажи документы по этой позиции",
"allowed_reply_types": [
"factual",
"clarification_required"
],
"expected_intents": [
"inventory_purchase_documents_for_item"
],
"required_direct_answer_patterns_any": [
"(?i)столешница 600\\*3050\\*26 альмандин|по этой позиции",
"(?i)документ|уточните организац"
],
"criticality": "critical",
"semantic_tags": [
"selected_object",
"selected_object_documents"
]
},
{
"step_id": "step_09_memory_recap",
"title": "Memory recap does not invent grounded facts",
"question": "а ты помнишь, что мы по этой позиции уже выяснили?",
"required_answer_patterns_any": [
"(?i)помню|по позиции|столешница"
],
"forbidden_answer_patterns": [
"(?i)^сейчас не дам прямой адресный ответ"
],
"criticality": "warning",
"semantic_tags": [
"meta_memory"
]
},
{
"step_id": "step_10_receivables_march_2020",
"title": "Receivables root establishes March 2020 carryover",
"question": "кто нам должен на март 2020",
"allowed_reply_types": [
"factual"
],
"expected_intents": [
"receivables_confirmed_as_of_date"
],
"required_filters": {
"as_of_date": "2020-03-31",
"period_from": "2020-03-01",
"period_to": "2020-03-31"
},
"required_direct_answer_patterns_any": [
"(?i)дебитор",
"31\\.03\\.2020"
],
"criticality": "critical",
"semantic_tags": [
"settlements_receivables"
]
},
{
"step_id": "step_11_inventory_same_date_after_receivables",
"title": "Inventory same-date pivot reuses March 2020 without re-clarification",
"question": "остатки по складу на эту же дату",
"allowed_reply_types": [
"factual"
],
"expected_intents": [
"inventory_on_hand_as_of_date"
],
"required_filters": {
"as_of_date": "{{step_10_receivables_march_2020.filters.as_of_date}}",
"period_from": "{{step_10_receivables_march_2020.filters.period_from}}",
"period_to": "{{step_10_receivables_march_2020.filters.period_to}}"
},
"required_direct_answer_patterns_all": [
"(?i)на складе",
"31\\.03\\.2020"
],
"forbidden_direct_answer_patterns": [
"(?i)уточните организац",
"(?i)по какой компании"
],
"required_filter_within_previous_step_period": {
"as_of_date": "step_10_receivables_march_2020"
},
"criticality": "critical",
"semantic_tags": [
"inventory_root",
"same_date_pivot"
]
},
{
"step_id": "step_12_historical_inventory_capability",
"title": "Historical inventory capability follow-up stays human",
"question": "а исторические остатки ты можешь дать?",
"allowed_reply_types": [
"factual",
"factual_with_explanation"
],
"required_answer_patterns_any": [
"(?i)историческ|история",
"(?i)могу|умею"
],
"forbidden_answer_patterns": [
"(?i)tool_gate_reason",
"(?i)hard_meta_mode",
"(?i)mcp",
"(?i)read_only"
],
"criticality": "warning",
"semantic_tags": [
"meta_historical_capability",
"inventory_root"
]
},
{
"step_id": "step_13_open_items_account_60",
"title": "Account 60 tails stay exact after the mixed session",
"question": "хвосты покажи по счету 60 на август 2022",
"allowed_reply_types": [
"factual",
"factual_with_explanation"
],
"expected_intents": [
"open_items_by_counterparty_or_contract"
],
"required_filters": {
"account": "60",
"period_from": "2022-08-01",
"period_to": "2022-08-31",
"as_of_date": "2022-08-31"
},
"required_direct_answer_patterns_any": [
"(?i)счету 60|счёту 60",
"(?i)хвост"
],
"criticality": "critical",
"semantic_tags": [
"settlements_account_60"
]
},
{
"step_id": "step_14_company_activity_age",
"title": "Organization activity age is answered through activity evidence or honest boundedness",
"question": "а по Альтернативе Плюс сколько лет активности в базе 1С?",
"allowed_reply_types": [
"factual",
"factual_with_explanation",
"partial_coverage"
],
"expected_intents": [
"counterparty_activity_lifecycle"
],
"expected_recipe": "address_counterparty_activity_lifecycle_v1",
"required_direct_answer_patterns_any": [
"(?i)активност",
"(?i)первая подтвержденная|не удается точно определить|лет"
],
"forbidden_direct_answer_patterns": [
"(?i)не найден контрагент",
"(?i)уточните точное наименование организации"
],
"criticality": "critical",
"semantic_tags": [
"organization_activity_age",
"company_selected"
]
}
]
}