{ "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"], "expected_answer_contract": "direct_answer_surface_v1", "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" ], "acceptance": { "must_have": [ "direct_answer_first", "business_meaning_before_service_context", "honest_unknown_when_evidence_is_limited" ], "must_not_have": [ "debug ids before answer", "route ids before answer", "service scaffold before answer" ] } }, "technical_garbage_in_answer": { "severity": "P0", "business_meaning": "Финальный ответ протащил debug/runtime/MCP-механику в пользовательскую поверхность.", "root_layers": ["answer_surface", "business_utility"], "expected_answer_contract": "technical_garbage_free_answer_v1", "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" ], "acceptance": { "must_have": [ "business_answer_only", "evidence_summary_when_useful" ], "must_not_have": [ "route ids", "capability ids", "debug payload", "raw runtime enums" ] } }, "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"], "expected_answer_contract": "limited_answer_next_action_v1", "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" ], "acceptance": { "must_have": [ "clear_limitation", "next_action_if_limited", "no_overclaiming" ], "must_not_have": [ "fake evidence", "masked route failure" ] } }, "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" ] } } }