Этап 4 / Волна 10: корректировка settlement-кейса — доменная фиксация синтеза, честное покрытие, удержание фокуса / Этап 4 / Волна 11: бизнес-якоря, доменное заземление и устранение утечки дебага

This commit is contained in:
2026-03-28 02:17:19 +03:00
parent 914843a8ba
commit a06e575be4
367 changed files with 432257 additions and 3627 deletions
@@ -68,10 +68,10 @@ describe.sequential("assistant answer policy v1.1", () => {
});
expect(response.status).toBe(200);
expect(response.body.reply_type).toBe("factual_with_explanation");
expect(String(response.body.assistant_reply)).toContain("Answer summary:");
expect(String(response.body.assistant_reply)).toContain("Direct answer:");
expect(String(response.body.assistant_reply)).toContain("Mechanism block:");
expect(["factual_with_explanation", "partial_coverage"]).toContain(response.body.reply_type);
expect(String(response.body.assistant_reply)).toContain("Коротко:");
expect(String(response.body.assistant_reply)).toContain("Что сломано:");
expect(String(response.body.assistant_reply)).toContain("Ограничения:");
const structure = response.body.debug?.answer_structure_v11;
expect(structure?.mechanism_block).toBeTruthy();
@@ -98,8 +98,8 @@ describe.sequential("assistant answer policy v1.1", () => {
expect(response.status).toBe(200);
expect(response.body.reply_type).toBe("partial_coverage");
expect(String(response.body.assistant_reply)).toContain("Uncertainty block:");
expect(String(response.body.assistant_reply)).toContain("Next step block:");
expect(String(response.body.assistant_reply)).toContain("Ограничения:");
expect(String(response.body.assistant_reply)).toContain("Что проверить первым:");
const structure = response.body.debug?.answer_structure_v11;
expect(typeof structure?.answer_summary).toBe("string");
@@ -136,7 +136,8 @@ describe.sequential("assistant answer policy v1.1", () => {
/period|account|document|counterparty|период|счет|документ|контрагент|пер|РґРѕРєСѓРј/i.test(String(item))
)
).toBe(true);
expect(String(response.body.assistant_reply)).toContain("clarify:");
expect(String(response.body.assistant_reply)).toContain("Что проверить первым:");
expect(String(response.body.assistant_reply)).toMatch(/уточните|период|счет|документ|контрагент/i);
});
it("does not fabricate mechanism when mechanism_note is unresolved", () => {
@@ -253,7 +254,8 @@ describe.sequential("assistant answer policy v1.1", () => {
expect(output.answer_structure_v11?.mechanism_block?.status).toBe("unresolved");
expect(output.answer_structure_v11?.mechanism_block?.mechanism_notes).toEqual([]);
expect(output.answer_structure_v11?.mechanism_block?.limitation_reason_codes).toContain("missing_mechanism");
expect(output.assistant_reply).toContain("mechanism_note is intentionally omitted");
expect(output.assistant_reply).toContain("Ограничения:");
expect(output.assistant_reply).not.toMatch(/mechanism_note|source_ref|canonical_ref|route|profile/i);
});
it("preserves legacy reply path when policy flag is OFF", async () => {
@@ -271,7 +273,7 @@ describe.sequential("assistant answer policy v1.1", () => {
});
expect(legacy.status).toBe(200);
expect(String(legacy.body.assistant_reply)).not.toContain("Answer summary:");
expect(String(legacy.body.assistant_reply)).not.toContain("Что сломано:");
const appPolicy = await createAppWithFlags({
answerPolicy: "1",
@@ -287,7 +289,7 @@ describe.sequential("assistant answer policy v1.1", () => {
});
expect(policy.status).toBe(200);
expect(String(policy.body.assistant_reply)).toContain("Answer summary:");
expect(String(policy.body.assistant_reply)).toContain("Что сломано:");
expect(String(policy.body.assistant_reply)).not.toBe(String(legacy.body.assistant_reply));
});
});