Skip to content

memory: live write/forget tool paths fail in workflows evals (previously masked by vacuous fixtures) #784

Description

@dcramer

Summary

5 of 11 cases in packages/junior-evals/evals/memory/workflows.eval.ts are red. The evals themselves have been audited and are correct (see below) — the reds document real misbehavior on the live memory write/forget tool paths: during the turn the agent narrates that persistence failed or is unavailable ("nothing was written to an external store", "the memory skill isn't available", "could not remove the preference"). Passive extraction, recall/injection, and read paths work.

Failing cases (post-audit):

  1. explicit first-person preference → agent says memory not persisted (rubric fail condition "do not say the memory failed to save" fires correctly)
  2. first-person opinion with rewritten wording → agent explicitly refuses persistence
  3. explicit shared task procedure → 0.50, frames shared knowledge as a "preference" (borderline)
  4. passive operational knowledge recall → 0.50, first claims no relevant memory then recovers (partial)
  5. forget a remembered preference → agent says it could not remove it

Why "green on main" was an illusion

The file had the same fixture bug as multi-actor-provenance.eval.ts (fixed on the #773 Track 1 branch): label-suffixed thread_ts values (e.g. "17000000.memory-explicit") fail parseSlackMessageTs, so the runtime keyed memories by per-message messageTs while the eval's readMemories filtered on the thread-based sourceKey. Every positive DB assertion could never match and every no-store assertion passed vacuously. The fixtures are now valid (17000000.000001…000011), the assertions are meaningful for the first time, and one case ("organic conversation teaches a task procedure") went green purely from the fixture fix.

Classification (provisional)

The live tool wiring (tools.ts, plugin tool registration, live requester derivation) is untouched by the #773 Track 1 branch — only passive extraction, session-log provenance, the run projection, and the actor rename changed. So these reds are most consistent with a pre-existing bug that vacuous assertions had been masking, not a #773 regression. Definitive verdict: run cases 1 and 5 on the committed baseline (stash or a main checkout) — that is the first step of this issue.

Eval audit notes (already applied on the branch)

  • Fixtures: fixed (valid Slack ts).
  • DB assertions: now non-vacuous, scoped by sourceKey/scope/subjectType — contract-level, no extraction-internal leakage (no overfitting).
  • Rubrics: fail conditions are precise and fired against genuine non-persistence narration, not over-read.
  • Scenarios: realistic and satisfiable.

Per maintainer policy: red-but-correct evals stay red; do not relax them to green. Fix the product behavior.

First steps

  1. Baseline run of cases 1 and 5 against main to confirm pre-existing vs Audit actor/instruction provenance across plugins #773-branch regression.
  2. Instrument the live createMemory/removeMemory tool path in the eval environment (why does the agent see the tool as unavailable/failing?).
  3. Fix the product path; cases must go green without touching the eval file.

Found during #773 Track 1 verification.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions