fix(memory): make quality cleanup migration conservative

This commit is contained in:
Ralph Chang
2026-04-28 14:15:34 +08:00
parent 5e85d098d8
commit 12eddc2f8c
4 changed files with 125 additions and 12 deletions
+15
View File
@@ -9,6 +9,21 @@ export type MemoryQualityResult = {
reasons: string[];
};
export const HARD_QUALITY_REASONS: ReadonlySet<string> = new Set([
"empty",
"progress_snapshot",
"raw_error",
"commit_or_ci_snapshot",
"temporary_status",
"active_file_snapshot",
"code_or_api_signature",
"path_heavy",
]);
export function isHardQualityReason(reason: string): boolean {
return HARD_QUALITY_REASONS.has(reason);
}
export function assessMemoryQuality(entry: MemoryQualityInput): MemoryQualityResult {
const reasons: string[] = [];
const text = entry.text.trim();
+10 -5
View File
@@ -2,7 +2,7 @@ import type { LongTermMemoryEntry, WorkspaceMemoryStore } from "./types.ts";
import { LONG_TERM_LIMITS } from "./types.ts";
import { workspaceKey, workspaceMemoryPath } from "./paths.ts";
import { atomicWriteJSON, readJSON, updateJSON } from "./storage.ts";
import { assessMemoryQuality, isProgressSnapshotViolation } from "./memory-quality.ts";
import { assessMemoryQuality, isHardQualityReason, isProgressSnapshotViolation } from "./memory-quality.ts";
// Minimum length for workspace_memory envelope: <workspace_memory>\n...\n</workspace_memory>
const MIN_ENVELOPE_LENGTH = 80;
@@ -188,9 +188,11 @@ export async function normalizeWorkspaceMemoryWithAccounting(
};
});
// One-time migration for legacy snapshot violations
result = runMigrationP0Cleanup(result, nowIso);
// One-time migrations for legacy/low-quality snapshot violations.
// Run quality cleanup first so hard violations receive quality audit tags
// before the older P0 project-only cleanup marks progress snapshots.
result = runMigrationQualityCleanup(result, nowIso);
result = runMigrationP0Cleanup(result, nowIso);
// P0 accounting only considers active entries. Entries that were already
// superseded before this normalization are preserved in storage; entries that
@@ -285,7 +287,7 @@ export function runMigrationP0Cleanup(
};
}
function runMigrationQualityCleanup(
export function runMigrationQualityCleanup(
store: WorkspaceMemoryStore,
nowIso: string,
): WorkspaceMemoryStore {
@@ -301,11 +303,14 @@ function runMigrationQualityCleanup(
const quality = assessMemoryQuality(entry);
if (quality.accepted) return entry;
const hardReasons = quality.reasons.filter(isHardQualityReason);
if (hardReasons.length === 0) return entry;
changed = true;
const tags = new Set([
...(entry.tags ?? []),
"quality_cleanup",
...quality.reasons.map(reason => `quality:${reason}`),
...hardReasons.map(reason => `quality:${reason}`),
]);
return {