106 lines
3.4 KiB
TypeScript
106 lines
3.4 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import type { UnifiedRetrievalResult } from "../src/types/assistant";
|
|
import { assembleAssistantEvidenceBundle } from "../src/services/assistantEvidenceBundleAssembler";
|
|
|
|
function buildRetrieval(input?: Partial<UnifiedRetrievalResult>): UnifiedRetrievalResult {
|
|
return {
|
|
fragment_id: "F1",
|
|
requirement_ids: ["R1"],
|
|
route: "hybrid_store_plus_live",
|
|
status: "ok",
|
|
result_type: "summary",
|
|
items: [],
|
|
summary: {},
|
|
evidence: [],
|
|
why_included: [],
|
|
selection_reason: [],
|
|
risk_factors: [],
|
|
business_interpretation: [],
|
|
confidence: "medium",
|
|
limitations: [],
|
|
errors: [],
|
|
...input
|
|
};
|
|
}
|
|
|
|
describe("assistant evidence bundle assembler", () => {
|
|
it("builds evidence contract and retrieval status from the same retrieval set", () => {
|
|
const assembled = assembleAssistantEvidenceBundle({
|
|
retrievalCalls: [{ route: "hybrid_store_plus_live" }, { route: "store_canonical" }],
|
|
retrievalResults: [
|
|
buildRetrieval({
|
|
fragment_id: "F1",
|
|
requirement_ids: ["R1"],
|
|
route: "hybrid_store_plus_live",
|
|
status: "ok",
|
|
evidence: [
|
|
{
|
|
evidence_id: "ev-1",
|
|
claim_ref: "requirement:R1",
|
|
source_type: "retrieval_item",
|
|
source_ref: {
|
|
schema_version: "evidence_source_ref_v1",
|
|
namespace: "snapshot_2020",
|
|
entity: "document",
|
|
id: "doc-1",
|
|
period: "2020-07",
|
|
canonical_ref: "evidence_source_ref_v1|snapshot_2020|document|doc-1|2020-07"
|
|
},
|
|
pointer: {
|
|
fragment_id: "F1",
|
|
route: "hybrid_store_plus_live",
|
|
source: {
|
|
namespace: "snapshot_2020",
|
|
entity: "document",
|
|
id: "doc-1",
|
|
period: "2020-07"
|
|
},
|
|
locator: {
|
|
field_path: "amount",
|
|
item_index: 0
|
|
}
|
|
},
|
|
evidence_kind: "mechanism_link",
|
|
mechanism_note: "signal",
|
|
confidence: "medium",
|
|
limitation: null,
|
|
payload: {}
|
|
}
|
|
]
|
|
}),
|
|
buildRetrieval({
|
|
fragment_id: "F2",
|
|
requirement_ids: ["R2"],
|
|
route: "store_canonical",
|
|
status: "error",
|
|
result_type: "list",
|
|
errors: ["timeout"]
|
|
})
|
|
]
|
|
});
|
|
|
|
expect(assembled.evidenceBundleContractV1.retrieval_calls_total).toBe(2);
|
|
expect(assembled.evidenceBundleContractV1.retrieval_results_total).toBe(2);
|
|
expect(assembled.evidenceBundleContractV1.retrieval_status_breakdown.ok).toBe(1);
|
|
expect(assembled.evidenceBundleContractV1.retrieval_status_breakdown.error).toBe(1);
|
|
expect(assembled.evidenceBundleContractV1.evidence_total).toBe(1);
|
|
expect(assembled.evidenceBundleContractV1.source_refs_total).toBe(1);
|
|
expect(assembled.retrievalStatus).toEqual([
|
|
{
|
|
fragment_id: "F1",
|
|
requirement_ids: ["R1"],
|
|
route: "hybrid_store_plus_live",
|
|
status: "ok",
|
|
result_type: "summary"
|
|
},
|
|
{
|
|
fragment_id: "F2",
|
|
requirement_ids: ["R2"],
|
|
route: "store_canonical",
|
|
status: "error",
|
|
result_type: "list"
|
|
}
|
|
]);
|
|
});
|
|
});
|