Fas 2 steg 2: Inventory Trust Engine - decay-profiler och cache-jobb

This commit is contained in:
Sven (AAMOS AI)
2026-08-06 23:25:32 +07:00
parent 8ae4bf6ec3
commit bcf932d2ff
17 changed files with 18296 additions and 61 deletions
+77 -32
View File
@@ -1,54 +1,99 @@
import { describe, expect, it } from "vitest";
import { computeTrust, worstTrustState } from "../src/trust.js";
import { applyDecay, computeTrust, worstTrustState } from "../src/trust.js";
const PINNED = new Date("2026-08-06T12:00:00.000Z");
describe("applyDecay", () => {
it("returns original confidence when elapsed days is zero", () => {
expect(applyDecay(0.8, 0)).toBe(0.8);
});
it("halves confidence after halfLifeDays", () => {
expect(applyDecay(1.0, 7, { halfLifeDays: 7, staleAfterDays: 30 })).toBeCloseTo(0.5, 3);
});
it("returns zero when elapsed days reaches staleAfterDays", () => {
expect(applyDecay(0.8, 30, { halfLifeDays: 7, staleAfterDays: 30 })).toBe(0);
});
});
describe("computeTrust", () => {
it("returns trusted for a fresh high-confidence item even without user verification", () => {
const result = computeTrust({
confidence: 0.8,
verifiedByUser: false,
lastVerifiedAt: null,
quantity: 2,
updatedAt: new Date(),
});
it("returns trusted for a fresh high-confidence item", () => {
const result = computeTrust(
{
confidence: 0.8,
verifiedByUser: false,
lastVerifiedAt: null,
quantity: 2,
updatedAt: PINNED,
},
PINNED,
);
expect(result.state).toBe("trusted");
expect(result.score).toBeGreaterThanOrEqual(60);
});
it("decays when last verification is old", () => {
const thirtyDaysAgo = new Date(Date.now() - 30 * 86_400_000);
const result = computeTrust({
confidence: 0.6,
verifiedByUser: true,
lastVerifiedAt: thirtyDaysAgo,
quantity: 1,
updatedAt: thirtyDaysAgo,
});
const sevenDaysAgo = new Date(PINNED.getTime() - 7 * 86_400_000);
const result = computeTrust(
{
confidence: 0.8,
verifiedByUser: true,
lastVerifiedAt: sevenDaysAgo,
quantity: 1,
updatedAt: sevenDaysAgo,
},
PINNED,
);
expect(result.state).toBe("decaying");
});
it("is stale for very old unverified low-confidence items", () => {
const sixtyDaysAgo = new Date(Date.now() - 60 * 86_400_000);
const result = computeTrust({
confidence: 0.2,
verifiedByUser: false,
lastVerifiedAt: null,
quantity: 1,
updatedAt: sixtyDaysAgo,
});
const sixtyDaysAgo = new Date(PINNED.getTime() - 60 * 86_400_000);
const result = computeTrust(
{
confidence: 0.2,
verifiedByUser: false,
lastVerifiedAt: null,
quantity: 1,
updatedAt: sixtyDaysAgo,
},
PINNED,
);
expect(result.state).toBe("stale");
});
it("is trusted when user verified recently", () => {
const result = computeTrust({
confidence: 0.7,
verifiedByUser: true,
lastVerifiedAt: new Date(),
quantity: 1,
updatedAt: new Date(),
});
const result = computeTrust(
{
confidence: 0.7,
verifiedByUser: true,
lastVerifiedAt: PINNED,
quantity: 1,
updatedAt: PINNED,
},
PINNED,
);
expect(result.state).toBe("trusted");
expect(result.score).toBeGreaterThanOrEqual(70);
});
it("uses custom decay profile to accelerate staleness", () => {
const tenDaysAgo = new Date(PINNED.getTime() - 10 * 86_400_000);
const fast = { halfLifeDays: 3, staleAfterDays: 10 };
const result = computeTrust(
{
confidence: 0.9,
verifiedByUser: true,
lastVerifiedAt: tenDaysAgo,
quantity: 1,
updatedAt: tenDaysAgo,
},
PINNED,
fast,
);
expect(result.state).toBe("stale");
});
});
describe("worstTrustState", () => {