























@@ -14,6 +14,7 @@ import {
1414__testing,
1515filterRecallEntriesWithinLookback,
1616runDreamingSweepPhases,
17+seedHistoricalDailyMemorySignals,
1718} from "./dreaming-phases.js";
1819import { previewRemHarness } from "./rem-harness.js";
1920import {
@@ -229,6 +230,13 @@ async function writeDailyNote(workspaceDir: string, lines: string[]): Promise<vo
229230);
230231}
231232233+function dailyCapStressLines(label: string): string[] {
234+return Array.from({ length: 8 }).flatMap((_, index) => [
235+`- ${label} durable memory item ${index + 1} has enough detail to create a chunk.`,
236+"",
237+]);
238+}
239+232240async function createDreamingWorkspace(): Promise<string> {
233241const workspaceDir = await createTempWorkspace("openclaw-dreaming-phases-");
234242await fs.mkdir(path.join(workspaceDir, "memory"), { recursive: true });
@@ -693,6 +701,98 @@ describe("memory-core dreaming phases", () => {
693701).toBe(true);
694702});
695703704+it("prioritizes the date-only daily file before same-day slugged files when ingestion is capped", async () => {
705+const workspaceDir = await createDreamingWorkspace();
706+await fs.writeFile(
707+path.join(workspaceDir, "memory", "2026-04-05.md"),
708+dailyCapStressLines("Canonical daily note").join("\n"),
709+"utf-8",
710+);
711+for (const slug of ["alpha", "beta", "gamma", "delta"]) {
712+await fs.writeFile(
713+path.join(workspaceDir, "memory", `2026-04-05-${slug}.md`),
714+dailyCapStressLines(`Slugged ${slug}`).join("\n"),
715+"utf-8",
716+);
717+}
718+719+const { beforeAgentReply } = createHarness(
720+{
721+plugins: {
722+entries: {
723+"memory-core": {
724+config: {
725+dreaming: {
726+enabled: true,
727+phases: {
728+light: {
729+enabled: true,
730+limit: 1,
731+lookbackDays: 2,
732+},
733+},
734+},
735+},
736+},
737+},
738+},
739+},
740+workspaceDir,
741+);
742+743+await withDreamingTestClock(async () => {
744+await triggerLightDreaming(beforeAgentReply, workspaceDir, 5);
745+});
746+747+const after = await rankShortTermPromotionCandidates({
748+ workspaceDir,
749+minScore: 0,
750+minRecallCount: 0,
751+minUniqueQueries: 0,
752+nowMs: Date.parse("2026-04-05T10:05:00.000Z"),
753+});
754+expect(after.some((entry) => entry.path === "memory/2026-04-05.md")).toBe(true);
755+expect(after.some((entry) => entry.snippet.includes("Canonical daily note"))).toBe(true);
756+});
757+758+it("prioritizes the date-only daily file before same-day slugged files during historical seeding", async () => {
759+const workspaceDir = await createDreamingWorkspace();
760+const canonicalPath = path.join(workspaceDir, "memory", "2026-04-05.md");
761+await fs.writeFile(
762+canonicalPath,
763+dailyCapStressLines("Canonical seeded note").join("\n"),
764+"utf-8",
765+);
766+const sluggedPaths: string[] = [];
767+for (const slug of ["alpha", "beta", "gamma", "delta"]) {
768+const sluggedPath = path.join(workspaceDir, "memory", `2026-04-05-${slug}.md`);
769+sluggedPaths.push(sluggedPath);
770+await fs.writeFile(
771+sluggedPath,
772+dailyCapStressLines(`Seeded slugged ${slug}`).join("\n"),
773+"utf-8",
774+);
775+}
776+777+await seedHistoricalDailyMemorySignals({
778+ workspaceDir,
779+filePaths: [...sluggedPaths, canonicalPath],
780+limit: 1,
781+nowMs: Date.parse("2026-04-05T10:05:00.000Z"),
782+timezone: "UTC",
783+});
784+785+const after = await rankShortTermPromotionCandidates({
786+ workspaceDir,
787+minScore: 0,
788+minRecallCount: 0,
789+minUniqueQueries: 0,
790+nowMs: Date.parse("2026-04-05T10:05:00.000Z"),
791+});
792+expect(after.some((entry) => entry.path === "memory/2026-04-05.md")).toBe(true);
793+expect(after.some((entry) => entry.snippet.includes("Canonical seeded note"))).toBe(true);
794+});
795+696796it("renders non-zero light-sleep confidence for dreaming-ingested candidates", async () => {
697797const workspaceDir = await createDreamingWorkspace();
698798await withDreamingTestClock(async () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。