.maestro/playbooks/Wizard-2026-02-22/2026-02-22-LoCoMo-Eval/LOCOMO-EVAL-02.md
This phase ingests all 10 LoCoMo conversations through the claude-mem worker API. Each conversation's dialog sessions are processed by Sonnet 4.6 for observation compression, creating a complete memory store across all conversations. The batch runner supports resumability so interrupted runs can continue where they left off. This is the most time-intensive phase due to Anthropic API calls for each session's compression.
Build batch ingestion script with resume support:
evals/locomo/scripts/ingest-all.tsevals/locomo/src/ingestion/worker-client.ts and evals/locomo/src/ingestion/adapter.ts)"Conversation {N}/10 [{sample_id}] — Session {M}/{total} — Elapsed: {time}"evals/locomo/results/ingestion-progress.json (create if doesn't exist)Run full ingestion across all 10 conversations:
bun evals/locomo/scripts/ingest-all.tsBuild and run ingestion verification:
evals/locomo/scripts/verify-all-ingestion.tslocomo-eval-{sample_id})sample_id | sessions | observations | status
-----------------+----------+--------------+---------
{sample_id_1} | 12 | 12 | complete
{sample_id_2} | 8 | 8 | complete
...
bun evals/locomo/scripts/verify-all-ingestion.ts/api/observations endpoint with auto-pagination (the /api/search?query=* wildcard approach was wrong — * is treated as literal text in Chroma semantic search, not a wildcard). Verification reveals only 2/272 observations persisted in claude-mem (1 each for conv-26 and conv-42). Only these 2 projects exist in the database; the other 8 conversation projects have no data. The ingestion-progress.json from the prior run claimed all 10 were completed, but the observations did not persist — likely due to worker restart, database changes, or compression failures. Re-ingestion will be needed before Phase 03. Also added listObservationsByProject method to WorkerClient for filter-only SQLite queries (no semantic search needed).Write and run ingestion adapter tests:
evals/locomo/tests/adapter.test.tsgenerateContentSessionId returns deterministic IDs: same inputs always produce same outputgenerateContentSessionId produces unique IDs: different sampleId/sessionId combinations never collidegenerateProjectName returns the expected formatformatSessionAsToolExecution with a mock session containing 3 dialog turns — verify tool_name is "Read", tool_response contains all speaker lines, user prompt mentions both speakersbun test evals/locomo/tests/adapter.test.ts