Сжать supplier-overlap ответы и detector utility gap

This commit is contained in:
2026-06-03 12:52:44 +03:00
parent fdd04abbde
commit ed44c6428a
6 changed files with 109 additions and 49 deletions
+15 -5
View File
@@ -134,7 +134,7 @@
"kind": "answer_text_shape",
"automation_level": "semi_automatic",
"description": "The first meaningful line is not a direct business answer for a direct user question.",
"issue_codes": ["business_direct_answer_missing"],
"issue_codes": ["business_direct_answer_missing", "business_utility_gap"],
"inputs": ["steps/<step_id>/output.md"],
"check": {
"first_line_should_be": "business_answer_or_honest_boundary"
@@ -144,7 +144,7 @@
"kind": "answer_text_regex_forbidden_in_prefix",
"automation_level": "automatic",
"description": "Answer starts with scaffold/service narration before the user-facing business conclusion.",
"issue_codes": ["business_direct_answer_missing"],
"issue_codes": ["business_direct_answer_missing", "business_utility_gap"],
"inputs": ["steps/<step_id>/output.md"],
"check": {
"prefix_line_count": 3,
@@ -155,7 +155,7 @@
"kind": "answer_text_regex_forbidden",
"automation_level": "automatic",
"description": "Final user-facing answer contains runtime/debug/service tokens.",
"issue_codes": ["technical_garbage_in_answer"],
"issue_codes": ["technical_garbage_in_answer", "business_utility_gap"],
"inputs": ["steps/<step_id>/output.md"],
"check": {
"forbidden_patterns": ["(?i)(route_id|capability_id|runtime_|snapshot_items|debug|answer_object|selected_object)"]
@@ -165,7 +165,7 @@
"kind": "answer_text_regex_forbidden",
"automation_level": "automatic",
"description": "Final user-facing answer contains capability ids or route ids.",
"issue_codes": ["technical_garbage_in_answer"],
"issue_codes": ["technical_garbage_in_answer", "business_utility_gap"],
"inputs": ["steps/<step_id>/output.md"],
"check": {
"forbidden_patterns": ["(?i)(capability[_ -]?id|route[_ -]?id|address\\.[a-z0-9_\\.]+)"]
@@ -185,13 +185,23 @@
"kind": "answer_text_required_when_limited",
"automation_level": "semi_automatic",
"description": "Answer states a limitation but gives no concrete next action for recovering or narrowing the answer.",
"issue_codes": ["business_next_step_missing"],
"issue_codes": ["business_next_step_missing", "business_utility_gap"],
"inputs": ["steps/<step_id>/output.md"],
"check": {
"limited_patterns": ["(?i)(не могу|не хватает|не подтвержден|нет данных|недостаточно)"],
"required_next_action_patterns_any": ["(?i)(можно|следующ|уточн|перезапусти|проверь|выбери|нужен|добавь)"]
}
},
"business_answer_too_verbose_output": {
"kind": "answer_text_regex_forbidden",
"automation_level": "automatic",
"description": "A scoped business follow-up answer still exposes verbose proof/scaffold sections that should be collapsed into a compact proof line.",
"issue_codes": ["business_utility_gap", "business_answer_too_verbose"],
"inputs": ["steps/<step_id>/output.md"],
"check": {
"forbidden_patterns": ["(?im)^\\s*(Что проверили|Опорные документы):"]
}
},
"route_candidate_needs_enablement": {
"kind": "stage_review_signal",
"automation_level": "semi_automatic",
+43 -1
View File
@@ -237,6 +237,48 @@
]
}
},
"business_utility_gap": {
"severity": "P2",
"business_meaning": "Ответ технически заземлен, но для узкого бизнес follow-up остается слишком тяжелым или недостаточно практичным.",
"root_layers": ["answer_surface", "business_utility"],
"expected_answer_contract": "compact_business_followup_surface_v1",
"detectors": [
"business_answer_too_verbose_output",
"top_level_scaffold_before_answer",
"runtime_tokens_in_user_answer",
"capability_ids_in_user_answer",
"limited_answer_without_next_action"
],
"allowed_patch_targets": [
"llm_normalizer/backend/src/services/address_runtime/composeStage.ts",
"llm_normalizer/backend/src/services/address_runtime/inventoryReplyBuilders.ts",
"llm_normalizer/backend/src/services/assistantMcpDiscoveryResponseCandidate.ts",
"llm_normalizer/backend/src/services/assistantService.ts"
],
"forbidden_patch_targets": [
"route masking",
"fake evidence",
"evidence deletion from artifacts"
],
"rerun_matrix": [
"failed_scenario",
"answer_surface_pack",
"accepted_smoke_pack"
],
"acceptance": {
"must_have": [
"direct_answer_first",
"compact_business_surface",
"short_evidence_basis",
"honest_limitation_when_needed"
],
"must_not_have": [
"verbose proof packet by default",
"technical ids",
"duplicated answer blocks"
]
}
},
"route_candidate_enablement_gap": {
"severity": "P1",
"business_meaning": "Планировщик понял бизнес-запрос, но route candidate ещё не исполняется как точная возможность.",
@@ -427,7 +469,7 @@
"severity": "P1",
"business_meaning": "Ответ слишком длинный для прямого бизнес-вопроса и снижает практическую полезность.",
"root_layers": ["answer_surface", "business_utility"],
"detectors": ["business_answer_too_verbose_signal"],
"detectors": ["business_answer_too_verbose_output", "business_answer_too_verbose_signal"],
"allowed_patch_targets": [
"llm_normalizer/backend/src/services/address_runtime/composeStage.ts",
"llm_normalizer/backend/src/services/assistantMcpDiscoveryResponseCandidate.ts",