ARCH: включить оборот конкретного контрагента в revenue-контур
This commit is contained in:
@@ -14,4 +14,13 @@ describe("address filter extractor regressions", () => {
|
||||
expect(extracted.warnings).toContain("period_derived_from_month_phrase");
|
||||
expect(extracted.warnings).not.toContain("period_derived_from_tax_quarter_for_confirmed_vat_liability");
|
||||
});
|
||||
it("extracts a compact counterparty tail for customer revenue profile", () => {
|
||||
const extracted = extractAddressFilters(
|
||||
"\u043a\u0430\u043a\u043e\u0439 \u043e\u0431\u043e\u0440\u043e\u0442 \u0431\u044b\u043b \u0441\u0432\u043a",
|
||||
"customer_revenue_and_payments"
|
||||
);
|
||||
|
||||
expect(extracted.extracted_filters.counterparty).toBe("\u0441\u0432\u043a");
|
||||
expect(extracted.warnings).toContain("counterparty_anchor_derived_from_revenue_phrase");
|
||||
});
|
||||
});
|
||||
|
||||
@@ -35,6 +35,23 @@ describe("addressIntentResolver regression bridges", () => {
|
||||
expect(result.intent).toBe("customer_revenue_and_payments");
|
||||
});
|
||||
|
||||
it("detects specific counterparty turnover wording as revenue profile", () => {
|
||||
const result = resolveAddressIntent(
|
||||
"\u043a\u0430\u043a\u043e\u0439 \u043e\u0431\u043e\u0440\u043e\u0442 \u0431\u044b\u043b \u0441\u0432\u043a"
|
||||
);
|
||||
|
||||
expect(result.intent).toBe("customer_revenue_and_payments");
|
||||
expect(result.reasons).toContain("specific_counterparty_revenue_bridge_signal_detected");
|
||||
});
|
||||
|
||||
it("keeps documents by counterparty wording out of revenue bridge", () => {
|
||||
const result = resolveAddressIntent(
|
||||
"\u043f\u043e\u043a\u0430\u0436\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u043f\u043e \u0441\u0432\u043a"
|
||||
);
|
||||
|
||||
expect(result.intent).toBe("list_documents_by_counterparty");
|
||||
});
|
||||
|
||||
it("does not collapse very old stock request into generic inventory snapshot", () => {
|
||||
const result = resolveAddressIntent("Есть ли остатки товара, которые закупались очень давно");
|
||||
|
||||
|
||||
@@ -965,4 +965,52 @@ describe("assistantTransitionPolicy", () => {
|
||||
|
||||
expect(carryover).toBeNull();
|
||||
});
|
||||
|
||||
it("drops carryover for a supported current-turn counterparty revenue pivot with a new entity", () => {
|
||||
const policy = buildPolicy({
|
||||
findLastAddressAssistantItem: () => ({
|
||||
text: "Documents by previous counterparty",
|
||||
debug: {
|
||||
execution_lane: "address_query",
|
||||
answer_grounding_check: { status: "grounded" },
|
||||
detected_intent: "list_documents_by_counterparty",
|
||||
extracted_filters: {
|
||||
counterparty: "Previous Counterparty",
|
||||
organization: "Org Alt"
|
||||
},
|
||||
anchor_type: "counterparty",
|
||||
anchor_value_resolved: "Previous Counterparty"
|
||||
}
|
||||
}),
|
||||
hasAddressFollowupContextSignal: () => true,
|
||||
isImplicitAddressContinuationByLlm: () => true,
|
||||
resolveAssistantTurnMeaning: () => ({
|
||||
schema_version: "assistant_turn_meaning_v1",
|
||||
asked_domain_family: "counterparty",
|
||||
asked_action_family: "counterparty_value_or_turnover",
|
||||
explicit_intent_candidate: "customer_revenue_and_payments",
|
||||
intent_override_strength: "explicit_current_turn_intent",
|
||||
explicit_entity_candidates: [
|
||||
{
|
||||
type: "counterparty",
|
||||
value: "svk",
|
||||
source: "current_turn_loose_entity_tail"
|
||||
}
|
||||
],
|
||||
stale_replay_forbidden: false
|
||||
}),
|
||||
resolveAddressIntent: () => ({ intent: "customer_revenue_and_payments" }),
|
||||
resolveAddressIntentFamily: () => "counterparty"
|
||||
});
|
||||
|
||||
const carryover = policy.resolveAddressFollowupCarryoverContext(
|
||||
"\u043a\u0430\u043a\u043e\u0439 \u043e\u0431\u043e\u0440\u043e\u0442 \u0431\u044b\u043b \u0441\u0432\u043a",
|
||||
[],
|
||||
null,
|
||||
null,
|
||||
null
|
||||
);
|
||||
|
||||
expect(carryover).toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -33,7 +33,7 @@ describe("assistantTurnMeaningPolicy", () => {
|
||||
expect(meaning.stale_replay_forbidden).toBe(false);
|
||||
});
|
||||
|
||||
it("marks unsupported counterparty turnover as understood and forbids stale replay", () => {
|
||||
it("promotes specific counterparty turnover to the supported revenue intent", () => {
|
||||
const policy = buildPolicy();
|
||||
|
||||
const meaning = policy.resolveAssistantTurnMeaning({
|
||||
@@ -41,11 +41,12 @@ describe("assistantTurnMeaningPolicy", () => {
|
||||
"\u043a\u0430\u043a\u043e\u0439 \u043e\u0431\u043e\u0440\u043e\u0442 \u0431\u044b\u043b \u0441\u0432\u043a"
|
||||
});
|
||||
|
||||
expect(meaning.explicit_intent_candidate).toBeNull();
|
||||
expect(meaning.explicit_intent_candidate).toBe("customer_revenue_and_payments");
|
||||
expect(meaning.asked_domain_family).toBe("counterparty");
|
||||
expect(meaning.asked_action_family).toBe("counterparty_value_or_turnover");
|
||||
expect(meaning.unsupported_but_understood_family).toBe("counterparty_value_or_turnover");
|
||||
expect(meaning.stale_replay_forbidden).toBe(true);
|
||||
expect(meaning.unsupported_but_understood_family).toBeNull();
|
||||
expect(meaning.stale_replay_forbidden).toBe(false);
|
||||
expect(meaning.carryover_budget).toBe("matching_family_only");
|
||||
expect(meaning.explicit_entity_candidates).toEqual([
|
||||
{
|
||||
type: "counterparty",
|
||||
|
||||
Reference in New Issue
Block a user