Skip to content

Commit 3d6757a

Browse files
authored
Merge pull request #15 from coe0718/codex/ranking-readability-cleanups
[codex] Follow up ranking readability suggestions
2 parents cb857d2 + 29be8fe commit 3d6757a

2 files changed

Lines changed: 22 additions & 8 deletions

File tree

src/memory/__tests__/ranking.test.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,20 @@ describe("memory ranking", () => {
7575
expect(shouldIncludeEpisodeInContext(staleWeak)).toBe(false);
7676
expect(shouldIncludeEpisodeInContext(durableRepeat)).toBe(true);
7777
});
78+
79+
test("invalid timestamps degrade gracefully", () => {
80+
const score = calculateEpisodeRecallScore(
81+
0.5,
82+
{
83+
importance: 0.6,
84+
accessCount: 2,
85+
startedAt: "not-a-date",
86+
lastAccessedAt: "still-not-a-date",
87+
decayRate: 1,
88+
},
89+
"metadata",
90+
);
91+
92+
expect(score).toBeFinite();
93+
});
7894
});

src/memory/ranking.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export function calculateEpisodeContextScore(episode: Episode): number {
4343
decayRate: episode.decay_rate,
4444
});
4545

46-
return weightedAverage(signals.durability, signals.recency, 0, 0.6, 0.4, 0);
46+
return weightedAverage2(signals.durability, signals.recency, 0.6, 0.4);
4747
}
4848

4949
export function shouldIncludeEpisodeInContext(episode: Episode): boolean {
@@ -75,6 +75,10 @@ function weightedAverage(a: number, b: number, c: number, aWeight: number, bWeig
7575
return a * aWeight + b * bWeight + c * cWeight;
7676
}
7777

78+
function weightedAverage2(a: number, b: number, aWeight: number, bWeight: number): number {
79+
return a * aWeight + b * bWeight;
80+
}
81+
7882
function exponentialDecay(ageHours: number, halfLifeHours: number, decayRate: number): number {
7983
if (!Number.isFinite(ageHours) || ageHours < 0) return 1;
8084
return Math.exp(-((ageHours / halfLifeHours) * decayRate));
@@ -83,13 +87,7 @@ function exponentialDecay(ageHours: number, halfLifeHours: number, decayRate: nu
8387
function hoursSince(value?: number | string): number {
8488
if (value == null) return Number.POSITIVE_INFINITY;
8589

86-
const timestamp =
87-
typeof value === "number"
88-
? value
89-
: (() => {
90-
const parsed = Date.parse(value);
91-
return Number.isNaN(parsed) ? Number.NaN : parsed;
92-
})();
90+
const timestamp = typeof value === "number" ? value : Date.parse(value);
9391

9492
if (!Number.isFinite(timestamp)) return Number.POSITIVE_INFINITY;
9593

0 commit comments

Comments
 (0)