Сжать supplier-overlap ответы и detector utility gap
This commit is contained in:
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user