mirror of
https://github.com/n8n-io/n8n.git
synced 2026-10-22 04:21:32 +02:00
A seed restored prior messages into the same thread the graded turn ran in, so "long-term memory" was really earlier turns of one conversation. That conflates window eviction, compression and genuine cross-session recall, and nothing could tell them apart. `seed.sessionBoundary` restores the messages into their own thread and runs the graded turn in a fresh one. Artifacts cross the boundary and the conversation does not: seeded workflows, data tables and agents are instance-scoped so the agent's tools still find them, while the messages are thread-scoped so nothing about the prior session is recoverable from the conversation. That is the split the arm exists to create. Uses calls that already exist — restore takes the thread id, and a thread is created implicitly — so there is no product change and no new endpoint. Seeded turns from a prior session are labelled as such in the graded transcript. Same-thread seeded turns stay deliberately unlabelled, because there it genuinely is one conversation; across a boundary the judge would otherwise read them as earlier turns here and penalise the agent for not remembering something it never received. That trap is why the flag reaches the transcript rather than staying in the harness. Refused on a `replay` seed, which reconstructs one real thread and where a boundary is incoherent — the strict arm rejects it instead of dropping the flag. Worth stating plainly: on today's product every memory tier is thread-scoped, so a boundary case expecting recall fails 100%. That is a deliberate red baseline rather than a regression, and the guidance says to write expectations around the honest fallback of asking rather than guessing. |
||
|---|---|---|
| .. | ||
| __tests__ | ||
| user-proxy | ||
| confirmation-payload.ts | ||
| conversation-text.ts | ||
| get-json-files.ts | ||
| llm-judge.ts | ||
| load-eval-cases.ts | ||
| safe-extract.ts | ||