ГЛОБАЛЬНЫЙ РЕФАКТОРИНГ АРХИТЕКТУРЫ - Этап 4.5: добавлен аудит контракта Stage 4 в debug/log и закрыт расширенный quality-loop

This commit is contained in:
2026-04-12 01:24:46 +03:00
parent 88a7da4f0a
commit 963f0aa372
12 changed files with 176 additions and 2 deletions
@@ -90,6 +90,13 @@ function baseInput() {
outcomeClassV1: "FULLY_ANSWERED",
assistantOrchestrationContractsV1: { query_frame: {}, execution_plan: {}, evidence_bundle: {}, coverage: {} },
answerStructureV11: { schema_version: "answer_structure_v1_1" },
assistantReply: [
"Коротко: Признак проблемы подтвержден частично.",
"Что именно проверено:\n- Проверен учетный контур.",
"Что найдено:\n- Есть признак разрыва цепочки.",
"Что пока не доказано:\n- Не хватает части подтверждений.",
"Что проверить первым:\n- Уточнить период."
].join("\n\n"),
investigationStateSnapshot: { status: "active" },
normalizedPayload: { schema_version: "normalized_query_v2_0_2" }
};
@@ -108,6 +115,7 @@ describe("assistant debug payload assembler", () => {
expect(payload.problem_unit_ids_used).toEqual(["pu-1", "pu-2"]);
expect(payload.address_llm_predecompose_applied).toBe(true);
expect(payload.assistant_outcome_class_v1).toBe("FULLY_ANSWERED");
expect(payload.answer_contract_stage4_v1?.is_stage4_shape).toBe(true);
});
it("omits optional fields when they are not provided", () => {
@@ -127,4 +135,19 @@ describe("assistant debug payload assembler", () => {
expect(payload.address_llm_predecompose_applied).toBe(false);
expect(payload.address_llm_predecompose_contract).toBeNull();
});
it("marks non-stage4 answer shapes in contract audit", () => {
const input = baseInput();
input.assistantReply = [
"Коротко: Есть проблема.",
"Что сломано:\n- Разрыв перехода.",
"Ограничения:\n- Частичная опора."
].join("\n\n");
const payload = buildDeepAnalysisDebugPayload(input);
expect(payload.answer_contract_stage4_v1?.is_stage4_shape).toBe(false);
expect(payload.answer_contract_stage4_v1?.legacy_blocks_present).toContain("Что сломано");
expect(payload.answer_contract_stage4_v1?.legacy_blocks_present).toContain("Ограничения");
});
});
@@ -89,7 +89,13 @@ function baseInput() {
assistantOrchestrationContractsV1: { query_frame: {}, execution_plan: {}, evidence_bundle: {}, coverage: {} },
answerStructureV11: { schema_version: "answer_structure_v1_1" },
investigationStateSnapshot: { status: "active" },
assistantReply: "ok",
assistantReply: [
"Коротко: Признак проблемы подтвержден частично.",
"Что именно проверено:\n- Проверен учетный контур.",
"Что найдено:\n- Есть признак разрыва цепочки.",
"Что пока не доказано:\n- Не хватает части подтверждений.",
"Что проверить первым:\n- Уточнить период."
].join("\n\n"),
traceId: "trace-1"
};
}
@@ -104,6 +110,7 @@ describe("assistant message log assembler", () => {
});
expect(details.problem_unit_ids_used).toEqual(["pu-1"]);
expect(details.reply_type).toBe("factual");
expect((details.answer_contract_stage4_v1 as { is_stage4_shape?: boolean } | undefined)?.is_stage4_shape).toBe(true);
});
it("marks partial coverage and omits optional sections when empty", () => {