Policy
When a run has multiple actors (run.actors.length > 1), passive memory extraction must not record preference memories at all — not even preferences whose evidence citations all point at run-actor instructions.
Rationale: in a multi-actor turn, first-person statements from different people are interleaved in model-visible content. Citation verification (#773 Track 1) makes cross-actor personal writes require the model to mis-cite, but a mis-cite is still possible; multi-actor runs are exactly where the cost of that mistake is highest. Personal preferences can wait for a single-actor run to restate them. This is defense in depth on top of the deterministic router, not a replacement for it.
Implementation sketch
packages/junior-memory/src/process-session.ts routeExtractedMemory: add a deterministic gate — kind === "preference" && run.actors.length > 1 → drop (never downgrade to conversation scope, consistent with the existing rule).
run.actors is already exposed on the plugin run context (specs/multi-actor-runs.md; attribution-not-authority contract).
- Spec: add the rule to
specs/memory-plugin/policy.md (personal-scope authorship section).
- Tests: junior-memory component test — multi-actor run + preference proposal citing only run-actor instructions → dropped; single-actor run unchanged. Eval: extend
packages/junior-evals/evals/memory/multi-actor-provenance.eval.ts case 2/3 DB assertions if needed (they already assert no cross-actor personal writes; add an assertion that no preference row is written at all for the batched multi-actor case).
Depends on
Part of the #773 follow-up set: case-specific consumers of run.actors.
Policy
When a run has multiple actors (
run.actors.length > 1), passive memory extraction must not record preference memories at all — not even preferences whose evidence citations all point at run-actor instructions.Rationale: in a multi-actor turn, first-person statements from different people are interleaved in model-visible content. Citation verification (#773 Track 1) makes cross-actor personal writes require the model to mis-cite, but a mis-cite is still possible; multi-actor runs are exactly where the cost of that mistake is highest. Personal preferences can wait for a single-actor run to restate them. This is defense in depth on top of the deterministic router, not a replacement for it.
Implementation sketch
packages/junior-memory/src/process-session.tsrouteExtractedMemory: add a deterministic gate —kind === "preference" && run.actors.length > 1→drop(never downgrade to conversation scope, consistent with the existing rule).run.actorsis already exposed on the plugin run context (specs/multi-actor-runs.md; attribution-not-authority contract).specs/memory-plugin/policy.md(personal-scope authorship section).packages/junior-evals/evals/memory/multi-actor-provenance.eval.tscase 2/3 DB assertions if needed (they already assert no cross-actor personal writes; add an assertion that no preference row is written at all for the batched multi-actor case).Depends on
run.actors) — implemented oneval/multi-actor-provenance, pending merge.Part of the #773 follow-up set: case-specific consumers of
run.actors.