# B3 — memsearch SessionStart injection cost review

_Reviewed 2026-07-08. memsearch v0.4.6 (installed) / v0.4.11 (also cached, not yet installed). Plugin: `memsearch@memsearch-plugins`._

## What gets injected

`hooks/session-start.sh` (both cached versions, logic unchanged 0.4.6→0.4.11) builds a
`# Recent Memory` block on every SessionStart and returns it as `additionalContext`:

- Finds the daily memory files under `$MEMORY_DIR` (`~/.memsearch/memory/YYYY-MM-DD.md`),
  sorted by filename descending, and takes the **2 most recent**.
- For each of those 2 files, greps lines matching `^(#{2,4} |- )` (headings + bullets) and
  takes the **first 40 matching lines** (`head -40`).
- Concatenates both files' extracts under one `# Recent Memory` heading and returns it.

This is entirely hardcoded (`head -2`, `head -40`) in the shell script — there is no
per-file/per-line/byte cap that's user-configurable.

## Measurements (cc-os project, last ~7 days of session transcripts)

Extracted the `additionalContext` string from every SessionStart hook event whose payload
contained `# Recent Memory`, across `~/.claude/projects/-home-jared-dev-cc-os/*.jsonl`
(61 SessionStart events found in that window — heavy usage during the WS2/WS4 eval loops,
so this sample is skewed toward busy days, not a quiet baseline).

| Stat | chars | approx tokens (÷4) |
|---|---|---|
| min | 5,976 | ~1,494 |
| median | 11,721 | ~2,930 |
| avg | 11,978 | ~2,995 |
| max | 15,407 | ~3,852 |

This roughly confirms the ~13 KB figure already observed. Size scales with how many
`##`/`###`/bullet lines the 2 most recent daily files accumulated that day — on a day with a
lot of sessions/subagent activity (like the recent eval-loop days), each daily file alone can
hit the 40-line cap, so the injection saturates near its structural ceiling
(2 files × 40 lines × ~150–200 chars/line ≈ 12,000–16,000 chars), matching the observed range.

Caveat: this is a per-project sample from one heavy-usage repo (cc-os) over 7 days; other
projects' daily files will differ, and this sampling method (string-matching the raw jsonl,
not a documented API) is the best available without deeper memsearch internals — reasonably
solid since the hook's exact output string was recovered from real transcripts, not estimated.

## Config surface found

Read `skills/memory-config/SKILL.md` (both cached versions) and `hooks/session-start.sh`
directly. Findings:

- The **documented** TOML config surface (`plugins.claude-code.summarize`, `.project_review`,
  `.user_profile`, `.memory_to_skill`, `[llm.providers.*]`, `[prompts]`) controls
  summarization, maintenance artifacts (PROJECT.md/USER.md), skill distillation, and provider
  routing — **none of it touches the SessionStart recall injection**.
- No `[plugins.claude-code.session_start]` or equivalent section exists in the documented
  schema, and none of the constants used by the injection logic (`head -2` file count,
  `head -40` line count, the `^(#{2,4} |- )` grep pattern) appear anywhere in `config.toml`,
  `memsearch config list --resolved/--global/--project`, or the SKILL.md. They are hardcoded
  in `hooks/session-start.sh` itself.
- The only adjacent, real lever is **memory file density**: since the cap is by line count
  (not token count) over headings+bullets, whatever produces terse vs. verbose daily-file
  bullets (the Stop-hook summarizer, governed by `plugins.claude-code.summarize.model`,
  defaults to haiku) indirectly controls how much of the 40-line budget per file is "real
  signal" vs. how many days of content get squeezed out.

## Recommendation

**No first-class cap/trim setting exists in memsearch's config schema for this injection.**
The two concrete options, in preference order:

1. **Workaround, no code change (recommended to try first):** the injection is driven purely
   by memory-file content density, not by any setting. If daily files are noisy (e.g. many
   short low-signal bullets from busy multi-session days, as in the cc-os sample), the
   Stop-hook summarizer producing those bullets is the actual place to add discipline —
   tightening what counts as bullet-worthy would shrink the 40-line/file budget's real size
   without touching the plugin. This is a memsearch summarizer/prompt-quality issue, not a
   session-cost cap.
2. **Direct edit, unsupported (only if (1) is insufficient):** hand-edit the cached
   `hooks/session-start.sh` at
   `~/.claude/plugins/cache/memsearch-plugins/memsearch/<version>/hooks/session-start.sh`,
   lowering `head -2` → `head -1` (halves injection size, roughly ~6–8 KB/day instead of
   ~12–15 KB) and/or `head -40` → a smaller value (e.g. 20). Expected savings: cutting to 1
   file × 20 lines would drop the typical injection from ~11–15 KB (~2,900–3,850 tokens) to
   roughly ~3 KB (~750 tokens), a ~75% reduction. **Caveat:** this is an unmanaged edit to
   plugin-cache source — it will be silently overwritten on the next
   `claude plugin update memsearch` / cache refresh, is not upstream-supported, and isn't a
   "setting" in the config-surface sense the task asked to identify. Treat it as a stopgap,
   not a durable fix; if this repo wants a durable cap, the change belongs upstream in
   `zilliztech/memsearch` (file an issue/PR to add a
   `[plugins.claude-code.session_start]` `max_files` / `max_lines_per_file` config section)
   rather than as a local hack here.

No setting was applied — this is a review/recommendation only per the task.
