260 lines
11 KiB
TypeScript
260 lines
11 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import {
|
|
attachAssistantTruthAnswerPolicy,
|
|
resolveAssistantTruthAnswerPolicyRuntime
|
|
} from "../src/services/assistantTruthAnswerPolicyRuntimeAdapter";
|
|
|
|
describe("assistant truth answer policy runtime adapter", () => {
|
|
it("emits confirmed truth gate and factual answer shape for grounded exact results", () => {
|
|
const policy = resolveAssistantTruthAnswerPolicyRuntime({
|
|
addressDebug: {
|
|
capability_id: "confirmed_inventory_on_hand_as_of_date",
|
|
detected_intent: "inventory_on_hand_as_of_date",
|
|
rows_matched: 3,
|
|
route_expectation_status: "matched",
|
|
evidence_strength: "strong"
|
|
},
|
|
groundingStatus: "grounded",
|
|
replyType: "factual"
|
|
});
|
|
|
|
expect(policy.truth_gate).toEqual(
|
|
expect.objectContaining({
|
|
schema_version: "assistant_truth_answer_policy_runtime_v1",
|
|
policy_owner: "assistantTruthAnswerPolicyRuntimeAdapter",
|
|
coverage_status: "full",
|
|
grounding_status: "grounded",
|
|
truth_mode: "confirmed",
|
|
evidence_grade: "strong",
|
|
source_truth_gate_status: "full_confirmed",
|
|
carryover_eligibility: "root_only",
|
|
blocked_or_limited_explanation: null
|
|
})
|
|
);
|
|
expect(policy.answer_shape).toEqual(
|
|
expect.objectContaining({
|
|
answer_shape: "confirmed_factual",
|
|
reply_type: "factual",
|
|
capability_contract_id: "confirmed_inventory_on_hand_as_of_date",
|
|
transition_contract_id: "T1",
|
|
may_state_confirmed_facts: true,
|
|
must_include_limitation: false,
|
|
may_power_followup: true,
|
|
required_sections: ["direct_answer", "evidence_basis"],
|
|
downgrade_only: true
|
|
})
|
|
);
|
|
});
|
|
|
|
it("keeps temporal/contextual limits as limited answer shape with explicit reason codes", () => {
|
|
const policy = resolveAssistantTruthAnswerPolicyRuntime({
|
|
addressDebug: {
|
|
capability_id: "confirmed_inventory_on_hand_as_of_date",
|
|
temporal_guard_outcome: "ambiguous_limited",
|
|
rows_matched: 2,
|
|
limitations: ["period_window_auto_broadened_to_available_data"]
|
|
},
|
|
groundingStatus: "partial",
|
|
replyType: "partial_coverage"
|
|
});
|
|
|
|
expect(policy.truth_gate.coverage_status).toBe("partial");
|
|
expect(policy.truth_gate.truth_mode).toBe("limited");
|
|
expect(policy.truth_gate.source_truth_gate_status).toBe("limited_temporal_or_contextual");
|
|
expect(policy.truth_gate.blocked_or_limited_explanation).toBe("temporal_or_contextual_limit");
|
|
expect(policy.truth_gate.reason_codes).toContain("period_window_auto_broadened_to_available_data");
|
|
expect(policy.answer_shape.answer_shape).toBe("limited_with_reason");
|
|
expect(policy.answer_shape.must_include_limitation).toBe(true);
|
|
expect(policy.answer_shape.required_sections).toEqual(["direct_answer", "evidence_window", "limitations"]);
|
|
});
|
|
|
|
it("blocks route expectation failures and prevents follow-up carryover", () => {
|
|
const policy = resolveAssistantTruthAnswerPolicyRuntime({
|
|
addressDebug: {
|
|
capability_id: "confirmed_inventory_on_hand_as_of_date",
|
|
route_expectation_status: "mismatch",
|
|
route_expectation_reason: "expected_confirmed_balance_route"
|
|
},
|
|
groundingStatus: "route_mismatch_blocked",
|
|
replyType: "partial_coverage"
|
|
});
|
|
|
|
expect(policy.truth_gate.coverage_status).toBe("blocked");
|
|
expect(policy.truth_gate.grounding_status).toBe("route_mismatch_blocked");
|
|
expect(policy.truth_gate.truth_mode).toBe("unsupported");
|
|
expect(policy.truth_gate.carryover_eligibility).toBe("none");
|
|
expect(policy.truth_gate.reason_codes).toContain("expected_confirmed_balance_route");
|
|
expect(policy.answer_shape.answer_shape).toBe("blocked_no_answer");
|
|
expect(policy.answer_shape.may_state_confirmed_facts).toBe(false);
|
|
expect(policy.answer_shape.may_power_followup).toBe(false);
|
|
});
|
|
|
|
it("honors explicit exact-lane truth gate contracts for factual negative answers", () => {
|
|
const policy = resolveAssistantTruthAnswerPolicyRuntime({
|
|
addressDebug: {
|
|
capability_id: "inventory_counterparty_item_flow",
|
|
rows_matched: 0,
|
|
address_coverage_evidence_v1: {
|
|
schema_version: "address_coverage_evidence_v1",
|
|
policy_owner: "addressCoverageEvidencePolicy",
|
|
requested_result_mode: "confirmed_balance",
|
|
result_mode: "confirmed_balance",
|
|
evidence_strength: "medium",
|
|
balance_confirmed: true,
|
|
as_of_date_basis: "period_end",
|
|
coverage_status: "full",
|
|
evidence_basis: "exact_negative",
|
|
reason_codes: ["evidence_basis_exact_negative"]
|
|
},
|
|
address_truth_gate_v1: {
|
|
schema_version: "address_truth_gate_v1",
|
|
policy_owner: "addressTruthGatePolicy",
|
|
truth_gate_status: "full_confirmed",
|
|
carryover_eligibility: "root_only",
|
|
limited_reason_category: "empty_match",
|
|
runtime_readiness: "LIVE_QUERYABLE_WITH_LIMITS",
|
|
reason_codes: ["counterparty_item_flow_exact_negative_response"],
|
|
blocked_or_limited_explanation: null
|
|
}
|
|
},
|
|
replyType: "factual"
|
|
});
|
|
|
|
expect(policy.truth_gate.coverage_status).toBe("full");
|
|
expect(policy.truth_gate.grounding_status).toBe("grounded");
|
|
expect(policy.truth_gate.truth_mode).toBe("confirmed");
|
|
expect(policy.truth_gate.evidence_grade).toBe("medium");
|
|
expect(policy.truth_gate.carryover_eligibility).toBe("root_only");
|
|
expect(policy.truth_gate.reason_codes).toContain("counterparty_item_flow_exact_negative_response");
|
|
expect(policy.truth_gate.reason_codes).toContain("evidence_basis_exact_negative");
|
|
expect(policy.answer_shape.answer_shape).toBe("confirmed_factual");
|
|
expect(policy.answer_shape.may_power_followup).toBe(true);
|
|
});
|
|
|
|
it("downgrades stale full-confirmed truth gates when coverage evidence is only heuristic", () => {
|
|
const policy = resolveAssistantTruthAnswerPolicyRuntime({
|
|
addressDebug: {
|
|
capability_id: "address_open_items_by_counterparty_or_contract",
|
|
rows_matched: 8,
|
|
answer_grounding_check: {
|
|
status: "grounded",
|
|
reasons: ["confirmed_balance_unavailable_fallback_to_heuristic_candidates"]
|
|
},
|
|
address_coverage_evidence_v1: {
|
|
schema_version: "address_coverage_evidence_v1",
|
|
policy_owner: "addressCoverageEvidencePolicy",
|
|
requested_result_mode: "confirmed_balance",
|
|
result_mode: "heuristic_candidates",
|
|
evidence_strength: "medium",
|
|
balance_confirmed: false,
|
|
as_of_date_basis: "period_range",
|
|
coverage_status: "partial",
|
|
evidence_basis: "heuristic_candidates",
|
|
reason_codes: [
|
|
"coverage_status_partial",
|
|
"result_mode_heuristic_candidates",
|
|
"balance_confirmed_false"
|
|
]
|
|
},
|
|
address_truth_gate_v1: {
|
|
schema_version: "address_truth_gate_v1",
|
|
policy_owner: "addressTruthGatePolicy",
|
|
truth_gate_status: "full_confirmed",
|
|
carryover_eligibility: "none",
|
|
limited_reason_category: null,
|
|
runtime_readiness: "LIVE_QUERYABLE_WITH_LIMITS",
|
|
reason_codes: ["stale_full_confirmed_shadow"],
|
|
blocked_or_limited_explanation: null
|
|
}
|
|
},
|
|
replyType: "factual"
|
|
});
|
|
|
|
expect(policy.truth_gate.coverage_status).toBe("partial");
|
|
expect(policy.truth_gate.truth_mode).toBe("limited");
|
|
expect(policy.truth_gate.evidence_grade).toBe("medium");
|
|
expect(policy.truth_gate.reason_codes).toContain("confirmed_balance_unavailable_fallback_to_heuristic_candidates");
|
|
expect(policy.answer_shape.answer_shape).toBe("limited_with_reason");
|
|
expect(policy.answer_shape.must_include_limitation).toBe(true);
|
|
});
|
|
|
|
it("downgrades stale full-confirmed truth gates from top-level heuristic result metadata", () => {
|
|
const policy = resolveAssistantTruthAnswerPolicyRuntime({
|
|
addressDebug: {
|
|
capability_id: "address_open_items_by_counterparty_or_contract",
|
|
rows_matched: 8,
|
|
result_mode: "heuristic_candidates",
|
|
evidence_strength: "medium",
|
|
balance_confirmed: false,
|
|
answer_grounding_check: {
|
|
status: "grounded",
|
|
reasons: ["confirmed_balance_unavailable_fallback_to_heuristic_candidates"]
|
|
},
|
|
address_truth_gate_v1: {
|
|
schema_version: "address_truth_gate_v1",
|
|
policy_owner: "addressTruthGatePolicy",
|
|
truth_gate_status: "full_confirmed",
|
|
carryover_eligibility: "none",
|
|
limited_reason_category: null,
|
|
runtime_readiness: "LIVE_QUERYABLE_WITH_LIMITS",
|
|
reason_codes: [],
|
|
blocked_or_limited_explanation: null
|
|
}
|
|
},
|
|
replyType: "factual"
|
|
});
|
|
|
|
expect(policy.truth_gate.coverage_status).toBe("partial");
|
|
expect(policy.truth_gate.truth_mode).toBe("limited");
|
|
expect(policy.truth_gate.evidence_grade).toBe("medium");
|
|
expect(policy.answer_shape.answer_shape).toBe("limited_with_reason");
|
|
});
|
|
|
|
it("keeps explicit temporal-limited factual answers limited in the truth contract", () => {
|
|
const policy = resolveAssistantTruthAnswerPolicyRuntime({
|
|
addressDebug: {
|
|
capability_id: "inventory_inventory_purchase_provenance_for_item",
|
|
rows_matched: 2,
|
|
address_truth_gate_v1: {
|
|
schema_version: "address_truth_gate_v1",
|
|
policy_owner: "addressTruthGatePolicy",
|
|
truth_gate_status: "limited_temporal_or_contextual",
|
|
carryover_eligibility: "object_only",
|
|
limited_reason_category: null,
|
|
runtime_readiness: "LIVE_QUERYABLE_WITH_LIMITS",
|
|
reason_codes: ["period_window_auto_broadened_to_available_data"],
|
|
blocked_or_limited_explanation: "temporal_or_contextual_limit"
|
|
}
|
|
},
|
|
replyType: "factual"
|
|
});
|
|
|
|
expect(policy.truth_gate.coverage_status).toBe("partial");
|
|
expect(policy.truth_gate.truth_mode).toBe("limited");
|
|
expect(policy.truth_gate.carryover_eligibility).toBe("object_only");
|
|
expect(policy.truth_gate.blocked_or_limited_explanation).toBe("temporal_or_contextual_limit");
|
|
expect(policy.answer_shape.answer_shape).toBe("limited_with_reason");
|
|
expect(policy.answer_shape.must_include_limitation).toBe(true);
|
|
});
|
|
|
|
it("attaches top-level debug fields without hiding the nested contract", () => {
|
|
const debug = attachAssistantTruthAnswerPolicy(
|
|
{
|
|
capability_id: "inventory_inventory_purchase_provenance_for_item",
|
|
missing_required_filters: ["item"],
|
|
limited_reason_category: "missing_anchor"
|
|
},
|
|
{
|
|
replyType: "partial_coverage"
|
|
}
|
|
);
|
|
|
|
expect(debug.assistant_truth_answer_policy_v1.schema_version).toBe("assistant_truth_answer_policy_runtime_v1");
|
|
expect(debug.coverage_gate_contract.truth_mode).toBe("clarification_required");
|
|
expect(debug.answer_shape_contract.answer_shape).toBe("clarification_required");
|
|
expect(debug.truth_mode).toBe("clarification_required");
|
|
expect(debug.carryover_eligibility).toBe("none");
|
|
expect(debug.answer_shape).toBe("clarification_required");
|
|
});
|
|
});
|