Уточнить оси доказательств Autonomy Core 1С
This commit is contained in:
parent
f7314b0212
commit
4d1b25cca7
|
|
@ -34,7 +34,10 @@ function uniqueStrings(values) {
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
function providedAxesFromMeaning(meaning) {
|
function isExplicitDate(value) {
|
||||||
|
return Boolean(value && /^\d{4}-\d{2}-\d{2}$/.test(value));
|
||||||
|
}
|
||||||
|
function providedAxesFromMeaning(meaning, graph) {
|
||||||
const result = [];
|
const result = [];
|
||||||
if ((meaning?.explicit_entity_candidates?.length ?? 0) > 0) {
|
if ((meaning?.explicit_entity_candidates?.length ?? 0) > 0) {
|
||||||
result.push("counterparty");
|
result.push("counterparty");
|
||||||
|
|
@ -43,8 +46,15 @@ function providedAxesFromMeaning(meaning) {
|
||||||
if (toNonEmptyString(meaning?.explicit_organization_scope)) {
|
if (toNonEmptyString(meaning?.explicit_organization_scope)) {
|
||||||
result.push("organization");
|
result.push("organization");
|
||||||
}
|
}
|
||||||
if (toNonEmptyString(meaning?.explicit_date_scope)) {
|
const explicitDateScope = toNonEmptyString(meaning?.explicit_date_scope);
|
||||||
|
if (explicitDateScope) {
|
||||||
result.push("period");
|
result.push("period");
|
||||||
|
if (isExplicitDate(explicitDateScope)) {
|
||||||
|
result.push("as_of_date");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (graph?.time_scope_need === "all_time_scope") {
|
||||||
|
result.push("all_time_scope");
|
||||||
}
|
}
|
||||||
if (toNonEmptyString(meaning?.asked_aggregation_axis)) {
|
if (toNonEmptyString(meaning?.asked_aggregation_axis)) {
|
||||||
result.push("aggregate_axis");
|
result.push("aggregate_axis");
|
||||||
|
|
@ -116,7 +126,7 @@ function buildAssistantEvidencePlanner(input) {
|
||||||
const plan = input.discoveryPlan;
|
const plan = input.discoveryPlan;
|
||||||
const turnMeaning = plan.turn_meaning_ref;
|
const turnMeaning = plan.turn_meaning_ref;
|
||||||
const requiredAxes = uniqueStrings(plan.required_axes);
|
const requiredAxes = uniqueStrings(plan.required_axes);
|
||||||
const providedAxes = providedAxesFromMeaning(turnMeaning);
|
const providedAxes = providedAxesFromMeaning(turnMeaning, graph);
|
||||||
const graphClarificationGaps = uniqueStrings(graph?.clarification_gaps ?? []);
|
const graphClarificationGaps = uniqueStrings(graph?.clarification_gaps ?? []);
|
||||||
const additionalAxisGaps = uniqueStrings(input.additionalMissingAxes ?? []).filter((axis) => !providedAxes.includes(axis) && (requiredAxes.includes(axis) || USER_ACTIONABLE_AXIS_SET.has(axis)));
|
const additionalAxisGaps = uniqueStrings(input.additionalMissingAxes ?? []).filter((axis) => !providedAxes.includes(axis) && (requiredAxes.includes(axis) || USER_ACTIONABLE_AXIS_SET.has(axis)));
|
||||||
const axisGaps = uniqueStrings([...additionalAxisGaps, ...missingAxes(requiredAxes, providedAxes)]);
|
const axisGaps = uniqueStrings([...additionalAxisGaps, ...missingAxes(requiredAxes, providedAxes)]);
|
||||||
|
|
|
||||||
|
|
@ -113,7 +113,14 @@ function uniqueStrings(values: unknown[]): string[] {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
function providedAxesFromMeaning(meaning: AssistantMcpDiscoveryTurnMeaningRef | null): string[] {
|
function isExplicitDate(value: string | null): boolean {
|
||||||
|
return Boolean(value && /^\d{4}-\d{2}-\d{2}$/.test(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
function providedAxesFromMeaning(
|
||||||
|
meaning: AssistantMcpDiscoveryTurnMeaningRef | null,
|
||||||
|
graph: AssistantMcpDiscoveryDataNeedGraphContract | null
|
||||||
|
): string[] {
|
||||||
const result: string[] = [];
|
const result: string[] = [];
|
||||||
if ((meaning?.explicit_entity_candidates?.length ?? 0) > 0) {
|
if ((meaning?.explicit_entity_candidates?.length ?? 0) > 0) {
|
||||||
result.push("counterparty");
|
result.push("counterparty");
|
||||||
|
|
@ -122,8 +129,15 @@ function providedAxesFromMeaning(meaning: AssistantMcpDiscoveryTurnMeaningRef |
|
||||||
if (toNonEmptyString(meaning?.explicit_organization_scope)) {
|
if (toNonEmptyString(meaning?.explicit_organization_scope)) {
|
||||||
result.push("organization");
|
result.push("organization");
|
||||||
}
|
}
|
||||||
if (toNonEmptyString(meaning?.explicit_date_scope)) {
|
const explicitDateScope = toNonEmptyString(meaning?.explicit_date_scope);
|
||||||
|
if (explicitDateScope) {
|
||||||
result.push("period");
|
result.push("period");
|
||||||
|
if (isExplicitDate(explicitDateScope)) {
|
||||||
|
result.push("as_of_date");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (graph?.time_scope_need === "all_time_scope") {
|
||||||
|
result.push("all_time_scope");
|
||||||
}
|
}
|
||||||
if (toNonEmptyString(meaning?.asked_aggregation_axis)) {
|
if (toNonEmptyString(meaning?.asked_aggregation_axis)) {
|
||||||
result.push("aggregate_axis");
|
result.push("aggregate_axis");
|
||||||
|
|
@ -209,7 +223,7 @@ export function buildAssistantEvidencePlanner(
|
||||||
const plan = input.discoveryPlan;
|
const plan = input.discoveryPlan;
|
||||||
const turnMeaning = plan.turn_meaning_ref;
|
const turnMeaning = plan.turn_meaning_ref;
|
||||||
const requiredAxes = uniqueStrings(plan.required_axes);
|
const requiredAxes = uniqueStrings(plan.required_axes);
|
||||||
const providedAxes = providedAxesFromMeaning(turnMeaning);
|
const providedAxes = providedAxesFromMeaning(turnMeaning, graph);
|
||||||
const graphClarificationGaps = uniqueStrings(graph?.clarification_gaps ?? []);
|
const graphClarificationGaps = uniqueStrings(graph?.clarification_gaps ?? []);
|
||||||
const additionalAxisGaps = uniqueStrings(input.additionalMissingAxes ?? []).filter(
|
const additionalAxisGaps = uniqueStrings(input.additionalMissingAxes ?? []).filter(
|
||||||
(axis) => !providedAxes.includes(axis) && (requiredAxes.includes(axis) || USER_ACTIONABLE_AXIS_SET.has(axis)),
|
(axis) => !providedAxes.includes(axis) && (requiredAxes.includes(axis) || USER_ACTIONABLE_AXIS_SET.has(axis)),
|
||||||
|
|
|
||||||
|
|
@ -95,6 +95,68 @@ describe("assistant MCP discovery planner", () => {
|
||||||
expect(result.reason_codes).toContain("planner_selected_chain_matches_catalog_top");
|
expect(result.reason_codes).toContain("planner_selected_chain_matches_catalog_top");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("treats an explicit date as a provided as-of-date evidence axis", () => {
|
||||||
|
const result = planAssistantMcpDiscovery({
|
||||||
|
dataNeedGraph: {
|
||||||
|
schema_version: "assistant_data_need_graph_v1",
|
||||||
|
policy_owner: "assistantMcpDiscoveryDataNeedGraph",
|
||||||
|
subject_candidates: [],
|
||||||
|
business_fact_family: "inventory_stock_snapshot",
|
||||||
|
action_family: "stock_snapshot",
|
||||||
|
aggregation_need: null,
|
||||||
|
time_scope_need: "as_of_date_required",
|
||||||
|
comparison_need: null,
|
||||||
|
ranking_need: null,
|
||||||
|
proof_expectation: "coverage_checked_fact",
|
||||||
|
clarification_gaps: [],
|
||||||
|
decomposition_candidates: [],
|
||||||
|
forbidden_overclaim_flags: ["no_raw_model_claims"],
|
||||||
|
reason_codes: ["data_need_graph_built"]
|
||||||
|
},
|
||||||
|
turnMeaning: {
|
||||||
|
asked_action_family: "stock_snapshot",
|
||||||
|
explicit_organization_scope: "Org",
|
||||||
|
explicit_date_scope: "2020-05-31"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(result.selected_chain_id).toBe("inventory_stock_snapshot");
|
||||||
|
expect(result.evidence_plan.evidence_axes.required_axes).toContain("as_of_date");
|
||||||
|
expect(result.evidence_plan.evidence_axes.provided_axes).toContain("period");
|
||||||
|
expect(result.evidence_plan.evidence_axes.provided_axes).toContain("as_of_date");
|
||||||
|
expect(result.evidence_plan.evidence_axes.missing_axes).not.toContain("as_of_date");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("treats graph all-time scope as a provided evidence axis", () => {
|
||||||
|
const result = planAssistantMcpDiscovery({
|
||||||
|
dataNeedGraph: {
|
||||||
|
schema_version: "assistant_data_need_graph_v1",
|
||||||
|
policy_owner: "assistantMcpDiscoveryDataNeedGraph",
|
||||||
|
subject_candidates: ["SVK"],
|
||||||
|
business_fact_family: "value_flow",
|
||||||
|
action_family: "net_value_flow",
|
||||||
|
aggregation_need: null,
|
||||||
|
time_scope_need: "all_time_scope",
|
||||||
|
comparison_need: "incoming_vs_outgoing",
|
||||||
|
ranking_need: null,
|
||||||
|
proof_expectation: "coverage_checked_fact",
|
||||||
|
clarification_gaps: [],
|
||||||
|
decomposition_candidates: [],
|
||||||
|
forbidden_overclaim_flags: ["no_raw_model_claims"],
|
||||||
|
reason_codes: ["data_need_graph_built"]
|
||||||
|
},
|
||||||
|
turnMeaning: {
|
||||||
|
asked_action_family: "net_value_flow",
|
||||||
|
explicit_entity_candidates: ["SVK"]
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(result.selected_chain_id).toBe("value_flow_comparison");
|
||||||
|
expect(result.evidence_plan.evidence_axes.required_axes).toContain("all_time_scope");
|
||||||
|
expect(result.evidence_plan.evidence_axes.provided_axes).toContain("all_time_scope");
|
||||||
|
expect(result.evidence_plan.evidence_axes.missing_axes).not.toContain("all_time_scope");
|
||||||
|
});
|
||||||
|
|
||||||
it("keeps representative graph-selected chains aligned with top catalog template matches", () => {
|
it("keeps representative graph-selected chains aligned with top catalog template matches", () => {
|
||||||
const graph = (
|
const graph = (
|
||||||
businessFactFamily: string,
|
businessFactFamily: string,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue