Skip to content

Commit 510c919

Browse files
committed
fix(plugin): remove process.cwd() fallbacks from memory promotion paths
process.cwd() in historian/recomp promotion could resolve to a different project's directory, causing cross-project memory contamination. Now skips promotion entirely if deps.directory is undefined rather than falling back to an unreliable cwd. Also cleaned 43 contaminated memories from paq project that were incorrectly promoted from this session.
1 parent ccb8786 commit 510c919

2 files changed

Lines changed: 28 additions & 20 deletions

File tree

packages/plugin/src/hooks/magic-context/compartment-runner-incremental.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -143,12 +143,14 @@ export async function runCompartmentAgent(deps: CompartmentRunnerDeps): Promise<
143143
appendCompartments(db, sessionId, newCompartments);
144144
replaceSessionFacts(db, sessionId, validatedPass.facts ?? []);
145145
})();
146-
promoteSessionFactsToMemory(
147-
db,
148-
sessionId,
149-
resolveProjectIdentity(deps.directory ?? process.cwd()),
150-
validatedPass.facts ?? [],
151-
);
146+
if (deps.directory) {
147+
promoteSessionFactsToMemory(
148+
db,
149+
sessionId,
150+
resolveProjectIdentity(deps.directory),
151+
validatedPass.facts ?? [],
152+
);
153+
}
152154

153155
const lastCompartmentEnd = lastNewEnd;
154156
queueDropsForCompartmentalizedMessages(db, sessionId, lastCompartmentEnd);

packages/plugin/src/hooks/magic-context/compartment-runner-recomp.ts

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,10 @@ export async function executeContextRecompInternal(deps: CompartmentRunnerDeps):
6262
const sessionDirectory = parentSession?.directory ?? directory;
6363

6464
// Render project memories once as read-only reference for fact dedup across all passes
65-
const projectPath = resolveProjectIdentity(directory ?? process.cwd());
66-
const memories = getMemoriesByProject(db, projectPath, ["active", "permanent"]);
65+
const projectPath = directory ? resolveProjectIdentity(directory) : undefined;
66+
const memories = projectPath
67+
? getMemoriesByProject(db, projectPath, ["active", "permanent"])
68+
: [];
6769
const memoryBlock = renderMemoryBlock(memories) ?? undefined;
6870

6971
// ── Resume from staging if a previous run was interrupted ────────────
@@ -100,12 +102,14 @@ export async function executeContextRecompInternal(deps: CompartmentRunnerDeps):
100102
const promoted = promoteRecompStaging(db, sessionId);
101103
if (!promoted) return null;
102104

103-
promoteSessionFactsToMemory(
104-
db,
105-
sessionId,
106-
resolveProjectIdentity(deps.directory ?? process.cwd()),
107-
promoted.facts,
108-
);
105+
if (deps.directory) {
106+
promoteSessionFactsToMemory(
107+
db,
108+
sessionId,
109+
resolveProjectIdentity(deps.directory),
110+
promoted.facts,
111+
);
112+
}
109113

110114
const lastCompartmentEnd =
111115
promoted.compartments[promoted.compartments.length - 1]?.endMessage ?? 0;
@@ -268,12 +272,14 @@ export async function executeContextRecompInternal(deps: CompartmentRunnerDeps):
268272
const finalCompartments = promoted?.compartments ?? candidateCompartments;
269273
const finalFacts = promoted?.facts ?? candidateFacts;
270274

271-
promoteSessionFactsToMemory(
272-
db,
273-
sessionId,
274-
resolveProjectIdentity(deps.directory ?? process.cwd()),
275-
finalFacts,
276-
);
275+
if (deps.directory) {
276+
promoteSessionFactsToMemory(
277+
db,
278+
sessionId,
279+
resolveProjectIdentity(deps.directory),
280+
finalFacts,
281+
);
282+
}
277283

278284
const lastCompartmentEnd = finalCompartments[finalCompartments.length - 1]?.endMessage ?? 0;
279285
if (lastCompartmentEnd > 0) {

0 commit comments

Comments
 (0)