NODEDC_1C/llm_normalizer/backend/tests/assistantStateTransitionRun...

163 lines
6.6 KiB
TypeScript

import { describe, expect, it } from "vitest";
import {
attachAssistantStateTransition,
resolveAssistantStateTransitionRuntime
} from "../src/services/assistantStateTransitionRuntimeAdapter";
describe("assistant state transition runtime adapter", () => {
it("applies root entry as a root-frame create and selected-object clear", () => {
const transition = resolveAssistantStateTransitionRuntime({
addressDebug: {
capability_id: "confirmed_inventory_on_hand_as_of_date",
detected_intent: "inventory_on_hand_as_of_date",
rows_matched: 4,
route_expectation_status: "matched"
},
groundingStatus: "grounded",
replyType: "factual"
});
expect(transition).toEqual(
expect.objectContaining({
schema_version: "assistant_state_transition_runtime_v1",
state_owner: "assistantStateTransitionRuntimeAdapter",
transition_id: "T1",
transition_title: "Root Query Entry",
application_status: "applied",
declared_carryover_depth: "none",
truth_gate_carryover_depth: "root_only",
effective_carryover_depth: "none",
expected_answer_mode: "confirmed"
})
);
expect(transition.state_actions).toEqual(
expect.objectContaining({
root_frame_state: "create",
selected_object_frame_state: "clear",
coverage_gate_state: "create",
answer_context_state: "create"
})
);
expect(transition.coverage_gate_state.truth_mode).toBe("confirmed");
});
it("keeps selected-object short follow-ups object-scoped", () => {
const transition = resolveAssistantStateTransitionRuntime({
addressDebug: {
capability_id: "inventory_inventory_purchase_provenance_for_item",
detected_intent: "inventory_purchase_provenance_for_item",
rows_matched: 1,
route_expectation_status: "matched"
},
addressRuntimeMeta: {
dialogContinuationContract: {
decision: "continue_previous",
target_intent: "inventory_purchase_provenance_for_item"
}
},
groundingStatus: "grounded",
replyType: "factual"
});
expect(transition.transition_id).toBe("T4");
expect(transition.application_status).toBe("applied");
expect(transition.effective_carryover_depth).toBe("object_only");
expect(transition.state_actions.selected_object_frame_state).toBe("reuse");
expect(transition.state_actions.root_frame_state).toBe("preserve");
expect(transition.forbidden_carryover).toEqual(
expect.arrayContaining(["generic_chat_fallback", "data_scope_selection_fallback", "object_focus_reset"])
);
});
it("turns missing-anchor cases into clarification state transitions", () => {
const transition = resolveAssistantStateTransitionRuntime({
addressDebug: {
capability_id: "inventory_inventory_purchase_provenance_for_item",
missing_required_filters: ["item"],
limited_reason_category: "missing_anchor"
},
replyType: "partial_coverage"
});
expect(transition.transition_id).toBe("T7");
expect(transition.application_status).toBe("clarification_required");
expect(transition.effective_carryover_depth).toBe("full");
expect(transition.state_actions.clarification_state).toBe("update");
expect(transition.coverage_gate_state.truth_mode).toBe("clarification_required");
});
it("blocks route expectation failures and forbids implicit follow-up reuse", () => {
const transition = resolveAssistantStateTransitionRuntime({
addressDebug: {
capability_id: "confirmed_inventory_on_hand_as_of_date",
route_expectation_status: "mismatch"
},
groundingStatus: "route_mismatch_blocked",
replyType: "partial_coverage"
});
expect(transition.transition_id).toBe("T10");
expect(transition.application_status).toBe("blocked");
expect(transition.effective_carryover_depth).toBe("none");
expect(transition.state_actions.coverage_gate_state).toBe("block");
expect(transition.forbidden_carryover).toEqual(
expect.arrayContaining(["blocked_as_confirmed_factual_answer", "implicit_followup_reuse"])
);
});
it("attaches compact debug fields and preserves the nested transition contract", () => {
const debug = attachAssistantStateTransition(
{
assistant_runtime_contract_v1: {
schema_version: "assistant_runtime_contracts_v1",
transition_contract_id: "T8",
transition_contract_title: "Meta Follow-Up Over Answer Object",
transition_contract_reason: ["capability_meta_followup_tool_gate_reason"],
capability_contract_id: "confirmed_inventory_on_hand_as_of_date",
capability_contract_reason: ["intent_matched_capability_contract"],
truth_gate_contract_status: "partial_supported",
carryover_eligibility: "meta_only"
},
assistant_truth_answer_policy_v1: {
schema_version: "assistant_truth_answer_policy_runtime_v1",
policy_owner: "assistantTruthAnswerPolicyRuntimeAdapter",
truth_gate: {
schema_version: "assistant_truth_answer_policy_runtime_v1",
policy_owner: "assistantTruthAnswerPolicyRuntimeAdapter",
coverage_status: "partial",
evidence_grade: "weak",
grounding_status: "partial",
truth_mode: "limited",
carryover_eligibility: "meta_only",
reason_codes: ["truth_gate_partial_supported"],
source_truth_gate_status: "partial_supported",
blocked_or_limited_explanation: "evidence_or_coverage_is_partial"
},
answer_shape: {
schema_version: "assistant_truth_answer_policy_runtime_v1",
policy_owner: "assistantTruthAnswerPolicyRuntimeAdapter",
answer_shape: "limited_with_reason",
reply_type: "deep_analysis",
capability_contract_id: "confirmed_inventory_on_hand_as_of_date",
transition_contract_id: "T8",
may_state_confirmed_facts: true,
must_include_limitation: true,
may_power_followup: true,
required_sections: ["direct_answer", "evidence_window", "limitations"],
downgrade_only: true
}
}
},
{
replyType: "deep_analysis"
}
);
expect(debug.state_transition_id).toBe("T8");
expect(debug.state_transition_status).toBe("applied");
expect(debug.effective_carryover_depth).toBe("meta_only");
expect(debug.assistant_state_transition_v1.state_actions.meta_frame_state).toBe("create");
expect(debug.state_transition_contract.state_actions.answer_context_state).toBe("reuse");
});
});