## 1. Tier 1 — session-start coverage note (default on)

- [x] 1.1 Implement config key `proactive.sessionNote` (default true) with an environment-variable override.
- [x] 1.2 Implement the coverage note builder from cached probe data (repositories, languages, symbol counts when available, snapshot time, supported-CGC scope line), hard length cap asserted by test, graceful degradation when counts are missing, zero new spawns.
- [x] 1.3 Wire one-shot injection at readiness through a `before_agent_start` handler returning the chained system prompt (same documented mechanism as the routing card), at most once per session.

## 2. Tier 2 — opt-in intrusive surfaces

- [x] 2.1 Implement `proactive.driftSteers` (default false) with an environment-variable override: one agent-facing steer per fresh→possibly-stale episode, driven by freshness state transitions, naming `/cgc sync`; never fires when disabled.
- [x] 2.2 Implement `proactive.resultAnnotations` (default false) with an environment-variable override: one-line freshness annotation on extension-owned tool and command outputs only; semantics untouched; never on CGC MCP server results.

## 3. Contract compliance and verification

- [x] 3.1 Implement the structural duplication test: tier content classes disjoint from the routing card; readiness predicate shared with the guidance module; fail-open retry cap of one per session for every tier.
- [x] 3.2 Test the full gating matrix (readiness × three tier settings), once-per-session and once-per-episode semantics, opt-out behavior, and failure containment.
- [x] 3.3 Verify all scenarios in `specs/cgc-proactive-notes/spec.md` against the implementation. (Verified 2026-09-13: all 13 scenarios across the 5 requirements walked against `extensions/proactive.ts` + wiring in `extensions/index.ts`/`commands.ts`/`config.ts`; `bun test extensions/proactive.test.ts` 85 pass / 0 fail, full suite 574 pass / 0 fail, `tsc --noEmit` exit 0, biome clean on the 5 proactive files. Two documented nuances, not failures: (a) scenario 1's "index exists or being created" is implemented as ready-on-`clean|drift` only — `unindexed` suppresses even while auto-create is in flight (`proactive.ts:255-276`, `LifecycleState` has no transient states; `indexing`/`syncing` are `LifecycleActivity`, `lifecycle-state.ts:37`); (b) "Tiers compose without duplication" is verified structurally (task 3.1 content-class disjointness) because change 2 `add-cgc-agent-routing-guidance` ships no card yet — all its tasks are unchecked. Nuance (a) and the rejected-`tool_result` decision are for task 3.5's ADR pass.)
- [x] 3.4 Run `openspec validate add-cgc-proactive-context-injection --type change --strict` before archive. (Verifier-executed 2026-09-13: `~/.bun/bin/openspec validate add-cgc-proactive-context-injection --type change --strict` → "Change 'add-cgc-proactive-context-injection' is valid", EXIT_CODE=0 (binary at `~/.bun/bin/openspec`; the npx fallback fails in this environment). The mandatory re-validation line now sits at `validate.md:47` beneath `VERDICT: READY` (`validate.md:43`), recording the strict pass after tasks 3.2–3.3 were marked — so the READY verdict is not voided by this marking.)
- [x] 3.5 Finalize `adr/0009-two-tier-proactive-injection.md` (already drafted during change authoring; Status: Proposed): review its Context so the MCP-results-out-of-scope boundary is recorded as a deliberate decision (the harness-documented `tool_result` event exists but is rejected as a surprising annotation surface), not a platform limitation. (Verified 2026-09-13 by reading the file rather than the report: `adr/0009-two-tier-proactive-injection.md:13` now states "although the harness documents a `tool_result` event that can patch another tool's result content, annotating the CGC MCP server's results is deliberately out of scope — not a missing hook but a rejected annotation surface", and `:17` mirrors it in Decision ("`tool_result` exists but decorating another process's protocol output is never attempted"). Residual-limitation wording is gone: `grep -n "no hook\|cannot annotate\|impossible\|platform limitation" adr/0009-two-tier-proactive-injection.md` → no hits; the old sentence ("The extension also has no hook into the CGC MCP server's results — it cannot annotate another process's protocol output.") was removed per `git diff --numstat -- adr/` = 3 insertions / 2 deletions on that file alone. Claims cross-checked against source: code-side model text matches (`extensions/proactive.ts:570-575`); `tool_result` genuinely can patch content (`pi-coding-agent/docs/extensions.md:737` "**Can modify result.**", `:743-745` chained partial patches) and NO `tool_result` handler is registered here (`grep -rn tool_result extensions/` → single hit, the comment at `proactive.ts:572`), so "only ever decorates outputs it itself emits" holds (`extensions/commands.ts:1434` via the `extensions/index.ts:214` seam). The added readiness nuance (and the new Negative consequence at `:26`) matches `extensions/proactive.ts:258-276` and `extensions/classifier.ts:192-203` (`unindexed` = no `.codegraphcontext/` dir) with `syncing`/`indexing`/`rebuilding` as `LifecycleActivity` (`extensions/lifecycle-state.ts:37`), and agrees with the already-reconciled `design.md:19,61,63`. Status intentionally left `Proposed` (`:5`) — every one of the 9 ADRs in `adr/` is `Proposed`. Docs-only, no code touched, so no test gate; `~/.bun/bin/openspec validate add-cgc-proactive-context-injection --type change --strict` → "Change 'add-cgc-proactive-context-injection' is valid", EXIT_CODE=0 both before and after this marking, so `validate.md:43` `VERDICT: READY` still stands.)
