222 lines
8.5 KiB
JSON
222 lines
8.5 KiB
JSON
{
|
||
"schema_version": "agent_issue_catalog_v1",
|
||
"updated_at": "2026-05-24",
|
||
"principles": [
|
||
"No accepted save without effective_runtime.json.",
|
||
"No auto-coder without allowed issue_code, root_layers, allowed/forbidden targets, rerun_matrix, and answer contract.",
|
||
"Subagents are read-only reviewers; Lead/Orchestrator owns final verdict and repair decision."
|
||
],
|
||
"issues": {
|
||
"runtime_manifest_missing": {
|
||
"severity": "P0",
|
||
"business_meaning": "Прогон нельзя воспроизвести, поэтому audit/repair/acceptance нельзя считать доказанными.",
|
||
"root_layers": ["run_reproducibility"],
|
||
"detectors": ["missing_effective_runtime_json"],
|
||
"allowed_patch_targets": [
|
||
"scripts/domain_case_loop.py",
|
||
"scripts/domain_truth_harness.py",
|
||
"scripts/stage_agent_loop.py",
|
||
"scripts/save_agent_semantic_run.py",
|
||
"scripts/agent_runtime_manifest.py"
|
||
],
|
||
"forbidden_patch_targets": [
|
||
"business routing",
|
||
"MCP runtime",
|
||
"domain contracts"
|
||
],
|
||
"rerun_matrix": [
|
||
"same_spec_direct_runner",
|
||
"same_spec_stage_runner",
|
||
"accepted_smoke_pack"
|
||
],
|
||
"acceptance": {
|
||
"must_have": [
|
||
"effective_runtime.json",
|
||
"git_sha",
|
||
"runner",
|
||
"llm_model",
|
||
"temperature",
|
||
"prompt_source",
|
||
"prompt_hash"
|
||
]
|
||
}
|
||
},
|
||
"prompt_registry_opaque": {
|
||
"severity": "P0",
|
||
"business_meaning": "Неясно, какой normalizer prompt реально исполняется.",
|
||
"root_layers": ["prompt_registry", "runtime_config"],
|
||
"detectors": [
|
||
"default_prompt_version_missing_files",
|
||
"silent_prompt_fallback",
|
||
"preset_version_mismatch"
|
||
],
|
||
"allowed_patch_targets": [
|
||
"llm_normalizer/backend/src/services/promptBuilder.ts",
|
||
"llm_normalizer/backend/src/config.ts",
|
||
"llm_normalizer/data/presets/*.json",
|
||
"scripts/prompt_registry_healthcheck.py",
|
||
"scripts/agent_runtime_manifest.py"
|
||
],
|
||
"forbidden_patch_targets": [
|
||
"domain routing rewrites",
|
||
"business answer heuristics"
|
||
],
|
||
"rerun_matrix": [
|
||
"prompt_healthcheck",
|
||
"normalizer_smoke",
|
||
"accepted_smoke_pack"
|
||
]
|
||
},
|
||
"margin_domain_leak_accounting_route": {
|
||
"severity": "P0",
|
||
"business_meaning": "Запрос про маржинальность номенклатуры ушёл в чужой бухгалтерский домен вместо выручки, себестоимости, валовой прибыли и процента маржи.",
|
||
"root_layers": ["intent", "route", "capability", "domain_contract"],
|
||
"expected_answer_contract": "margin_profitability_v1",
|
||
"detectors": [
|
||
"forbidden_margin_terms",
|
||
"missing_revenue_cogs_margin_fields",
|
||
"wrong_capability_family"
|
||
],
|
||
"allowed_patch_targets": [
|
||
"llm_normalizer/backend/src/services/addressIntentResolver.ts",
|
||
"llm_normalizer/backend/src/services/addressCapabilityPolicy.ts",
|
||
"llm_normalizer/backend/src/services/addressFilterExtractor.ts",
|
||
"llm_normalizer/backend/src/services/address_runtime/**",
|
||
"docs/orchestration/contracts/margin_profitability_v1.json"
|
||
],
|
||
"forbidden_patch_targets": [
|
||
"fake data",
|
||
"silent heuristic masking",
|
||
"global orchestration rewrite",
|
||
"MCP protocol rewrite"
|
||
],
|
||
"rerun_matrix": [
|
||
"failed_margin_scenario",
|
||
"margin_neighbor_pack",
|
||
"wrong_domain_trap_pack",
|
||
"selected_object_followup_pack",
|
||
"accepted_smoke_pack"
|
||
],
|
||
"acceptance": {
|
||
"must_have": [
|
||
"direct_answer_first",
|
||
"period",
|
||
"revenue_ex_vat_or_honest_unknown",
|
||
"cogs_or_honest_unknown",
|
||
"gross_profit_or_honest_unknown",
|
||
"margin_pct_or_honest_unknown",
|
||
"next_action_if_limited"
|
||
],
|
||
"must_not_have": [
|
||
"route ids",
|
||
"debug ids",
|
||
"fixed assets leak",
|
||
"amortization leak",
|
||
"payment document as margin source"
|
||
]
|
||
}
|
||
},
|
||
"business_direct_answer_missing": {
|
||
"severity": "P0",
|
||
"business_meaning": "Ответ не начинает с прямого бизнес-вывода, хотя пользователь задал прямой вопрос.",
|
||
"root_layers": ["answer_surface", "business_utility"],
|
||
"detectors": ["first_line_not_direct_answer", "top_level_scaffold_before_answer"],
|
||
"allowed_patch_targets": [
|
||
"llm_normalizer/backend/src/services/address_runtime/composeStage.ts",
|
||
"llm_normalizer/backend/src/services/assistantMcpDiscoveryResponseCandidate.ts",
|
||
"llm_normalizer/backend/src/services/assistantService.ts"
|
||
],
|
||
"forbidden_patch_targets": [
|
||
"routing rewrites",
|
||
"fake evidence",
|
||
"global runtime rewrite"
|
||
],
|
||
"rerun_matrix": [
|
||
"failed_scenario",
|
||
"direct_answer_surface_pack",
|
||
"accepted_smoke_pack"
|
||
]
|
||
},
|
||
"technical_garbage_in_answer": {
|
||
"severity": "P0",
|
||
"business_meaning": "Финальный ответ протащил debug/runtime/MCP-механику в пользовательскую поверхность.",
|
||
"root_layers": ["answer_surface", "business_utility"],
|
||
"detectors": ["runtime_tokens_in_user_answer", "capability_ids_in_user_answer"],
|
||
"allowed_patch_targets": [
|
||
"llm_normalizer/backend/src/services/address_runtime/composeStage.ts",
|
||
"llm_normalizer/backend/src/services/assistantMcpDiscoveryResponseCandidate.ts",
|
||
"llm_normalizer/backend/src/services/assistantService.ts"
|
||
],
|
||
"forbidden_patch_targets": [
|
||
"route masking",
|
||
"debug deletion from artifacts"
|
||
],
|
||
"rerun_matrix": [
|
||
"failed_scenario",
|
||
"technical_garbage_canary_pack",
|
||
"accepted_smoke_pack"
|
||
]
|
||
},
|
||
"accounting_contract_missing": {
|
||
"severity": "P1",
|
||
"business_meaning": "Ответ не раскрыл обязательный бухгалтерский/доказательный контракт для запрошенного расчёта.",
|
||
"root_layers": ["domain_contract", "answer_surface", "evidence"],
|
||
"detectors": ["required_contract_fields_missing"],
|
||
"allowed_patch_targets": [
|
||
"docs/orchestration/contracts/*.json",
|
||
"llm_normalizer/backend/src/services/address_runtime/composeStage.ts",
|
||
"llm_normalizer/backend/src/services/assistantMcpDiscoveryResponseCandidate.ts"
|
||
],
|
||
"forbidden_patch_targets": [
|
||
"fake data",
|
||
"silent heuristic masking"
|
||
],
|
||
"rerun_matrix": [
|
||
"failed_scenario",
|
||
"contract_field_pack",
|
||
"accepted_smoke_pack"
|
||
]
|
||
},
|
||
"business_next_step_missing": {
|
||
"severity": "P2",
|
||
"business_meaning": "Ограниченный ответ не предлагает полезный следующий шаг.",
|
||
"root_layers": ["answer_surface", "business_utility"],
|
||
"detectors": ["limited_answer_without_next_action"],
|
||
"allowed_patch_targets": [
|
||
"llm_normalizer/backend/src/services/address_runtime/composeStage.ts",
|
||
"llm_normalizer/backend/src/services/assistantMcpDiscoveryResponseCandidate.ts"
|
||
],
|
||
"forbidden_patch_targets": [
|
||
"evidence fabrication",
|
||
"route masking"
|
||
],
|
||
"rerun_matrix": [
|
||
"failed_scenario",
|
||
"limited_answer_pack",
|
||
"accepted_smoke_pack"
|
||
]
|
||
},
|
||
"route_candidate_enablement_gap": {
|
||
"severity": "P1",
|
||
"business_meaning": "Планировщик понял бизнес-запрос, но route candidate ещё не исполняется как точная возможность.",
|
||
"root_layers": ["route_candidate", "runtime_capability"],
|
||
"detectors": ["route_candidate_needs_enablement"],
|
||
"allowed_patch_targets": [
|
||
"llm_normalizer/backend/src/services/assistantMcpDiscoveryRuntimeBridge.ts",
|
||
"llm_normalizer/backend/src/services/assistantMcpDiscoveryPlanner.ts",
|
||
"llm_normalizer/backend/src/services/assistantMcpDiscoveryPilotExecutor.ts",
|
||
"llm_normalizer/backend/src/services/addressRecipeCatalog.ts"
|
||
],
|
||
"forbidden_patch_targets": [
|
||
"global orchestration rewrite",
|
||
"fake fixtures"
|
||
],
|
||
"rerun_matrix": [
|
||
"failed_scenario",
|
||
"route_candidate_pack",
|
||
"accepted_smoke_pack"
|
||
]
|
||
}
|
||
}
|
||
}
|