﻿I can only answer from what's in this session's context ΓÇö I haven't read the SessionStart implementation. Two facts about it are directly available: HEAD is `b5181ca feat: add bounded opt-in SessionStart continuity`, and there's an untracked `reports/sessionstart-ab/` (an A/B evaluation not yet committed). Everything else below is the constraint envelope the repo's standing decisions impose on any SessionStart path ΓÇö reliable as constraints, not as a description of the shipped code.

## Default state
**Off.** The feature is opt-in per the commit line, which matches the repo's posture toward anything that touches shared state. Registering a SessionStart hook means editing the *global* `~/.claude/settings.json`, which CLAUDE.md names as a **hard HALT point** ΓÇö draft, show diffs and size deltas, wait for explicit approval. So the default has to be "installed but inert until a user flips it on," never "enabled by presence."

## Archive / database access
- **Read-only, absolutely.** No tool mutates the DB or sources; reindex is a separate CLI step. A SessionStart path must not index, backfill, create, or touch the DB on a missing-file path ΓÇö it reads or it does nothing.
- **DB lives at `%LOCALAPPDATA%\claude-archive-mcp\archive.db`**, deliberately outside `.claude/`. The hook resolves it through `config.py` like everything else ΓÇö `config.py` is the only module that reads `os.environ`, and there are no hardcoded paths outside it. A hook that hardcodes the DB path or reads its own env var violates that.
- **Schema gate applies.** `PRAGMA user_version` is canonical; a too-new DB is refused with `SchemaVersionError`. The hook inherits that refusal rather than reading a DB it doesn't understand.
- The natural body of a continuity payload is the **digest aggregation** (`claude_archive_mcp.digest`), already shared between `get_digest` and `scripts/digest.py` ΓÇö reuse it rather than growing a third query path.

## Context bounds
"Bounded" is the operative word in the commit. Continuity injected at session start is spent from the user's context budget before they've typed anything, so the payload needs a **fixed ceiling enforced at generation time**, not a hope that the digest stays small. Condensed digest-shaped output ΓÇö recent activity, project names, dated buckets ΓÇö not raw transcript text. The `reports/sessionstart-ab/` directory suggests the bound was chosen against measured A/B evidence rather than picked; that report is uncommitted, so its numbers aren't in my context.

## Failure behavior
**Fail silent, fail open, never block the session.** DB missing, locked by a concurrent reindex, too-new schema, embeddings extra absent, empty window ΓÇö every one degrades to *no injection*, not to an error surfaced in the user's session. A SessionStart hook that throws or hangs damages every session on the box, including sessions in unrelated repos, which is a far worse outcome than missing continuity. Diagnostics go to the **file log only**.

## MCP contract
- The tool surface stays at **eleven tools** plus the per-project resource. SessionStart is a *hook*, not a twelfth tool ΓÇö it must not alter tool schemas or the Pydantic v2 I/O contracts.
- **The stdout rule cuts both ways here, and the distinction matters.** For the MCP server, stdout is owned by the stdio JSON-RPC transport and nothing may print to it. A SessionStart hook is a *separate process* whose stdout *is* its channel to Claude Code ΓÇö so the shared library code it calls must keep its file-only logging discipline, or a stray `print` in a shared module corrupts the hook's payload in one context and the JSON-RPC stream in the other.
- Windows-first: pathlib throughout, and if the hook shim is PowerShell, ASCII-only (PS 5.1 reads UTF-8-without-BOM as Windows-1252).

If you want the actual shipped behavior ΓÇö the env var name, the real token ceiling, the A/B numbers ΓÇö say the word and I'll read `b5181ca` and `reports/sessionstart-ab/`.
