Reading additional input from stdin...
OpenAI Codex v0.125.0 (research preview)
--------
workdir: /Users/michelkerkmeester/MEGA/Development/Code_Environment/Public
model: gpt-5.5
provider: openai
approval: never
sandbox: read-only
reasoning effort: medium
reasoning summaries: none
session id: 019dcafa-32ef-71d3-be07-d5102ffb6b4b
--------
user
Find the spec for the /memory:save planner-first contract. Return the exact spec folder path and cite at least one anchor or filename from the canonical spec.
hook: SessionStart
hook: SessionStart
hook: SessionStart Completed
hook: SessionStart Completed
hook: UserPromptSubmit
hook: UserPromptSubmit
hook: UserPromptSubmit Completed
hook: UserPromptSubmit Completed
codex
I’ll use `system-spec-kit` for this since the question is about a canonical spec packet, then I’ll verify the path from repo evidence rather than guessing from memory.
exec
/bin/zsh -lc "sed -n '1,180p' /Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/SKILL.md" in /Users/michelkerkmeester/MEGA/Development/Code_Environment/Public
 succeeded in 0ms:
---
name: system-spec-kit
description: "Unified documentation and context preservation: spec folder workflow (levels 1-3+), CORE + ADDENDUM template architecture (v2.2), validation, and Spec Kit Memory for context preservation. Mandatory for all file modifications."
allowed-tools: [Bash, Edit, Glob, Grep, Read, Task, Write]
version: 3.3.1.0
---

<!-- Keywords: spec-kit, speckit, documentation-workflow, spec-folder, template-enforcement, context-preservation, progressive-documentation, validation, spec-kit-memory, vector-search, hybrid-search, bm25, rrf-fusion, fsrs-decay, constitutional-tier, checkpoint, importance-tiers, cognitive-memory, co-activation, tiered-injection -->

# Spec Kit - Mandatory Conversation Documentation

Orchestrates mandatory spec folder creation for all conversations involving file modifications. Ensures proper documentation level selection (1-3+), template usage, and context preservation through AGENTS.md-enforced workflows.


<!-- ANCHOR:when-to-use -->
## 1. WHEN TO USE

### What is a Spec Folder?

A **spec folder** is a numbered directory (e.g., `007-auth-feature/`) that contains documentation for a single feature/task or a coordinated packet of related phase work:

Spec folders may also be nested as coordination-root packets with direct-child phase folders (e.g., `specs/02--track/022-feature/011-phase/002-child/`).

- **Purpose**: Track specifications, plans, tasks, and decisions for one unit of work
- **Location**: Under `specs/` using either `###-short-name/` at the root or nested packet paths for phased coordination
- **Contents**: Markdown files (spec.md, plan.md, tasks.md, and implementation-summary.md when work is complete) plus optional support folders such as `scratch/`, `research/`, or `review/`

Think of it as a "project folder" for AI-assisted development - it keeps context organized and enables session continuity.

### Activation Triggers

**MANDATORY for ALL file modifications:**
- Code files: JS, TS, Python, CSS, HTML
- Documentation: Markdown, README, guides
- Configuration: JSON, YAML, TOML, env templates
- Templates, knowledge base, build/tooling files

**Request patterns that trigger activation:**
- "Add/implement/create [feature]"
- "Fix/update/refactor [code]"
- "Modify/change [configuration]"
- Any keyword: add, implement, fix, update, create, modify, rename, delete, configure, analyze, phase

**Example triggers:**
- "Add email validation to the signup form" → Level 1-2
- "Refactor the authentication module" → Level 2-3
- "Fix the button alignment bug" → Level 1
- "Implement user dashboard with analytics" → Level 3

### When NOT to Use

- Pure exploration/reading (no file modifications)
- Single typo fixes (<5 characters in one file)
- Whitespace-only changes
- Auto-generated file updates (package-lock.json)
- User explicitly selects Option D (skip documentation)

**Rule of thumb:** If modifying ANY file content → Activate this skill.
Status: ✅ This requirement applies immediately once file edits are requested.

### Distributed Governance Rule

Any agent writing authored spec folder docs (`spec.md`, `plan.md`, `tasks.md`, `checklist.md`, `implementation-summary.md`, `decision-record.md`, `handover.md`, `review-report.md`, `debug-delegation.md`, `resource-map.md` (optional)) MUST use templates from .opencode/skills/system-spec-kit/templates/level_N/ for level-owned docs and the root cross-cutting templates where applicable, run `bash .opencode/skills/system-spec-kit/scripts/spec/validate.sh [spec_folder] --strict` after each file write, and route continuity updates through /memory:save. Deep-research workflow-owned packet markdown (`research/iterations/*.md`, `research/deep-research-*.md`, and progressive `research/research.md` loop updates) is exempt from that generic per-write rule; `/spec_kit:deep-research` must instead run targeted strict validation after every `spec.md` mutation it performs. @deep-research retains exclusive write access for `research/research.md`; @debug retains exclusive write access for `debug-delegation.md`.

- `handover.md` stays in the canonical recovery ladder and is maintained through `/memory:save` handover_state routing using `.opencode/skills/system-spec-kit/templates/handover.md` for initial creation.
- `review-report.md` remains owned by `@deep-review` when deep review workflows synthesize findings.
- `resource-map.md` is a peer cross-cutting template under `.opencode/skills/system-spec-kit/templates/`; it remains optional at any level and gives reviewers a lean file ledger alongside `implementation-summary.md`.

### Utility Template Triggers

| Template              | Trigger Keywords                                                                                                              | Action                    |
| --------------------- | ----------------------------------------------------------------------------------------------------------------------------- | ------------------------- |
| `handover.md`         | "handover", "next session", "continue later", "pass context", "ending session", "save state", "multi-session", "for next AI"  | Suggest `/memory:save` handover maintenance |
| `debug-delegation.md` | "stuck", "can't fix", "tried everything", "same error", "fresh eyes", "hours on this", "still failing", "need help debugging" | Suggest Task-tool debug delegation |

**Rule:** When detected, proactively suggest the appropriate action.

---

<!-- /ANCHOR:when-to-use -->
<!-- ANCHOR:smart-routing -->
## 2. SMART ROUTING

### Resource Domains

The router discovers markdown resources recursively from `references/` and `assets/` and then applies intent scoring from `RESOURCE_MAP`. Keep this section domain-focused rather than static file inventories.

- `references/memory/` for context retrieval, save workflows, trigger behavior, and indexing.
- `references/templates/` for level selection, template composition, and structure guides.
- `references/validation/` for checklist policy, verification rules, decision formats, and template compliance contracts.
- `references/structure/` for folder organization and sub-folder versioning.
- `references/workflows/` for command workflows and worked examples.
- `references/debugging/` for troubleshooting and root-cause methodology.
- `references/config/` for runtime environment configuration.

### Template and Script Sources of Truth

- Level definitions and template size guidance: [level_specifications.md](./references/templates/level_specifications.md)
- Template usage and composition rules: [template_guide.md](./references/templates/template_guide.md)
- Use `templates/level_N/` for operational templates; `core/` and `addendum/` remain composition inputs.
- Use `templates/changelog/` for packet-local nested changelog generation at completion time.
- Script architecture, build outputs, and runtime entrypoints: [scripts/README.md](./scripts/README.md)
- Memory save JSON schema and workflow contracts: [save_workflow.md](./references/memory/save_workflow.md)
- Nested packet changelog workflow: [nested_changelog.md](./references/workflows/nested_changelog.md)

Primary operational scripts:
- `spec/validate.sh`
- `spec/create.sh`
- `spec/archive.sh`
- `spec/check-completion.sh`
- `spec/recommend-level.sh`
- `templates/compose.sh`

### Resource Loading Levels

| Level       | When to Load               | Resources                    |
| ----------- | -------------------------- | ---------------------------- |
| ALWAYS      | Every skill invocation     | Shared patterns + SKILL.md   |
| CONDITIONAL | If intent signals match   | Intent-mapped references     |
| ON_DEMAND   | Only on explicit request   | Deep-dive quality standards  |

`references/workflows/quick_reference.md` is the primary first-touch command surface. Keep the compact `spec_kit` and `memory` command map there, including `/spec_kit:plan --intake-only` as the standalone intake entry, `/spec_kit:plan` and `/spec_kit:complete` smart delegation notes, and the pointer from `/spec_kit:deep-research` to `../sk-deep-research/references/spec_check_protocol.md`, and use this file only to point readers to it rather than duplicating the full matrix.

### Smart Router Pseudocode

The authoritative routing logic for scoped loading, weighted intent scoring, and ambiguity handling.

```python
from pathlib import Path

SKILL_ROOT = Path(__file__).resolve().parent
RESOURCE_BASES = (SKILL_ROOT / "references", SKILL_ROOT / "assets")
DEFAULT_RESOURCE = "references/workflows/quick_reference.md"

INTENT_SIGNALS = {
    "PLAN": {"weight": 3, "keywords": ["plan", "design", "new spec", "level selection", "option b"]},
    "RESEARCH": {"weight": 3, "keywords": ["investigate", "explore", "analyze", "prior work", "evidence"]},
    "IMPLEMENT": {"weight": 3, "keywords": ["implement", "build", "execute", "workflow"]},
    "DEBUG": {"weight": 4, "keywords": ["stuck", "error", "not working", "failed", "debug"]},
    "COMPLETE": {"weight": 4, "keywords": ["done", "complete", "finish", "verify", "checklist"]},
    "MEMORY": {"weight": 4, "keywords": ["memory", "save context", "resume", "checkpoint", "context"]},
    "HANDOVER": {"weight": 4, "keywords": ["handover", "continue later", "next session", "pause"]},
    "PHASE": {"weight": 4, "keywords": ["phase", "decompose", "split", "workstream", "multi-phase", "phased approach", "phased", "multi-session"]},
    "RETRIEVAL_TUNING": {"weight": 3, "keywords": ["retrieval", "search tuning", "fusion", "scoring", "pipeline"]},
    "EVALUATION": {"weight": 3, "keywords": ["evaluate", "ablation", "benchmark", "baseline", "metrics"]},
    "SCORING_CALIBRATION": {"weight": 3, "keywords": ["calibration", "scoring", "normalization", "decay", "interference"]},
    "ROLLOUT_FLAGS": {"weight": 3, "keywords": ["feature flag", "rollout", "toggle", "enable", "disable"]},
    "GOVERNANCE": {"weight": 3, "keywords": ["governance", "tenant", "retention", "audit"]},
}

RESOURCE_MAP = {
    "PLAN": [
        "references/templates/level_specifications.md",
        "references/templates/template_guide.md",
        "references/validation/template_compliance_contract.md",
    ],
    "RESEARCH": [
        "references/workflows/quick_reference.md",
        "references/workflows/worked_examples.md",
        "references/memory/epistemic_vectors.md",
    ],
    "IMPLEMENT": [
        "references/validation/validation_rules.md",
        "references/validation/template_compliance_contract.md",
        "references/templates/template_guide.md",
    ],
    "DEBUG": [
        "references/debugging/troubleshooting.md",
        "references/workflows/quick_reference.md",
        "manual_testing_playbook/manual_testing_playbook.md",
    ],
    "COMPLETE": [
        "references/validation/validation_rules.md",
        "references/workflows/nested_changelog.md",
    ],
    "MEMORY": [
        "references/memory/memory_system.md",
        "references/memory/save_workflow.md",
        "references/memory/trigger_config.md",
    ],

exec
/bin/zsh -lc 'rg -n "/memory:save|planner-first|planner first|planner" specs .opencode -S' in /Users/michelkerkmeester/MEGA/Development/Code_Environment/Public
 exited 2 in 170ms:
.opencode/specs/system-spec-kit/022-hybrid-rag-fusion/009-perfect-session-capturing/018-memory-save-quality-fixes/tasks.md:50:- [x] T001 Confirm the eight root causes from the flawed `/memory:save` output (manual review notes)
.opencode/specs/system-spec-kit/022-hybrid-rag-fusion/009-perfect-session-capturing/018-memory-save-quality-fixes/graph-metadata.json:210:    "causal_summary": "After the Sprint 1 pipeline hardening landed, a `/memory:save` run still produced a memory file that scored 88/100 while carrying 10 structural quality issues. Manual review traced those defects to eight backend bugs across the `generate-context.js` extraction, normalization, and rendering pipeline: duplicated decision fields, wrong completion status, false blocker detection, generic pattern filler, noisy trigger phrases, contaminated file paths, over-aggressive tree thinning, and missing synthesized conversation messages.",
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-024.md:5523:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/assets/template_mapping.md:322:**Generation:** Use `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"###-name","sessionSummary":"..."}' specs/###-name/` to auto-generate properly formatted memory files.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-024.md:5811:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/SKILL.md:566:**Memory Commands:** 4 memory slash commands (`/memory:save`, `/memory:manage`, `/memory:learn`, `/memory:search`) cover the memory command surface, with shared-memory operations available under `/memory:manage shared`, while `/spec_kit:resume` owns session recovery through the broader memory/session recovery stack. The `/memory:search` command covers all analysis and retrieval workflows. See `.opencode/commands/memory/` and `.opencode/commands/spec_kit/resume.md` for command documentation.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-024.md:5970:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:126:- [ ] Save context if significant progress: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-024.md:5971:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:159:- [ ] Memory context saved: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-024.md:6277:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/references/templates/level_specifications.md:764:| `memory/` | Session context preservation | `generate-context.js` runtime script via `/memory:save` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-024.md:6278:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/references/templates/level_specifications.md:769:- Use `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-024.md:6779:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/README.md:641:The **commands** are the doors into the system. Each command opens access to the tools it needs. `/spec_kit:complete` runs a full workflow from spec through implementation and packet-local changelog closeout when applicable. `/memory:save` saves context. `/spec_kit:resume` recovers or continues a previous session.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-024.md:7100:   641	The **commands** are the doors into the system. Each command opens access to the tools it needs. `/spec_kit:complete` runs a full workflow from spec through implementation and packet-local changelog closeout when applicable. `/memory:save` saves context. `/spec_kit:resume` recovers or continues a previous session.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-004.md:2891:.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:126:- [ ] Save context if significant progress: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-004.md:2892:.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:159:- [ ] Memory context saved: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-004.md:3014:.opencode/skills/system-spec-kit/assets/template_mapping.md:322:**Generation:** Use `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"###-name","sessionSummary":"..."}' specs/###-name/` to auto-generate properly formatted memory files.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-004.md:3043:.opencode/skills/system-spec-kit/references/templates/level_specifications.md:764:| `memory/` | Session context preservation | `generate-context.js` runtime script via `/memory:save` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-004.md:3044:.opencode/skills/system-spec-kit/references/templates/level_specifications.md:769:- Use `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-010.md:372:| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-010.md:465:Trigger: "save context", "save memory", `/memory:save`, memory file creation
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/003-modus-memory-main/research/iterations/iteration-024.md:3997:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/assets/template_mapping.md:322:**Generation:** Use `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"###-name","sessionSummary":"..."}' specs/###-name/` to auto-generate properly formatted memory files.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/003-modus-memory-main/research/iterations/iteration-024.md:4699:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:126:- [ ] Save context if significant progress: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/003-modus-memory-main/research/iterations/iteration-024.md:4700:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:159:- [ ] Memory context saved: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/003-modus-memory-main/research/iterations/iteration-024.md:4785:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/references/templates/level_specifications.md:764:| `memory/` | Session context preservation | `generate-context.js` runtime script via `/memory:save` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/003-modus-memory-main/research/iterations/iteration-024.md:4786:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/references/templates/level_specifications.md:769:- Use `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-004.md:411:| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed                                 |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-004.md:472:Trigger: "save context", "save memory", `/memory:save`, memory file creation
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-004.md:614:| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-004.md:707:Trigger: "save context", "save memory", `/memory:save`, memory file creation
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-020.md:378:| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-020.md:471:Trigger: "save context", "save memory", `/memory:save`, memory file creation
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-014.md:419:| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-014.md:512:Trigger: "save context", "save memory", `/memory:save`, memory file creation
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/spec.md:126:| `implemented` | Shipped substrate exists and should not be treated as missing prerequisite work. | Shared trust axes and readiness primitives, planner-first memory-save substrate, Codex hook injection, search-routing measurement scaffolding |
.opencode/specs/system-spec-kit/022-hybrid-rag-fusion/009-perfect-session-capturing/research/research-pipeline-improvements.md:353:**Problem**: Two consecutive `/memory:save` operations for `019-manual-testing-per-playbook` exposed compound failures: (A) the auto-detection cascade failed to identify the active spec folder despite 24+ untracked files, and (B) the saved memory file exhibited 10 of 12 previously-identified R-series issues simultaneously — a quality regression demonstrating that R-11's source-of-truth corruption cascades into nearly every downstream pipeline stage. Additionally, a new decision deduplication bug was discovered where 4 decisions appear twice due to dual-write in the input normalizer.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-005.md:6147:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/README.md:448:| `/memory:save`   | 4          | Save conversation context to a spec folder's `memory/` directory with semantic indexing                                                 |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-005.md:414:| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed                                 |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-005.md:475:Trigger: "save context", "save memory", `/memory:save`, memory file creation
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-005.md:572:| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-005.md:665:Trigger: "save context", "save memory", `/memory:save`, memory file creation
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-031.md:36:- **Migration risk**: planner-only first, execution later; bundling this into Q1 would compound routing and repair risk
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-031.md:90:  - **Q2**: ship planner-first `spec-kit doctor`, then layer freshness/provenance hints into that flow
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/005-memory-indexer-invariants/decision-record.md:84:After A2 landed, live acceptance on `026/009` showed `E_LINEAGE` → `0` but `candidate_changed` went from `58` → `159`. B1 (forcing `scanBatchSize=1` to serialize batches) was the wrong layer — the save-time transactional reconsolidation recheck was the real source, not outer batch overlap. `withSpecFolderLock` already serializes writes per spec folder; the remaining race was inside the save transaction comparing planner-time vs commit-time candidates.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-007.md:651:| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-007.md:744:Trigger: "save context", "save memory", `/memory:save`, memory file creation
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/005-memory-indexer-invariants/spec.md:87:1. **Track A — Cross-file lineage and scan-recheck regressions.** The read-only investigation at `/tmp/codex-lineage-investigation-output.txt` found that the prediction-error gate could treat a sibling spec doc (e.g. `checklist.md`) as the best `UPDATE` or `REINFORCE` candidate for `tasks.md`, then attempt to record a lineage transition across different canonical file paths — surfacing as `E_LINEAGE`. A second failure showed the save-time transactional reconsolidation recheck rerunning candidate selection for scan-originated saves after planner-time decisions had already been made, aborting with `candidate_changed`. Baseline counts across a 026/009 scan were `E_LINEAGE=68` and `candidate_changed=58`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/005-memory-indexer-invariants/spec.md:334:2. Given a scan-originated save, When planner-time and commit-time candidates diverge, Then `candidate_changed` no longer aborts the write while non-scan saves keep the guarded path.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-015.md:356:| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-015.md:449:Trigger: "save context", "save memory", `/memory:save`, memory file creation
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-035.md:15:### Finding 2: The guided maintenance surface fits only as a planner over existing authority boundaries
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-035.md:18:- **Why it matters**: The compatibility answer is yes, but only for a thin planner/wrapper. A guided surface can safely aggregate findings and next steps, or export a repair brief, but it should not become a new execution authority that silently writes memories, repairs indexes, or bypasses confirmation semantics already enforced by the underlying MCP tools.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-035.md:26:- **Why it matters**: Any future integrity work should plug into this existing bridge as extra hints, annotations, or planner inputs, not as a rival index or alternate search path. The conflict to avoid is building a second discovery subsystem for documentation drift when the runtime already has a better separation: lexical integrity for docs truthfulness, CocoIndex for semantic recall, and code graph for structural expansion.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-035.md:42:- **Why it matters**: This makes a broad, all-in-one doctor command risky if it tries to flatten the stack. The compatible design is a native Spec Kit planner that reports integrity, readiness, and suggested next actions, then hands off to explicit internal tools first and to external MCPs only as second-order, opt-in actions. Otherwise a docs-integrity feature inherits unrelated transport, credential, and orchestration risk.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-035.md:69:- **Questions answered**: the integrity lane is compatible only as a separate lexical surface; the guided maintenance surface is compatible only as a planner over existing tools; the right integration seam is the existing CocoIndex-to-code-graph bridge; commit-time automation must stay non-indexing by default; and any future doctor surface must preserve the native-vs-external MCP split
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-035.md:88:3. the planner-only versus execution-enabled boundary for a future `spec-kit doctor`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-017.md:331:| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-017.md:424:Trigger: "save context", "save memory", `/memory:save`, memory file creation
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-001.md:4867:.opencode/skills/system-spec-kit/assets/template_mapping.md:322:**Generation:** Use `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"###-name","sessionSummary":"..."}' specs/###-name/` to auto-generate properly formatted memory files.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-001.md:428:| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed                                 |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-001.md:489:Trigger: "save context", "save memory", `/memory:save`, memory file creation
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-001.md:772:| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-001.md:865:Trigger: "save context", "save memory", `/memory:save`, memory file creation
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-001.md:3951:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/specs/system-spec-kit/z_archive/001-fix-command-dispatch/z_archive/035-memory-speckit-merger/plan.md:287:| Gate 5 | Run /memory:save | generate-context.js executes from new path |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-001.md:4828:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/specs/system-spec-kit/022-hybrid-rag-fusion/019-rewrite-repo-readme/scratch/research-brief.md:104:| Memory Save | HARD BLOCK | "save context", "save memory", `/memory:save` | Must use `generate-context.js` (no manual memory file creation) |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-001.md:4829:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/specs/system-spec-kit/022-hybrid-rag-fusion/019-rewrite-repo-readme/scratch/research-brief.md:144:| `/memory:save` | Save context via `generate-context.js` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-001.md:4853:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/assets/template_mapping.md:322:**Generation:** Use `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"###-name","sessionSummary":"..."}' specs/###-name/` to auto-generate properly formatted memory files.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-001.md:4971:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/specs/system-spec-kit/022-hybrid-rag-fusion/014-agents-md-alignment/research/iterations/iteration-001.md:51:  evidence: Each file still contains the row `| **Save context** | \`/memory:save\` OR compose JSON → \`generate-context.js --json '<data>' [spec-folder]\` → Auto-indexed |`.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-001.md:5314:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/specs/system-spec-kit/022-hybrid-rag-fusion/003-constitutional-learn-refactor/spec.md:44:The current `/memory:learn` command (620 lines) is a generic learning capture tool that classifies inputs into 5 types (pattern, mistake, insight, optimization, constraint) and saves them to spec folder `memory/` directories via `generate-context.js`. This provides negligible value over the existing `/memory:save` command.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-001.md:5401:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/specs/system-spec-kit/022-hybrid-rag-fusion/009-perfect-session-capturing/018-memory-save-quality-fixes/spec.md:45:After the Sprint 1 pipeline hardening landed, a `/memory:save` run still produced a memory file that scored 88/100 while carrying 10 structural quality issues. Manual review traced those defects to eight backend bugs across the `generate-context.js` extraction, normalization, and rendering pipeline: duplicated decision fields, wrong completion status, false blocker detection, generic pattern filler, noisy trigger phrases, contaminated file paths, over-aggressive tree thinning, and missing synthesized conversation messages.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-001.md:5437:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/specs/system-spec-kit/022-hybrid-rag-fusion/013-agents-alignment/scratch/archive-pass2/iteration-003.md:25:- **Fix**: Explicitly allow only /memory:save or generate-context.js, add hard prohibition on direct Write/Edit into memory/.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-001.md:5668:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/specs/system-spec-kit/022-hybrid-rag-fusion/002-indexing-normalization/scratch/agent-output-iter-003-copilot-C1.md:416:  - Global rules say memory saves must use `generate-context.js` when triggered by “save context”, “save memory”, `/memory:save`, or memory-file creation. [`AGENTS.md:129-138`]
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-001.md:5743:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:126:- [ ] Save context if significant progress: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-001.md:5744:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:159:- [ ] Memory context saved: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-001.md:5772:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/references/templates/level_specifications.md:764:| `memory/` | Session context preservation | `generate-context.js` runtime script via `/memory:save` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-001.md:5773:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/references/templates/level_specifications.md:769:- Use `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-001.md:5778:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/specs/system-spec-kit/022-hybrid-rag-fusion/009-perfect-session-capturing/scratch/agent-output-iter-003-codex-A2.md:248:.opencode/specs/system-spec-kit/022-hybrid-rag-fusion/009-perfect-session-capturing/005-confidence-calibration/memory/16-03-26_19-21__confidence-calibration.md:442:# AGENTS.md instructions for /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public  # AI Assistant Framework (Universal Template) > **Universal behavior framework** defining guardrails, standards, and decision protocols. --- ## 1. 🚨 CRITICAL RULES **HARD BLOCKERS (The "Four Laws" of Agent Safety):** 1. **READ FIRST:** Never edit a file without reading it first. Understand context before modifying. 2. **SCOPE LOCK:** Only modify files explicitly in scope. **NO** "cleaning up" or "improving" adjacent code. Scope in `spec.md` is FROZEN. 3. **VERIFY:** Syntax checks and tests **MUST** pass before claiming completion. **NO** blind commits. 4. **HALT:** Stop immediately if uncertain, if line numbers don't match, or if tests fail. (See "Halt Conditions" below). **OPERATIONAL MANDATES:** - **All file modifications require a spec folder** (Gate 3). - **Never lie or fabricate** - use "UNKNOWN" when uncertain. - **Clarify** if confidence < 80% (see §5 Confidence Framework). - **Use explicit uncertainty:** Prefix claims with "I'M UNCERTAIN ABOUT THIS:". **QUALITY PRINCIPLES:** - **Prefer simplicity**, reuse existing patterns, and cite evidence with sources - Solve only the stated problem; **avoid over-engineering** and premature optimization - **Verify with checks** (simplicity, performance, maintainability, scope) before making changes - **Truth over agreement** - correct user misconceptions with evidence; do not agree for conversational flow **HALT CONDITIONS (Stop and Report):** - [ ] Target file does not exist or line numbers don't match. - [ ] Syntax check or Tests fail after edit. - [ ] Merge conflicts encountered. - [ ] Edit tool reports "string not found". - [ ] Test/Production boundary is unclear. **MANDATORY TOOLS:** - **Spec Kit Memory MCP** for research tasks, context recovery, and finding prior work. **Memory saves MUST use `node.opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js [spec-folder-path]`** - NEVER manually create memory files. **GIT WORKFLOW:** Full details: `.opencode/skills/sk-git/` - Worktree setup, conventional commits, PR creation, branch management - Trigger keywords: worktree, branch, commit, merge, pr, pull request, git workflow, finish work, integrate changes ### Quick Reference: Common Workflows | Task | Flow | | ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | | **File modification** | Gate 3 (ask spec folder) → Gate 1 → Gate 2 → Load memory context → Execute | | **Research/exploration** | `memory_match_triggers()` → `memory_context()` (unified) OR `memory_search()` (targeted) → Document findings | | **Code search** | `Grep()` for text patterns, `Glob()` for file discovery, `Read()` for file contents | | **Resume prior work** | `/memory:continue` OR `memory_search({ query, specFolder, anchors: ['state', 'next-steps'] })` → Review checklist → Continue | | **Save context** | `/memory:save` OR `node.opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js [spec-folder-path]` → Auto-indexed | | **Claim completion** | Validation runs automatically → Load `checklist.md` → Verify ALL items → Mark with evidence | | **End session** | `/spec_kit:handover` → Save context → Provide continuation prompt | | **New spec folder** | Option B (Gate 3) → Research via Task tool → Evidence-based plan → Approval → Implement | | **Complex multi-step** | Task tool → Decompose → Delegate → Synthesize | | **Documentation** | sk-doc skill → Classify → Load template → Fill → Validate (`validate_document.py`) → DQI score → Verify | | **Web code** | sk-code-web skill → Webflow/CDN standards, minification, browser testing | | **OpenCode system code** | sk-code-opencode skill → JS/TS/Python/Shell standards, language detection, quality checklists | | **Git workflow** | sk-git skill → Worktree setup / Commit / Finish (PR) | | **Phase workflow** | `/spec_kit:phase` → Decompose → `create.sh --phase` → Populate parent/children → `validate.sh --recursive` | | **Database maintenance** | `/memory:manage` → stats, health, cleanup, checkpoint, ingest operations | | **Analysis/evaluation** | `/memory:analyze` → preflight, postflight, causal graph, ablation, dashboard, history | ### Coding Analysis Lenses | Lens | Focus | Detection Questions | | ------------------ | ---------------- | ---------------------------------------------------------------------------------- | | **CLARITY** | Simplicity | Is this the simplest code that solves the problem? Are abstractions earned? | | **SYSTEMS** | Dependencies | What does this change touch? What calls this? What are the side effects? | | **BIAS** | Wrong problem | Is user solving a symptom? Is this premature optimization? Is the framing correct? | | **SUSTAINABILITY** | Maintainability | Will future devs understand this? Is it self-documenting? Tech debt implications? | | **VALUE** | Actual impact | Does this change behavior or just refactor? Is it cosmetic or functional? | | **SCOPE** | Complexity match | Does solution complexity match problem size? Single-line fix or new abstraction? | ### Coding Anti-Patterns (Detect Silently) | Anti-Pattern | Trigger Phrases | Response | | ---------------------- | ----------------------------------------------- | --------------------------------------------------------------------------- | | Over-engineering | "for flexibility", "future-proof", "might need" | Ask: "Is this solving a current problem or a hypothetical one?" | | Premature optimization | "could be slow", "might bottleneck" | Ask: "Has this been measured? What's the actual performance?" | | Cargo culting | "best practice", "always should" | Ask: "Does this pattern fit this specific case?" | | Gold-plating | "while we're here", "might as well" | Flag scope creep: "That's a separate change - shall I note it for later?" | | Wrong abstraction | "DRY this up" for 2 instances | "These look similar but might not be the same concept. Let's verify first." | | Scope creep | "also add", "bonus feature" | "That's outside the current scope. Want to track it separately?" | --- ## 2. ⛔ MANDATORY GATES - STOP BEFORE ACTING **⚠️ BEFORE using ANY tool (except Gate Actions: memory_match_triggers, skill_advisor.py), you MUST pass all applicable gates below.** ### 🔒 PRE-EXECUTION GATES (Pass before ANY tool use) #### GATE 1: UNDERSTANDING + CONTEXT SURFACING [SOFT] BLOCK Trigger: EACH new user message (re-evaluate even in ongoing conversations) 1. Call `memory_match_triggers(prompt)` → Surface relevant context 2. Classify intent: Research or Implementation 3. Parse request → Check confidence AND uncertainty (see §4) 4. **Dual-threshold:** confidence ≥ 0.70 AND uncertainty ≤ 0.35 → PROCEED. Either fails → INVESTIGATE (max 3 iterations) → ESCALATE. Simple: <40% ASK | 40-69% CAUTION | ≥70% PASS > Gate 1 is SOFT — if file modification detected, Gate 3 (HARD) takes precedence. Ask spec folder question BEFORE analysis. #### GATE 2: SKILL ROUTING [REQUIRED for non-trivial tasks] 1. A) Run: `python3.opencode/skills/scripts/skill_advisor.py "[request]" --threshold 0.8` 2. B) Cite user's explicit direction: "User specified: [exact quote]" - Confidence ≥ 0.8 → MUST invoke skill | < 0.8 → general approach | User names skill → cite and proceed - Output: `SKILL ROUTING: [result]` or `SKILL ROUTING: User directed → [name]` - Skip: trivial queries only (greetings, single-line questions) #### GATE 3: SPEC FOLDER QUESTION [HARD] BLOCK — PRIORITY GATE - **Overrides Gates 1-2:** If file modification detected → ask Gate 3 BEFORE any analysis/tool calls - **Triggers:** rename, move, delete, create, add, remove, update, change, modify, edit, fix, refactor, implement, build, write, generate, configure, analyze, decompose, phase — or any task resulting in file changes - **Options:** A) Existing | B) New | C) Update related | D) Skip | E) Phase folder (e.g., `specs/NNN-name/001-phase/`) - **DO NOT** use Read/Edit/Write/Bash (except Gate Actions) before asking. ASK FIRST, wait for response, THEN proceed - **Phase boundary:** Gate 3 answers apply ONLY within current workflow phase. Plan→implement transition MUST re-evaluate. Exception: carry-over IS valid for Memory Save Rule #### CONSOLIDATED QUESTION PROTOCOL When multiple inputs are needed, consolidate into a SINGLE prompt — never split across messages. Include only applicable questions; omit when pre-determined. - **Round-trip optimization** — Only 1 user interaction needed for setup - **First Message Protocol** — ALL questions asked BEFORE any analysis or tool calls - **Violation:** Multiple separate prompts → STOP, apologize, re-present as single prompt - **Bypass phrases:** "skip context" / "fresh start" / "skip memory" / [skip] for memory loading; Level 1 tasks skip completion verification --- ### 🔒 POST-EXECUTION RULES #### MEMORY SAVE RULE [HARD] BLOCK Trigger: "save context", "save memory", `/memory:save`, memory file creation - If spec folder established at Gate 3 → USE IT (don't re-ask). Carry-over applies ONLY to memory saves - If NO folder and Gate 3 never answered → HARD BLOCK → Ask user - **Script:** `node.opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js [spec-folder-path]` - Mode 1 (JSON): Write JSON to `/tmp/save-context-data.json`, pass as arg - Mode 2 (Direct): Pass spec folder path (e.g., `specs/005-memory`) - Subfolder: `003-parent/121-child` or bare `121-child` (auto-searches parents) - **Indexing:** For immediate MCP visibility after save: `memory_index_scan({ specFolder })` or `memory_save()` - **Violation:** Write tool on `memory/` path → DELETE and re-run via script #### COMPLETION VERIFICATION RULE [HARD] BLOCK Trigger: Claiming "done", "complete", "finished", "works" 1. Validation runs automatically on spec folder (if exists) 2. Load `checklist.md` → Verify ALL items → Mark `[x]` with evidence - Skip: Level 1 tasks (no checklist.md required) | Exit 0 = pass, Exit 1 = warnings, Exit 2 = errors (must fix) #### VIOLATION RECOVERY [SELF-CORRECTION] Trigger: About to skip gates, or realized gates were skipped → STOP → STATE: "Before I proceed, I need to ask about documentation:" → ASK Gate 3 (A/B/C/D/E) → WAIT #### Self-Check (before ANY tool-using response): - [ ] File modification? Asked spec folder question? - [ ] Skill routing verified? - [ ] Saving memory? Using `generate-context.js` (not Write tool)? - [ ] Aligned with ORIGINAL request? No scope drift? - [ ] Claiming completion? `checklist.md` verified? --- ## 3. 📝 CONVERSATION DOCUMENTATION Every conversation that modifies files MUST have a spec folder. **Full details:** system-spec-kit SKILL.md (§1 When to Use, §3 How it Works, §4 Rules) ### Documentation Levels | Level | LOC | Required Files | Use When | | ------ | -------------- | ----------------------------------------------------- | ---------------------------------- | | **1** | <100 | spec.md, plan.md, tasks.md, implementation-summary.md | All features (minimum) | | **2** | 100-499 | Level 1 + checklist.md | QA validation needed | | **3** | ≥500 | Level 2 + decision-record.md (+ optional research/research.md) | Complex/architecture changes | | **3+** | Complexity 80+ | Level 3 + AI protocols, extended checklist, sign-offs | Multi-agent, enterprise governance | > **Note:** `implementation-summary.md` is REQUIRED for all levels but created **after implementation completes**, not at spec folder creation time. See SKILL.md §4 Rule 13. **Rules:** When in doubt → higher level. LOC is soft guidance (risk/complexity can override). Single typo/whitespace fixes (<5 characters in one file) are exempt. **Spec folder path:** `specs/[###-short-name]/` | **Templates:** `.opencode/skills/system-spec-kit/templates/` **For details on:** folder structure, `scratch/` vs `memory/` usage, sub-folder versioning, checklist verification (P0/P1/P2), and completion workflow — see system-spec-kit SKILL.md §3. --- ## 4. 🧑🏫 CONFIDENCE & CLARIFICATION FRAMEWORK **Core Principle:** If confidence < 80%, pause and ask for clarification with multiple-choice options. | Confidence | Action | | ------------ | -------------------------------------------- | | **≥80%** | Proceed with citable source | | **40-79%** | Proceed with caveats | | **<40%** | Ask for clarification or mark "UNKNOWN" | | **Override** | Blockers/conflicts → ask regardless of score | **Logic-Sync Protocol:** On contradiction (Spec vs Code, conflicting requirements) → HALT → Report "LOGIC-SYNC REQUIRED: [Fact A] contradicts [Fact B]" → Ask "Which truth prevails?" **Escalation:** Confidence stays <80% after two failed attempts → ask with 2-3 options. Blockers beyond control → escalate with evidence and proposed next step. --- ## 5. 🧠 REQUEST ANALYSIS & SOLUTION FRAMEWORK **Flow:** Parse request → Read files first → Analyze → Design simplest solution → Validate → Execute | Principle | Rule | Anti-Pattern | | ----------------- | -------------------------------------------------- | --------------------------------------- | | **Simplicity** | Reuse patterns; earn every abstraction | Utilities for <3 uses, single-impl intf | | **Evidence** | Cite `[SOURCE: file:lines]` or `[CITATION: NONE]` | Claims without verification | | **Scope Match** | Solution size = problem size | Refactoring during bug fix | | **Right Problem** | Root cause, not symptom; measure before optimizing | Premature optimization, wrong framing | **CLARITY Triggers** (justify before proceeding): - Utility for <3 uses | Config for single value | Abstraction without clear boundary - Pattern where simple code suffices | Interface for single impl - On bias → don't argue, redirect to root cause **Pre-Change Checklist:** - [ ] Read first? | Simplest solution? | Scope discipline? - [ ] Confidence ≥80%? | Sources cited? | Spec folder? | Approval? **Five Checks (>100 LOC):** Necessary now? | Alternatives (≥2)? | Simplest sufficient? | On critical path? | No tech debt? **STOP CONDITIONS:** Any check unchecked | no spec folder | no approval → STOP and address --- ## 6. 🤖 AGENT ROUTING When using the orchestrate agent or Task tool for complex multi-step workflows, route to specialized agents: ### Runtime Agent Directory Resolution Use the agent directory that matches the active runtime/provider profile: | Runtime / Profile | Agent Directory | Usage Rule | | -------------------------------------- | -------------------------- | ----------------------------------------------------------- | | **Copilot (default OpenCode profile)** | `.opencode/agents/` | Load base agent definitions from this directory | | **ChatGPT profile** | `.opencode/agents/chatgpt/` | Load ChatGPT-specific agent definitions from this directory | | **Claude profile** | `.claude/agents/` | Load Claude-specific agent definitions from this directory | | **Gemini CLI** | `.gemini/agents/` | Load Gemini-specific agent definitions from this directory | **Resolution rule:** pick one directory by runtime and stay consistent for that workflow phase. ### Agent Definitions - **`@general`** — Implementation, complex tasks - **`@context`** — ALL codebase exploration, file search, pattern discovery, context loading. Dispatches sub-agents for fast search and deep investigation - **`@orchestrate`** — Multi-agent coordination, complex workflows - **`@research`** — Evidence gathering, planning, Gate 3 Option B. May write `research/research.md` inside spec folders - **`@write`** — Creating READMEs, Skills, Guides - **`@review`** — Code review, PRs, quality gates (READ-ONLY) - **`@speckit`** — Spec folder creation Level 1-3+. **EXCLUSIVE:** Only agent permitted to write `*.md` inside spec folders. Exceptions: `memory/` (generate-context.js), `scratch/` (any agent), `handover.md` (@handover), `research/research.md` (@research), `debug-delegation.md` (@debug) - **`@debug`** — Fresh perspective debugging, root cause analysis. May write `debug-delegation.md` inside spec folders - **`@handover`** — Session continuation, context preservation. May write `handover.md` inside spec folders - **`@ultra-think`** — Multi-strategy planning architect. Dispatches diverse thinking strategies, scores via 5-dimension rubric, synthesizes optimal plan. Planning-only: no file modifications --- ## 7. ⚙️ MCP CONFIGURATION **Two systems:** 1. **Native MCP** (`opencode.json`) - Direct tools, called natively - Sequential Thinking, Spec Kit Memory, Code Mode server 2. **Code Mode MCP** (`.utcp_config.json`) - External tools via `call_tool_chain()` - Figma, Github, ClickUp, Chrome DevTools, etc. - Naming: `{manual_name}.{manual_name}_{tool_name}` (e.g., `clickup.clickup_get_teams({})`) - Discovery: `search_tools()`, `list_tools()`, or read `.utcp_config.json` --- ## 8. 🧩 SKILLS SYSTEM Skills are specialized, on-demand capabilities that provide domain expertise. Unlike knowledge files (passive references), skills are explicitly invoked to handle complex, multi-step workflows. ### How Skills Work ``` Task Received → Gate 2: Run skill_advisor.py ↓ Confidence > 0.8 → MUST invoke recommended skill ↓ Invoke Skill → Read(".opencode/skills/<skill-name>/SKILL.md") ↓ Instructions Load → SKILL.md content + resource paths ↓ Follow Instructions → Complete task using skill guidance ``` ### Skill Loading Protocol 1. Gate 2 provides skill recommendation via `skill_advisor.py` 2. Invoke using appropriate method for your environment 3. Read bundled resources from `references/`, `scripts/`, `assets/` paths 4. Follow skill instructions to completion 5. Do NOT re-invoke a skill already in context ### Primary Skill: sk-code-opencode For ALL OpenCode system code (`.opencode/`, MCP servers, scripts), `sk-code-opencode` provides multi-language standards. Includes the `system-spec-kit` skill for spec folder workflows and the Spec Kit Memory system for context preservation across sessions. **Supported Languages:** | Language | Target | Key Patterns | | ---------- | ----------------------------- | ------------------------------------------- | | JavaScript | MCP servers, CommonJS modules | `require`/`module.exports`, strict mode | | TypeScript | Type-safe modules, configs | Interfaces, strict tsconfig, type guards | | Python | Validators, advisors, tests | snake_case, argparse, pytest, docstrings | | Shell | Automation, deployment | `set -euo pipefail`, shebang, quoting | | JSON/JSONC | Manifests, schemas, configs | Schema validation, commented config | **Key Systems:** - **system-spec-kit**: Spec folder lifecycle (Levels 1-3+), validation, template architecture - **Spec Kit Memory**: Context preservation, semantic search, session continuity (`/memory:save`, `/memory:continue`) **Invocation:** Automatic via Gate 2 routing when OpenCode system code tasks detected. ### Git Workflow Skill: sk-git For ALL git workflows, `sk-git` orchestrates workspace setup, commit hygiene, and work completion. **Sub-workflows:** - **Worktree**: Branch creation via `git worktree`, workspace isolation, parallel development - **Commit**: Conventional commit format, staged change analysis, clean commit messages - **Finish**: PR creation, branch cleanup, integration workflows **Trigger Keywords:** worktree, branch, commit, merge, pr, pull request, git workflow, conventional commits, finish work, integrate changes **Invocation:** Automatic via Gate 2 routing when git tasks detected, or manually via `Read(".opencode/skills/sk-git/SKILL.md")`. ## Skills A skill is a set of local instructions to follow that is stored in a `SKILL.md` file. Below is the list of skills that can be used. Each entry includes a name, description, and file path so you can open the source for full instructions when using a specific skill. ### Available skills - cli-claude-code: Claude Code CLI orchestrator enabling external AI assistants (Gemini, Codex, Copilot) to invoke Anthropic's Claude Code CLI for supplementary tasks including deep reasoning, code editing, structured output, code review, agent delegation, and extended thinking. (file: /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public/.opencode/skills/cli-claude-code/SKILL.md) - cli-codex: Codex CLI orchestrator enabling any AI assistant to invoke OpenAI's Codex CLI for supplementary AI tasks including code generation, code review, web research, codebase analysis, cross-AI validation, and parallel task processing. (file: /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public/.opencode/skills/cli-codex/SKILL.md) - cli-copilot: GitHub Copilot CLI orchestrator enabling external AI assistants to invoke the standalone 'copilot' binary for supplementary tasks including collaborative planning, cloud delegation, versatile code generation, and autonomous task execution. (file: /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public/.opencode/skills/cli-copilot/SKILL.md) - cli-gemini: Gemini CLI orchestrator enabling any AI assistant to invoke Google's Gemini CLI for supplementary AI tasks including code generation, web research via Google Search, codebase architecture analysis, cross-AI validation, and parallel task processing. (file: /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public/.opencode/skills/cli-gemini/SKILL.md) - mcp-chrome-devtools: Chrome DevTools orchestrator providing intelligent routing between CLI (bdg) and MCP (Code Mode) approaches. CLI prioritized for speed and token efficiency; MCP fallback for multi-tool integration scenarios. (file: /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public/.opencode/skills/mcp-chrome-devtools/SKILL.md) - mcp-clickup: ClickUp project management orchestrator providing intelligent routing between CLI (cu) and MCP (Code Mode) approaches. CLI prioritized for speed and token efficiency; MCP for enterprise features like docs, goals, webhooks, and bulk operations. (file: /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public/.opencode/skills/mcp-clickup/SKILL.md) - mcp-code-mode: MCP orchestration via TypeScript execution for efficient multi-tool workflows. Use Code Mode for ALL MCP tool calls (ClickUp, Notion, Figma, Webflow, Chrome DevTools, etc.). Provides 98.7% context reduction, 60% faster execution, and type-safe invocation. Mandatory for external tool integration. (file: /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public/.opencode/skills/mcp-code-mode/SKILL.md) - mcp-figma: Figma design file access via MCP providing 18 tools for file retrieval, image export, component/style extraction, team management, and collaborative commenting. Accessed via Code Mode for token-efficient workflows. (file: /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public/.opencode/skills/mcp-figma/SKILL.md) - sk-code-full-stack: Stack-agnostic development orchestrator guiding developers through implementation, testing, and verification phases with automatic stack detection via marker files and bundled stack-specific knowledge. (file: /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public/.opencode/skills/sk-code-full-stack/SKILL.md) - sk-code-opencode: Multi-language code standards for OpenCode system code (JavaScript, TypeScript, Python, Shell, JSON/JSONC) with language detection routing, universal patterns, and quality checklists. (file: /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public/.opencode/skills/sk-code-opencode/SKILL.md) - sk-code-review: Stack-agnostic code review baseline skill with findings-first severity analysis, mandatory security/correctness minimums, and adaptive overlay compatibility with sk-code-opencode, sk-code-web, and sk-code-full-stack standards. (file: /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public/.opencode/skills/sk-code-review/SKILL.md) - sk-code-web: Orchestrator guiding developers through implementation, debugging, and verification phases across specialized code quality skills (project) (file: /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public/.opencode/skills/sk-code-web/SKILL.md) - sk-doc: Unified markdown and OpenCode component specialist providing document quality enforcement, content optimization, component creation workflows (skills, agents, commands), ASCII flowcharts and install guides. (file: /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public/.opencode/skills/sk-doc/SKILL.md) - sk-git: Git workflow orchestrator guiding developers through workspace setup, clean commits, and work completion across git-worktrees, git-commit, and git-finish skills (file: /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public/.opencode/skills/sk-git/SKILL.md) - sk-improve-prompt: Prompt engineering specialist that transforms vague requests into structured, scored AI prompts using 7 proven frameworks (RCAF, COSTAR, RACE, CIDI, TIDD-EC, CRISPE, CRAFT), DEPTH thinking methodology, and CLEAR scoring across text modes. (file: /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public/.opencode/skills/sk-improve-prompt/SKILL.md) - system-spec-kit: Unified documentation and context preservation: spec folder workflow (levels 1-3+), CORE + ADDENDUM template architecture (v2.2), validation, and Spec Kit Memory for context preservation. Mandatory for all file modifications. (file: /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public/.opencode/skills/system-spec-kit/SKILL.md) - openai-docs: Use when the user asks how to build with OpenAI products or APIs and needs up-to-date official documentation with citations, help choosing the latest model for a use case, or explicit GPT-5.4 upgrade and prompt-upgrade guidance; prioritize OpenAI docs MCP tools, use bundled references only as helper context, and restrict any fallback browsing to official OpenAI domains. (file: /Users/michelkerkmeester/.codex/skills/.system/openai-docs/SKILL.md) - skill-creator: Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Codex's capabilities with specialized knowledge, workflows, or tool integrations. (file: /Users/michelkerkmeester/.codex/skills/.system/skill-creator/SKILL.md) - skill-installer: Install Codex skills into $CODEX_HOME/skills from a curated list or a GitHub repo path. Use when a user asks to list installable skills, install a curated skill, or install a skill from another repo (including private repos). (file: /Users/michelkerkmeester/.codex/skills/.system/skill-installer/SKILL.md) ### How to use skills - Discovery: The list above is the skills available in this session (name + description + file path). Skill bodies live on disk at the listed paths. - Trigger rules: If the user names a skill (with `$SkillName` or plain text) OR the task clearly matches a skill's description shown above, you must use that skill for that turn. Multiple mentions mean use them all. Do not carry skills across turns unless re-mentioned. - Missing/blocked: If a named skill isn't in the list or the path can't be read, say so briefly and continue with the best fallback. - How to use a skill (progressive disclosure): 1) After deciding to use a skill, open its `SKILL.md`. Read only enough to follow the workflow. 2) When `SKILL.md` references relative paths (e.g., `scripts/foo.py`), resolve them relative to the skill directory listed above first, and only consider other paths if needed. 3) If `SKILL.md` points to extra folders such as `references/`, load only the specific files needed for the request; don't bulk-load everything. 4) If `scripts/` exist, prefer running or patching them instead of retyping large code blocks. 5) If `assets/` or templates exist, reuse them instead of recreating from scratch. - Coordination and sequencing: - If multiple skills apply, choose the minimal set that covers the request and state the order you'll use them. - Announce which skill(s) you're using and why (one short line). If you skip an obvious skill, say why. - Context hygiene: - Keep context small: summarize long sections instead of pasting them; only load extra files when needed. - Avoid deep reference-chasing: prefer opening only files directly linked from `SKILL.md` unless you're blocked. - When variants exist (frameworks, providers, domains), pick only the relevant reference file(s) and note that choice. - Safety and fallback: If a skill can't be applied cleanly (missing files, unclear instructions), state the issue, pick the next-best approach, and continue. Files called AGENTS.md commonly appear in many places inside a container - at "/", in "~", deep within git repositories, or in any other directory; their location is not limited to version-controlled folders. Their purpose is to pass along human guidance to you, the agent. Such guidance can include coding standards, explanations of the project layout, steps for building or testing, and even wording that must accompany a GitHub pull-request description produced by the agent; all of it is to be followed. Each AGENTS.md governs the entire directory that contains it and every child directory beneath that point. Whenever you change a file, you have to comply with every AGENTS.md whose scope covers that file. Naming conventions, stylistic rules and similar directives are restricted to the code that falls inside that scope unless the document explicitly states otherwise. When two AGENTS.md files disagree, the one located deeper in the directory structure overrides the higher-level file, while instructions given directly in the prompt by the system, developer, or user outrank any AGENTS.md content.   /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public zsh 2026-03-16 Europe/Amsterdam
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-001.md:5950:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/specs/system-spec-kit/022-hybrid-rag-fusion/018-rewrite-system-speckit-readme/scratch/research-brief.md:208:| 1 | `/memory:save [folder]` | Save conversation context to spec folder memory/ with semantic indexing via generate-context.js | `.opencode/commands/memory/save.md` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-008.md:371:| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-008.md:464:Trigger: "save context", "save memory", `/memory:save`, memory file creation
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-040.md:318:**Executive summary:** Mex should **not** replace Spec Kit Memory. The durable import from 40 iterations is a **separate advisory markdown integrity lane** plus, later, a **thin planner surface** over existing maintenance tools. Keep `session_bootstrap`/`/spec_kit:resume`, hybrid retrieval, CocoIndex, code graph, causal links, and explicit repair/save authority exactly where they already live. Treat freshness only as advisory metadata. Reject score-first health and any design that mixes integrity into retrieval/ranking.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-040.md:329:| 8 | Design planner-only `spec-kit doctor` handoff payloads | **New feature** | High | Medium |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-040.md:341:8. Design planner-only `spec-kit doctor`.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-040.md:346:- **Decision:** adopt a narrow lexical integrity lane and a thin planner UX layer; do not adopt Mex as the memory substrate.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-040.md:348:- **Build next:** planner-only `spec-kit doctor` over existing authorities.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-011.md:391:| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-011.md:484:Trigger: "save context", "save memory", `/memory:save`, memory file creation
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-018.md:466:| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed                                 |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-018.md:527:Trigger: "save context", "save memory", `/memory:save`, memory file creation
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-018.md:664:| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-018.md:757:Trigger: "save context", "save memory", `/memory:save`, memory file creation
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-009.md:330:| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-009.md:423:Trigger: "save context", "save memory", `/memory:save`, memory file creation
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-006.md:424:| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed                                 |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-006.md:485:Trigger: "save context", "save memory", `/memory:save`, memory file creation
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-006.md:563:| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-006.md:656:Trigger: "save context", "save memory", `/memory:save`, memory file creation
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-019.md:327:| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-019.md:420:Trigger: "save context", "save memory", `/memory:save`, memory file creation
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-006.md:2052:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/assets/template_mapping.md:322:**Generation:** Use `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"###-name","sessionSummary":"..."}' specs/###-name/` to auto-generate properly formatted memory files.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-006.md:4083:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:126:- [ ] Save context if significant progress: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-006.md:4084:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:159:- [ ] Memory context saved: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-006.md:4173:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/references/templates/level_specifications.md:764:| `memory/` | Session context preservation | `generate-context.js` runtime script via `/memory:save` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-006.md:4174:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/references/templates/level_specifications.md:769:- Use `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-006.md:4183:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/feature_catalog/feature_catalog.md:60:| `/memory:save` | 4 | shared | `memory_save`, `memory_index_scan`, `memory_stats`, `memory_update` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-032.md:60:  - `SPECKIT_GUIDED_SURFACE_EXECUTION=false` for planner/prompt mode first
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-032.md:133:Define the Q1 rollout contract as a small acceptance matrix: checker scope, advisory-to-blocking promotion criteria, wrapper routing behavior under stale structural context, and the exact conditions under which planner-only maintenance can ever gain execution privileges.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-016.md:331:| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-016.md:424:Trigger: "save context", "save memory", `/memory:save`, memory file creation
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-036.md:285:  │ "generate-context\.js|session_bootstrap|session_resume|memory_context\(|/memory:save|/spec_kit:r
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-022.md:1621:.opencode/skills/system-spec-kit/assets/template_mapping.md:322:**Generation:** Use `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"###-name","sessionSummary":"..."}' specs/###-name/` to auto-generate properly formatted memory files.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-022.md:5430:.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:126:- [ ] Save context if significant progress: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-022.md:5431:.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:159:- [ ] Memory context saved: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-022.md:5537:.opencode/skills/system-spec-kit/references/templates/level_specifications.md:764:| `memory/` | Session context preservation | `generate-context.js` runtime script via `/memory:save` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-022.md:5538:.opencode/skills/system-spec-kit/references/templates/level_specifications.md:769:- Use `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/007-hook-parity/008-docs-impact-remediation/checklist.md:88:5. `/memory:save` run with canonical JSON to refresh `description.json` + `graph-metadata.json`.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-036.md:10:- **Why it matters**: If we adopt the lexical integrity lane and guided maintenance planner, the main DX improvement should be a smaller mental model, not more knobs. The right addition is one explicit integrity entry point that routes to existing tools and preserves their authority boundaries.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-036.md:26:- **Why it matters**: The adoptable UX pattern is not auto-fix itself; it is the clarity of a targeted repair brief. In Public, the safe developer experience is a planner-first command that can emit issue JSON, a repair plan, and explicit next steps before any write-capable operation is allowed to run.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-036.md:41:- **What it does**: Mex presents one CLI family, so "use check/sync/watch" is unambiguous. Public already has distinct namespaces with overlapping "health", "save", "resume", and "doctor" language: `/doctor:mcp_debug` for broken MCP servers, `/memory:manage health` for DB/index health, `/memory:save` for session persistence, and `/spec_kit:resume` for recovery.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-036.md:69:- **Questions answered**: one thin integrity surface is justified; `session_bootstrap` and `/spec_kit:resume` should stay canonical; repair should be planner-first and confirmation-gated; Mex-style mandatory pattern growth should not migrate; command-routing documentation is mandatory
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-036.md:70:- **Novelty justification**: earlier iterations established the integrity lane and planner direction; this pass adds the missing operator-facing command contract and migration-map constraints for a real rollout
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-036.md:87:3. publish the routing matrix against `/doctor:mcp_debug`, `/memory:manage health`, `/memory:save`, and `/spec_kit:resume`;
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/007-hook-parity/008-docs-impact-remediation/implementation-summary.md:198:- Canonical `/memory:save` with structured JSON can be run at any time to refresh `graph-metadata.json.derived.last_save_at` and propagate this packet into the memory index.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-002.md:3459:    92	| `/memory:save` | Save conversation context | 4 tools |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-002.md:5835:.opencode/skills/system-spec-kit/assets/template_mapping.md:322:**Generation:** Use `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"###-name","sessionSummary":"..."}' specs/###-name/` to auto-generate properly formatted memory files.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-002.md:5989:.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:126:- [ ] Save context if significant progress: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-002.md:5990:.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:159:- [ ] Memory context saved: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-002.md:6765:.opencode/skills/system-spec-kit/references/templates/level_specifications.md:764:| `memory/` | Session context preservation | `generate-context.js` runtime script via `/memory:save` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/iterations/iteration-002.md:6766:.opencode/skills/system-spec-kit/references/templates/level_specifications.md:769:- Use `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-002.md:317:| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-002.md:410:Trigger: "save context", "save memory", `/memory:save`, memory file creation
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/001-engram-main/research/iterations/iteration-002.md:1343:2026-04-10T20:35:01.118874Z ERROR codex_core::tools::router: error=exec_command failed for `/bin/zsh -lc 'rg -n "CREATE TABLE|sqlite|fts5|memory_index|duplicate|causal|session|working_memory|trigger|memory_search|memory_context|memory_match_triggers|generate-context|memory_save|session_bootstrap|session_resume|code_graph|topic" .opencode/skills/system-spec-kit/mcp_server .opencode/skills/system-spec-kit/scripts .opencode/skills/system-spec-kit/src .opencode/skills/system-spec-kit/lib 2>/dev/null'`: CreateProcess { message: "Codex(Sandbox(Denied { output: ExecToolCallOutput { exit_code: 2, stdout: StreamOutput { text: \"\", truncated_after_lines: None }, stderr: StreamOutput { text: \".opencode/skills/system-spec-kit/mcp_server/context-server.ts:85:import * as sessionBoost from './lib/search/session-boost.js';\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:86:import * as causalBoost from './lib/search/causal-boost.js';\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:113:import * as sessionManager from './lib/session/session-manager.js';\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:115:// Phase 023: Context metrics — lightweight session quality tracking\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:116:import { recordMetricEvent } from './lib/session/context-metrics.js';\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:125:import { migrateLearnedTriggers, verifyFts5Isolation } from './lib/storage/learned-triggers-schema.js';\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:131:import { getSessionSnapshot } from './lib/session/session-snapshot.js';\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:163:  triggered: unknown[];\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:169:  sessionPrimed?: boolean;\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:213:  'code_graph_query',\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:214:  'code_graph_context',\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:215:  'code_graph_scan',\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:216:  'code_graph_status',\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:254:  preferredTool: 'code_graph_query';\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:255:  secondaryTool: 'code_graph_context';\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:257:  preservesAuthority: 'session_bootstrap';\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:258:  surface: 'response-hints' | 'session-bootstrap' | 'memory-context';\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:320:    preferredTool: 'code_graph_query',\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:321:    secondaryTool: 'code_graph_context',\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:322:    message: 'Advisory only: this looks like a structural question. Prefer `code_graph_query` before Grep or Glob for callers, imports, outline, and dependency lookups.',\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:323:    preservesAuthority: 'session_bootstrap',\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:360:  const transportSessionId = typeof (extra as { sessionId?: unknown } | null)?.sessionId === 'string'\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:361:    ? ((extra as { sessionId?: string }).sessionId ?? null)\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:363:  const explicitSessionId = typeof args.sessionId === 'string'\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:364:    ? args.sessionId\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:365:    : typeof args.session_id === 'string'\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:366:      ? args.session_id\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:376:// REQ-014: Sticky session for follow_on_tool_use correlation.\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:377:// Stores the last resolved session ID so non-search tools (e.g. memory_stats)\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:378:// that lack an explicit sessionId param can still correlate with a prior search.\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:669:  sessionPrimeContext: AutoSurfaceResult,\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:676:  const constitutionalCount = Array.isArray(sessionPrimeContext.constitutional)\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:677:    ? sessionPrimeContext.constitutional.length\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:679:  const codeGraphStatus = sessionPrimeContext.codeGraphStatus;\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:689:  const pkg = sessionPrimeContext.primePackage;\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:700:  meta.sessionPriming = sessionPrimeContext;\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:738:// (CHK-076): Instructions are computed once at startup and NOT refreshed during the session.\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:747:  const channels: string[] = ['vector', 'fts5'];\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:752:    ? ` Warning: ${stats.staleCount} stale memories detected. Consider running memory_index_scan.`\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:759:    'Key tools: memory_context, memory_search, memory_save, memory_index_scan, memory_stats.',\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:760:    'Graph retrieval: memory_search supports retrievalLevel (local/global/auto) for entity-level or community-level search. Graph provenance visible via graphEvidence in results.',\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:764:  // Phase 024 / Item 4: Session recovery digest from session-snapshot\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:766:    const { getSessionSnapshot } = await import('./lib/session/session-snapshot.js');\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:768:    const hasData = snap.specFolder || snap.graphFreshness !== 'error' || snap.sessionQuality !== 'unknown';\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:770:      const recommended = !snap.primed ? 'call session_bootstrap()' :\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:771:        snap.graphFreshness === 'empty' ? 'run code_graph_scan' :\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:772:        snap.sessionQuality === 'critical' ? 'call memory_context(resume)' : 'ready';\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:777:      lines.push(`- Session quality: ${snap.sessionQuality}`);\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:780:  } catch { /* session-snapshot not available — skip digest */ }\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:785:  lines.push('Non-hook runtimes receive automatic structural context via session_bootstrap, session_resume, and auto-prime.');\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:786:  lines.push('- If structural context shows \\\"ready\\\": code_graph_query is available for structural lookups');\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:787:  lines.push('- If \\\"stale\\\" or \\\"missing\\\": call session_bootstrap first to refresh structural context');\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:788:  lines.push('- Recovery priority: session_bootstrap → session_resume → code_graph_scan');\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:792:    const { getSessionSnapshot: getSnap } = await import('./lib/session/session-snapshot.js');\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:799:      routingRules.push('Structural queries (callers, imports, deps) → code_graph_query');\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:823:    const triggerMatcher = await import('./lib/parsing/trigger-matcher.js');\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:824:    if (typeof triggerMatcher.clearCache === 'function') {\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:825:      triggerMatcher.clearCache();\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:829:    console.error(`[context-server] Failed to clear trigger cache after DB reinit: ${message}`);\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:865:  const sessionTrackingId = resolveSessionTrackingId(args, _extra);\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:866:  if (sessionTrackingId) lastKnownSessionId = sessionTrackingId;\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:874:    // T018: Track last tool call timestamp for all tools except session_health.\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:875:    if (name !== 'session_health') {\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:876:      recordToolCall(sessionTrackingId);\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:882:    if (name === 'memory_context' && args.mode === 'resume') {\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:885:    if (name.startsWith('code_graph_')) {\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:886:      recordMetricEvent({ kind: 'code_graph_query' });\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:897:    let sessionPrimeContext: AutoSurfaceResult | null = null;\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:899:      sessionPrimeContext = await primeSessionIfNeeded(\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:902:        sessionTrackingId,\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:912:      name === 'memory_context' && args.mode === 'resume';\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:964:    if (name !== 'memory_search' && name !== 'memory_context' && name !== 'memory_quick_search' && name !== 'session_health') {\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:969:        const followOnSessionId = sessionTrackingId ?? lastKnownSessionId;\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:977:    if ((name === 'memory_search' || name === 'memory_context') && result && !result.isError && result.content?.[0]?.text) {\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:985:            existingHints.push('Tip: For code search queries, consider using mcp__cocoindex_code__search for semantic code search or code_graph_query for structural lookups.');\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:1021:    // near mentioned file paths and session continuity warnings.\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:1066:          if (sessionPrimeContext && !result.isError) {\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:1067:            injectSessionPrimeHints(envelope, meta, sessionPrimeContext);\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:1195:      const row = (database.prepare('SELECT 1 FROM memory_index WHERE file_path = ?') as import('better-sqlite3').Statement).get(originalPath);\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:1243:      console.error('[context-server] Run memory_index_scan manually after model loads');\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:1362:  runCleanupStep('sessionManager', () => sessionManager.shutdown());\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:1421:      FROM memory_index\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:1428:      FROM memory_index\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:1560:  // P4-12/P4-19 FIX: Pass sessionManager and incrementalIndex so db-state can\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:1567:    sessionManager,\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:1570:      sessionBoost,\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:1571:      causalBoost,\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:1622:        console.error(`[context-server] Learned triggers ready (migrated=${migrated}, fts5Isolated=${isolated})`);\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:1640:    const memoryCountRow = database.prepare('SELECT COUNT(*) as cnt FROM memory_index').get() as { cnt?: number } | undefined;\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:1652:    console.error('[context-server] Startup health: memory_index=%d, active_memory_projection=%d', memoryCount, projectionCount);\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:1656:      console.error('[context-server] Auto-backfill triggered: %d rows seeded into active_memory_projection', result.seeded);\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:1673:    sessionBoost.init(database);\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:1674:    causalBoost.init(database);\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:1694:    console.error('[context-server] Checkpoints, access tracker, hybrid search, session boost, and causal boost initialized');\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:1791:      const sessionResult = sessionManager.init(database);\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:1792:      if (sessionResult.success) {\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:1793:        console.error(`[context-server] Session manager initialized (enabled: ${sessionManager.isEnabled()})`);\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:1796:        // Reset any sessions that were active when server last crashed\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:1797:        const recoveryResult = sessionManager.resetInterruptedSessions();\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:1799:          console.error(`[context-server] Crash recovery: marked ${recoveryResult.interruptedCount} sessions as interrupted`);\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:1800:          // Log interrupted sessions for visibility\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:1801:          const interrupted = sessionManager.getInterruptedSessions();\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:1802:          if (interrupted.sessions && interrupted.sessions.length > 0) {\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:1803:            console.error('[context-server] Recoverable sessions:', interrupted.sessions.map((s: { sessionId: string }) => s.sessionId).join(', '));\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:1807:        console.warn('[context-server] Session manager initialization returned:', sessionResult.error);\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:1809:    } catch (sessionErr: unknown) {\\n.opencode/skills/system-spec-kit/mcp_server/context-server.ts:1810:      const message = sessionErr instanceof Error ? sessionErr.message : String(sessionErr);\\n.opencode/skills/system-spec-kit/mcp_server/ENV_REFERENCE.md:17:**Graph as a first-class feature family.** The `SPECKIT_GRAPH_*` variables form a dedicated feature family (see [Section 6](#6-graph) and [Section 7](#7-graph-calibration)) controlling structural code graph indexing, graph-first routing in the search pipeline, causal graph traversal, and calibration profiles. Since graph-first routing is now the default query dispatch order (Code Graph -> CocoIndex -> Memory), the graph env vars are among the most impactful configuration levers.\\n.opencode/skills/system-spec-kit/mcp_server/ENV_REFERENCE.md:174:| `SPECKIT_GRAPH_SIGNALS` | `true` | boolean | Graph momentum scoring and causal depth signals (N2a+N2b). Graduated ON. | `lib/search/search-flags.ts` |\\n.opencode/skills/system-spec-kit/mcp_server/ENV_REFERENCE.md:189:| `SPECKIT_TEMPORAL_EDGES` | `true` | boolean | Temporal validity tracking for causal edges (Phase D T036). Graduated ON. | `lib/search/search-flags.ts` |\\n.opencode/skills/system-spec-kit/mcp_server/ENV_REFERENCE.md:226:| `SPECKIT_ASSISTIVE_RECONSOLIDATION` | `true` | boolean | Assistive reconsolidation for near-duplicate detection (REQ-D4-005). Graduated ON. | `lib/search/search-flags.ts` |\\n.opencode/skills/system-spec-kit/mcp_server/ENV_REFERENCE.md:229:| `SPECKIT_PRESSURE_POLICY` | `true` | boolean | Token-pressure policy for memory_context responses. Graduated ON. | `lib/search/search-flags.ts` |\\n.opencode/skills/system-spec-kit/mcp_server/ENV_REFERENCE.md:230:| `SPECKIT_AUTO_RESUME` | `true` | boolean | Automatic session resume context injection for memory_context. Graduated ON. | `lib/search/search-flags.ts` |\\n.opencode/skills/system-spec-kit/mcp_server/ENV_REFERENCE.md:243:| `SPECKIT_IMPLICIT_FEEDBACK_LOG` | `true` | boolean | Implicit feedback event ledger for `search_shown`, `result_cited`, `query_reformulated`, `same_topic_requery`, and `follow_on_tool_use`. Shadow-only, no ranking side effects (REQ-D4-001). Graduated ON. | `lib/feedback/feedback-ledger.ts` |\\n.opencode/skills/system-spec-kit/mcp_server/ENV_REFERENCE.md:252:| `SPECKIT_SIGNAL_VOCAB` | `true` | boolean | Signal vocabulary detection for trigger matching. Graduated ON. | `lib/parsing/trigger-matcher.ts` |\\n.opencode/skills/system-spec-kit/mcp_server/ENV_REFERENCE.md:285:| `SPECKIT_SESSION_RETRIEVAL_STATE_V1` | `true` | boolean | Cross-turn retrieval session state for dedup and goal-aware refinement (REQ-D5-006). Graduated ON. | `lib/search/search-flags.ts` |\\n.opencode/skills/system-spec-kit/scripts/README.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/README.md:50:- `memory/` - 8 TypeScript/JS CLIs (`generate-context.ts`, `rank-memories.ts`, `cleanup-orphaned-vectors.ts`, `validate-memory-quality.ts`, `reindex-embeddings.ts`, `ast-parser.ts`, `backfill-frontmatter.ts`, `rebuild-auto-entities.ts`)\\n.opencode/skills/system-spec-kit/scripts/README.md:57:- `types/` - TypeScript type definitions (`session-types.ts`)\\n.opencode/skills/system-spec-kit/scripts/README.md:107:node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js /tmp/save-context-data.json specs/<###-spec-name>\\n.opencode/skills/system-spec-kit/scripts/README.md:115:node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js /tmp/save-context-data.json specs/<###-spec-name>\\n.opencode/skills/system-spec-kit/scripts/README.md:124:- duplicate top-of-body separators\\n.opencode/skills/system-spec-kit/scripts/extractors/quality-scorer.ts:14:} from '../types/session-types';\\n.opencode/skills/system-spec-kit/scripts/extractors/quality-scorer.ts:145:      qualityFlags.add('has_session_source_mismatch');\\n.opencode/skills/system-spec-kit/scripts/extractors/quality-scorer.ts:155:      qualityFlags.add('has_topical_mismatch');\\n.opencode/skills/system-spec-kit/scripts/extractors/quality-scorer.ts:189:  // P3-4: minimum_message_ratio — flag sessions with disproportionately low message count\\n.opencode/skills/system-spec-kit/scripts/registry-loader.sh:46:  --by-trigger \\\"phrase\\\"     Find scripts by trigger phrase\\n.opencode/skills/system-spec-kit/scripts/registry-loader.sh:57:  ./registry-loader.sh --by-trigger \\\"save context\\\"\\n.opencode/skills/system-spec-kit/scripts/registry-loader.sh:174:        local triggers\\n.opencode/skills/system-spec-kit/scripts/registry-loader.sh:175:        triggers=$(echo \\\"$result\\\" | jq -r '.trigger | if type == \\\"array\\\" then join(\\\", \\\") else . end // \\\"N/A\\\"')\\n.opencode/skills/system-spec-kit/scripts/registry-loader.sh:176:        if [[ \\\"$triggers\\\" != \\\"null\\\" && \\\"$triggers\\\" != \\\"N/A\\\" && -n \\\"$triggers\\\" ]]; then\\n.opencode/skills/system-spec-kit/scripts/registry-loader.sh:177:            echo -e \\\"  ${CYAN}Triggers:${NC}    $triggers\\\"\\n.opencode/skills/system-spec-kit/scripts/registry-loader.sh:188:find_by_trigger() {\\n.opencode/skills/system-spec-kit/scripts/registry-loader.sh:193:    results=$(jq --arg phrase \\\"$phrase\\\" '.scripts | map(select(.trigger | if type == \\\"array\\\" then any(. | ascii_downcase | contains($phrase | ascii_downcase)) else false end))' \\\"$REGISTRY_FILE\\\")\\n.opencode/skills/system-spec-kit/scripts/registry-loader.sh:202:            echo -e \\\"${YELLOW}No scripts found for trigger: \\\\\\\"$phrase\\\\\\\"${NC}\\\"\\n.opencode/skills/system-spec-kit/scripts/registry-loader.sh:206:        echo -e \\\"${BOLD}Scripts for trigger: \\\\\\\"$phrase\\\\\\\"${NC}\\\"\\n.opencode/skills/system-spec-kit/scripts/registry-loader.sh:342:            --by-trigger)\\n.opencode/skills/system-spec-kit/scripts/registry-loader.sh:343:                action=\\\"by-trigger\\\"\\n.opencode/skills/system-spec-kit/scripts/registry-loader.sh:393:        by-trigger)\\n.opencode/skills/system-spec-kit/scripts/registry-loader.sh:394:            find_by_trigger \\\"$value\\\" \\\"$json_mode\\\"\\n.opencode/skills/system-spec-kit/scripts/extractors/session-activity-signal.ts:5:export * from '../lib/session-activity-signal';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/shared-memory.ts:246:  // an authenticated session. In untrusted environments, wrap this handler\\n.opencode/skills/system-spec-kit/mcp_server/handlers/shared-memory.ts:248:  // Shared-memory tools do not currently receive a server-minted sessionId or\\n.opencode/skills/system-spec-kit/mcp_server/handlers/shared-memory.ts:249:  // transport principal, so the trusted-session validation used by\\n.opencode/skills/system-spec-kit/mcp_server/handlers/shared-memory.ts:250:  // memory_context/memory_match_triggers cannot be wired here yet.\\n.opencode/skills/system-spec-kit/scripts/kpi/README.md:3:description: \\\"Shell-based quality KPI reporter that scans memory files for placeholders, fallback content, AI contamination and missing trigger phrases.\\\"\\n.opencode/skills/system-spec-kit/scripts/kpi/README.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/kpi/README.md:69:- **stderr** -- One-line summary: `KPI Summary: files=N, placeholder=N%, fallback=N%, contamination=N%, empty_trigger=N%`\\n.opencode/skills/system-spec-kit/scripts/kpi/README.md:84:| Empty trigger phrases rate | YAML frontmatter block has zero `trigger_phrases` entries |\\n.opencode/skills/system-spec-kit/scripts/loaders/data-loader.ts:8:// Loads session data from JSON file (via file path, --stdin, or --json)\\n.opencode/skills/system-spec-kit/scripts/loaders/data-loader.ts:67:      'write session data to /tmp/save-context-data.json, then run: node generate-context.js /tmp/save-context-data.json [spec-folder]'\\n.opencode/skills/system-spec-kit/scripts/rules/check-phase-links.sh:35:    # TODO: Parse Predecessor/Successor metadata table rows instead of grepping for phase name presence. Current approach may pass with swapped, stale, or duplicated adjacency metadata. See review finding F-035.\\n.opencode/skills/system-spec-kit/scripts/extractors/decision-extractor.ts:23:} from '../types/session-types';\\n.opencode/skills/system-spec-kit/scripts/extractors/decision-extractor.ts:430:  // since observation decisions are auto-extracted from the same session and manual\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-types.ts:11:// Feature catalog: Memory indexing (memory_save)\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-types.ts:26:  triggerPhrases?: string[];\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-types.ts:87:  sessionId?: string | null;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-types.ts:93:  triggerCacheCleared: boolean;\\n.opencode/skills/system-spec-kit/scripts/rules/README.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/rules/README.md:382:- No duplicate keys\\n.opencode/skills/system-spec-kit/scripts/utils/workspace-identity.ts:9:// .opencode anchor so native session capture can match equivalent roots\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-ingest.ts:30:// Feature catalog: Workspace scanning and indexing (memory_index_scan)\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-ingest.ts:230:  const deduplicatedPaths: string[] = [];\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-ingest.ts:232:  let duplicatePathCount = 0;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-ingest.ts:236:      duplicatePathCount++;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-ingest.ts:241:    deduplicatedPaths.push(normalizedPath);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-ingest.ts:244:  paths = deduplicatedPaths;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-ingest.ts:264:      ...(duplicatePathCount > 0 ? { duplicatePathCount } : {}),\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-ingest.ts:270:      ...(duplicatePathCount > 0\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-ingest.ts:271:        ? ['Duplicate input paths were deduplicated before queueing']\\n.opencode/skills/system-spec-kit/scripts/extractors/file-extractor.ts:8:// Extracts file references, descriptions, and observation types from session data\\n.opencode/skills/system-spec-kit/scripts/extractors/file-extractor.ts:34:} from '../types/session-types';\\n.opencode/skills/system-spec-kit/scripts/extractors/file-extractor.ts:45:/** Semantic summary for a file referenced by the session. */\\n.opencode/skills/system-spec-kit/scripts/extractors/file-extractor.ts:220:        description: cleaned || 'Modified during session',\\n.opencode/skills/system-spec-kit/scripts/extractors/file-extractor.ts:233:      const description = fileInfo.DESCRIPTION || fileInfo.description || 'Modified during session';\\n.opencode/skills/system-spec-kit/scripts/extractors/file-extractor.ts:258:          : 'Modified during session';\\n.opencode/skills/system-spec-kit/scripts/extractors/file-extractor.ts:269:        addFile(fileInfo.trim(), 'Modified during session', 'Modified');\\n.opencode/skills/system-spec-kit/scripts/extractors/file-extractor.ts:278:        addFile(file, 'Modified during session');\\n.opencode/skills/system-spec-kit/scripts/extractors/file-extractor.ts:287:              addFile(file, 'Modified during session');\\n.opencode/skills/system-spec-kit/scripts/extractors/file-extractor.ts:335:        DESCRIPTION: info.description !== 'Modified during session' ? info.description : file.DESCRIPTION,\\n.opencode/skills/system-spec-kit/scripts/extractors/file-extractor.ts:362:        DESCRIPTION: info.description !== 'Modified during session' ? info.description : file.DESCRIPTION,\\n.opencode/skills/system-spec-kit/scripts/extractors/file-extractor.ts:382:  // Deduplicate observations: merge repeated tool calls on the same file\\n.opencode/skills/system-spec-kit/scripts/extractors/file-extractor.ts:383:  const deduped = deduplicateObservations(observations || []);\\n.opencode/skills/system-spec-kit/scripts/extractors/file-extractor.ts:426: * Deduplicate observations that represent repeated tool calls on the same file.\\n.opencode/skills/system-spec-kit/scripts/extractors/file-extractor.ts:430:function deduplicateObservations(observations: ObservationInput[]): ObservationInput[] {\\n.opencode/skills/system-spec-kit/scripts/extractors/file-extractor.ts:495:  deduplicateObservations,\\n.opencode/skills/system-spec-kit/scripts/templates/README.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/templates/README.md:313:**Symptom**: Composed template missing expected sections or has duplicates\\n.opencode/skills/system-spec-kit/scripts/lib/wave-segment-state.cjs:10:// always include explicit keys: sessionId, generation, segment,\\n.opencode/skills/system-spec-kit/scripts/lib/wave-segment-state.cjs:24:  'sessionId',\\n.opencode/skills/system-spec-kit/scripts/lib/wave-segment-state.cjs:62: * @param {string} config.sessionId - Parent session identifier\\n.opencode/skills/system-spec-kit/scripts/lib/wave-segment-state.cjs:74:  if (!config || !isNonEmptyString(config.sessionId)) {\\n.opencode/skills/system-spec-kit/scripts/lib/wave-segment-state.cjs:82:    sessionId: config.sessionId,\\n.opencode/skills/system-spec-kit/scripts/lib/wave-segment-state.cjs:111: * Every record includes sessionId, generation, segment, wave, and findingId.\\n.opencode/skills/system-spec-kit/scripts/lib/wave-segment-state.cjs:127:    sessionId: segmentState.sessionId,\\n.opencode/skills/system-spec-kit/scripts/lib/wave-segment-state.cjs:137:    sessionId: segmentState.sessionId,\\n.opencode/skills/system-spec-kit/scripts/lib/wave-segment-state.cjs:161:    sessionId: record.sessionId || segmentState.sessionId,\\n.opencode/skills/system-spec-kit/scripts/lib/wave-segment-state.cjs:231:              duplicateSegment: state.segmentId,\\n.opencode/skills/system-spec-kit/scripts/lib/wave-segment-state.cjs:258:    // Sort by sessionId, generation, segment, wave, findingId (then timestamp as tiebreaker)\\n.opencode/skills/system-spec-kit/scripts/lib/wave-segment-state.cjs:259:    if ((a.sessionId || '') !== (b.sessionId || '')) return (a.sessionId || '').localeCompare(b.sessionId || '');\\n.opencode/skills/system-spec-kit/scripts/kpi/quality-kpi.sh:45:    if (!inBlock && /^trigger_phrases:\\\\s*$/.test(line.trim())) {\\n.opencode/skills/system-spec-kit/scripts/kpi/quality-kpi.sh:96:console.error(`KPI Summary: files=${totals.total}, placeholder=${output.rates.placeholderRate}%, fallback=${output.rates.fallbackRate}%, contamination=${output.rates.contaminationRate}%, empty_trigger=${output.rates.emptyTriggerPhrasesRate}%`);\\n.opencode/skills/system-spec-kit/scripts/loaders/README.md:3:description: \\\"Data loader modules that normalize input from JSON files or native CLI capture, then hard-stop when no usable session data exists.\\\"\\n.opencode/skills/system-spec-kit/scripts/loaders/README.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/loaders/README.md:51:4. Hard-stop with `NO_DATA_AVAILABLE` when neither explicit data nor any native capture source produces usable session data\\n.opencode/skills/system-spec-kit/scripts/extractors/index.ts:8:// Barrel export for all extractor modules (files, diagrams, conversations, decisions, sessions)\\n.opencode/skills/system-spec-kit/scripts/extractors/index.ts:13:export * from './session-extractor';\\n.opencode/skills/system-spec-kit/scripts/extractors/index.ts:14:export * from '../lib/session-activity-signal';\\n.opencode/skills/system-spec-kit/scripts/extractors/index.ts:34:export * from './collect-session-data';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-bulk-delete.ts:11:import * as causalEdges from '../lib/storage/causal-edges.js';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-bulk-delete.ts:108:        hint: 'Restart the MCP server or run memory_index_scan() to reinitialize the database.',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-bulk-delete.ts:109:        actions: ['Restart the MCP server', 'Call memory_index_scan()'],\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-bulk-delete.ts:116:  let countSql = 'SELECT COUNT(*) as count FROM memory_index WHERE importance_tier = ?';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-bulk-delete.ts:183:  // Fetch IDs for deletion (needed for causal edge cleanup and ledger)\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-bulk-delete.ts:184:  let selectSql = 'SELECT id, content_hash, file_path, spec_folder FROM memory_index WHERE importance_tier = ?';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-bulk-delete.ts:208:  causalEdges.init(database);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-bulk-delete.ts:229:        // Clean up causal edges\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-bulk-delete.ts:231:        // Previously errors were caught and logged, leaving orphan causal edges\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-bulk-delete.ts:233:        causalEdges.deleteEdgesForMemory(String(memory.id));\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-bulk-delete.ts:268:        latencyMs: 0, triggerCacheCleared: false,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-bulk-delete.ts:291:  hints.push(`Run memory_index_scan({ force: true }) to re-index if needed`);\\n.opencode/skills/system-spec-kit/scripts/spec/upgrade-level.sh:1585:            # Deduplicate modified files (same file may be listed multiple times from chain steps)\\n.opencode/skills/system-spec-kit/scripts/utils/validation-utils.ts:80:    console.warn(`[generate-context] Anchor validation warnings in ${filename}:`);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:37:import * as causalEdges from '../lib/storage/causal-edges.js';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:100:import { resolveMemoryReference } from './causal-links-processor.js';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:103:// Feature catalog: Memory indexing (memory_save)\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:105:// Feature catalog: Dry-run preflight for memory_save\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:130:  '## continue session',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:185:    triggerPhrases: parsed.triggerPhrases,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:189:    causalLinks: parsed.causalLinks,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:226:      const rejectScore = { total: 0, breakdown: { triggers: 0, anchors: 0, budget: 0, coherence: 0 }, issues: [`V-rule hard block: ${failedRuleIds.join(', ')}`] };\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:243:          evidenceCounts: { primary: 0, support: 0, total: 0, semanticChars: 0, uniqueWords: 0, anchors: 0, triggerPhrases: 0 },\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:267:    parsed.triggerPhrases = qualityLoopResult.fixedTriggerPhrases;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:280:    const warning = 'Manual fallback save mode detected; standard generate-context template markers are missing.';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:417:  causalEdges.init(database);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:421:  causalEdges.insertEdge(\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:424:    causalEdges.RELATION_TYPES.SUPERSEDES,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:471:      FROM memory_index\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:643:          triggerPhrases: parsed.triggerPhrases,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:744:          triggerPhrases: parsed.triggerPhrases,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:754:              sessionId: scope.sessionId,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:797:    const duplicatePrecheck = checkContentHashDedup(database, parsed, force, validation.warnings, {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:801:    if (duplicatePrecheck) {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:802:      return duplicatePrecheck;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:945:            actor: 'mcp:memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:972:        actor: 'mcp:memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1013:    // POST-INSERT ENRICHMENT: causal links, entities, summaries, entity linking\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1014:    const { causalLinksResult, enrichmentStatus } = await runPostInsertEnrichment(database, id, parsed);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1028:      causalLinksResult,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1043:/** Parse, validate, and index a memory file with PE gating, FSRS scheduling, and causal links */\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1078:/** Handle memory_save tool - validates, indexes, and persists a memory file to the database */\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1086:      tool: 'memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1093:        hint: 'Retry memory_save after checkpoint_restore maintenance completes.',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1109:    sessionId,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1140:    sessionId,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1151:      action: 'memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1156:      sessionId,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1169:      sessionId,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1174:        action: 'memory_save_shared_space',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1179:        sessionId,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1213:      tool: 'memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1269:    sessionId: governanceDecision.normalized.sessionId,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1293:        check_duplicates: !force,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1310:            tool: 'memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1316:              actions: ['Run npm run build --workspace=@spec-kit/scripts', 'Retry memory_save'],\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1345:        tool: 'memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1441:        tool: 'memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1447:          actions: ['Run npm run build --workspace=@spec-kit/scripts', 'Retry memory_save'],\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1455:  if (typeof result.id === 'number' && result.id > 0 && result.status !== 'unchanged' && result.status !== 'duplicate') {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1462:        action: 'memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1468:        sessionId,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1477:          FROM memory_index\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1490:            actor: provenanceActor ?? 'mcp:memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1500:      // (vec_memories, BM25 index, causal edges, projections, etc.)\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1501:      // not just memory_index, to prevent orphaned search phantoms.\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1703:        'Retry memory_save({ filePath, force: true }) once dependencies are healthy',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1710:  if (indexResult.status !== 'unchanged' && indexResult.status !== 'duplicate' && indexResult.id > 0) {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1714:  const shouldEmitPostMutationFeedback = indexResult.status !== 'duplicate' && indexResult.status !== 'unchanged';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1727:        latencyMs: 0, triggerCacheCleared: false,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1737:    indexResult.status === 'duplicate'\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1738:      ? 'Memory skipped (duplicate content)'\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1751:  } else if (indexResult.status === 'duplicate') {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1789:const handle_memory_save = handleMemorySave;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1796:  handle_memory_save,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:7:// Feature catalog: Trigger phrase matching (memory_match_triggers)\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:8:// Feature catalog: BM25 trigger phrase re-index gate\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:24:import * as triggerMatcher from '../lib/parsing/trigger-matcher.js';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:43:// T73: Import session manager for trusted session validation (IDOR prevention)\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:44:import * as sessionManager from '../lib/session/session-manager.js';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:95:  sessionId: string;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:108:  session_id?: string;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:111:  // C2 FIX: Scope fields to prevent cross-scope trigger leaks\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:140:      'SELECT * FROM memory_index WHERE id = ?'\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:150:    console.warn('[memory_match_triggers] Failed to fetch memory records:', message);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:158:  memoryInfo: { filePath: string; title: string | null; triggerPhrases: string[] },\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:171:    console.warn('[memory-triggers] getTieredContent failed', {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:184:/** Handle memory_match_triggers tool - matches prompt against trigger phrases with cognitive decay */\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:189:    session_id: rawSessionId,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:197:      tool: 'memory_match_triggers',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:207:  // T73 SECURITY: Validate caller-supplied sessionId through server-side session\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:209:  // arbitrary sessions — only server-minted or previously tracked sessions.\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:210:  let sessionId: string | undefined = rawSessionId;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:212:    const trustedSession = sessionManager.resolveTrustedSession(rawSessionId, {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:218:      console.warn(`[memory_match_triggers] SECURITY: Rejected untrusted sessionId \\\"${rawSessionId}\\\" — ${trustedSession.error}`);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:220:        tool: 'memory_match_triggers',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:225:          hint: 'Omit session_id to start a new server-generated session, or reuse the effectiveSessionId returned by memory_context.',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:229:    sessionId = trustedSession.effectiveSessionId;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:243:  // Eval logger — capture trigger query at entry (fail-safe)\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:249:      intent: 'trigger_match',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:254:  } catch (_error: unknown) { /* eval logging must never break triggers handler */ }\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:263:          scores: memoryIds.map(() => 1.0), // trigger matches are binary\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:264:          fusionMethod: 'trigger',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:269:      /* eval logging must never break triggers handler */\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:274:    sessionId &&\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:281:      decayStats = { decayedCount: workingMemory.batchUpdateScores(sessionId as string) };\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:284:      console.warn('[memory_match_triggers] Decay failed:', message);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:288:  const triggerMatchResult = triggerMatcher.matchTriggerPhrasesWithStats(prompt, limit * 2);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:289:  let results: TriggerMatch[] = triggerMatchResult.matches;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:291:  // C2 FIX: Post-filter by scope to prevent cross-tenant trigger leaks\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:301:          FROM memory_index WHERE id IN (${placeholders})\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:325:      console.error('[memory_match_triggers] Scope filtering failed, returning empty results (fail-closed):', toErrorMessage(scopeErr));\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:329:  const detectedSignals = Array.isArray(triggerMatchResult.stats?.signals)\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:330:    ? triggerMatchResult.stats.signals\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:332:  const degradedTriggerMatching = triggerMatchResult.stats?.degraded ?? null;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:336:      tool: 'memory_match_triggers',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:337:      summary: 'No matching trigger phrases found',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:339:        matchType: useCognitive ? 'trigger-phrase-cognitive' : 'trigger-phrase',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:343:          sessionId,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:349:        'Ensure memories have trigger phrases defined',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:351:        ...(degradedTriggerMatching ? ['Trigger matching ran in degraded mode; inspect server logs for skipped trigger sources'] : []),\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:370:        workingMemory.setAttentionScore(sessionId as string, match.memoryId, 1.0);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:374:        console.warn(`[memory_match_triggers] Failed to activate memory ${match.memoryId}:`, message);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:390:          console.warn(`[memory_match_triggers] Co-activation failed for ${memoryId}:`, message);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:398:    const sessionMemories: WorkingMemoryEntry[] = workingMemory.getSessionMemories(sessionId as string)\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:407:      const wmEntry = sessionMemories.find(wm => wm.memoryId === match.memoryId);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:426:        // When no FSRS record, use WM score directly (already session-decayed) or apply turn decay\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:450:        triggerPhrases: r.matchedPhrases\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:469:      sessionId: sessionId!,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:491:    console.warn(`[memory_match_triggers] Latency ${latencyMs}ms exceeds 100ms target`);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:496:    : `Matched ${formattedResults.length} memories via trigger phrases`;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:499:  if (!useCognitive && sessionId) {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:510:  const _triggersResponse = createMCPSuccessResponse({\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:511:    tool: 'memory_match_triggers',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:514:      matchType: useCognitive ? 'trigger-phrase-cognitive' : 'trigger-phrase',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:524:      triggerSignals: detectedSignals,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:529:  // Consumption instrumentation — log triggers event (fail-safe, never throws)\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:536:        event_type: 'triggers',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:540:        session_id: sessionId ?? null,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:544:  } catch (_error: unknown) { /* instrumentation must never cause triggers handler to fail */ }\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:546:  // Eval logger — capture final trigger results at exit (fail-safe)\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:547:  const triggerMemoryIds = formattedResults.map(r => r.memoryId).filter(id => typeof id === 'number');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:548:  logFinalTriggerEval(triggerMemoryIds, latencyMs);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:550:  return _triggersResponse;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:562:const handle_memory_match_triggers = handleMemoryMatchTriggers;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-triggers.ts:565:  handle_memory_match_triggers,\\n.opencode/skills/system-spec-kit/scripts/extractors/git-context-extractor.ts:8:// Mines git history for file changes and observations for captured-session enrichment\\n.opencode/skills/system-spec-kit/scripts/extractors/git-context-extractor.ts:14:import type { ModificationMagnitude } from '../types/session-types';\\n.opencode/skills/system-spec-kit/scripts/extractors/git-context-extractor.ts:442:        : `Uncommitted: ${entry.action} during session`;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-utils.ts:15:// Feature catalog: Memory indexing (memory_save)\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-utils.ts:33:      FROM memory_index\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-utils.ts:62:      session_id: input.sessionId ?? null,\\n.opencode/skills/system-spec-kit/scripts/extractors/session-extractor.ts:8:// Extracts session metadata — ID, title, duration, key topics, and learning delta\\n.opencode/skills/system-spec-kit/scripts/extractors/session-extractor.ts:27:} from '../types/session-types';\\n.opencode/skills/system-spec-kit/scripts/extractors/session-extractor.ts:43:/** High-level characteristics inferred from the session. */\\n.opencode/skills/system-spec-kit/scripts/extractors/session-extractor.ts:51:/** Snapshot of the project state captured for session output. */\\n.opencode/skills/system-spec-kit/scripts/extractors/session-extractor.ts:61:/** Related documentation entry referenced by the session. */\\n.opencode/skills/system-spec-kit/scripts/extractors/session-extractor.ts:85: * Generate a unique session identifier using CSPRNG.\\n.opencode/skills/system-spec-kit/scripts/extractors/session-extractor.ts:86: * @returns Session ID in the format `session-{timestamp}-{12-char-hex}` with 48 bits of entropy.\\n.opencode/skills/system-spec-kit/scripts/extractors/session-extractor.ts:90:  return `session-${Date.now()}-${randomPart}`;\\n.opencode/skills/system-spec-kit/scripts/extractors/session-extractor.ts:94: * Detect the current git branch to use as the session channel.\\n.opencode/skills/system-spec-kit/scripts/extractors/session-extractor.ts:115: * Classify the session context type based on tool usage ratios and decision count.\\n.opencode/skills/system-spec-kit/scripts/extractors/session-extractor.ts:116: * @param toolCounts - Aggregated counts of each tool type used in the session.\\n.opencode/skills/system-spec-kit/scripts/extractors/session-extractor.ts:138: * Determine the importance tier of a session based on modified file paths and context type.\\n.opencode/skills/system-spec-kit/scripts/extractors/session-extractor.ts:139: * @param filesModified - Array of file paths modified during the session.\\n.opencode/skills/system-spec-kit/scripts/extractors/session-extractor.ts:184: * @param toolCounts - Aggregated counts of each tool type used in the session.\\n.opencode/skills/system-spec-kit/scripts/extractors/session-extractor.ts:221: * @param toolCounts - Aggregated counts of each tool type used in the session.\\n.opencode/skills/system-spec-kit/scripts/extractors/session-extractor.ts:362:            console.debug(`[session-extractor] rejected blocker artifact: ${sentence.trim()}`);\\n.opencode/skills/system-spec-kit/scripts/extractors/session-extractor.ts:523: * Extract up to 10 key topic terms from a session summary and decision records using semantic signal extraction.\\n.opencode/skills/system-spec-kit/scripts/extractors/session-extractor.ts:525: * NOTE: Similar to core/topic-extractor.ts:extractKeyTopics but differs in:\\n.opencode/skills/system-spec-kit/scripts/extractors/session-extractor.ts:526: * - Accepts `string | undefined` (topic-extractor requires `string`)\\n.opencode/skills/system-spec-kit/scripts/extractors/session-extractor.ts:528: * - Processes TITLE, RATIONALE, and CHOSEN from decisions (topic-extractor only uses TITLE/RATIONALE)\\n.opencode/skills/system-spec-kit/scripts/extractors/session-extractor.ts:531: * @param summary - Optional session summary text; placeholders are filtered out.\\n.opencode/skills/system-spec-kit/scripts/extractors/session-extractor.ts:533: * @returns Array of up to 10 extracted topic term strings.\\n.opencode/skills/system-spec-kit/scripts/extractors/session-extractor.ts:568: * Derive high-level session characteristics by combining tool counts, context type, and importance tier.\\n.opencode/skills/system-spec-kit/scripts/extractors/session-extractor.ts:616: * Assemble a complete project state snapshot from session parameters.\\n.opencode/skills/system-spec-kit/scripts/utils/task-enrichment.ts:40:  sessionCandidates: readonly string[] = [],\\n.opencode/skills/system-spec-kit/scripts/utils/task-enrichment.ts:44:    ? [task, specTitle, ...sessionCandidates, folderBase]\\n.opencode/skills/system-spec-kit/scripts/utils/task-enrichment.ts:45:    : [task, ...sessionCandidates, folderBase];\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-index-alias.ts:10:// Feature catalog: Workspace scanning and indexing (memory_index_scan)\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-index-alias.ts:204:      FROM memory_index\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-index-alias.ts:229:    FROM memory_index\\n.opencode/skills/system-spec-kit/scripts/lib/wave-lifecycle.cjs:127: * @param {string} [options.sessionId] - Session identifier (auto-generated if absent)\\n.opencode/skills/system-spec-kit/scripts/lib/wave-lifecycle.cjs:143:    sessionId: opts.sessionId || `wave-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\\n.opencode/skills/system-spec-kit/scripts/lib/wave-lifecycle.cjs:166: * @param {string} config.sessionId - Session identifier\\n.opencode/skills/system-spec-kit/scripts/lib/wave-lifecycle.cjs:176:  if (!config || !isNonEmptyString(config.sessionId) || !config.waveNumber) {\\n.opencode/skills/system-spec-kit/scripts/lib/wave-lifecycle.cjs:182:  const waveId = `${config.sessionId}-w${config.waveNumber}`;\\n.opencode/skills/system-spec-kit/scripts/lib/wave-lifecycle.cjs:203:    sessionId: config.sessionId,\\n.opencode/skills/system-spec-kit/scripts/lib/wave-lifecycle.cjs:228: * Applies the specified merge strategy to handle duplicates and conflicts.\\n.opencode/skills/system-spec-kit/scripts/lib/wave-lifecycle.cjs:288:            duplicate: finding,\\n.opencode/skills/system-spec-kit/scripts/lib/wave-lifecycle.cjs:289:            duplicateSegment: result.segmentId || 'unknown',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/db-helpers.ts:4:import type Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/db-helpers.ts:6:// Feature catalog: Memory indexing (memory_save)\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/db-helpers.ts:21:      \\\"SELECT name FROM sqlite_master WHERE type='table' AND name='checkpoints'\\\"\\n.opencode/skills/system-spec-kit/scripts/spec/create.sh:97:        --topic)\\n.opencode/skills/system-spec-kit/scripts/spec/create.sh:99:                echo 'Error: --topic requires a value' >&2\\n.opencode/skills/system-spec-kit/scripts/spec/create.sh:105:                echo 'Error: --topic requires a value' >&2\\n.opencode/skills/system-spec-kit/scripts/spec/create.sh:211:            echo \\\"  --topic <name>      Topic name for sub-folder (used with --subfolder)\\\"\\n.opencode/skills/system-spec-kit/scripts/spec/create.sh:254:            echo \\\"  $0 --subfolder specs/005-memory --topic 'refactor' 'Phase 2 refactoring'\\\"\\n.opencode/skills/system-spec-kit/scripts/spec/create.sh:308:    local topic=\\\"$2\\\"\\n.opencode/skills/system-spec-kit/scripts/spec/create.sh:332:    local subfolder_name=\\\"${version_str}-${topic}\\\"\\n.opencode/skills/system-spec-kit/scripts/spec/create.sh:450:    # Determine topic name\\n.opencode/skills/system-spec-kit/scripts/spec/create.sh:458:        echo \\\"Error: --topic must contain at least one alphanumeric character after slugification\\\" >&2\\n.opencode/skills/system-spec-kit/scripts/spec/create.sh:1125:# Set the SPECIFY_FEATURE environment variable for the current session\\n.opencode/skills/system-spec-kit/scripts/utils/prompt-utils.ts:23:  console.error('  node generate-context.js /tmp/save-context-data.json <spec-folder-path>');\\n.opencode/skills/system-spec-kit/scripts/utils/prompt-utils.ts:26:  console.error('  node generate-context.js --json \\\\'{\\\"specFolder\\\":\\\"specs/003-memory-and-spec-kit/054-remaining-bugs-remediation\\\"}\\\\' specs/003-memory-and-spec-kit/054-remaining-bugs-remedation');\\n.opencode/skills/system-spec-kit/scripts/utils/prompt-utils.ts:40:    console.warn('[generate-context] Non-interactive mode: using default value');\\n.opencode/skills/system-spec-kit/scripts/utils/prompt-utils.ts:72:    console.warn(`[generate-context] Non-interactive mode: using default choice 1`);\\n.opencode/skills/system-spec-kit/scripts/test-fixtures/011-anchors-duplicate-ids/spec.md:14:Tests duplicate anchor IDs, each properly closed.\\n.opencode/skills/system-spec-kit/scripts/extractors/diagram-extractor.ts:28:} from '../types/session-types';\\n.opencode/skills/system-spec-kit/scripts/extractors/diagram-extractor.ts:187:  // fields via {{#HAS_DECISION_TREE}}. AUTO_DECISION_TREES would duplicate them.\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:8:// Orchestrates session data collection — gathers observations, files, decisions, and context\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:33:} from './session-extractor';\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:63:} from '../types/session-types';\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:110:/** Captures the synthesized data needed to continue a session. */\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:130:/** Full collected session payload used by downstream extractors. */\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:325:      return 'Productive session with balanced learning across metrics.';\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:327:      return 'Moderate learning session - incremental progress made.';\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:329:      return 'Low learning delta - session may have focused on execution rather than exploration.';\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:336:    summary += ' Overall: Highly productive learning session.';\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:338:    summary += ' Overall: Good learning session with meaningful progress.';\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:340:    summary += ' Overall: Moderate learning session.';\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:360:function renderOverviewSummary(sessionSummary: string, boundarySafeSummary: string): string {\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:361:  const trimmedSummary = sessionSummary.trim();\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:385:      (collectedData as Record<string, unknown> | undefined)?.sessionStatus\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:386:      ?? (collectedData as Record<string, unknown> | undefined)?.session_status\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:432:    const hasSessionSummary = !!collectedData.sessionSummary;\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:449:    // If explicit JSON data has summary + decisions + next steps, session is complete\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:502:  const summaryText = collectedData?.sessionSummary || '';\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:537:  sessionStatus: string,\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:554:  if (sessionStatus === 'COMPLETED') return 100;\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:555:  if (sessionStatus === 'BLOCKED') return Math.min(90, messageCount * 5);\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:557:  // CG-03: JSON-mode explicit data with sessionSummary → high completion\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:560:    const hasSessionSummary = !!collectedData.sessionSummary;\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:617:        component: 'collect-session-data',\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:772:// CanonicalDocs type lives in scripts/types/session-types.ts — imported above.\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:996:  const sessionStatus = determineSessionStatus(blockers, observations, userPrompts.length, collectedData);\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:998:    observations, userPrompts.length, toolCounts, sessionStatus, collectedData\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:1016:    SESSION_STATUS: sessionStatus,\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:1178:        DESCRIPTION: 'Modified during session',\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:1231:  const sessionId: string = (\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:1237:  const sessionInfo = data.recentContext?.[0] || {};\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:1246:      sessionId,\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:1267:        DESCRIPTION: 'Modified during session',\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:1292:  // Persist source-session fields as metadata only; SaveMode governs behavior elsewhere.\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:1296:    : typeof data._sessionId === 'string'\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:1297:      ? data._sessionId\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:1331:  const rawLearning = (sessionInfo as RecentContextEntry).learning || '';\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:1335:  // P3-7: Check if rawLearning is topically related to the spec folder before using it as SUMMARY.\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:1350:  // Rec 3: Prefer explicit sessionSummary from JSON over transcript-derived learning\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:1351:  const SUMMARY: string = (typeof data.sessionSummary === 'string' && data.sessionSummary.length > 20)\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:1352:    ? renderOverviewSummary(data.sessionSummary, truncateOnWordBoundary(data.sessionSummary, 500))\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:1408:    (sessionInfo as RecentContextEntry).request || '',\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:1409:    (sessionInfo as RecentContextEntry).learning || '',\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:1414:    || (sessionInfo as RecentContextEntry).request\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:1415:    || (sessionInfo as RecentContextEntry).learning\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:1417:    || 'Development session';\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:1535:    // Rec 3: Derive title from sessionSummary when available (up to 80 chars, sentence boundary)\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:1537:      const summary = typeof data.sessionSummary === 'string' ? data.sessionSummary : '';\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:1561:    // RC1: Pass through raw sessionSummary from JSON payload for title candidate\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:1562:    _JSON_SESSION_SUMMARY: typeof data.sessionSummary === 'string' ? data.sessionSummary : null,\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:1574:    SESSION_ID: sessionId,\\n.opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts:1597:    // Git provenance metadata (M-007d) — surfaced from captured-session enrichment\\n.opencode/skills/system-spec-kit/mcp_server/handlers/pe-gating.ts:17:// Feature catalog: Memory indexing (memory_save)\\n.opencode/skills/system-spec-kit/mcp_server/handlers/pe-gating.ts:26:  triggerPhrases: string[];\\n.opencode/skills/system-spec-kit/mcp_server/handlers/pe-gating.ts:53:  triggerPhrases?: string[];\\n.opencode/skills/system-spec-kit/mcp_server/handlers/pe-gating.ts:64:function findSimilarMemories(embedding: Float32Array | null, options: { limit?: number; specFolder?: string | null; tenantId?: string | null; userId?: string | null; agentId?: string | null; sessionId?: string | null; sharedSpaceId?: string | null } = {}): SimilarMemory[] {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/pe-gating.ts:65:  const { limit = 5, specFolder = null, tenantId = null, userId = null, agentId = null, sessionId = null, sharedSpaceId = null } = options;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/pe-gating.ts:101:        // H9 FIX: Filter by sessionId to prevent false duplicate/supersede decisions across sessions\\n.opencode/skills/system-spec-kit/mcp_server/handlers/pe-gating.ts:102:        if (!matchesScopedValue(sessionId, r.session_id)) continue;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/pe-gating.ts:142:/** Reinforce an existing memory's stability via FSRS scheduling instead of creating a duplicate */\\n.opencode/skills/system-spec-kit/mcp_server/handlers/pe-gating.ts:149:      FROM memory_index\\n.opencode/skills/system-spec-kit/mcp_server/handlers/pe-gating.ts:174:      UPDATE memory_index\\n.opencode/skills/system-spec-kit/mcp_server/handlers/pe-gating.ts:211:      UPDATE memory_index\\n.opencode/skills/system-spec-kit/mcp_server/handlers/pe-gating.ts:242:    FROM memory_index\\n.opencode/skills/system-spec-kit/mcp_server/handlers/pe-gating.ts:252:      error: `Memory ${memoryId} not found in memory_index, update had no effect`,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/pe-gating.ts:265:      triggerPhrases: parsed.triggerPhrases,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/pe-gating.ts:290:      UPDATE memory_index\\n.opencode/skills/system-spec-kit/mcp_server/handlers/pe-gating.ts:297:      actor: 'mcp:memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/pe-gating.ts:303:      recordHistory(nextMemoryId, 'ADD', null, parsed.title ?? parsed.filePath, 'mcp:memory_save');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/pe-gating.ts:304:      recordHistory(memoryId, 'UPDATE', previous.title, parsed.title ?? parsed.filePath, 'mcp:memory_save');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/pe-gating.ts:318:    triggerPhrases: parsed.triggerPhrases,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/pe-gating.ts:330:      SELECT name FROM sqlite_master\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/spec-folder-mutex.ts:6:// Feature catalog: Memory indexing (memory_save)\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/index.ts:7:// Feature catalog: Memory indexing (memory_save)\\n.opencode/skills/system-spec-kit/scripts/test-fixtures/011-anchors-duplicate-ids/plan.md:12:Testing duplicate handling.\\n.opencode/skills/system-spec-kit/scripts/test-fixtures/011-anchors-duplicate-ids/plan.md:20:L1 with duplicate anchors.\\n.opencode/skills/system-spec-kit/scripts/test-fixtures/011-anchors-duplicate-ids/plan.md:24:- memory/ with duplicate IDs\\n.opencode/skills/system-spec-kit/scripts/test-fixtures/011-anchors-duplicate-ids/plan.md:30:Create memory file with duplicate IDs.\\n.opencode/skills/system-spec-kit/scripts/rules/check-placeholders.sh:93:    # Deduplicate (bash 3.2 compatible)\\n.opencode/skills/system-spec-kit/scripts/lib/simulation-factory.ts:24:} from '../types/session-types';\\n.opencode/skills/system-spec-kit/scripts/lib/simulation-factory.ts:45:/** Configuration for session data creation */\\n.opencode/skills/system-spec-kit/scripts/lib/simulation-factory.ts:47:  sessionId?: string;\\n.opencode/skills/system-spec-kit/scripts/lib/simulation-factory.ts:61:  session: SessionData;\\n.opencode/skills/system-spec-kit/scripts/lib/simulation-factory.ts:131:// NOTE: Similar to extractors/session-extractor.ts:generateSessionId but differs in randomness source.\\n.opencode/skills/system-spec-kit/scripts/lib/simulation-factory.ts:132:// Both this file and session-extractor use crypto.randomBytes (CSPRNG).\\n.opencode/skills/system-spec-kit/scripts/lib/simulation-factory.ts:133:// Same output format: session-{timestamp}-{9-char-random}\\n.opencode/skills/system-spec-kit/scripts/lib/simulation-factory.ts:135:  return `session-${Date.now()}-${secureRandomString(9)}`;\\n.opencode/skills/system-spec-kit/scripts/lib/simulation-factory.ts:143:  const sessionId: string = config.sessionId || generateSessionId();\\n.opencode/skills/system-spec-kit/scripts/lib/simulation-factory.ts:175:    SESSION_ID: sessionId,\\n.opencode/skills/system-spec-kit/scripts/lib/simulation-factory.ts:229:    LEARNING_SUMMARY: 'Simulation session has no learning delta.',\\n.opencode/skills/system-spec-kit/scripts/lib/simulation-factory.ts:240:    CONTEXT_SUMMARY: 'Simulation session placeholder data.',\\n.opencode/skills/system-spec-kit/scripts/lib/simulation-factory.ts:516:    session: createSessionData(config),\\n.opencode/skills/system-spec-kit/scripts/lib/simulation-factory.ts:539:  const warning: string = `<!-- WARNING: This is simulated/placeholder content - NOT from a real session -->\\\\n\\\\n`;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/create-record.ts:5:import type BetterSqlite3 from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/create-record.ts:12:import * as causalEdges from '../../lib/storage/causal-edges.js';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/create-record.ts:26:// Feature catalog: Memory indexing (memory_save)\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/create-record.ts:38:  causalSupersedesMemoryId: number | null;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/create-record.ts:49:      causalSupersedesMemoryId: samePathExistingId === peDecision.existingMemoryId\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/create-record.ts:59:      causalSupersedesMemoryId: null,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/create-record.ts:66:    causalSupersedesMemoryId: null,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/create-record.ts:80:  causalEdges.init(database);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/create-record.ts:84:  causalEdges.insertEdge(\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/create-record.ts:87:    causalEdges.RELATION_TYPES.SUPERSEDES,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/create-record.ts:105:  const sessionId = normalizeScopeMatchValue(scope.sessionId);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/create-record.ts:110:    FROM memory_index\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/create-record.ts:117:      AND ((? IS NULL AND session_id IS NULL) OR session_id = ?)\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/create-record.ts:131:    sessionId,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/create-record.ts:132:    sessionId,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/create-record.ts:185:          triggerPhrases: parsed.triggerPhrases,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/create-record.ts:200:          triggerPhrases: parsed.triggerPhrases,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/create-record.ts:234:          UPDATE memory_index\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/create-record.ts:246:        UPDATE memory_index\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/create-record.ts:254:      actor: 'mcp:memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/create-record.ts:261:      lineageRouting.causalSupersedesMemoryId,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/create-record.ts:271:          trigger_phrases: parsed.triggerPhrases,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/create-record.ts:284:      recordHistory(memory_id, 'ADD', null, parsed.title ?? filePath, 'mcp:memory_save');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/create-record.ts:291:          'mcp:memory_save',\\n.opencode/skills/system-spec-kit/scripts/extractors/spec-folder-extractor.ts:8:// Extracts structured context from spec folder documents for captured-session enrichment\\n.opencode/skills/system-spec-kit/scripts/extractors/spec-folder-extractor.ts:37:  triggerPhrases: string[];\\n.opencode/skills/system-spec-kit/scripts/extractors/spec-folder-extractor.ts:39:  sessionPhase: string;\\n.opencode/skills/system-spec-kit/scripts/extractors/spec-folder-extractor.ts:182:  const triggerPhrases = dedupe([\\n.opencode/skills/system-spec-kit/scripts/extractors/spec-folder-extractor.ts:183:    ...(Array.isArray(data.trigger_phrases) ? data.trigger_phrases : []),\\n.opencode/skills/system-spec-kit/scripts/extractors/spec-folder-extractor.ts:184:    ...extractFrontmatterListItems(content, 'trigger_phrases'),\\n.opencode/skills/system-spec-kit/scripts/extractors/spec-folder-extractor.ts:212:  return { summary, triggerPhrases, files, observations };\\n.opencode/skills/system-spec-kit/scripts/extractors/spec-folder-extractor.ts:387:    triggerPhrases: dedupe([\\n.opencode/skills/system-spec-kit/scripts/extractors/spec-folder-extractor.ts:388:      ...spec.triggerPhrases,\\n.opencode/skills/system-spec-kit/scripts/extractors/spec-folder-extractor.ts:389:      ...((Array.isArray(description.triggerPhrases) ? description.triggerPhrases : []) as unknown[]).filter((t): t is string => typeof t === 'string').map(cleanText),\\n.opencode/skills/system-spec-kit/scripts/extractors/spec-folder-extractor.ts:392:    sessionPhase: determineSessionPhase(tasks, checklist, plan.phaseTitle, String(description.status || '')),\\n.opencode/skills/system-spec-kit/scripts/spec/README.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/mcp_server/utils/db-helpers.ts:9:// To eliminate duplicate getDb()+null-check and instanceof Error\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/embedding-pipeline.ts:5:import type Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/embedding-pipeline.ts:17:// Feature catalog: Memory indexing (memory_save)\\n.opencode/skills/system-spec-kit/scripts/extractors/conversation-extractor.ts:23:} from '../types/session-types';\\n.opencode/skills/system-spec-kit/scripts/extractors/conversation-extractor.ts:53: * userPrompts are available. Creates User+Assistant exchange pairs from sessionSummary,\\n.opencode/skills/system-spec-kit/scripts/extractors/conversation-extractor.ts:59:  collectedData: CollectedDataSubset<'userPrompts' | 'observations' | 'sessionSummary' | 'keyDecisions' | 'nextSteps'>\\n.opencode/skills/system-spec-kit/scripts/extractors/conversation-extractor.ts:63:  const sessionSummary = String(collectedData.sessionSummary || '');\\n.opencode/skills/system-spec-kit/scripts/extractors/conversation-extractor.ts:68:    ? `Working on: ${specFolder.split('/').pop()?.replace(/^\\\\d{3}-/, '').replace(/-/g, ' ') || 'session context'}`\\n.opencode/skills/system-spec-kit/scripts/extractors/conversation-extractor.ts:69:    : sessionSummary.split(/[.!?\\\\n]/)[0]?.trim() || 'Session context save';\\n.opencode/skills/system-spec-kit/scripts/extractors/conversation-extractor.ts:77:  // Assistant message from full sessionSummary\\n.opencode/skills/system-spec-kit/scripts/extractors/conversation-extractor.ts:78:  if (sessionSummary.length > 0) {\\n.opencode/skills/system-spec-kit/scripts/extractors/conversation-extractor.ts:82:      CONTENT: sessionSummary,\\n.opencode/skills/system-spec-kit/scripts/extractors/conversation-extractor.ts:131:  collectedData: CollectedDataSubset<'userPrompts' | 'observations' | 'sessionSummary' | 'keyDecisions' | 'nextSteps'> | null\\n.opencode/skills/system-spec-kit/scripts/extractors/conversation-extractor.ts:168:  // Rec 2: When userPrompts are empty but JSON has sessionSummary, build messages from structured data\\n.opencode/skills/system-spec-kit/scripts/extractors/conversation-extractor.ts:170:  if (userPrompts.length === 0 && collectedData.sessionSummary) {\\n.opencode/skills/system-spec-kit/scripts/extractors/conversation-extractor.ts:328:  if (!jsonModeHandled && userPrompts.length <= 1 && collectedData.sessionSummary) {\\n.opencode/skills/system-spec-kit/scripts/extractors/conversation-extractor.ts:333:      CONTENT: String(collectedData.sessionSummary),\\n.opencode/skills/system-spec-kit/scripts/extractors/conversation-extractor.ts:389:    TOPIC_CLUSTERS: classification.topicClusters,\\n.opencode/skills/system-spec-kit/mcp_server/api/index.ts:46:  fts5Bm25Search,\\n.opencode/skills/system-spec-kit/mcp_server/api/index.ts:80:export * as sessionBoost from '../lib/search/session-boost.js';\\n.opencode/skills/system-spec-kit/mcp_server/api/index.ts:81:export * as causalBoost from '../lib/search/causal-boost.js';\\n.opencode/skills/system-spec-kit/scripts/lib/coverage-graph-core.cjs:6:// Extracted and adapted from mcp_server/lib/storage/causal-edges.ts\\n.opencode/skills/system-spec-kit/scripts/lib/coverage-graph-core.cjs:97: * Adapted from causal-edges.ts insertEdge():\\n.opencode/skills/system-spec-kit/scripts/lib/coverage-graph-core.cjs:99: * - Weight clamping (0.0-2.0 range for coverage, vs 0-1 for causal)\\n.opencode/skills/system-spec-kit/scripts/lib/coverage-graph-core.cjs:118:  // Prevent self-loops (adapted from causal-edges.ts line 179)\\n.opencode/skills/system-spec-kit/scripts/lib/coverage-graph-core.cjs:155: * Adapted from causal-edges.ts updateEdge():\\n.opencode/skills/system-spec-kit/scripts/lib/coverage-graph-core.cjs:196: * Adapted from causal-edges.ts deleteEdge().\\n.opencode/skills/system-spec-kit/scripts/lib/coverage-graph-core.cjs:215: * Adapted from causal-edges.ts getCausalChain():\\n.opencode/skills/system-spec-kit/scripts/extractors/README.md:3:description: \\\"Extractor inventory for session, conversation, decision, file, and implementation data capture.\\\"\\n.opencode/skills/system-spec-kit/scripts/extractors/README.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/extractors/README.md:6:  - \\\"collect session data\\\"\\n.opencode/skills/system-spec-kit/scripts/extractors/README.md:26:The `extractors/` directory converts collected session input into structured data used by templates and indexing.\\n.opencode/skills/system-spec-kit/scripts/extractors/README.md:34:- `collect-session-data.ts` - Orchestrates session data collection across observations, files, decisions, and context\\n.opencode/skills/system-spec-kit/scripts/extractors/README.md:40:- `git-context-extractor.ts` - Mines git history for captured-session enrichment (spec 013)\\n.opencode/skills/system-spec-kit/scripts/extractors/README.md:43:- `session-activity-signal.ts` - Detects session activity signals for capture gating (re-exported from barrel)\\n.opencode/skills/system-spec-kit/scripts/extractors/README.md:44:- `session-extractor.ts`\\n.opencode/skills/system-spec-kit/scripts/extractors/README.md:45:- `spec-folder-extractor.ts` - Parses spec folder docs for captured-session enrichment (spec 013)\\n.opencode/skills/system-spec-kit/scripts/extractors/README.md:55:- Processing: extraction and enrichment across conversation, files, decisions, and session context\\n.opencode/skills/system-spec-kit/scripts/extractors/README.md:66:- The extractor barrel now re-exports the captured-session enrichment helpers `extractSpecFolderContext()` and `extractGitContext()` alongside the existing extraction surface.\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/types.ts:8:// Feature catalog: Memory indexing (memory_save)\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/types.ts:10:// Feature catalog: Dry-run preflight for memory_save\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/types.ts:59:  triggerPhrases?: string[];\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/types.ts:74:  causalLinks?: Record<string, unknown>;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/types.ts:134:  sessionId?: string;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/types.ts:180:  sessionId?: string | null;\\n.opencode/skills/system-spec-kit/mcp_server/api/README.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:8:// Validates, normalizes, and transforms raw input data into structured session format\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:20:import type { Observation, RecentContextEntry } from '../types/session-types';\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:37:// O3-1: Re-export canonical Observation from session-types\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:48:/** A user prompt record with required timestamp (stricter than session-types UserPrompt) */\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:57:/** A file entry in the FILES array (normalizer-specific shape, not session-types FileEntry) */\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:84:  sessionSummary?: string;\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:85:  session_summary?: string;\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:91:  triggerPhrases?: string[];\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:92:  trigger_phrases?: string[];\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:101:  sessionStatus?: string;\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:102:  session_status?: string;\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:113:  causalLinks?: Record<string, unknown>;\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:114:  causal_links?: Record<string, unknown>;\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:143:  causalLinks?: Record<string, unknown>;\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:144:  causal_links?: Record<string, unknown>;\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:148:  sessionStatus?: string;\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:257:/** OpenCode session capture structure */\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:262:  sessionTitle?: string;\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:263:  sessionId?: string;\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:275:  _sessionId?: string;\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:373: * Builds a feature observation from a session summary string and optional trigger phrases.\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:374: * @param summary - The session summary text to use as title and narrative.\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:375: * @param triggerPhrases - Optional array of trigger phrases stored as observation facts.\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:376: * @returns An Observation of type 'feature' representing the session summary.\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:378:function buildSessionSummaryObservation(summary: string, triggerPhrases: string[] = []): Observation {\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:389:    facts: triggerPhrases\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:539:function buildPromotedExchangePrompts(exchanges: unknown[], sessionSummary: string): NormalizedUserPrompt[] {\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:540:  const sessionSummaryLower = sessionSummary.toLowerCase();\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:548:    if (inputStr.length > 10 && !sessionSummaryLower.includes(inputStr.toLowerCase().slice(0, 50))) {\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:615:  const description = safeString(rawDescription, 'Modified during session');\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:635:  const explicitCausalLinks = normalizeCausalLinks(data.causalLinks ?? data.causal_links);\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:651:  const triggerPhrases = Array.isArray(data.triggerPhrases)\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:652:    ? data.triggerPhrases\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:653:    : Array.isArray(data.trigger_phrases)\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:654:      ? data.trigger_phrases\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:670:    const sessionSummary = typeof data.sessionSummary === 'string'\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:671:      ? data.sessionSummary\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:672:      : (typeof data.session_summary === 'string' ? data.session_summary : '');\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:732:    if (sessionSummary) {\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:733:      cloned.observations.push(buildSessionSummaryObservation(sessionSummary, triggerPhrases));\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:741:    if (triggerPhrases.length > 0) {\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:742:      cloned._manualTriggerPhrases = [...triggerPhrases];\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:754:      cloned.causalLinks = explicitCausalLinks;\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:755:      cloned.causal_links = explicitCausalLinks;\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:781:      (data as Record<string, unknown>).sessionStatus\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:782:      || (data as Record<string, unknown>).session_status\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:786:      (cloned as Record<string, unknown>).sessionStatus = fastPathSessionStatus;\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:819:      const promotedPrompts = buildPromotedExchangePrompts(data.exchanges, sessionSummary);\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:852:    normalized.causalLinks = explicitCausalLinks;\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:853:    normalized.causal_links = explicitCausalLinks;\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:922:  const sessionSummary = typeof data.sessionSummary === 'string'\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:923:    ? data.sessionSummary\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:924:    : (typeof data.session_summary === 'string' ? data.session_summary : '');\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:926:  if (sessionSummary) {\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:927:    observations.push(buildSessionSummaryObservation(sessionSummary, triggerPhrases));\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:959:    ? buildPromotedExchangePrompts(data.exchanges, sessionSummary || '')\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:967:  // T09b: Use promoted exchange prompts alongside sessionSummary fallback\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:969:    ? [...promotedPrompts, { prompt: sessionSummary || 'Manual context save', timestamp: new Date().toISOString() }]\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:970:    : [{ prompt: sessionSummary || 'Manual context save', timestamp: new Date().toISOString() }];\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:973:    request: sessionSummary || 'Manual context save',\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:974:    learning: sessionSummary || ''\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:977:  if (triggerPhrases.length > 0) {\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:978:    normalized._manualTriggerPhrases = [...triggerPhrases];\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1005:    (data as Record<string, unknown>).sessionStatus\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1006:    || (data as Record<string, unknown>).session_status\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1010:    normalized.sessionStatus = slowPathSessionStatus;\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1050:  'sessionSummary', 'session_summary',\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1054:  'triggerPhrases', 'trigger_phrases',\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1058:  'status', 'sessionStatus', 'session_status',\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1064:  'causalLinks', 'causal_links',\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1110:  if (typeof data.sessionSummary === 'string' && data.sessionSummary.length > 50000) {\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1111:    errors.push(`sessionSummary exceeds maximum length of 50000 characters (got ${data.sessionSummary.length})`);\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1113:  if (typeof data.session_summary === 'string' && data.session_summary.length > 50000) {\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1114:    errors.push(`session_summary exceeds maximum length of 50000 characters (got ${data.session_summary.length})`);\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1122:  if (Array.isArray(data.triggerPhrases)) {\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1123:    for (let i = 0; i < data.triggerPhrases.length; i++) {\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1124:      if (typeof data.triggerPhrases[i] === 'string' && (data.triggerPhrases[i] as string).length > 200) {\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1125:        errors.push(`triggerPhrases[${i}] exceeds maximum length of 200 characters`);\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1129:  if (Array.isArray(data.trigger_phrases)) {\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1130:    for (let i = 0; i < data.trigger_phrases.length; i++) {\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1131:      if (typeof data.trigger_phrases[i] === 'string' && (data.trigger_phrases[i] as string).length > 200) {\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1132:        errors.push(`trigger_phrases[${i}] exceeds maximum length of 200 characters`);\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1148:  if (data.triggerPhrases !== undefined && !Array.isArray(data.triggerPhrases)) {\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1149:    errors.push('triggerPhrases must be an array');\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1151:  if (data.trigger_phrases !== undefined && !Array.isArray(data.trigger_phrases)) {\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1152:    errors.push('trigger_phrases must be an array');\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1154:  if (data.causalLinks !== undefined && (!data.causalLinks || typeof data.causalLinks !== 'object' || Array.isArray(data.causalLinks))) {\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1155:    errors.push('causalLinks must be an object');\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1157:  if (data.causal_links !== undefined && (!data.causal_links || typeof data.causal_links !== 'object' || Array.isArray(data.causal_links))) {\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1158:    errors.push('causal_links must be an object');\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1297:// Words like 'testing', 'playbook', 'memory', 'session' are meaningful when from a path and should NOT be stopped.\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1315:    // Multi-word phrases are specific enough to keep (e.g., \\\"session capturing\\\")\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1364:  // P3-3: Require at least one topical anchor when a spec hint exists.\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1378: * Transforms a raw OpenCode session capture into a structured TransformedCapture with observations, prompts, and file entries.\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1408:    sessionTitle: capture.sessionTitle ?? (raw.session_title as string | undefined),\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1409:    sessionId: capture.sessionId ?? (raw.session_id as string | undefined),\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1413:  const { exchanges, toolCalls, metadata, sessionTitle } = normalizedCapture;\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1419:  // Unrelated session content (e.g., from prior conversations in the same\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1420:  // OpenCode session) from polluting the memory file.\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1674:    request: contextExchanges[0].userInput || sessionTitle || 'OpenCode session',\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1707:    _sessionId: normalizedCapture.sessionId,\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1713:        const candidate = summary.transcriptPath ?? summary.eventsPath ?? summary.sessionPath;\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1720:      : normalizedCapture.sessionId,\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1723:      : typeof metadata?.session_created === 'number'\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1724:        ? metadata.session_created as number\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1728:      : typeof metadata?.session_updated === 'number'\\n.opencode/skills/system-spec-kit/scripts/utils/input-normalizer.ts:1729:        ? metadata.session_updated as number\\n.opencode/skills/system-spec-kit/scripts/rules/check-template-source.sh:45:        # (frontmatter with trigger_phrases arrays can exceed 10 lines)\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/README.md:3:description: \\\"Decomposed pipeline modules for the memory_save MCP tool handler, covering dedup, embedding, PE gating, record creation, reconsolidation and response assembly.\\\"\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/README.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/README.md:27:`handlers/save/` contains the decomposed pipeline for the `memory_save` MCP tool. Each file owns a single stage of the save flow, from deduplication through embedding generation, save quality gating, prediction-error gating, reconsolidation, record creation, post-insert enrichment, and final response assembly.\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/README.md:45:| `post-insert.ts`            | Post-insert enrichment pipeline. Runs causal links processing, R10 entity extraction, R8 summary generation and S5 cross-document entity linking. Each step is feature-flag gated and independently error-guarded. |\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/README.md:46:| `response-builder.ts`       | Final response assembly. `buildIndexResult` constructs the `IndexResult` with PE actions, causal links and warnings. `buildSaveResponse` wraps it in a standard MCP success envelope with hints, triggers post-mutation hooks and runs N3-lite consolidation. |\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/README.md:53:1. dedup          -- Skip if unchanged or duplicate content hash\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/README.md:60:8. post-insert    -- Enrich with entities, summaries, causal links\\n.opencode/skills/system-spec-kit/mcp_server/utils/README.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/mcp_server/api/search.ts:16:  fts5Bm25Search,\\n.opencode/skills/system-spec-kit/mcp_server/api/search.ts:18:} from '../lib/search/sqlite-fts.js';\\n.opencode/skills/system-spec-kit/scripts/extractors/implementation-guide-extractor.ts:8:// Extracts implementation guidance and step-by-step instructions from session observations\\n.opencode/skills/system-spec-kit/scripts/extractors/implementation-guide-extractor.ts:13:// O3-2: Use canonical types from session-types (no local duplicates)\\n.opencode/skills/system-spec-kit/scripts/extractors/implementation-guide-extractor.ts:20:} from '../types/session-types';\\n.opencode/skills/system-spec-kit/scripts/extractors/implementation-guide-extractor.ts:71:  return `topic-${digest}`;\\n.opencode/skills/system-spec-kit/scripts/extractors/implementation-guide-extractor.ts:88:    const topicSlug = slugify(baseTitle).substring(0, 40);\\n.opencode/skills/system-spec-kit/scripts/extractors/implementation-guide-extractor.ts:89:    return topicSlug || createTopicFallback(baseTitle || implObs.title);\\n.opencode/skills/system-spec-kit/scripts/extractors/implementation-guide-extractor.ts:131:        DESCRIPTION: description || 'Implemented during session'\\n.opencode/skills/system-spec-kit/scripts/extractors/implementation-guide-extractor.ts:200:        !existingDesc.toLowerCase().includes('modified during session')) {\\n.opencode/skills/system-spec-kit/scripts/spec/check-placeholders.sh:106:    # Memory/ contains generated session context markdown that legitimately\\n.opencode/skills/system-spec-kit/scripts/lib/validate-memory-quality.ts:89:    reason: 'Sparse trigger phrases are diagnostic, but not enough to reject an otherwise valid rendered memory.',\\n.opencode/skills/system-spec-kit/scripts/lib/validate-memory-quality.ts:129:    name: 'session-source-mismatch',\\n.opencode/skills/system-spec-kit/scripts/lib/validate-memory-quality.ts:147:    name: 'topical-coherence-mismatch',\\n.opencode/skills/system-spec-kit/scripts/lib/validate-memory-quality.ts:152:    reason: 'Memory content with zero topical overlap with spec trigger_phrases suggests off-target capture.',\\n.opencode/skills/system-spec-kit/scripts/lib/validate-memory-quality.ts:213:  { pattern: /^(to promote a memory|epistemic state captured at session start|table of contents)\\\\b/i, label: 'template instructional heading' },\\n.opencode/skills/system-spec-kit/scripts/lib/validate-memory-quality.ts:215:  { pattern: /^(untitled|draft|todo|tbd)(?:\\\\s+(memory|session|summary|document|notes?))?$/i, label: 'generic stub title' },\\n.opencode/skills/system-spec-kit/scripts/lib/validate-memory-quality.ts:468:  // When one count is 0, the session produced no file references\\n.opencode/skills/system-spec-kit/scripts/lib/validate-memory-quality.ts:469:  // (newly created specs, research sessions, non-file-tool CLIs).\\n.opencode/skills/system-spec-kit/scripts/lib/validate-memory-quality.ts:570: * Example: \\\"010-perfect-session-capturing/012-template-compliance\\\"\\n.opencode/skills/system-spec-kit/scripts/lib/validate-memory-quality.ts:571: *   -> allowed = { \\\"010-perfect-session-capturing\\\", \\\"012-template-compliance\\\" }\\n.opencode/skills/system-spec-kit/scripts/lib/validate-memory-quality.ts:764:  const triggerPhrases = parseYamlListFromContent(content, 'trigger_phrases');\\n.opencode/skills/system-spec-kit/scripts/lib/validate-memory-quality.ts:765:  const sparseSemantic = toolCount >= 5 && triggerPhrases.length === 0;\\n.opencode/skills/system-spec-kit/scripts/lib/validate-memory-quality.ts:769:    message: sparseSemantic ? 'sparse semantic fields: trigger_phrases empty' : 'ok',\\n.opencode/skills/system-spec-kit/scripts/lib/validate-memory-quality.ts:822:  const keyTopics = parseYamlListFromContent(content, 'key_topics');\\n.opencode/skills/system-spec-kit/scripts/lib/validate-memory-quality.ts:823:  const frontmatterSpecCounts = countSpecIdsInValues([...triggerPhrases, ...keyTopics]);\\n.opencode/skills/system-spec-kit/scripts/lib/validate-memory-quality.ts:878:      ? `session source mismatch: filesystem_file_count=${filesystemFileCount}, captured_file_count=${capturedFileCount}`\\n.opencode/skills/system-spec-kit/scripts/lib/validate-memory-quality.ts:889:  const errorTriggerCount = triggerPhrases.filter((tp) => ERROR_VOCAB.test(tp)).length;\\n.opencode/skills/system-spec-kit/scripts/lib/validate-memory-quality.ts:890:  const errorDominatedTriggers = triggerPhrases.length > 0 && (errorTriggerCount / triggerPhrases.length) > 0.5;\\n.opencode/skills/system-spec-kit/scripts/lib/validate-memory-quality.ts:899:          errorDominatedTriggers ? `trigger_phrases(${errorTriggerCount}/${triggerPhrases.length})` : '',\\n.opencode/skills/system-spec-kit/scripts/lib/validate-memory-quality.ts:904:  // V12: Topical coherence — check if memory content overlaps with spec's trigger_phrases\\n.opencode/skills/system-spec-kit/scripts/lib/validate-memory-quality.ts:932:            specTriggerPhrases = parseYamlListFromContent(specContent, 'trigger_phrases');\\n.opencode/skills/system-spec-kit/scripts/lib/validate-memory-quality.ts:935:            structuredLog('warn', 'Failed to read spec.md during V12 topical coherence validation', {\\n.opencode/skills/system-spec-kit/scripts/lib/validate-memory-quality.ts:952:        v12Message = `V12_TOPICAL_MISMATCH: zero of ${specTriggerPhrases.length} spec trigger_phrases found in memory content`;\\n.opencode/skills/system-spec-kit/scripts/lib/validate-memory-quality.ts:1016:      'frontmatter:trigger_phrases',\\n.opencode/skills/system-spec-kit/scripts/lib/validate-memory-quality.ts:1017:      'frontmatter:key_topics',\\n.opencode/skills/system-spec-kit/scripts/lib/validate-memory-quality.ts:1031:      `trigger_phrases:${triggerPhrases.length}`,\\n.opencode/skills/system-spec-kit/scripts/lib/validate-memory-quality.ts:1032:      `key_topics:${keyTopics.length}`,\\n.opencode/skills/system-spec-kit/scripts/utils/tool-detection.ts:10:import type { ConversationPhaseLabel } from '../types/session-types';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/reconsolidation-bridge.ts:5:import type BetterSqlite3 from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/reconsolidation-bridge.ts:36:// Feature catalog: Memory indexing (memory_save)\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/reconsolidation-bridge.ts:44: * Similarity threshold above which two memories are considered near-duplicates\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/reconsolidation-bridge.ts:69: *   similarity >= 0.96  → auto-merge (near-duplicate)\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/reconsolidation-bridge.ts:124: * Result payload from reconsolidation pre-checks during memory_save.\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/reconsolidation-bridge.ts:138:  triggerPhrases: string[];\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/reconsolidation-bridge.ts:147:      trigger_phrases: args.triggerPhrases,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/reconsolidation-bridge.ts:171:  scope?: { tenantId?: string | null; userId?: string | null; agentId?: string | null; sessionId?: string | null; sharedSpaceId?: string | null },\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/reconsolidation-bridge.ts:195:            triggerPhrases: parsed.triggerPhrases,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/reconsolidation-bridge.ts:238:              // Single transaction for atomicity. better-sqlite3 supports nested transactions\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/reconsolidation-bridge.ts:248:                  triggerPhrases: memory.triggerPhrases ?? [],\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/reconsolidation-bridge.ts:281:                      trigger_phrases: memory.triggerPhrases ?? [],\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/reconsolidation-bridge.ts:291:                      triggerPhrases: memory.triggerPhrases ?? [],\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/reconsolidation-bridge.ts:301:                recordHistory(id, 'ADD', null, memory.title ?? memory.filePath ?? null, 'mcp:memory_save');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/reconsolidation-bridge.ts:322:            reason: `memory_save: reconsolidation ${reconResult.action}`,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/reconsolidation-bridge.ts:329:              tool: 'memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/reconsolidation-bridge.ts:335:            actor: 'mcp:memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/reconsolidation-bridge.ts:401:              UPDATE memory_index\\n.opencode/skills/system-spec-kit/mcp_server/test/hooks/replay-harness.ts:18:} from '../../hooks/claude/session-stop.js';\\n.opencode/skills/system-spec-kit/mcp_server/test/hooks/replay-harness.ts:68:  sessionId: string = 'replay-session',\\n.opencode/skills/system-spec-kit/mcp_server/test/hooks/replay-harness.ts:90:          session_id: sessionId,\\n.opencode/skills/system-spec-kit/mcp_server/test/hooks/replay-harness.ts:99:        const statePath = getStatePath(sessionId);\\n.opencode/skills/system-spec-kit/mcp_server/test/hooks/replay-harness.ts:101:        const state = loadState(sessionId);\\n.opencode/skills/system-spec-kit/mcp_server/tools/context-tools.ts:4:// Dispatch for L1 Orchestration tool: memory_context (T303).\\n.opencode/skills/system-spec-kit/mcp_server/tools/context-tools.ts:11:export const TOOL_NAMES = new Set(['memory_context']);\\n.opencode/skills/system-spec-kit/mcp_server/tools/context-tools.ts:16:    case 'memory_context': return handleMemoryContext(parseArgs<ContextArgs>(validateToolArgs('memory_context', args)));\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/markdown-evidence-builder.ts:10:// Feature catalog: Memory indexing (memory_save)\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/markdown-evidence-builder.ts:11:// Feature catalog: Dry-run preflight for memory_save\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/markdown-evidence-builder.ts:159:    if (heading.includes('context summary') || heading.includes('session summary') || heading === 'overview') {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/markdown-evidence-builder.ts:170:    triggerPhrases: parsed.triggerPhrases,\\n.opencode/skills/system-spec-kit/scripts/test-fixtures/060-checklist-chk-format-invalid/checklist.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/mcp_server/formatters/README.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/utils/tool-sanitizer.ts:21: * Sanitizes a tool description to remove paths that could trigger\\n.opencode/skills/system-spec-kit/mcp_server/tools/code-graph-tools.ts:19:  'code_graph_scan',\\n.opencode/skills/system-spec-kit/mcp_server/tools/code-graph-tools.ts:20:  'code_graph_query',\\n.opencode/skills/system-spec-kit/mcp_server/tools/code-graph-tools.ts:21:  'code_graph_status',\\n.opencode/skills/system-spec-kit/mcp_server/tools/code-graph-tools.ts:22:  'code_graph_context',\\n.opencode/skills/system-spec-kit/mcp_server/tools/code-graph-tools.ts:58:    case 'code_graph_scan':\\n.opencode/skills/system-spec-kit/mcp_server/tools/code-graph-tools.ts:60:    case 'code_graph_query': {\\n.opencode/skills/system-spec-kit/mcp_server/tools/code-graph-tools.ts:67:    case 'code_graph_status':\\n.opencode/skills/system-spec-kit/mcp_server/tools/code-graph-tools.ts:69:    case 'code_graph_context':\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/dedup.ts:5:import type Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/dedup.ts:12:// Feature catalog: Generation-time duplicate and empty content prevention\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/dedup.ts:22:  ['session_id', 'sessionId'],\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/dedup.ts:40:  trigger_phrases: string | null;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/dedup.ts:60:    sessionId: normalizeScopeMatchValue(scope.sessionId),\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/dedup.ts:95:    SELECT id, content_hash, embedding_status, trigger_phrases, quality_score, quality_flags\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/dedup.ts:96:    FROM memory_index\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/dedup.ts:139:    trigger_phrases: string | null;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/dedup.ts:145:  const persistedTriggerPhrases = parseJsonStringArray(existing.trigger_phrases);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/dedup.ts:146:  if (!areEquivalentStringArrays(persistedTriggerPhrases, parsed.triggerPhrases)) {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/dedup.ts:226:  // P1-4 FIX: Check content hash even during force reindex to prevent duplicate\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/dedup.ts:228:  // not change either, so re-indexing provides no value and creates duplicates.\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/dedup.ts:235:      triggerPhrases: parsed.triggerPhrases,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/dedup.ts:262:    const duplicateParams: Array<string> = [\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/dedup.ts:271:      duplicateParams.push(samePathExclusion.filePath);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/dedup.ts:273:      duplicateParams.push(samePathExclusion.canonicalFilePath);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/dedup.ts:276:    const duplicateByHash = database.prepare(`\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/dedup.ts:278:      FROM memory_index\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/dedup.ts:282:    `).get(...duplicateParams) as DuplicateLookupRow | undefined;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/dedup.ts:284:    if (duplicateByHash) {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/dedup.ts:286:        duplicateByHash.content_text,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/dedup.ts:287:        duplicateByHash.file_path,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/dedup.ts:291:        console.warn(`[memory-save] Hash match for memory #${duplicateByHash.id} failed secondary content verification; continuing save`);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/dedup.ts:294:      console.error(`[memory-save] T054: Duplicate content detected (hash match id=${duplicateByHash.id}), skipping embedding`);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/dedup.ts:296:        status: 'duplicate',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/dedup.ts:297:        id: duplicateByHash.id,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/dedup.ts:299:        title: parsed.title ?? duplicateByHash.title ?? '',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/dedup.ts:300:        triggerPhrases: parsed.triggerPhrases,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/dedup.ts:304:        message: `Duplicate content detected: identical to existing memory #${duplicateByHash.id} (${duplicateByHash.file_path}). Skipping embedding generation.`,\\n.opencode/skills/system-spec-kit/mcp_server/formatters/search-results.ts:16:} from '../lib/search/session-transition.js';\\n.opencode/skills/system-spec-kit/mcp_server/formatters/search-results.ts:76:  /** Raw vector cosine similarity (0-100 scale from sqlite-vec). */\\n.opencode/skills/system-spec-kit/mcp_server/formatters/search-results.ts:82:  triggerPhrases?: string | string[];\\n.opencode/skills/system-spec-kit/mcp_server/formatters/search-results.ts:93:  /** Raw vector cosine similarity (0-100 scale from sqlite-vec), or averageSimilarity for multi-concept. */\\n.opencode/skills/system-spec-kit/mcp_server/formatters/search-results.ts:97:  triggerPhrases: string[];\\n.opencode/skills/system-spec-kit/mcp_server/formatters/search-results.ts:147:  sessionTransition?: SessionTransitionTrace;\\n.opencode/skills/system-spec-kit/mcp_server/formatters/search-results.ts:364:  const sessionTransition = readSessionTransitionTrace(extraData?.sessionTransition) ?? undefined;\\n.opencode/skills/system-spec-kit/mcp_server/formatters/search-results.ts:376:    sessionTransition,\\n.opencode/skills/system-spec-kit/mcp_server/formatters/search-results.ts:416:      tool: 'memory_search',\\n.opencode/skills/system-spec-kit/mcp_server/formatters/search-results.ts:448:      triggerPhrases: Array.isArray(rawResult.triggerPhrases) ? rawResult.triggerPhrases :\\n.opencode/skills/system-spec-kit/mcp_server/formatters/search-results.ts:449:                      safeJsonParse<string[]>(rawResult.triggerPhrases as string, []),\\n.opencode/skills/system-spec-kit/mcp_server/formatters/search-results.ts:551:            // 'summary-session-1770903150838-...'). Prefers shortest match to\\n.opencode/skills/system-spec-kit/mcp_server/formatters/search-results.ts:709:    tool: 'memory_search',\\n.opencode/skills/system-spec-kit/mcp_server/tools/index.ts:7:import * as causalTools from './causal-tools.js';\\n.opencode/skills/system-spec-kit/mcp_server/tools/index.ts:12:export { contextTools, memoryTools, causalTools, checkpointTools, lifecycleTools, codeGraphTools };\\n.opencode/skills/system-spec-kit/mcp_server/tools/index.ts:20:  causalTools,\\n.opencode/skills/system-spec-kit/mcp_server/core/db-state.ts:68:  sessionManager?: SessionManagerLike;\\n.opencode/skills/system-spec-kit/mcp_server/core/db-state.ts:101:let sessionManagerRef: SessionManagerLike | null = null;\\n.opencode/skills/system-spec-kit/mcp_server/core/db-state.ts:169:  if (sessionManagerRef) {\\n.opencode/skills/system-spec-kit/mcp_server/core/db-state.ts:170:    const sessionInitResult = sessionManagerRef.init(database);\\n.opencode/skills/system-spec-kit/mcp_server/core/db-state.ts:171:    if (!sessionInitResult.success) {\\n.opencode/skills/system-spec-kit/mcp_server/core/db-state.ts:172:      const errorSuffix = sessionInitResult.error ? `: ${sessionInitResult.error}` : '';\\n.opencode/skills/system-spec-kit/mcp_server/core/db-state.ts:200:  if (deps.sessionManager) sessionManagerRef = deps.sessionManager;\\n.opencode/skills/system-spec-kit/mcp_server/core/db-state.ts:287:      const row = database.prepare('SELECT COUNT(*) as cnt FROM memory_index').get() as { cnt?: number | bigint } | undefined;\\n.opencode/skills/system-spec-kit/mcp_server/core/db-state.ts:340:  db.exec(`CREATE TABLE IF NOT EXISTS config (key TEXT PRIMARY KEY, value TEXT)`);\\n.opencode/skills/system-spec-kit/scripts/ops/heal-session-ambiguity.sh:4:# STATUS:    DEPRECATED — session ambiguity is now handled by\\n.opencode/skills/system-spec-kit/scripts/ops/heal-session-ambiguity.sh:5:#            the memory-save pipeline (generate-context.js).\\n.opencode/skills/system-spec-kit/scripts/ops/heal-session-ambiguity.sh:8:echo \\\"[DEPRECATED] heal-session-ambiguity.sh is deprecated. Session ambiguity is now handled by the memory-save pipeline.\\\" >&2\\n.opencode/skills/system-spec-kit/scripts/ops/heal-session-ambiguity.sh:17:FAILURE_CLASS=\\\"session-ambiguity\\\"\\n.opencode/skills/system-spec-kit/scripts/ops/heal-session-ambiguity.sh:28:heal-session-ambiguity.sh - Deterministic auto-remediation for session ambiguity\\n.opencode/skills/system-spec-kit/scripts/ops/heal-session-ambiguity.sh:31:  ./heal-session-ambiguity.sh [OPTIONS]\\n.opencode/skills/system-spec-kit/scripts/ops/heal-session-ambiguity.sh:105:        \\\"node dist/extractors/session-extractor.js --diagnose-ambiguity --sample-size 500\\\" || exit 1\\n.opencode/skills/system-spec-kit/scripts/ops/heal-session-ambiguity.sh:107:    ops_run_step \\\"$FAILURE_CLASS\\\" \\\"refresh-session-candidates\\\" \\\"$MAX_ATTEMPTS\\\" \\\"$BACKOFF_SECONDS\\\" \\\"$REPAIR_FAILURES\\\" \\\"$OWNER\\\" \\\\\\n.opencode/skills/system-spec-kit/scripts/ops/heal-session-ambiguity.sh:108:        \\\"node dist/core/workflow.js --session-reconcile --refresh-candidates\\\" || exit 1\\n.opencode/skills/system-spec-kit/scripts/ops/heal-session-ambiguity.sh:110:    ops_log \\\"ERROR\\\" \\\"Deprecated session-quality verifier was removed; wire a supported verification command before using this remediation script\\\"\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:9:// Import working-memory for immediate cleanup on session end (GAP 2).\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:20:  sessionTtlMinutes: number;\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:67:    sessionId?: string;\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:80:  sessionStateDeleted: number;\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:85:  sessionId: string;\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:124:  sessionId: string;\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:135:  sessions: InterruptedSession[];\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:153:  sessionId: string;\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:179: * - Cap at 100 entries per session\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:182:  sessionTtlMinutes: parseInt(process.env.SESSION_TTL_MINUTES as string, 10) || 30,\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:193:// Track periodic cleanup interval for expired sessions\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:197:// Track stale session cleanup interval (runs hourly)\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:204:    console.error('[session-manager] WARNING: init() called with null database');\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:226:      console.warn(`[session-manager] Periodic cleanup failed: ${message}`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:234:  // Run stale session cleanup on startup and set up hourly interval\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:239:    console.warn(`[session-manager] Initial stale session cleanup failed: ${message}`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:250:      console.warn(`[session-manager] Periodic stale session cleanup failed: ${message}`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:269:      \\\"SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ? LIMIT 1\\\"\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:277:function hasSessionStateRecord(sessionId: string): boolean {\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:278:  if (!db || !hasTable('session_state')) return false;\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:282:      'SELECT 1 FROM session_state WHERE session_id = ? LIMIT 1'\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:283:    ).get(sessionId) as { 1?: number } | undefined;\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:287:    console.warn(`[session-manager] hasSessionStateRecord failed: ${message}`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:292:function hasSentMemoryRecord(sessionId: string): boolean {\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:293:  if (!db || !hasTable('session_sent_memories')) return false;\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:297:      'SELECT 1 FROM session_sent_memories WHERE session_id = ? LIMIT 1'\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:298:    ).get(sessionId) as { 1?: number } | undefined;\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:302:    console.warn(`[session-manager] hasSentMemoryRecord failed: ${message}`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:307:function isTrackedSession(sessionId: string): boolean {\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:308:  if (!sessionId || typeof sessionId !== 'string') {\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:312:  const normalizedSessionId = sessionId.trim();\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:317:  return workingMemory.sessionExists(normalizedSessionId)\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:330:function getSessionIdentityRecord(sessionId: string): {\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:335:  if (!db || !hasTable('session_state')) {\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:341:    FROM session_state\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:342:    WHERE session_id = ?\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:344:  `).get(sessionId) as Record<string, unknown> | undefined;\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:406:      error: `sessionId \\\"${normalizedSessionId}\\\" does not match a server-managed session. Omit sessionId to start a new server-generated session and reuse the effectiveSessionId returned by the server.`,\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:416:      error: `sessionId \\\"${normalizedSessionId}\\\" is not bound to a corroborated server identity. Omit sessionId to start a new server-generated session and reuse the effectiveSessionId returned by the server.`,\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:426:      error: `sessionId \\\"${normalizedSessionId}\\\" is bound to a different ${mismatch}. Omit sessionId to start a new server-generated session and reuse the effectiveSessionId returned by the server.`,\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:442:  CREATE TABLE IF NOT EXISTS session_sent_memories (\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:443:    session_id TEXT NOT NULL,\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:447:    PRIMARY KEY (session_id, memory_hash)\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:452:  'CREATE INDEX IF NOT EXISTS idx_session_sent_session ON session_sent_memories(session_id);',\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:453:  'CREATE INDEX IF NOT EXISTS idx_session_sent_time ON session_sent_memories(sent_at);',\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:469:    console.error(`[session-manager] Schema creation failed: ${message}`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:508:function shouldSendMemory(sessionId: string, memory: MemoryInput | number): boolean {\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:512:    console.warn(`[session-manager] Database not initialized. dbUnavailableMode=${SESSION_CONFIG.dbUnavailableMode}. ${allow ? 'Allowing' : 'Blocking'} memory.`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:515:  if (!sessionId || typeof sessionId !== 'string') return true;\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:522:      SELECT 1 FROM session_sent_memories\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:523:      WHERE session_id = ? AND memory_hash = ?\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:526:    const exists = stmt.get(sessionId, hash);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:530:    console.warn(`[session-manager] shouldSendMemory check failed: ${message}`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:536:  sessionId: string,\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:542:  if (!SESSION_CONFIG.enabled || !sessionId || !Array.isArray(memories)) {\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:553:    console.warn(`[session-manager] Database not initialized for batch dedup. dbUnavailableMode=${SESSION_CONFIG.dbUnavailableMode}. ${allow ? 'Allowing' : 'Blocking'} batch.`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:565:      SELECT memory_hash FROM session_sent_memories WHERE session_id = ?\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:568:      INSERT OR IGNORE INTO session_sent_memories (session_id, memory_hash, memory_id, sent_at)\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:573:      const existingRows = existingStmt.all(sessionId) as { memory_hash: string }[];\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:580:          const insertResult = insertStmt.run(sessionId, hash, memory.id || null, now);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:593:        // Check + mark + cap enforcement stay in one transaction to avoid duplicate injection races.\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:594:        enforceEntryLimit(sessionId);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:623:    console.warn(`[session-manager] shouldSendMemoriesBatch failed: ${message}`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:634:function markMemorySent(sessionId: string, memory: MemoryInput | number): MarkResult {\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:637:  if (!sessionId || typeof sessionId !== 'string') {\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:638:    return { success: false, error: 'Valid sessionId is required' };\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:647:      INSERT OR IGNORE INTO session_sent_memories (session_id, memory_hash, memory_id, sent_at)\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:653:      stmt.run(sessionId, hash, memoryId, new Date().toISOString());\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:655:      enforceEntryLimit(sessionId);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:661:    console.error(`[session-manager] markMemorySent failed: ${message}`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:666:function markMemoriesSentBatch(sessionId: string, memories: MemoryInput[]): MarkBatchResult {\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:669:  if (!sessionId || !Array.isArray(memories) || memories.length === 0) {\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:670:    return { success: false, markedCount: 0, error: 'Valid sessionId and memories array required' };\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:678:      INSERT OR IGNORE INTO session_sent_memories (session_id, memory_hash, memory_id, sent_at)\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:685:        const result = insertStmt.run(sessionId, hash, memory.id || null, now);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:691:      enforceEntryLimit(sessionId);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:699:    console.error(`[session-manager] markMemoriesSentBatch failed: ${message}`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:708:function enforceEntryLimit(sessionId: string): void {\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:709:  if (!db || !sessionId) return;\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:713:      SELECT COUNT(*) as count FROM session_sent_memories WHERE session_id = ?\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:715:    const row = countStmt.get(sessionId) as { count: number } | undefined;\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:722:      DELETE FROM session_sent_memories\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:723:      WHERE session_id = ? AND rowid IN (\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:724:        SELECT rowid FROM session_sent_memories\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:725:        WHERE session_id = ?\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:730:    deleteStmt.run(sessionId, sessionId, excess);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:733:    console.warn(`[session-manager] enforce_entry_limit failed: ${message}`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:741:    const cutoffMs = Date.now() - SESSION_CONFIG.sessionTtlMinutes * 60 * 1000;\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:745:      DELETE FROM session_sent_memories WHERE sent_at < ?\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:752:    console.error(`[session-manager] cleanup_expired_sessions failed: ${message}`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:758: * T302: Clean up stale sessions across all session-related tables.\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:761: *   - working_memory: entries with last_focused older than threshold\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:762: *   - session_sent_memories: entries with sent_at older than threshold\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:763: *   - session_state: completed/interrupted sessions older than threshold\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:766: *   - session_learning records (permanent, never cleaned)\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:767: *   - Active sessions (session_state with status='active')\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:773:    return { success: false, workingMemoryDeleted: 0, sentMemoriesDeleted: 0, sessionStateDeleted: 0, errors: ['Database not initialized'] };\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:779:  let sessionStateDeleted = 0;\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:782:  // 1. Clean stale working_memory entries\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:784:    const wmStmt = db.prepare('DELETE FROM working_memory WHERE last_focused < ?');\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:791:      errors.push(`working_memory cleanup: ${msg}`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:795:  // 2. Clean stale session_sent_memories entries\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:797:    const smStmt = db.prepare('DELETE FROM session_sent_memories WHERE sent_at < ?');\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:803:      errors.push(`session_sent_memories cleanup: ${msg}`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:807:  // 3. Clean completed/interrupted session_state entries (NEVER clean active sessions)\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:810:      `DELETE FROM session_state WHERE status IN ('completed', 'interrupted') AND updated_at < ?`\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:813:    sessionStateDeleted = ssResult.changes;\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:817:      errors.push(`session_state cleanup: ${msg}`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:821:  const totalDeleted = workingMemoryDeleted + sentMemoriesDeleted + sessionStateDeleted;\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:824:      `[session-manager] Stale session cleanup: removed ${workingMemoryDeleted} working_memory, ` +\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:825:      `${sentMemoriesDeleted} sent_memories, ${sessionStateDeleted} session_state entries ` +\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:831:    console.warn(`[session-manager] Stale cleanup had ${errors.length} error(s): ${errors.join('; ')}`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:838:    sessionStateDeleted,\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:843:function clearSession(sessionId: string): CleanupResult {\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:844:  if (!db || !sessionId) return { success: false, deletedCount: 0 };\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:848:      DELETE FROM session_sent_memories WHERE session_id = ?\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:850:    const result = stmt.run(sessionId);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:852:    // Immediately clear working memory for cleared session (GAP 2).\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:854:      workingMemory.clearSession(sessionId);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:857:      console.warn(`[session-manager] Working memory cleanup for ${sessionId} failed: ${wmMsg}`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:863:    console.error(`[session-manager] clear_session failed: ${message}`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:868:function getSessionStats(sessionId: string): SessionStats {\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:869:  if (!db || !sessionId) return { totalSent: 0, oldestEntry: null, newestEntry: null };\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:877:      FROM session_sent_memories\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:878:      WHERE session_id = ?\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:880:    const row = stmt.get(sessionId) as { total_sent: number; oldest_entry: string | null; newest_entry: string | null } | undefined;\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:889:    console.warn(`[session-manager] get_session_stats failed: ${message}`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:898:function filterSearchResults(sessionId: string, results: MemoryInput[]): FilterResult {\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:899:  if (!SESSION_CONFIG.enabled || !sessionId || !Array.isArray(results)) {\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:907:  const shouldSendMap = shouldSendMemoriesBatch(sessionId, results, true);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:938:function markResultsSent(sessionId: string, results: MemoryInput[]): MarkBatchResult {\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:939:  if (!SESSION_CONFIG.enabled || !sessionId || !Array.isArray(results) || results.length === 0) {\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:943:  return markMemoriesSentBatch(sessionId, results);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:959:  CREATE TABLE IF NOT EXISTS session_state (\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:960:    session_id TEXT PRIMARY KEY,\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:974:  'CREATE INDEX IF NOT EXISTS idx_session_state_status ON session_state(status);',\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:975:  'CREATE INDEX IF NOT EXISTS idx_session_state_updated ON session_state(updated_at);',\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:976:  'CREATE INDEX IF NOT EXISTS idx_session_state_identity_scope ON session_state(tenant_id, user_id, agent_id);',\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:980:  { column: 'tenant_id', sql: 'ALTER TABLE session_state ADD COLUMN tenant_id TEXT;' },\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:981:  { column: 'user_id', sql: 'ALTER TABLE session_state ADD COLUMN user_id TEXT;' },\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:982:  { column: 'agent_id', sql: 'ALTER TABLE session_state ADD COLUMN agent_id TEXT;' },\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1003:    const existingColumns = getTableColumns('session_state');\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1015:    console.error(`[session-manager] Session state schema creation failed: ${message}`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1020:function saveSessionState(sessionId: string, state: SessionStateInput = {}): InitResult {\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1022:  if (!sessionId || typeof sessionId !== 'string') {\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1023:    return { success: false, error: 'Valid sessionId is required' };\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1035:      INSERT INTO session_state (\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1036:        session_id, status, spec_folder, current_task, last_action,\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1042:      ON CONFLICT(session_id) DO UPDATE SET\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1044:        spec_folder = COALESCE(excluded.spec_folder, session_state.spec_folder),\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1045:        current_task = COALESCE(excluded.current_task, session_state.current_task),\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1046:        last_action = COALESCE(excluded.last_action, session_state.last_action),\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1047:        context_summary = COALESCE(excluded.context_summary, session_state.context_summary),\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1048:        pending_work = COALESCE(excluded.pending_work, session_state.pending_work),\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1049:        state_data = COALESCE(excluded.state_data, session_state.state_data),\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1050:        tenant_id = COALESCE(excluded.tenant_id, session_state.tenant_id),\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1051:        user_id = COALESCE(excluded.user_id, session_state.user_id),\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1052:        agent_id = COALESCE(excluded.agent_id, session_state.agent_id),\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1057:      sessionId,\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1074:    console.error(`[session-manager] save_session_state failed: ${message}`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1079:function completeSession(sessionId: string): InitResult {\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1080:  if (!db || !sessionId) return { success: false, error: 'Database or sessionId not available' };\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1084:      UPDATE session_state\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1086:      WHERE session_id = ?\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1088:    stmt.run(new Date().toISOString(), sessionId);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1090:    // Immediately clear working memory for completed session (GAP 2).\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1092:      workingMemory.clearSession(sessionId);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1095:      console.warn(`[session-manager] Working memory cleanup for ${sessionId} failed: ${wmMsg}`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1101:    console.error(`[session-manager] complete_session failed: ${message}`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1112:      UPDATE session_state\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1121:    console.error(`[session-manager] reset_interrupted_sessions failed: ${message}`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1126:function recoverState(sessionId: string, scope: SessionIdentityScope = {}): RecoverResult {\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1128:  if (!sessionId || typeof sessionId !== 'string') {\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1129:    return { success: false, error: 'Valid sessionId is required' };\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1136:      SELECT session_id, status, spec_folder, current_task, last_action,\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1140:      FROM session_state\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1141:      WHERE session_id = ?\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1143:    const row = stmt.get(sessionId) as Record<string, unknown> | undefined;\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1156:      return { success: false, error: `sessionId \\\"${sessionId}\\\" is bound to a different ${mismatch}` };\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1160:      sessionId: row.session_id as string,\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1178:        UPDATE session_state\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1180:        WHERE session_id = ?\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1182:      updateStmt.run(new Date().toISOString(), sessionId);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1188:    console.error(`[session-manager] recover_state failed: ${message}`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1194:  if (!db) return { success: false, sessions: [], error: 'Database not initialized. Server may still be starting up.' };\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1199:      SELECT session_id, spec_folder, current_task, last_action,\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1202:      FROM session_state\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1218:      sessions: filteredRows.map((row) => ({\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1219:        sessionId: row.session_id as string,\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1230:    console.error(`[session-manager] get_interrupted_sessions failed: ${message}`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1231:    return { success: false, sessions: [], error: message };\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1239:function generateContinueSessionMd(sessionState: ContinueSessionInput): string {\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1241:    sessionId,\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1248:  } = sessionState;\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1262:    : sessionId\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1263:      ? `memory_search({ sessionId: \\\"${sessionId}\\\" })`\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1264:      : 'memory_search({ query: \\\"last session\\\" })';\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1269:> **Purpose:** Enable seamless session recovery after context compaction, crashes, or breaks.\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1278:| **Session ID** | \\\\`${sessionId || 'N/A'}\\\\` |\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1301:To continue this session, use:\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1318:*This file is auto-generated on session checkpoint. It provides a human-readable recovery mechanism alongside SQLite persistence.*\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1324:function writeContinueSessionMd(sessionId: string, specFolderPath: string): CheckpointResult {\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1325:  if (!sessionId || !specFolderPath) {\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1326:    return { success: false, error: 'sessionId and specFolderPath are required' };\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1330:    const recoverResult = recoverState(sessionId);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1333:        sessionId,\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1349:    console.error(`[session-manager] write_continue_session_md failed: ${message}`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1355:  sessionId: string,\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1359:  const saveResult = saveSessionState(sessionId, state);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-manager.ts:1366:    return writeContinueSessionMd(sessionId, folderPath);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/post-insert.ts:4:import type BetterSqlite3 from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/post-insert.ts:8:import { processCausalLinks } from '../causal-links-processor.js';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/post-insert.ts:24:// Feature catalog: Memory indexing (memory_save)\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/post-insert.ts:38:  causalLinks: boolean;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/post-insert.ts:46:  causalLinksResult: CausalLinksResult | null;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/post-insert.ts:53: * Sequentially executes: causal links processing, entity extraction (R10),\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/post-insert.ts:61: * @returns PostInsertEnrichmentResult with causal links outcome.\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/post-insert.ts:70:    causalLinks: false,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/post-insert.ts:78:  let causalLinksResult: CausalLinksResult | null = null;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/post-insert.ts:79:  if (parsed.hasCausalLinks && parsed.causalLinks) {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/post-insert.ts:81:      causalLinksResult = processCausalLinks(database, id, parsed.causalLinks);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/post-insert.ts:82:      enrichmentStatus.causalLinks = true;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/post-insert.ts:83:      if (causalLinksResult.inserted > 0) {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/post-insert.ts:84:        console.error(`[causal-links] Processed ${causalLinksResult.inserted} causal edges for memory #${id}`);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/post-insert.ts:86:      if (causalLinksResult.unresolved.length > 0) {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/post-insert.ts:87:        console.warn(`[causal-links] ${causalLinksResult.unresolved.length} references could not be resolved`);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/post-insert.ts:89:    } catch (causal_err: unknown) {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/post-insert.ts:90:      const message = toErrorMessage(causal_err);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/post-insert.ts:94:    // No causal links to process — not a failure\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/post-insert.ts:95:    enrichmentStatus.causalLinks = true;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/post-insert.ts:193:  return { causalLinksResult, enrichmentStatus };\\n.opencode/skills/system-spec-kit/scripts/test-fixtures/058-template-reordered-anchor/spec.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/mcp_server/tools/types.ts:34:  sessionId?: string;\\n.opencode/skills/system-spec-kit/mcp_server/tools/types.ts:62:  sessionId?: string;\\n.opencode/skills/system-spec-kit/mcp_server/tools/types.ts:80:/** Arguments for trigger matching requests. */\\n.opencode/skills/system-spec-kit/mcp_server/tools/types.ts:84:  session_id?: string;\\n.opencode/skills/system-spec-kit/mcp_server/tools/types.ts:100:  triggerPhrases?: string[];\\n.opencode/skills/system-spec-kit/mcp_server/tools/types.ts:145:  sessionId?: string;\\n.opencode/skills/system-spec-kit/mcp_server/tools/types.ts:159:  sessionId?: string;\\n.opencode/skills/system-spec-kit/mcp_server/tools/types.ts:204:/** Arguments for session resume requests. */\\n.opencode/skills/system-spec-kit/mcp_server/tools/types.ts:210:/** Arguments for session bootstrap requests. */\\n.opencode/skills/system-spec-kit/mcp_server/tools/types.ts:264:  sessionId?: string | null;\\n.opencode/skills/system-spec-kit/mcp_server/tools/types.ts:276:  sessionId?: string | null;\\n.opencode/skills/system-spec-kit/mcp_server/tools/types.ts:282:  sessionId?: string;\\n.opencode/skills/system-spec-kit/mcp_server/tools/types.ts:288:/** Arguments for causal drift trace requests. */\\n.opencode/skills/system-spec-kit/mcp_server/tools/types.ts:297:/** Arguments for causal link creation requests. */\\n.opencode/skills/system-spec-kit/mcp_server/tools/types.ts:306:/** Arguments for causal statistics requests. */\\n.opencode/skills/system-spec-kit/mcp_server/tools/types.ts:311:/** Arguments for causal link removal requests. */\\n.opencode/skills/system-spec-kit/mcp_server/tools/types.ts:328:  channels?: Array<'vector' | 'bm25' | 'fts5' | 'graph' | 'trigger'>;\\n.opencode/skills/system-spec-kit/mcp_server/core/config.ts:75:    databasePath: path.join(resolved, 'context-index.sqlite'),\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:3:description: \\\"Session management for the Spec Kit Memory MCP server. Handles session deduplication, crash recovery and context persistence.\\\"\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:5:  - \\\"session management\\\"\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:6:  - \\\"session deduplication\\\"\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:33:The session layer provides all session-related operations for the Spec Kit Memory MCP server. It prevents duplicate context injection (saving ~50% tokens on follow-up queries) and enables crash recovery with immediate SQLite persistence.\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:39:| Modules | 1 | `session-manager.ts` |\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:42:| Max Entries | 100 | Per session cap (R7 mitigation) |\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:48:| **Session Deduplication** | Tracks sent memories to prevent duplicate context injection |\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:62:session/\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:63: session-manager.ts  # Session deduplication, crash recovery, state management (~28KB)\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:71:| `session-manager.ts` | Core session tracking, deduplication, state persistence, CONTINUE_SESSION.md |\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:82:**Purpose**: Prevent sending the same memory content twice in a session, saving tokens.\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:89:| **Token Savings** | ~200 tokens per duplicate avoided |\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:93:1. User queries memory_search\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:107:| **Interrupted Detection** | On startup, active sessions marked as interrupted |\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:118:**Purpose**: Human-readable recovery file for smooth session continuation.\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:137:import { filterSearchResults, markResultsSent } from './session-manager';\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:140:const { filtered, dedupStats } = filterSearchResults(sessionId, results);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:142:console.log(`Filtered ${dedupStats.filtered} duplicates`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:146:markResultsSent(sessionId, filtered);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:152:import { init, resetInterruptedSessions, getInterruptedSessions } from './session-manager';\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:154:// Initialize session manager\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:157:// Mark any active sessions as interrupted\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:159:console.log(`Found ${interruptedCount} interrupted sessions`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:162:const { sessions } = getInterruptedSessions();\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:163:sessions.forEach(s => {\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:164:  console.log(`Session ${s.sessionId}: ${s.lastAction} in ${s.specFolder}`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:171:import { checkpointSession, saveSessionState } from './session-manager';\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:174:saveSessionState(sessionId, {\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:177:  lastAction: 'Implemented causal edges',\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:183:checkpointSession(sessionId, {\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:194:| Check if should send | `shouldSendMemory(sessionId, memory)` | Before returning single memory |\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:195:| Batch check | `shouldSendMemoriesBatch(sessionId, memories)` | Before returning multiple memories |\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:196:| Mark single sent | `markMemorySent(sessionId, memory)` | After returning a memory |\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:197:| Mark batch sent | `markMemoriesSentBatch(sessionId, memories)` | After returning multiple memories |\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:198:| Clear session | `clearSession(sessionId)` | On explicit session end |\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:199:| Get session stats | `getSessionStats(sessionId)` | For debugging/logging |\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:200:| Recover state | `recoverState(sessionId)` | On session resume |\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:201:| Complete session | `completeSession(sessionId)` | On normal session end |\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:216:**Cause**: Memories already marked as sent in this session.\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:220:import { getSessionStats, clearSession } from './session-manager';\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:222:// Check session stats\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:223:const stats = getSessionStats(sessionId);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:226:// Clear session to reset\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:227:clearSession(sessionId);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:234:**Cause**: Database not initialized or session ID changing.\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:238:import { getDb } from './session-manager';\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:246:// Ensure consistent session ID\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:247:console.log(`Using session: ${sessionId}`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:261:import { isEnabled, getConfig, getSessionStats, getInterruptedSessions } from './session-manager';\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:267:// Check session stats\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:268:console.log(getSessionStats(sessionId));\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:270:// Check for interrupted sessions\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:279:| `SESSION_MAX_ENTRIES` | 100 | Maximum entries per session |\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:300:| `context-server.ts` | MCP server that uses session layer |\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/README.md:301:| `storage/checkpoints.ts` | Checkpoint creation uses session state |\\n.opencode/skills/system-spec-kit/scripts/test-fixtures/053-template-compliant-level2/spec.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/utils/fact-coercion.ts:27:  sessionId?: string;\\n.opencode/skills/system-spec-kit/scripts/utils/fact-coercion.ts:95:      sessionId: ctx.sessionId,\\n.opencode/skills/system-spec-kit/mcp_server/cli.ts:7:// Better-sqlite3 and sqlite-vec load correctly regardless of cwd.\\n.opencode/skills/system-spec-kit/mcp_server/cli.ts:23:type TriggerMatcherModule = Awaited<typeof import('./lib/parsing/trigger-matcher.js')>;\\n.opencode/skills/system-spec-kit/mcp_server/cli.ts:26:type CausalEdgesModule = Awaited<typeof import('./lib/storage/causal-edges.js')>;\\n.opencode/skills/system-spec-kit/mcp_server/cli.ts:34:let _trigger_matcher: TriggerMatcherModule | null = null;\\n.opencode/skills/system-spec-kit/mcp_server/cli.ts:37:let _causal_edges: CausalEdgesModule | null = null;\\n.opencode/skills/system-spec-kit/mcp_server/cli.ts:58:  return _trigger_matcher ??= await import('./lib/parsing/trigger-matcher.js');\\n.opencode/skills/system-spec-kit/mcp_server/cli.ts:70:  return _causal_edges ??= await import('./lib/storage/causal-edges.js');\\n.opencode/skills/system-spec-kit/mcp_server/cli.ts:173:  const totalRow = db.prepare('SELECT COUNT(*) as count FROM memory_index').get() as { count: number };\\n.opencode/skills/system-spec-kit/mcp_server/cli.ts:181:    'SELECT importance_tier, COUNT(*) as count FROM memory_index GROUP BY importance_tier ORDER BY count DESC'\\n.opencode/skills/system-spec-kit/mcp_server/cli.ts:192:    'SELECT spec_folder, COUNT(*) as count FROM memory_index WHERE spec_folder IS NOT NULL GROUP BY spec_folder ORDER BY count DESC LIMIT 10'\\n.opencode/skills/system-spec-kit/mcp_server/cli.ts:224:      \\\"SELECT COUNT(*) as count FROM memory_index WHERE embedding_status = 'partial'\\\"\\n.opencode/skills/system-spec-kit/mcp_server/cli.ts:227:      'SELECT COUNT(*) as count FROM memory_index WHERE parent_id IS NOT NULL'\\n.opencode/skills/system-spec-kit/mcp_server/cli.ts:281:  const [vectorIndex, checkpointsLib, mutationLedger, triggerMatcher, causalEdges, history] = await Promise.all([\\n.opencode/skills/system-spec-kit/mcp_server/cli.ts:292:  let countSql = 'SELECT COUNT(*) as count FROM memory_index WHERE importance_tier = ?';\\n.opencode/skills/system-spec-kit/mcp_server/cli.ts:324:    let sampleSql = 'SELECT id, title, created_at FROM memory_index WHERE importance_tier = ?';\\n.opencode/skills/system-spec-kit/mcp_server/cli.ts:371:  let selectSql = 'SELECT id, spec_folder FROM memory_index WHERE importance_tier = ?';\\n.opencode/skills/system-spec-kit/mcp_server/cli.ts:378:  // Initialize causal edges for cleanup\\n.opencode/skills/system-spec-kit/mcp_server/cli.ts:379:  causalEdges.init(db);\\n.opencode/skills/system-spec-kit/mcp_server/cli.ts:396:        try { causalEdges.deleteEdgesForMemory(String(memory.id)); } catch { /* ignore */ }\\n.opencode/skills/system-spec-kit/mcp_server/cli.ts:426:  // Invalidate trigger cache\\n.opencode/skills/system-spec-kit/mcp_server/cli.ts:427:  triggerMatcher.clearCache();\\n.opencode/skills/system-spec-kit/scripts/ops/README.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/ops/README.md:79:2. `session-ambiguity`\\n.opencode/skills/system-spec-kit/scripts/ops/README.md:95:| `heal-session-ambiguity.sh` | Run session-ambiguity remediation workflow |\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:4:import type BetterSqlite3 from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:56:  causalLinksResult: CausalLinksResult | null;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:124:  causalLinksResult,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:144:      ? 'memory_save: updated indexed memory entry'\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:145:      : 'memory_save: created new indexed memory entry',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:150:      tool: 'memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:160:    actor: 'mcp:memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:168:    triggerPhrases: parsed.triggerPhrases,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:224:  if (causalLinksResult) {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:225:    result.causalLinks = {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:226:      processed: causalLinksResult.processed,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:227:      inserted: causalLinksResult.inserted,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:228:      resolved: causalLinksResult.resolved,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:229:      unresolved_count: causalLinksResult.unresolved.length,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:231:    if (causalLinksResult.errors.length > 0) {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:232:      (result.causalLinks as Record<string, unknown>).errors = causalLinksResult.errors;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:251:      tool: 'memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:269:      tool: 'memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:285:      tool: 'memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:312:  const shouldEmitPostMutationFeedback = result.status !== 'duplicate' && result.status !== 'unchanged';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:321:        latencyMs: 0, triggerCacheCleared: false,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:335:    triggerPhrases: result.triggerPhrases,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:340:    message: result.message ?? (result.status === 'duplicate' ? 'Memory skipped (duplicate content)' : `Memory ${result.status} successfully`),\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:406:    hints.push('Existing memory was reinforced instead of creating duplicate');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:417:      hints.push('Async embedding mode: immediate background attempt triggered, background retry manager as safety net');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:423:  if (result.causalLinks) {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:424:    response.causalLinks = result.causalLinks;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:425:    if ((result.causalLinks as Record<string, unknown>).inserted as number > 0) {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:426:      hints.push(`Created ${(result.causalLinks as Record<string, unknown>).inserted} causal graph edge(s)`);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:428:    if ((result.causalLinks as Record<string, unknown>).unresolved_count as number > 0) {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:429:      hints.push(`${(result.causalLinks as Record<string, unknown>).unresolved_count} causal link reference(s) could not be resolved`);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:435:  } else if (result.status === 'duplicate') {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:462:    tool: 'memory_save',\\n.opencode/skills/system-spec-kit/scripts/lib/trigger-phrase-sanitizer.ts:90:  'session for',\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-snapshot.ts:4:// Phase 024: Lightweight read-only snapshot of session state.\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-snapshot.ts:27:  sessionQuality: 'healthy' | 'degraded' | 'critical' | 'unknown';\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-snapshot.ts:43:  sourceSurface: 'auto-prime' | 'session_bootstrap' | 'session_resume' | 'session_health';\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-snapshot.ts:135:/** Build a read-only snapshot of the current session state. */\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-snapshot.ts:162:  let sessionQuality: SessionSnapshot['sessionQuality'] = 'unknown';\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-snapshot.ts:165:    sessionQuality = qs.level;\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-snapshot.ts:188:    routingParts.push('structural queries (callers, deps) → code_graph_query');\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-snapshot.ts:198:    sessionQuality,\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-snapshot.ts:243:      summary = `Code graph: ${stats.totalFiles} files, ${stats.totalNodes} nodes (stale — structural reads may refresh inline or recommend code_graph_scan)`;\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-snapshot.ts:253:    recommendedAction = 'Structural context available. Use code_graph_query for structural lookups.';\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-snapshot.ts:255:    recommendedAction = 'Use a structural read to trigger bounded inline refresh when safe, or run code_graph_scan for broader stale states.';\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-snapshot.ts:257:    recommendedAction = 'Call session_bootstrap first. Then run code_graph_scan if structural context is needed.';\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-snapshot.ts:269:      producer: 'session_snapshot',\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/session-snapshot.ts:283:      sourceRefs: ['code-graph-db', 'session-snapshot'],\\n.opencode/skills/system-spec-kit/mcp_server/tools/README.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/mcp_server/tools/README.md:27:- `context-tools.ts` - dispatch for `memory_context`.\\n.opencode/skills/system-spec-kit/mcp_server/tools/README.md:28:- `memory-tools.ts` - dispatch for search, quick search, triggers, save, CRUD, stats, health, validate, and bulk delete.\\n.opencode/skills/system-spec-kit/mcp_server/tools/README.md:29:- `causal-tools.ts` - dispatch for causal graph operations.\\n.opencode/skills/system-spec-kit/mcp_server/tools/README.md:40:- `memory-tools.ts` implements the `memory_quick_search` delegation path by building a richer `memory_search` request and relabeling the returned envelope metadata back to `memory_quick_search`.\\n.opencode/skills/system-spec-kit/mcp_server/core/README.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/context-metrics.ts:4:// Phase 023: Lightweight session quality tracking.\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/context-metrics.ts:15:  sessionId: string;\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/context-metrics.ts:33:    recovery: number;       // 1.0 if memory recovered this session\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/context-metrics.ts:42:  | 'code_graph_query'\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/context-metrics.ts:66:const sessionId = `sess_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/context-metrics.ts:84:// Matches the session-snapshot graph staleness threshold.\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/context-metrics.ts:104:    case 'code_graph_query':\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/context-metrics.ts:144:/** Return a read-only snapshot of current session metrics. */\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/context-metrics.ts:147:    sessionId,\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/context-metrics.ts:200: * session-health.ts should use this instead of the memory-surface duplicate.\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/context-metrics.ts:217:  //   recency (0.35)       — Highest weight because stale sessions are the primary\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/context-metrics.ts:224:  //   recovery (0.20)      — A memory_context({ mode: \\\"resume\\\" }) call is the most\\n.opencode/skills/system-spec-kit/mcp_server/lib/session/context-metrics.ts:225:  //                          reliable signal that the session has recovered prior state.\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/validation-responses.ts:18:// Feature catalog: Dry-run preflight for memory_save\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/validation-responses.ts:42:    triggerPhrases: parsed.triggerPhrases,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/validation-responses.ts:66:    triggerPhrases: parsed.triggerPhrases,\\n.opencode/skills/system-spec-kit/mcp_server/tools/causal-tools.ts:4:// Dispatch for L6 causal memory graph tools: drift_why,\\n.opencode/skills/system-spec-kit/mcp_server/tools/causal-tools.ts:5:// Causal_link, causal_stats, causal_unlink (T303).\\n.opencode/skills/system-spec-kit/mcp_server/tools/causal-tools.ts:26:  'memory_causal_link',\\n.opencode/skills/system-spec-kit/mcp_server/tools/causal-tools.ts:27:  'memory_causal_stats',\\n.opencode/skills/system-spec-kit/mcp_server/tools/causal-tools.ts:28:  'memory_causal_unlink',\\n.opencode/skills/system-spec-kit/mcp_server/tools/causal-tools.ts:35:    case 'memory_causal_link':   return handleMemoryCausalLink(parseArgs<CausalLinkArgs>(validateToolArgs('memory_causal_link', args)));\\n.opencode/skills/system-spec-kit/mcp_server/tools/causal-tools.ts:36:    case 'memory_causal_stats':  return handleMemoryCausalStats(parseArgs<CausalStatsArgs>(validateToolArgs('memory_causal_stats', args)));\\n.opencode/skills/system-spec-kit/mcp_server/tools/causal-tools.ts:37:    case 'memory_causal_unlink': return handleMemoryCausalUnlink(parseArgs<CausalUnlinkArgs>(validateToolArgs('memory_causal_unlink', args)));\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:7:import Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:8:import * as causalBoost from '../lib/search/causal-boost';\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:9:import type { RankedSearchResult } from '../lib/search/causal-boost';\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:18:    CREATE TABLE causal_edges (\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:30:    CREATE TABLE memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:36:      trigger_phrases TEXT,\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:40:  causalBoost.init(db);\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:49:    INSERT INTO memory_index (id, spec_folder, file_path, title, importance_tier, trigger_phrases)\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:76:      INSERT INTO causal_edges (source_id, target_id, relation, strength)\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:91:    expect(causalBoost.isSparseMode(0.1)).toBe(false);\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:92:    expect(causalBoost.isSparseMode(0.9)).toBe(false);\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:96:    expect(causalBoost.isSparseMode(0.5)).toBe(false);\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:97:    expect(causalBoost.isSparseMode(1.0)).toBe(false);\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:98:    expect(causalBoost.isSparseMode(0.7)).toBe(false);\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:102:    expect(causalBoost.isSparseMode(0.0)).toBe(true);\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:103:    expect(causalBoost.isSparseMode(0.1)).toBe(true);\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:104:    expect(causalBoost.isSparseMode(0.499)).toBe(true);\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:108:    expect(causalBoost.isSparseMode(undefined)).toBe(false);\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:109:    expect(causalBoost.isSparseMode(NaN)).toBe(false);\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:110:    expect(causalBoost.isSparseMode(Infinity)).toBe(false);\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:117:    const { metadata } = causalBoost.applyCausalBoost(results, { graphDensity: 0.3 });\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:126:    const { results: boosted, metadata } = causalBoost.applyCausalBoost(\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:132:    // Node 2 should be injected as a causal neighbor at hop 1\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:139:    const { metadata } = causalBoost.applyCausalBoost(results, { graphDensity: 0.8 });\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:148:    const { metadata } = causalBoost.applyCausalBoost(results, { graphDensity: 0.1 });\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:158:    const boosts = causalBoost.getNeighborBoosts([1]);\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:185:    const supersedes = causalBoost.resolveEdgePrior('supersedes', 'fix_bug');\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:186:    const dependsOn = causalBoost.resolveEdgePrior('caused', 'fix_bug');\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:187:    const random = causalBoost.resolveEdgePrior('supports', 'fix_bug');\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:194:    const contradicts = causalBoost.resolveEdgePrior('contradicts', 'fix_bug');\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:200:    const enabled = causalBoost.resolveEdgePrior('enabled', 'add_feature');\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:201:    const derivedFrom = causalBoost.resolveEdgePrior('derived_from', 'add_feature');\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:202:    const caused = causalBoost.resolveEdgePrior('caused', 'add_feature');\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:210:    const supports = causalBoost.resolveEdgePrior('supports', 'find_decision');\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:211:    const supersedes = causalBoost.resolveEdgePrior('supersedes', 'find_decision');\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:218:    const caused = causalBoost.resolveEdgePrior('caused', 'unknown_intent');\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:219:    const supports = causalBoost.resolveEdgePrior('supports', 'unknown_intent');\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:229:    expect(causalBoost.resolveEdgePrior('supports', 'fix_bug')).toBe(1.0);\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:230:    expect(causalBoost.resolveEdgePrior('caused', 'add_feature')).toBe(1.0);\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:231:    expect(causalBoost.resolveEdgePrior('supersedes', 'find_decision')).toBe(1.0);\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:237:    expect(causalBoost.computeHopDecay(1)).toBeCloseTo(1.0, 6);\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:238:    expect(causalBoost.computeHopDecay(2)).toBeCloseTo(0.5, 6);\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:242:    expect(causalBoost.computeHopDecay(0)).toBe(0);\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:243:    expect(causalBoost.computeHopDecay(-1)).toBe(0);\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:244:    expect(causalBoost.computeHopDecay(NaN)).toBe(0);\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:252:    const score = causalBoost.computeIntentTraversalScore(0.9, 'supersedes', 1, 0.8, 'fix_bug');\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:260:    const score = causalBoost.computeIntentTraversalScore(0.8, 'supports', 2, 1.0, 'add_feature');\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:266:    const score = causalBoost.computeIntentTraversalScore(0.9, 'caused', 1, 0, 'understand');\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:271:    const score = causalBoost.computeIntentTraversalScore(0, 'caused', 1, 1.0, 'understand');\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:284:      INSERT INTO causal_edges (source_id, target_id, relation, strength)\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:287:    causalBoost.init(localDb);\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:290:    const { metadata } = causalBoost.applyCausalBoost(results, { intent: 'fix_bug' });\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:303:      INSERT INTO causal_edges (source_id, target_id, relation, strength)\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:306:    causalBoost.init(localDb);\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:309:    const { metadata } = causalBoost.applyCausalBoost(results, {\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:335:      INSERT INTO causal_edges (source_id, target_id, relation, strength)\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:349:    const boosts = causalBoost.getNeighborBoosts([1]);\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:359:    const { results: boostedResults, metadata } = causalBoost.applyCausalBoost(results, {\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:360:      graphDensity: 0.1,  // Would trigger sparse mode if flag were ON\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:376:    expect(() => causalBoost.applyCausalBoost(results)).not.toThrow();\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:380:    expect(causalBoost.RELATION_WEIGHT_MULTIPLIERS['supersedes']).toBe(1.5);\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:381:    expect(causalBoost.RELATION_WEIGHT_MULTIPLIERS['contradicts']).toBe(0.8);\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:382:    expect(causalBoost.RELATION_WEIGHT_MULTIPLIERS['caused']).toBe(1.0);\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:392:    expect(causalBoost.SPARSE_DENSITY_THRESHOLD).toBe(0.5);\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:396:    expect(causalBoost.SPARSE_MAX_HOPS).toBe(1);\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:400:    expect(causalBoost.EDGE_PRIOR_TIERS).toEqual([1.0, 0.75, 0.5]);\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:404:    expect(causalBoost.INTENT_EDGE_PRIORITY).toHaveProperty('fix_bug');\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:405:    expect(causalBoost.INTENT_EDGE_PRIORITY).toHaveProperty('add_feature');\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:406:    expect(causalBoost.INTENT_EDGE_PRIORITY).toHaveProperty('find_decision');\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:410:    expect(causalBoost.EDGE_LABEL_ALIASES).toHaveProperty('CORRECTION');\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:411:    expect(causalBoost.EDGE_LABEL_ALIASES).toHaveProperty('DEPENDS_ON');\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:412:    expect(causalBoost.EDGE_LABEL_ALIASES).toHaveProperty('EXTENDS');\\n.opencode/skills/system-spec-kit/mcp_server/tests/typed-traversal.vitest.ts:413:    expect(causalBoost.EDGE_LABEL_ALIASES).toHaveProperty('PREFERENCE');\\n.opencode/skills/system-spec-kit/scripts/utils/README.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/ops/runbook.sh:21:      Print trigger, owner, escalation path, and drill command.\\n.opencode/skills/system-spec-kit/scripts/ops/runbook.sh:37:        session-ambiguity) echo \\\"${SCRIPT_DIR}/heal-session-ambiguity.sh\\\" ;;\\n.opencode/skills/system-spec-kit/scripts/ops/runbook.sh:55:        session-ambiguity)\\n.opencode/skills/system-spec-kit/scripts/ops/runbook.sh:57:CLASS: session-ambiguity\\n.opencode/skills/system-spec-kit/scripts/ops/runbook.sh:58:TRIGGER: session misroute threshold exceeded on ambiguity fixtures\\n.opencode/skills/system-spec-kit/scripts/ops/runbook.sh:61:DRILL: ./runbook.sh drill session-ambiguity --scenario success\\n.opencode/skills/system-spec-kit/scripts/ops/runbook.sh:105:        for failure_class in index-drift session-ambiguity ledger-mismatch telemetry-drift; do\\n.opencode/skills/system-spec-kit/scripts/ops/runbook.sh:135:session-ambiguity\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/pe-orchestration.ts:4:import type Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/pe-orchestration.ts:18:// Feature catalog: Memory indexing (memory_save)\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/pe-orchestration.ts:35:  scope?: { tenantId?: string | null; userId?: string | null; agentId?: string | null; sessionId?: string | null; sharedSpaceId?: string | null },\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/pe-orchestration.ts:48:      sessionId: scope?.sessionId,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/pe-orchestration.ts:88:            reason: 'memory_save: reinforced existing memory via prediction-error gate',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/pe-orchestration.ts:93:              tool: 'memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/pe-orchestration.ts:99:            actor: 'mcp:memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/pe-orchestration.ts:140:          reason: 'memory_save: updated existing memory via prediction-error gate',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/pe-orchestration.ts:145:            tool: 'memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/save/pe-orchestration.ts:151:          actor: 'mcp:memory_save',\\n.opencode/skills/system-spec-kit/scripts/test-fixtures/053-template-compliant-level2/plan.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/mcp_server/lib/interfaces/README.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/test-fixtures/061-template-optional-absent/spec.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:47:description: \\\"Durable regression fixture for memory_save UX contract coverage.\\\"\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:48:trigger_phrases:\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:64:<!-- ANCHOR:continue-session -->\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:68:Continue validating the \\\\`memory_save\\\\` UX contract with a fixture that is rich enough to satisfy the durable-memory gate while still exercising duplicate no-op, deferred embedding, and post-mutation feedback behavior.\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:70:<!-- /ANCHOR:continue-session -->\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:76:- \\\\`decision-record.md\\\\` — UX contract and duplicate detection strategy\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:85:| \\\\`mcp_server/handlers/memory-save.ts\\\\` | Coordinates duplicate detection, sufficiency evaluation, template validation, and post-mutation feedback for \\\\`memory_save\\\\`. |\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:86:| \\\\`mcp_server/handlers/save/response-builder.ts\\\\` | Shapes successful save payloads, duplicate no-op hints, and deferred embedding response details. |\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:94:This regression fixture exists to prove that successful saves and duplicate no-op saves still report the correct UX payloads after the shared insufficiency gate and rendered-memory template contract were added to the save pipeline.\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:102:- Validated duplicate no-op response shape\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:110:- Decided to keep duplicate no-op saves visible in the UX contract so callers can distinguish unchanged content from validation failures.\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:116:- Verified duplicate no-op saves omit post-mutation hooks and leave caches unchanged.\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:132:session_id: \\\"${titleSlug}-fixture\\\"\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:157:    SELECT id FROM memory_index WHERE file_path LIKE ? OR spec_folder LIKE ?\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:160:    SELECT id FROM memory_index WHERE file_path LIKE ? OR spec_folder LIKE ?\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:163:  // Delete history rows before memory_index to satisfy FK constraint\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:165:    SELECT id FROM memory_index WHERE file_path LIKE ? OR spec_folder LIKE ?\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:167:  db.prepare('DELETE FROM memory_index WHERE file_path LIKE ? OR spec_folder LIKE ?').run(likePattern, likePattern);\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:222:  it('does not emit postMutationHooks for duplicate-content no-op saves', async () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:224:    const duplicatePath = path.join(FIXTURE_ROOT, 'memory', 'duplicate.md');\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:225:    const sharedContent = buildMemoryContent('Duplicate Seed', 'Shared duplicate body for regression coverage.');\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:228:    fs.writeFileSync(duplicatePath, sharedContent, 'utf8');\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:233:    db!.prepare('UPDATE memory_index SET embedding_status = ? WHERE id = ?').run('success', initialIndex.id);\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:236:      filePath: duplicatePath,\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:242:    expect(parsed.data.status).toBe('duplicate');\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:248:  it('memory_save success response exposes postMutationHooks contract fields and types', async () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:263:      triggerCacheCleared: expect.any(Boolean),\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:271:    expect(typeof parsed.data.postMutationHooks.triggerCacheCleared).toBe('boolean');\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:295:      triggerCacheCleared: expect.any(Boolean),\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:305:  it('atomicSaveMemory duplicate no-op omits postMutationHooks and reports no-op status', async () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:306:    const indexedPath = path.join(FIXTURE_ROOT, 'memory', 'atomic-duplicate-seed.md');\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:307:    const duplicatePath = path.join(FIXTURE_ROOT, 'memory', 'atomic-duplicate-copy.md');\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:308:    const sharedContent = buildMemoryContent('Atomic Duplicate Seed', 'Atomic duplicate behavior regression fixture.');\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:314:    db!.prepare('UPDATE memory_index SET embedding_status = ? WHERE id = ?').run('success', initialIndex.id);\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:318:        file_path: duplicatePath,\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:325:    expect(['duplicate', 'unchanged', 'no_change']).toContain(result.status);\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts:395:        qualityFlags: ['No trigger phrases found'],\\n.opencode/skills/system-spec-kit/mcp_server/tools/memory-tools.ts:4:// Dispatch for L2-L4 memory tools: search, triggers, save,\\n.opencode/skills/system-spec-kit/mcp_server/tools/memory-tools.ts:62:  'memory_search',\\n.opencode/skills/system-spec-kit/mcp_server/tools/memory-tools.ts:64:  'memory_match_triggers',\\n.opencode/skills/system-spec-kit/mcp_server/tools/memory-tools.ts:65:  'memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/tools/memory-tools.ts:78:    case 'memory_search':         return handleMemorySearch(parseArgs<SearchArgs>(validateToolArgs('memory_search', args)));\\n.opencode/skills/system-spec-kit/mcp_server/tools/memory-tools.ts:80:      // E3: Delegate to memory_search with sensible defaults\\n.opencode/skills/system-spec-kit/mcp_server/tools/memory-tools.ts:99:    case 'memory_match_triggers': return handleMemoryMatchTriggers(parseArgs<TriggerArgs>(validateToolArgs('memory_match_triggers', args)));\\n.opencode/skills/system-spec-kit/mcp_server/tools/memory-tools.ts:100:    case 'memory_save':           return handleMemorySave(parseArgs<SaveArgs>(validateToolArgs('memory_save', args)));\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-delete.ts:13:import * as causalEdges from '../lib/storage/causal-edges.js';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-delete.ts:60:      hint: 'Restart the MCP server or run memory_index_scan() to reinitialize the database',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-delete.ts:61:      actions: ['Restart the MCP server', 'Call memory_index_scan()'],\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-delete.ts:94:    // T2-5 transaction wrapper — wraps single-delete path (memory delete, causal edge\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-delete.ts:115:        causalEdges.init(database);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-delete.ts:116:        causalEdges.deleteEdgesForMemory(String(numericId));\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-delete.ts:149:          FROM memory_index\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-delete.ts:190:    // Snapshot-then-delete is safe under single-process better-sqlite3; re-evaluate if multi-process support is added\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-delete.ts:191:    causalEdges.init(database);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-delete.ts:211:          causalEdges.deleteEdgesForMemory(String(memory.id));\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-delete.ts:250:        latencyMs: 0, triggerCacheCleared: false,\\n.opencode/skills/system-spec-kit/scripts/test-fixtures/053-template-compliant-level2/checklist.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/mcp_server/tests/d5-recovery-payload.vitest.ts:78:    // Threshold is 0.4 — exactly at the boundary still triggers recovery\\n.opencode/skills/system-spec-kit/mcp_server/tools/lifecycle-tools.ts:47:  'memory_index_scan',\\n.opencode/skills/system-spec-kit/mcp_server/tools/lifecycle-tools.ts:60:  'session_health',\\n.opencode/skills/system-spec-kit/mcp_server/tools/lifecycle-tools.ts:61:  'session_resume',\\n.opencode/skills/system-spec-kit/mcp_server/tools/lifecycle-tools.ts:62:  'session_bootstrap',\\n.opencode/skills/system-spec-kit/mcp_server/tools/lifecycle-tools.ts:68:    case 'memory_index_scan':          return handleMemoryIndexScan(parseArgs<ScanArgs>(validateToolArgs('memory_index_scan', args)));\\n.opencode/skills/system-spec-kit/mcp_server/tools/lifecycle-tools.ts:81:    case 'session_health':             return handleSessionHealth();\\n.opencode/skills/system-spec-kit/mcp_server/tools/lifecycle-tools.ts:82:    case 'session_resume':             return handleSessionResume(parseArgs<SessionResumeArgs>(validateToolArgs('session_resume', args)));\\n.opencode/skills/system-spec-kit/mcp_server/tools/lifecycle-tools.ts:83:    case 'session_bootstrap':          return handleSessionBootstrap(parseArgs<SessionBootstrapArgs>(validateToolArgs('session_bootstrap', args)));\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-update.ts:49:    triggerPhrases,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-update.ts:85:  if (triggerPhrases !== undefined) updateParams.triggerPhrases = triggerPhrases;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-update.ts:151:      // T2-6 — BM25 index stores title + trigger phrases; must re-index when either changes\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-update.ts:155:      if ((updateParams.title !== undefined || updateParams.triggerPhrases !== undefined) && bm25Index.isBm25Enabled()) {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-update.ts:159:            'SELECT title, content_text, trigger_phrases, file_path FROM memory_index WHERE id = ?'\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-update.ts:160:          ).get(id) as { title: string | null; content_text: string | null; trigger_phrases: string | null; file_path: string | null } | undefined;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-update.ts:208:          triggerPhrases: updateParams.triggerPhrases ?? null,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-update.ts:236:        hint: 'Restart the MCP server or run memory_index_scan() to reinitialize the database',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-update.ts:237:        actions: ['Restart the MCP server', 'Call memory_index_scan()'],\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-update.ts:249:      latencyMs: 0, triggerCacheCleared: false,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-update.ts:263:    hints.push('Run memory_index_scan() to regenerate embeddings');\\n.opencode/skills/system-spec-kit/scripts/utils/slug-utils.ts:15:  'development-session',\\n.opencode/skills/system-spec-kit/scripts/utils/slug-utils.ts:16:  'session-summary',\\n.opencode/skills/system-spec-kit/scripts/utils/slug-utils.ts:17:  'session-context',\\n.opencode/skills/system-spec-kit/scripts/utils/slug-utils.ts:18:  'session',\\n.opencode/skills/system-spec-kit/scripts/utils/slug-utils.ts:21:  'work-session',\\n.opencode/skills/system-spec-kit/scripts/utils/slug-utils.ts:30:  /^epistemic state captured at session start\\\\b/i,\\n.opencode/skills/system-spec-kit/scripts/utils/slug-utils.ts:37:  /session context documentation/i,\\n.opencode/skills/system-spec-kit/scripts/utils/slug-utils.ts:65:  return `session-${digest}`;\\n.opencode/skills/system-spec-kit/scripts/utils/slug-utils.ts:127: * (e.g., \\\"session-summary\\\", \\\"implementation\\\").\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:5:// producer metadata into queryable session and turn tables.\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:10:import Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:16:export const SESSION_ANALYTICS_DB_FILENAME = 'speckit-session-analytics.db';\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:91:  CREATE TABLE IF NOT EXISTS analytics_sessions (\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:92:    claude_session_id TEXT PRIMARY KEY,\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:93:    speckit_session_id TEXT,\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:115:  CREATE TABLE IF NOT EXISTS analytics_turns (\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:117:    claude_session_id TEXT NOT NULL,\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:136:    UNIQUE(claude_session_id, transcript_path, byte_start)\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:139:  CREATE TABLE IF NOT EXISTS model_pricing_versioned (\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:153:  CREATE TABLE IF NOT EXISTS cache_tier_normalized (\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:159:  CREATE INDEX IF NOT EXISTS idx_analytics_turns_session\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:160:    ON analytics_turns (claude_session_id, transcript_path, line_no);\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:167:  claude_session_id: string;\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:168:  speckit_session_id: string | null;\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:192:  claude_session_id: string;\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:234:  sessionUpserted: boolean;\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:236:  session: SessionAnalyticsSessionRow;\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:313:    throw new Error('[session-analytics-db] Seeded model pricing is missing a sonnet fallback');\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:347:      console.warn('[session-analytics-db] close-before-switch warning:', err instanceof Error ? err.message : String(err));\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:368:    throw new Error('[session-analytics-db] Database not initialized. Call initSessionAnalyticsDb() first.');\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:382:      console.warn('[session-analytics-db] close warning:', err instanceof Error ? err.message : String(err));\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:392:    FROM analytics_sessions\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:393:    WHERE claude_session_id = ?\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:397:    throw new Error(`[session-analytics-db] Session row missing after upsert for ${claudeSessionId}`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:422:    WHERE claude_session_id = ?\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:439:    UPDATE analytics_sessions\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:453:    WHERE claude_session_id = ?\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:479:    INSERT INTO analytics_sessions (\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:480:      claude_session_id,\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:481:      speckit_session_id,\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:502:    ON CONFLICT(claude_session_id) DO UPDATE SET\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:503:      speckit_session_id = excluded.speckit_session_id,\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:533:      claude_session_id,\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:591:    throw new Error('[session-analytics-db] Cannot ingest session analytics without producerMetadata.transcript.path');\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:603:    sessionUpserted: true,\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:605:    session: getSessionRow(db, state.claudeSessionId),\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:613:    FROM analytics_sessions\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:614:    ORDER BY claude_session_id ASC\\n.opencode/skills/system-spec-kit/mcp_server/lib/analytics/session-analytics-db.ts:625:    WHERE claude_session_id = ?\\n.opencode/skills/system-spec-kit/scripts/lib/topic-keywords.ts:9: * @file topic-keywords.ts\\n.opencode/skills/system-spec-kit/scripts/lib/topic-keywords.ts:10: * @description Shared lexical helpers for topic extraction across script extractors.\\n.opencode/skills/system-spec-kit/scripts/lib/topic-keywords.ts:11: * @module scripts/lib/topic-keywords\\n.opencode/skills/system-spec-kit/scripts/lib/topic-keywords.ts:16:// Shared lexical helpers for topic extraction across script extractors.\\n.opencode/skills/system-spec-kit/scripts/lib/topic-keywords.ts:25:/** Tokenize topic words. */\\n.opencode/skills/system-spec-kit/scripts/lib/topic-keywords.ts:38:/** Provides should include topic word. */\\n.opencode/skills/system-spec-kit/scripts/tests/post-save-review.vitest.ts:25:title: Meaningful implementation session\\n.opencode/skills/system-spec-kit/scripts/tests/post-save-review.vitest.ts:26:description: Meaningful implementation session\\n.opencode/skills/system-spec-kit/scripts/tests/post-save-review.vitest.ts:29:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/post-save-review.vitest.ts:34:# Meaningful implementation session\\n.opencode/skills/system-spec-kit/scripts/tests/post-save-review.vitest.ts:48:        sessionSummary: 'Meaningful implementation session',\\n.opencode/skills/system-spec-kit/scripts/tests/post-save-review.vitest.ts:64:      { severity: 'HIGH', field: 'trigger_phrases', message: 'bad', fix: 'fix' },\\n.opencode/skills/system-spec-kit/mcp_server/tests/integration-error-recovery.vitest.ts:6:import * as triggerHandlerModule from '../handlers/memory-triggers';\\n.opencode/skills/system-spec-kit/mcp_server/tests/integration-error-recovery.vitest.ts:7:import * as causalHandlerModule from '../handlers/causal-graph';\\n.opencode/skills/system-spec-kit/mcp_server/tests/integration-error-recovery.vitest.ts:9:import * as learningHandlerModule from '../handlers/session-learning';\\n.opencode/skills/system-spec-kit/mcp_server/tests/integration-error-recovery.vitest.ts:45:      expect(triggerHandlerModule).toBeDefined();\\n.opencode/skills/system-spec-kit/mcp_server/tests/integration-error-recovery.vitest.ts:49:      expect(causalHandlerModule).toBeDefined();\\n.opencode/skills/system-spec-kit/mcp_server/tests/integration-error-recovery.vitest.ts:106:      if (triggerHandlerModule?.handleMemoryMatchTriggers) {\\n.opencode/skills/system-spec-kit/mcp_server/tests/integration-error-recovery.vitest.ts:108:          name: 'triggers',\\n.opencode/skills/system-spec-kit/mcp_server/tests/integration-error-recovery.vitest.ts:109:          run: () => triggerHandlerModule.handleMemoryMatchTriggers({} as Parameters<typeof triggerHandlerModule.handleMemoryMatchTriggers>[0]),\\n.opencode/skills/system-spec-kit/mcp_server/tests/integration-error-recovery.vitest.ts:112:      if (causalHandlerModule?.handleMemoryCausalLink) {\\n.opencode/skills/system-spec-kit/mcp_server/tests/integration-error-recovery.vitest.ts:114:          name: 'causal-link',\\n.opencode/skills/system-spec-kit/mcp_server/tests/integration-error-recovery.vitest.ts:115:          run: () => causalHandlerModule.handleMemoryCausalLink({} as Parameters<typeof causalHandlerModule.handleMemoryCausalLink>[0]),\\n.opencode/skills/system-spec-kit/mcp_server/tests/history.vitest.ts:6:import type Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/tests/history.vitest.ts:28:    DatabaseImpl = require('better-sqlite3') as DatabaseConstructor;\\n.opencode/skills/system-spec-kit/mcp_server/tests/history.vitest.ts:30:    dbPath = path.join(os.tmpdir(), `history-test-${Date.now()}.sqlite`);\\n.opencode/skills/system-spec-kit/mcp_server/tests/history.vitest.ts:34:    // Create memory_index table (required for joins)\\n.opencode/skills/system-spec-kit/mcp_server/tests/history.vitest.ts:36:      CREATE TABLE IF NOT EXISTS memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/history.vitest.ts:40:        trigger_phrases TEXT,\\n.opencode/skills/system-spec-kit/mcp_server/tests/history.vitest.ts:50:      CREATE TABLE IF NOT EXISTS memory_history (\\n.opencode/skills/system-spec-kit/mcp_server/tests/history.vitest.ts:59:        FOREIGN KEY (memory_id) REFERENCES memory_index(id)\\n.opencode/skills/system-spec-kit/mcp_server/tests/history.vitest.ts:64:    const insert = activeDb.prepare('INSERT INTO memory_index (id, title, spec_folder) VALUES (?, ?, ?)');\\n.opencode/skills/system-spec-kit/mcp_server/tests/history.vitest.ts:221:      activeDb.prepare('INSERT INTO memory_index (id, title, spec_folder) VALUES (?, ?, ?)')\\n.opencode/skills/system-spec-kit/mcp_server/tests/history.vitest.ts:224:      activeDb.prepare('DELETE FROM memory_index WHERE id = ?').run(9);\\n.opencode/skills/system-spec-kit/mcp_server/tests/history.vitest.ts:269:      activeDb.prepare('INSERT INTO memory_index (id, title, spec_folder) VALUES (?, ?, ?)')\\n.opencode/skills/system-spec-kit/mcp_server/tests/history.vitest.ts:272:      activeDb.prepare('DELETE FROM memory_index WHERE id = ?').run(10);\\n.opencode/skills/system-spec-kit/mcp_server/tests/history.vitest.ts:300:        \\\"SELECT sql FROM sqlite_master WHERE type='table' AND name='memory_history'\\\"\\n.opencode/skills/system-spec-kit/mcp_server/tests/history.vitest.ts:307:      const id = mod.recordHistory(1, 'ADD', null, 'reconsolidation test', 'mcp:memory_save');\\n.opencode/skills/system-spec-kit/mcp_server/tests/history.vitest.ts:314:      expect(entry!.actor).toBe('mcp:memory_save');\\n.opencode/skills/system-spec-kit/mcp_server/tests/history.vitest.ts:353:      'mcp:memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/tests/history.vitest.ts:359:      'mcp:memory_index_scan',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-resume.ts:13:import { computeQualityScore, recordMetricEvent, recordBootstrapEvent } from '../lib/session/context-metrics.js';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-resume.ts:14:import { buildStructuralBootstrapContract } from '../lib/session/session-snapshot.js';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-resume.ts:15:import type { StructuralBootstrapContract } from '../lib/session/session-snapshot.js';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-resume.ts:89:  sessionId?: string;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-resume.ts:112:  sessionQuality?: 'healthy' | 'degraded' | 'critical' | 'unknown';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-resume.ts:184:    summaryText: state.sessionSummary?.text ?? null,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-resume.ts:185:    extractedAt: state.sessionSummary?.extractedAt ?? null,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-resume.ts:216:      'Cached continuity requires a non-empty session summary with a valid extractedAt timestamp.',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-resume.ts:326:  const continuityText = `Last session worked on: ${cachedSpecFolder}\\\\nSummary: ${summaryText}`;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-resume.ts:400:/** Handle session_resume tool call — composite resume with memory + graph + cocoindex */\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-resume.ts:402:  // F052: Record memory recovery metric for session_resume\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-resume.ts:416:        input: 'resume previous work continue session',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-resume.ts:433:      hints.push('Memory resume failed. Try memory_context manually.');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-resume.ts:459:    hints.push('Code graph unavailable. Run `code_graph_scan` to initialize.');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-resume.ts:472:  const structuralContext = buildStructuralBootstrapContract('session_resume');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-resume.ts:474:    hints.push(`Structural context is ${structuralContext.status}. Call session_bootstrap to refresh.`);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-resume.ts:482:    claudeSessionId: typeof args.sessionId === 'string' ? args.sessionId : undefined,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-resume.ts:487:    logCachedSummaryDecision('session_resume', cachedSummaryDecision);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-resume.ts:490:  let sessionQuality: SessionResumeResult['sessionQuality'];\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-resume.ts:493:      sessionQuality = computeQualityScore().level;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-resume.ts:495:      sessionQuality = 'unknown';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-resume.ts:527:      source: 'session',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-resume.ts:570:      producer: 'session_resume',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-resume.ts:571:      sourceSurface: 'session_resume',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-resume.ts:575:      sourceRefs: ['memory-context', 'code-graph-db', 'cocoindex-path', 'session-snapshot'],\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-resume.ts:580:    sourceSurface: 'session_resume',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-resume.ts:595:    ...(sessionQuality ? { sessionQuality } : {}),\\n.opencode/skills/system-spec-kit/scripts/test-fixtures/062-template-compliant-level1/spec.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/test-fixtures/053-template-compliant-level2/tasks.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/mcp_server/tests/spec-folder-hierarchy.vitest.ts:4:import Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/tests/spec-folder-hierarchy.vitest.ts:22:    CREATE TABLE memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/spec-folder-hierarchy.vitest.ts:42:    INSERT INTO memory_index (id, spec_folder, title, parent_id, importance_tier)\\n.opencode/skills/system-spec-kit/mcp_server/tests/spec-folder-hierarchy.vitest.ts:214:  it('does not duplicate nodes or children', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/spec-folder-hierarchy.vitest.ts:225:    // Root should have exactly one child, not duplicated\\n.opencode/skills/system-spec-kit/mcp_server/tests/spec-folder-hierarchy.vitest.ts:574:    db.prepare(`INSERT INTO memory_index (id, spec_folder, title) VALUES (?, ?, ?)`).run(1, '', 'empty');\\n.opencode/skills/system-spec-kit/mcp_server/tests/spec-folder-hierarchy.vitest.ts:575:    db.prepare(`INSERT INTO memory_index (id, spec_folder, title) VALUES (?, ?, ?)`).run(2, '003-foo', 'valid');\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/README.md:3:description: \\\"Pre-flight quality gates for memory operations: anchor validation, duplicate detection and token budget verification.\\\"\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/README.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/README.md:12:> Pre-flight quality gates for memory operations: anchor validation, duplicate detection, token budget verification and content size checks.\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/README.md:37:| Pre-flight Checks | 4 | Anchors, duplicates, tokens, content size |\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/README.md:47:| **Duplicate Detection** | Exact (SHA-256 hash) and similar (vector similarity) duplicate finding |\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/README.md:68:| `preflight.ts` | All validation logic: anchors, duplicates, tokens, content size, unified preflight |\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/README.md:69:| `save-quality-gate.ts` | 3-layer pre-storage quality gate: structural validation, content quality scoring (title, triggers, length, anchors, metadata, signal density), and semantic dedup. Behind `SPECKIT_SAVE_QUALITY_GATE` flag with 14-day warn-only graduation period |\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/README.md:85:| Uniqueness | No duplicate anchor IDs in same file |\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/README.md:89:Two-tier duplicate detection:\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/README.md:125:| PF010 | DUPLICATE_DETECTED | Generic duplicate found |\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/README.md:141:| `checkDuplicate` | `(params: DuplicateCheckParams, options?) => DuplicateCheckResult` | Detect duplicates |\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/README.md:160:| Layer 2 | Content Quality | Weighted signal density across 5 dimensions (title 0.25, triggers 0.20, length 0.20, anchors 0.15, metadata 0.20). Threshold: 0.4 |\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/README.md:175:| `scoreTriggerQuality(triggerPhrases)` | Layer 2 dimension: trigger phrase quality (0-1) |\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/README.md:203:  check_duplicates: true,\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/README.md:258:  triggerPhrases: ['architecture', 'sqlite'],\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/README.md:274:| Full validation | `runPreflight()` | Before memory_save |\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:66:type MemoryTriggersModule = typeof import('./memory-triggers.js');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:74:type SessionLearningModule = typeof import('./session-learning.js');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:76:type CausalGraphModule = typeof import('./causal-graph.js');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:79:type SessionHealthModule = typeof import('./session-health.js');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:80:type SessionResumeModule = typeof import('./session-resume.js');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:81:type SessionBootstrapModule = typeof import('./session-bootstrap.js');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:92:let sessionLearningModule: Promise<SessionLearningModule> | null = null;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:94:let causalGraphModule: Promise<CausalGraphModule> | null = null;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:97:let sessionHealthModule: Promise<SessionHealthModule> | null = null;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:98:let sessionResumeModule: Promise<SessionResumeModule> | null = null;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:99:let sessionBootstrapModule: Promise<SessionBootstrapModule> | null = null;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:110:    memoryTriggersModule = loadHandlerModule<MemoryTriggersModule>('memory-triggers');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:165:  if (!sessionLearningModule) {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:166:    sessionLearningModule = loadHandlerModule<SessionLearningModule>('session-learning');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:168:  return sessionLearningModule;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:179:  if (!causalGraphModule) {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:180:    causalGraphModule = loadHandlerModule<CausalGraphModule>('causal-graph');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:182:  return causalGraphModule;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:200:  if (!sessionHealthModule) {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:201:    sessionHealthModule = loadHandlerModule<SessionHealthModule>('session-health');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:203:  return sessionHealthModule;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:207:  if (!sessionResumeModule) {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:208:    sessionResumeModule = loadHandlerModule<SessionResumeModule>('session-resume');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:210:  return sessionResumeModule;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:214:  if (!sessionBootstrapModule) {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:215:    sessionBootstrapModule = loadHandlerModule<SessionBootstrapModule>('session-bootstrap');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:217:  return sessionBootstrapModule;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:222:export const handle_memory_search = lazyFunction(getMemorySearchModule, 'handle_memory_search');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:224:// Memory triggers handlers\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:226:export const handle_memory_match_triggers = lazyFunction(getMemoryTriggersModule, 'handle_memory_match_triggers');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:233:export const handle_memory_save = lazyFunction(getMemorySaveModule, 'handle_memory_save');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:275:export const handle_memory_index_scan = lazyFunction(getMemoryIndexModule, 'handle_memory_index_scan');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:314:export const handle_memory_causal_link = lazyFunction(getCausalGraphModule, 'handle_memory_causal_link');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:315:export const handle_memory_causal_stats = lazyFunction(getCausalGraphModule, 'handle_memory_causal_stats');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:316:export const handle_memory_causal_unlink = lazyFunction(getCausalGraphModule, 'handle_memory_causal_unlink');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/index.ts:320:export const handle_memory_context = lazyFunction(getMemoryContextModule, 'handle_memory_context');\\n.opencode/skills/system-spec-kit/mcp_server/tests/cross-encoder-circuit-breaker.vitest.ts:116:    // isCircuitOpen triggers half-open reset\\n.opencode/skills/system-spec-kit/scripts/utils/message-utils.ts:15:import type { ToolCallEntry } from '../types/session-types';\\n.opencode/skills/system-spec-kit/scripts/utils/message-utils.ts:35:/** Summary of a conversation exchange (artifact-level, differs from session-types ExchangeSummary) */\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation-bridge.vitest.ts:130:        triggerPhrases: ['merge'],\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation-bridge.vitest.ts:175:        triggerPhrases: ['merge'],\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation-bridge.vitest.ts:212:        triggerPhrases: ['conflict'],\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation-bridge.vitest.ts:219:        causalEdgeId: 77,\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation-bridge.vitest.ts:232:        triggerPhrases: ['conflict'],\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:10:import Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:29:    CREATE TABLE memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:32:      trigger_phrases TEXT,\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:48:    CREATE TABLE active_memory_projection (\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:62:    triggerPhrases?: string;\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:71:    INSERT INTO memory_index (title, trigger_phrases, spec_folder, parent_id, importance_tier, is_archived)\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:76:    opts.triggerPhrases || '',\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:182:    const sharedTriggers = 'authentication, login, session, token, validation, handler, middleware, security, user, access';\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:184:      title: 'authentication login session token validation handler middleware security user access primary',\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:185:      triggerPhrases: sharedTriggers,\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:189:      title: 'authentication login session token validation handler middleware security user access secondary',\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:190:      triggerPhrases: sharedTriggers,\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:194:      title: 'authentication login session token validation handler middleware security user access tertiary',\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:195:      triggerPhrases: sharedTriggers,\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:206:      triggerPhrases: 'auth, login, authentication',\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:212:      triggerPhrases: 'auth, login, authentication',\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:223:      triggerPhrases: 'auth, login, authentication',\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:229:      triggerPhrases: 'auth, login, authentication',\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:239:    const sharedTriggers = 'authentication, login, session, token, validation, handler, middleware, security, user, access';\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:241:      title: 'authentication login session token validation handler middleware security user access primary',\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:242:      triggerPhrases: sharedTriggers,\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:246:      title: 'authentication login session token validation handler middleware security user access archived',\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:247:      triggerPhrases: sharedTriggers,\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:253:      title: 'authentication login session token validation handler middleware security user access deprecated',\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:254:      triggerPhrases: sharedTriggers,\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:282:      triggerPhrases: 'auth, login',\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:287:      triggerPhrases: 'auth, login',\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:340:    const sharedTriggers = 'authentication, login, session, token, validation, handler, middleware, security, user, access';\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:342:      title: 'authentication login session token validation handler middleware security user access primary',\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:343:      triggerPhrases: sharedTriggers,\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:347:      title: 'authentication login session token validation handler middleware security user access secondary',\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:348:      triggerPhrases: sharedTriggers,\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:365:    const sharedTriggers = 'authentication, login, session, token, validation, handler, middleware, security, user, access';\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:367:      title: 'authentication login session token validation handler middleware security user access primary',\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:368:      triggerPhrases: sharedTriggers,\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:372:      title: 'authentication login session token validation handler middleware security user access secondary',\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:373:      triggerPhrases: sharedTriggers,\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:377:      title: 'authentication login session token validation handler middleware security user access archived',\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:378:      triggerPhrases: sharedTriggers,\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:384:      title: 'authentication login session token validation handler middleware security user access deprecated',\\n.opencode/skills/system-spec-kit/mcp_server/tests/interference.vitest.ts:385:      triggerPhrases: sharedTriggers,\\n.opencode/skills/system-spec-kit/scripts/tests/semantic-signal-golden.vitest.ts:3:import { extractTriggerPhrases as sharedExtractTriggerPhrases } from '@spec-kit/shared/trigger-extractor';\\n.opencode/skills/system-spec-kit/scripts/tests/semantic-signal-golden.vitest.ts:4:import { extractKeyTopics as extractWorkflowTopics } from '../core/topic-extractor';\\n.opencode/skills/system-spec-kit/scripts/tests/semantic-signal-golden.vitest.ts:5:import { extractKeyTopics as extractSessionTopics } from '../extractors/session-extractor';\\n.opencode/skills/system-spec-kit/scripts/tests/semantic-signal-golden.vitest.ts:10:} from '../lib/trigger-extractor';\\n.opencode/skills/system-spec-kit/scripts/tests/semantic-signal-golden.vitest.ts:17:    // ngramDepth 4 baseline (shared trigger-extractor and explicit depth 4)\\n.opencode/skills/system-spec-kit/scripts/tests/semantic-signal-golden.vitest.ts:44:      // Fix 5: \\\"the error\\\" was filtered — \\\"the\\\" is a generic stopword, not a meaningful trigger\\n.opencode/skills/system-spec-kit/scripts/tests/semantic-signal-golden.vitest.ts:92:  it('keeps trigger extraction locked to the shared baseline for frozen inputs', () => {\\n.opencode/skills/system-spec-kit/scripts/tests/semantic-signal-golden.vitest.ts:96:      // Shared trigger-extractor still uses depth 4 internally\\n.opencode/skills/system-spec-kit/scripts/tests/semantic-signal-golden.vitest.ts:102:          mode: 'triggers',\\n.opencode/skills/system-spec-kit/scripts/tests/semantic-signal-golden.vitest.ts:110:  it('returns trigger stats and preserves the baseline phrase order', () => {\\n.opencode/skills/system-spec-kit/scripts/tests/semantic-signal-golden.vitest.ts:125:      mode: 'topics',\\n.opencode/skills/system-spec-kit/scripts/tests/semantic-signal-golden.vitest.ts:131:      mode: 'topics',\\n.opencode/skills/system-spec-kit/scripts/tests/semantic-signal-golden.vitest.ts:136:    expect(balanced.filteredTokens).toContain('session');\\n.opencode/skills/system-spec-kit/scripts/tests/semantic-signal-golden.vitest.ts:138:    expect(aggressive.filteredTokens).not.toContain('session');\\n.opencode/skills/system-spec-kit/scripts/tests/semantic-signal-golden.vitest.ts:140:    expect(aggressive.topics.join(' ')).toContain('oauth');\\n.opencode/skills/system-spec-kit/scripts/tests/semantic-signal-golden.vitest.ts:144:    const text = 'Workspace identity adapter migration keeps trigger extraction deterministic';\\n.opencode/skills/system-spec-kit/scripts/tests/semantic-signal-golden.vitest.ts:148:      mode: 'topics',\\n.opencode/skills/system-spec-kit/scripts/tests/semantic-signal-golden.vitest.ts:154:      mode: 'topics',\\n.opencode/skills/system-spec-kit/scripts/tests/semantic-signal-golden.vitest.ts:159:    expect(depth1.topics.some((topic) => topic.includes(' '))).toBe(false);\\n.opencode/skills/system-spec-kit/scripts/tests/semantic-signal-golden.vitest.ts:160:    expect(depth4.topics.some((topic) => topic.includes('workspace identity'))).toBe(true);\\n.opencode/skills/system-spec-kit/scripts/tests/semantic-signal-golden.vitest.ts:161:    expect(depth4.topics.length).toBeGreaterThan(0);\\n.opencode/skills/system-spec-kit/scripts/tests/semantic-signal-golden.vitest.ts:164:  it('keeps workflow topics, session topics, and summary trigger phrases aligned on the same dominant concepts', () => {\\n.opencode/skills/system-spec-kit/scripts/tests/semantic-signal-golden.vitest.ts:165:    const summaryText = 'Implemented unified signal extraction for workspace identity alignment and adapter migration with deterministic trigger generation.';\\n.opencode/skills/system-spec-kit/scripts/tests/semantic-signal-golden.vitest.ts:169:        RATIONALE: 'One stopword contract keeps workspace identity and trigger generation aligned',\\n.opencode/skills/system-spec-kit/scripts/tests/semantic-signal-golden.vitest.ts:175:    const sessionTopics = extractSessionTopics(summaryText, decisions);\\n.opencode/skills/system-spec-kit/scripts/tests/semantic-signal-golden.vitest.ts:178:        { prompt: 'Implement unified signal extraction and keep trigger generation stable.' },\\n.opencode/skills/system-spec-kit/scripts/tests/semantic-signal-golden.vitest.ts:179:        { content: 'Created scripts/lib/semantic-signal-extractor.ts and updated the topic and session adapters.' },\\n.opencode/skills/system-spec-kit/scripts/tests/semantic-signal-golden.vitest.ts:184:          narrative: 'Implemented unified signal extraction and preserved the trigger baseline.',\\n.opencode/skills/system-spec-kit/scripts/tests/semantic-signal-golden.vitest.ts:190:    // T09: specFolderName no longer injected into topics, so 'signal extraction' bigram\\n.opencode/skills/system-spec-kit/scripts/tests/semantic-signal-golden.vitest.ts:193:    expect(sessionTopics.join(' ')).toMatch(/signal (extractor|extraction)/);\\n.opencode/skills/system-spec-kit/scripts/tests/semantic-signal-golden.vitest.ts:194:    expect(implementationSummary.triggerPhrases.join(' ')).toMatch(/signal (extractor|extraction)/);\\n.opencode/skills/system-spec-kit/scripts/tests/semantic-signal-golden.vitest.ts:196:    expect(sessionTopics.join(' ')).toContain('workspace identity');\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/save-quality-gate.ts:8:// - Layer 2: Content quality scoring (title, triggers, length,\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/save-quality-gate.ts:38:  triggerQuality: number;\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/save-quality-gate.ts:82:  triggerPhrases?: string[];\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/save-quality-gate.ts:103:/** Semantic dedup similarity threshold: above this, reject as near-duplicate */\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/save-quality-gate.ts:123:  triggerQuality: 0.20,\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/save-quality-gate.ts:132:  /^session$/i,\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/save-quality-gate.ts:140:  /^session \\\\d+$/i,\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/save-quality-gate.ts:162:  db.exec('CREATE TABLE IF NOT EXISTS config (key TEXT PRIMARY KEY, value TEXT)');\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/save-quality-gate.ts:286: * If in-memory state is empty, first trigger the lazy DB load path. Only when no\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/save-quality-gate.ts:487: * Score trigger phrase quality (0-1).\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/save-quality-gate.ts:489: * @param triggerPhrases - Array of trigger phrases\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/save-quality-gate.ts:492:export function scoreTriggerQuality(triggerPhrases: string[]): number {\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/save-quality-gate.ts:493:  const count = triggerPhrases.length;\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/save-quality-gate.ts:552:  const hasTriggers = /^trigger[_-]?phrases?\\\\s*:/m.test(frontmatter);\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/save-quality-gate.ts:571:  trigger_phrases?: string;\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/save-quality-gate.ts:580:  if ((Array.isArray(row.trigger_phrases) ? row.trigger_phrases.length : (row.trigger_phrases?.trim().length ?? 0)) > 0) {\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/save-quality-gate.ts:605:  triggerPhrases?: string[];\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/save-quality-gate.ts:610:    triggerQuality: scoreTriggerQuality(params.triggerPhrases ?? []),\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/save-quality-gate.ts:637:    if (dimensions.triggerQuality === 0) {\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/save-quality-gate.ts:638:      reasons.push('No trigger phrases: add at least 1-2 trigger phrases');\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/save-quality-gate.ts:686: * Layer 3: Check for semantic near-duplicates using vector similarity.\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/save-quality-gate.ts:690: * memory, the new memory is rejected as a near-duplicate.\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/save-quality-gate.ts:729:        ? `Near-duplicate detected: memory #${bestMatch.id} (similarity: ${(bestMatch.similarity * 100).toFixed(1)}% >= ${SEMANTIC_DEDUP_THRESHOLD * 100}%)`\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/save-quality-gate.ts:777:            triggerQuality: 0,\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/save-quality-gate.ts:812:    triggerPhrases: params.triggerPhrases,\\n.opencode/skills/system-spec-kit/scripts/lib/wave-coordination-board.cjs:37:  'duplicate',\\n.opencode/skills/system-spec-kit/scripts/lib/wave-coordination-board.cjs:61: * @param {string} options.sessionId - Session identifier\\n.opencode/skills/system-spec-kit/scripts/lib/wave-coordination-board.cjs:68:  if (!options || !isNonEmptyString(options.sessionId)) {\\n.opencode/skills/system-spec-kit/scripts/lib/wave-coordination-board.cjs:79:    sessionId: options.sessionId,\\n.opencode/skills/system-spec-kit/scripts/lib/wave-coordination-board.cjs:100:      duplicateFindings: 0,\\n.opencode/skills/system-spec-kit/scripts/lib/wave-coordination-board.cjs:172: * Keys: sessionId, generation, segment, wave, findingId.\\n.opencode/skills/system-spec-kit/scripts/lib/wave-coordination-board.cjs:176: * @param {object} board - Board context for sessionId/generation\\n.opencode/skills/system-spec-kit/scripts/lib/wave-coordination-board.cjs:188:    sessionId: board.sessionId,\\n.opencode/skills/system-spec-kit/scripts/lib/wave-coordination-board.cjs:214: * Preserves conflict and duplicate metadata.\\n.opencode/skills/system-spec-kit/scripts/lib/wave-coordination-board.cjs:259:      // Exact duplicate\\n.opencode/skills/system-spec-kit/scripts/lib/wave-coordination-board.cjs:262:        duplicateSegment: findingRecord.segment,\\n.opencode/skills/system-spec-kit/scripts/lib/wave-coordination-board.cjs:264:        deduplicatedAt: new Date().toISOString(),\\n.opencode/skills/system-spec-kit/scripts/lib/wave-coordination-board.cjs:266:      findingRecord.mergeState = 'duplicate';\\n.opencode/skills/system-spec-kit/scripts/lib/wave-coordination-board.cjs:307:  lines.push(`| Session | ${board.sessionId || 'N/A'} |`);\\n.opencode/skills/system-spec-kit/scripts/lib/wave-coordination-board.cjs:327:  lines.push(`| Duplicates | ${s.duplicateFindings || 0} |`);\\n.opencode/skills/system-spec-kit/scripts/lib/wave-coordination-board.cjs:429:    duplicateFindings: (board.dedupeLog || []).length,\\n.opencode/skills/system-spec-kit/scripts/test-fixtures/053-template-compliant-level2/implementation-summary.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/test-fixtures/062-template-compliant-level1/plan.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/mcp_server/tests/chunking-orchestrator.vitest.ts:5:import type Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/tests/chunking-orchestrator.vitest.ts:19:  triggerPhrases: string[];\\n.opencode/skills/system-spec-kit/mcp_server/tests/chunking-orchestrator.vitest.ts:57:      CREATE TABLE IF NOT EXISTS embedding_cache (\\n.opencode/skills/system-spec-kit/mcp_server/tests/chunking-orchestrator.vitest.ts:110:vi.mock('../lib/parsing/trigger-matcher', () => ({\\n.opencode/skills/system-spec-kit/mcp_server/tests/chunking-orchestrator.vitest.ts:121:      CREATE TABLE IF NOT EXISTS memory_history (\\n.opencode/skills/system-spec-kit/mcp_server/tests/chunking-orchestrator.vitest.ts:154:    triggerPhrases: [],\\n.opencode/skills/system-spec-kit/mcp_server/tests/chunking-orchestrator.vitest.ts:174:  testDb = initializeDb(path.join(tempDir, 'context-index.sqlite'));\\n.opencode/skills/system-spec-kit/mcp_server/tests/chunking-orchestrator.vitest.ts:229:      FROM memory_index\\n.opencode/skills/system-spec-kit/mcp_server/tests/chunking-orchestrator.vitest.ts:246:      FROM memory_index\\n.opencode/skills/system-spec-kit/mcp_server/tests/unit-rrf-fusion.vitest.ts:166:  it('T006b: canonical ID matching deduplicates numeric/string/mem-prefixed IDs', () => {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:4:// Phase 024 / Item 7: Composite tool that runs session_resume\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:5:// + session_health in one call, merging results with hints.\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:7:import { handleSessionResume } from './session-resume.js';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:8:import type { CachedSessionSummaryDecision } from './session-resume.js';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:9:import { handleSessionHealth } from './session-health.js';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:10:import { recordBootstrapEvent } from '../lib/session/context-metrics.js';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:11:import { buildStructuralBootstrapContract } from '../lib/session/session-snapshot.js';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:12:import type { StructuralBootstrapContract } from '../lib/session/session-snapshot.js';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:53:    preferredTool: 'code_graph_query';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:55:    preservesAuthority: 'session_bootstrap';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:102:    nextActions.add('Call `session_resume({ specFolder })` directly to inspect the detailed resume failure.');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:106:    nextActions.add('Call `session_health()` directly to inspect the current health-check failure.');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:114:    nextActions.add('Use `session_resume({ specFolder })` when you need the fuller merged recovery payload.');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:116:    nextActions.add('Run `code_graph_scan` if you need fresh structural context, then call `session_bootstrap()` again.');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:118:    nextActions.add('If structural context matters for this task, run `code_graph_scan` and then re-run `session_bootstrap()`.');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:123:    nextActions.add('Call `memory_context({ input: \\\"resume previous work\\\", mode: \\\"resume\\\", profile: \\\"resume\\\" })` if you need a deeper state refresh.');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:153:    preferredTool: 'code_graph_query',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:154:    message: 'Advisory only: when the next question is about callers, imports, dependencies, or outline, prefer `code_graph_query` before Grep or Glob.',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:155:    preservesAuthority: 'session_bootstrap',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:163:/** Handle session_bootstrap tool call — one-call session setup */\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:168:  // Sub-call 1: session_resume with full resume payload\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:179:    allHints.push('session_resume failed. Try calling it manually.');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:182:  // Sub-call 2: session_health\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:191:    allHints.push('session_health failed. Try calling it manually.');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:195:  const structuralContext = buildStructuralBootstrapContract('session_bootstrap');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:198:      `Structural context is ${structuralContext.status}. Run code_graph_scan if needed, then re-run session_bootstrap.`\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:211:  // Deduplicate hints\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:230:      'session_bootstrap expected session_resume to emit structural-context.structuralTrust.',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:236:    { label: 'session_bootstrap structural context payload' },\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:243:      { label: 'session_bootstrap resume payload' },\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:264:      source: 'session',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:290:      source: 'session',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:306:      producer: 'session_bootstrap',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:307:      sourceSurface: 'session_bootstrap',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:311:      sourceRefs: ['session-resume', 'session-health', 'session-snapshot'],\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-bootstrap.ts:320:    sourceSurface: 'session_bootstrap',\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:8:// Feature catalog: Dry-run preflight for memory_save\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:36:  exact_duplicate_enabled: boolean;\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:37:  similar_duplicate_threshold: number;\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:60:/** Result of duplicate detection */\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:63:  duplicate_type: 'exact' | 'similar' | null;\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:95:/** Parameters for duplicate checking */\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:109:/** Options for duplicate checking */\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:134:  check_duplicates?: boolean;\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:248:  exact_duplicate_enabled: true,\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:249:  similar_duplicate_threshold: parseFloat(process.env.MCP_DUPLICATE_THRESHOLD || '0.95'),\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:327:  // Track seen anchor IDs for duplicate detection\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:333:    // Check for duplicate anchor IDs\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:340:        suggestion: `Rename one of the duplicate anchors to a unique ID`,\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:432:    check_exact = PREFLIGHT_CONFIG.exact_duplicate_enabled,\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:434:    similarity_threshold = PREFLIGHT_CONFIG.similar_duplicate_threshold,\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:439:    duplicate_type: null,\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:467:    duplicate: {\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:477:      tenantId: duplicate.tenant_id ?? null,\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:478:      userId: duplicate.user_id ?? null,\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:479:      agentId: duplicate.agent_id ?? null,\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:480:      sharedSpaceId: duplicate.shared_space_id ?? null,\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:504:    if (typeof duplicate.file_path === 'string') {\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:505:      result.existing_path = duplicate.file_path;\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:513:  // Check 1: Exact duplicate via content hash (fast)\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:530:        FROM memory_index\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:554:        result.duplicate_type = 'exact';\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:562:      console.warn('[preflight] Exact duplicate check failed:', message);\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:566:  // Check 2: Similar duplicate via vector similarity (requires embedding)\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:592:          result.duplicate_type = 'similar';\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:601:      console.warn('[preflight] Similar duplicate check failed:', message);\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:768:    check_duplicates = true,\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:851:  if (check_duplicates && content) {\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:856:    addCheck('duplicate_check', dupResult);\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:859:      // Exact duplicates block save\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:860:      if (dupResult.duplicate_type === 'exact') {\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:864:          message: `Exact duplicate found: memory #${dupResult.existingId}`,\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:870:      // Similar duplicates are warnings (PE-gating handles them)\\n.opencode/skills/system-spec-kit/mcp_server/lib/validation/preflight.ts:871:      else if (dupResult.duplicate_type === 'similar') {\\n.opencode/skills/system-spec-kit/scripts/test-fixtures/008-invalid-anchors/memory/context.md:5:This anchor is intentionally not closed to trigger validation failure.\\n.opencode/skills/system-spec-kit/mcp_server/database/README.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/mcp_server/database/README.md:6:  - \\\"sqlite\\\"\\n.opencode/skills/system-spec-kit/mcp_server/database/README.md:33:- Runtime-generated (canonical): `database/context-index.sqlite`, `database/code-graph.sqlite`, and their WAL sidecars (`-wal`, `-shm`).\\n.opencode/skills/system-spec-kit/mcp_server/database/README.md:34:- Embedding-profile database: `context-index__voyage__voyage-4__1024.sqlite` (and `-wal`, `-shm` sidecars) — profile-specific vector store.\\n.opencode/skills/system-spec-kit/mcp_server/database/README.md:42:- Primary table set includes `memory_index`, `vec_memories`, `memory_fts`, `checkpoints`, and `config`.\\n.opencode/skills/system-spec-kit/mcp_server/database/README.md:43:- Structural code-graph persistence lives in the separate `code-graph.sqlite` database with `code_files`, `code_nodes`, `code_edges`, and `code_graph_metadata`.\\n.opencode/skills/system-spec-kit/mcp_server/database/README.md:45:  - `memory_index.document_type` and `memory_index.spec_level` are part of schema v13.\\n.opencode/skills/system-spec-kit/mcp_server/database/README.md:68:- Primary memory index: `database/context-index.sqlite`.\\n.opencode/skills/system-spec-kit/mcp_server/database/README.md:69:- Structural code-graph index: `database/code-graph.sqlite`.\\n.opencode/skills/system-spec-kit/mcp_server/database/README.md:70:- Embedding-profile database: `context-index__voyage__voyage-4__1024.sqlite` stores profile-specific vectors (naming convention: `context-index__<provider>__<model>__<dims>.sqlite`).\\n.opencode/skills/system-spec-kit/mcp_server/database/README.md:72:- Use MCP tools (`memory_stats`, `memory_health`, `memory_index_scan`) for normal operations.\\n.opencode/skills/system-spec-kit/mcp_server/database/README.md:73:- Structural reads (`code_graph_query`, `code_graph_context`) can perform bounded inline selective refresh against `code-graph.sqlite` when the stale set is small enough.\\n.opencode/skills/system-spec-kit/mcp_server/database/README.md:74:- Empty or broadly stale structural states still require explicit `code_graph_scan` to rebuild the graph database.\\n.opencode/skills/system-spec-kit/scripts/tests/validation-v13-v14-v12.vitest.ts:4:// status/percentage contradiction, and topical coherence path normalization.\\n.opencode/skills/system-spec-kit/scripts/tests/validation-v13-v14-v12.vitest.ts:23:  triggerPhrases?: string[];\\n.opencode/skills/system-spec-kit/scripts/tests/validation-v13-v14-v12.vitest.ts:32:  if (opts.triggerPhrases && opts.triggerPhrases.length > 0) {\\n.opencode/skills/system-spec-kit/scripts/tests/validation-v13-v14-v12.vitest.ts:33:    lines.push('trigger_phrases:');\\n.opencode/skills/system-spec-kit/scripts/tests/validation-v13-v14-v12.vitest.ts:34:    for (const tp of opts.triggerPhrases) {\\n.opencode/skills/system-spec-kit/scripts/tests/validation-v13-v14-v12.vitest.ts:63:function createTempSpecFolder(triggerPhrases: string[]): string {\\n.opencode/skills/system-spec-kit/scripts/tests/validation-v13-v14-v12.vitest.ts:70:    'trigger_phrases:',\\n.opencode/skills/system-spec-kit/scripts/tests/validation-v13-v14-v12.vitest.ts:71:    ...triggerPhrases.map(tp => `  - \\\"${tp}\\\"`),\\n.opencode/skills/system-spec-kit/scripts/tests/validation-v13-v14-v12.vitest.ts:98:    it('unclosed single-quoted string triggers V13 failure', () => {\\n.opencode/skills/system-spec-kit/scripts/tests/validation-v13-v14-v12.vitest.ts:107:    it('unclosed double-quoted string triggers V13 failure', () => {\\n.opencode/skills/system-spec-kit/scripts/tests/validation-v13-v14-v12.vitest.ts:127:    it('body with fewer than 50 non-whitespace chars triggers V13 failure', () => {\\n.opencode/skills/system-spec-kit/scripts/tests/validation-v13-v14-v12.vitest.ts:168:  it('status=complete + percentage=40 triggers V14 failure', () => {\\n.opencode/skills/system-spec-kit/scripts/tests/validation-v13-v14-v12.vitest.ts:207:describe('V12: topical coherence with spec_folder path normalization (CHK-031, CHK-032)', () => {\\n.opencode/skills/system-spec-kit/scripts/tests/validation-v13-v14-v12.vitest.ts:214:      triggerPhrases: ['widget factory'],\\n.opencode/skills/system-spec-kit/scripts/tests/validation-v13-v14-v12.vitest.ts:223:  it('relative spec_folder with zero overlap triggers V12 failure', () => {\\n.opencode/skills/system-spec-kit/scripts/tests/validation-v13-v14-v12.vitest.ts:228:      triggerPhrases: ['unrelated topic'],\\n.opencode/skills/system-spec-kit/scripts/tests/validation-v13-v14-v12.vitest.ts:242:      triggerPhrases: ['widget factory'],\\n.opencode/skills/system-spec-kit/mcp_server/tests/search-results-format.vitest.ts:144:    const res = await formatSearchResults([], 'trigger');\\n.opencode/skills/system-spec-kit/mcp_server/tests/search-results-format.vitest.ts:171:      triggerPhrases: '[\\\"hello\\\",\\\"world\\\"]',\\n.opencode/skills/system-spec-kit/mcp_server/tests/search-results-format.vitest.ts:184:  it('C4: triggerPhrases parsed from JSON string', async () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/search-results-format.vitest.ts:190:      triggerPhrases: '[\\\"phrase1\\\",\\\"phrase2\\\"]'\\n.opencode/skills/system-spec-kit/mcp_server/tests/search-results-format.vitest.ts:194:    expect(envelope.data.results[0].triggerPhrases).toEqual(['phrase1', 'phrase2']);\\n.opencode/skills/system-spec-kit/mcp_server/tests/search-results-format.vitest.ts:197:  it('C5: triggerPhrases as array preserved', async () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/search-results-format.vitest.ts:203:      triggerPhrases: ['already', 'an', 'array']\\n.opencode/skills/system-spec-kit/mcp_server/tests/search-results-format.vitest.ts:207:    expect(envelope.data.results[0].triggerPhrases).toEqual(['already', 'an', 'array']);\\n.opencode/skills/system-spec-kit/mcp_server/tests/search-results-format.vitest.ts:264:      appliedBoosts: { session: true },\\n.opencode/skills/system-spec-kit/mcp_server/tests/search-results-format.vitest.ts:268:    expect(envelope.data.appliedBoosts).toEqual({ session: true });\\n.opencode/skills/system-spec-kit/mcp_server/tests/search-results-format.vitest.ts:384:  it('C13: Response meta.tool is memory_search', async () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/search-results-format.vitest.ts:388:    expect(envelope.meta.tool).toBe('memory_search');\\n.opencode/skills/system-spec-kit/mcp_server/tests/search-results-format.vitest.ts:441:          trigger: [52],\\n.opencode/skills/system-spec-kit/mcp_server/tests/search-results-format.vitest.ts:459:    expect(trace?.channelsUsed).toEqual(expect.arrayContaining(['vector', 'fts', 'trigger']));\\n.opencode/skills/system-spec-kit/scripts/test-fixtures/062-template-compliant-level1/tasks.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:83:      validateToolInputSchema('memory_context', {}, TOOL_DEFINITIONS);\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:119:      validateToolInputSchema('memory_context', { input: 'resume', mode: 'invalid-mode' }, TOOL_DEFINITIONS);\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:133:      validateToolArgs('memory_search', { query: 'valid query', unexpected: true } as Record<string, unknown>);\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:137:    expect(errorSpy.mock.calls.some((call) => String(call[0]).includes('[schema-validation] memory_search:'))).toBe(true);\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:240:   4. memory_search LIMIT CONTRACT (schema + runtime alignment)\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:243:describe('memory_search limit contract', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:246:      validateToolInputSchema('memory_search', { cursor: 'opaque-cursor-token' }, TOOL_DEFINITIONS);\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:252:      validateToolArgs('memory_search', { cursor: 'opaque-cursor-token' });\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:258:      validateToolInputSchema('memory_search', { concepts: ['alpha', 'beta'] }, TOOL_DEFINITIONS);\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:264:      validateToolInputSchema('memory_search', {}, TOOL_DEFINITIONS);\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:270:      validateToolArgs('memory_search', { query: 'ab', limit: 100 });\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:276:      validateToolArgs('memory_search', { query: 'ab', limit: 101 });\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:282:      validateToolInputSchema('memory_search', { query: 'ab', limit: 101 }, TOOL_DEFINITIONS);\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:288:      validateToolArgs('memory_search', { concepts: ['solo'] });\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:292:  it('public schema rejects unknown memory_search parameters', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:294:      validateToolInputSchema('memory_search', { query: 'valid query', unexpected: true }, TOOL_DEFINITIONS);\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:300:      validateToolInputSchema('memory_search', { query: 'a' }, TOOL_DEFINITIONS);\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:304:  it('runtime rejects unknown memory_search parameters', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:306:      validateToolArgs('memory_search', { query: 'valid query', unexpected: true } as Record<string, unknown>);\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:310:  it('runtime accepts governed scope fields for memory_search', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:312:      validateToolArgs('memory_search', {\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:322:  it('public and runtime schemas accept response profiles for memory_search', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:329:      validateToolInputSchema('memory_search', args, TOOL_DEFINITIONS);\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:331:    expect(validateToolArgs('memory_search', args)).toEqual(args);\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:336:  it('public and runtime schemas accept governed scope fields for memory_context', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:346:      validateToolInputSchema('memory_context', args, TOOL_DEFINITIONS);\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:348:    expect(validateToolArgs('memory_context', args)).toEqual(args);\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:351:  it('public and runtime schemas accept response profiles for memory_context', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:358:      validateToolInputSchema('memory_context', args, TOOL_DEFINITIONS);\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:360:    expect(validateToolArgs('memory_context', args)).toEqual(args);\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:378:  it('public and runtime schemas accept governed scope fields for memory_match_triggers', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:389:      validateToolInputSchema('memory_match_triggers', args, TOOL_DEFINITIONS);\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:391:    expect(validateToolArgs('memory_match_triggers', args)).toEqual(args);\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:463:  it('public causal tool schemas expose string memory identifiers', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:465:    const causalLink = TOOL_DEFINITIONS.find((entry) => entry.name === 'memory_causal_link');\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:467:    const causalLinkSchema = causalLink?.inputSchema as { properties?: Record<string, unknown> } | undefined;\\n.opencode/skills/system-spec-kit/mcp_server/tests/tool-input-schema.vitest.ts:472:    expect(causalLinkSchema?.properties).toMatchObject({\\n.opencode/skills/system-spec-kit/mcp_server/handlers/mutation-hooks.ts:4:import * as triggerMatcher from '../lib/parsing/trigger-matcher.js';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/mutation-hooks.ts:27:  let triggerCacheCleared = false;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/mutation-hooks.ts:29:    triggerMatcher.clearCache();\\n.opencode/skills/system-spec-kit/mcp_server/handlers/mutation-hooks.ts:30:    triggerCacheCleared = true;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/mutation-hooks.ts:34:      `[mutation-hooks] triggerMatcher.clearCache failed for operation=\\\"${operation}\\\":`,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/mutation-hooks.ts:37:    errors.push(`triggerMatcher.clearCache: ${message}`);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/mutation-hooks.ts:38:    triggerCacheCleared = false;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/mutation-hooks.ts:99:    triggerCacheCleared,\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:3:import Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:4:import * as causalEdges from '../lib/storage/causal-edges';\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:56:    triggerPhrases: ['test', 'memory'],\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:80:    FROM memory_index m\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:106:    // Create memory_index table matching production schema\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:108:      CREATE TABLE IF NOT EXISTS memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:114:        trigger_phrases TEXT DEFAULT '[]',\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:129:      CREATE TABLE IF NOT EXISTS vec_memories (\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:135:    // Create causal_edges table\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:137:      CREATE TABLE IF NOT EXISTS causal_edges (\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:154:      CREATE TABLE IF NOT EXISTS weight_history (\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:156:        edge_id INTEGER NOT NULL REFERENCES causal_edges(id) ON DELETE CASCADE,\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:166:      CREATE TABLE IF NOT EXISTS memory_lineage (\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:183:      CREATE TABLE IF NOT EXISTS active_memory_projection (\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:191:    // Initialize causal edges module\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:192:    causalEdges.init(testDb);\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:204:    testDb.exec('DELETE FROM memory_index');\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:206:    testDb.exec('DELETE FROM causal_edges');\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:401:        INSERT INTO memory_index (id, spec_folder, file_path, title, content_text, importance_weight, created_at, updated_at)\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:422:      const oldRow = testDb.prepare('SELECT is_archived FROM memory_index WHERE id = 100').get() as {\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:429:        'SELECT content_text, importance_weight FROM memory_index WHERE id > 100 ORDER BY id DESC LIMIT 1'\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:441:        INSERT INTO memory_index (id, spec_folder, file_path, title, content_text, importance_weight, created_at, updated_at)\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:460:      const oldRow = testDb.prepare('SELECT is_archived FROM memory_index WHERE id = 101').get() as {\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:466:        'SELECT importance_weight FROM memory_index WHERE id = ?'\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:475:        INSERT INTO memory_index (id, spec_folder, file_path, title, content_text, created_at, updated_at)\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:497:        'SELECT is_archived FROM memory_index WHERE id = 102'\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:524:        INSERT INTO memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:573:        FROM memory_index\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:612:        INSERT INTO memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:635:          content: 'Merged addition that should trigger repair attempts',\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:650:        FROM memory_index\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:658:        INSERT INTO memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:680:          UPDATE memory_index\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:702:        FROM memory_index\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:712:        INSERT INTO memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:746:        FROM memory_index\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:760:        INSERT INTO memory_index (id, spec_folder, file_path, title, content_text, created_at, updated_at)\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:785:      const row = testDb.prepare('SELECT title, content_text, importance_tier FROM memory_index WHERE id = 200').get() as {\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:794:      // Verify causal edge\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:795:      expect(result.causalEdgeId).not.toBeNull();\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:796:      const edges = causalEdges.getEdgesFrom('201');\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:804:        INSERT INTO memory_index (id, spec_folder, file_path, title, content_text, created_at, updated_at)\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:813:      const edges = causalEdges.getEdgesFrom('211');\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:820:        INSERT INTO memory_index (id, spec_folder, file_path, title, content_text, created_at, updated_at)\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:829:      expect(result.causalEdgeId).toBeNull();\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:831:      const selfSupersedes = causalEdges\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:900:        INSERT INTO memory_index (id, spec_folder, file_path, title, content_text, importance_weight, created_at, updated_at)\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:930:        'SELECT is_archived FROM memory_index WHERE id = 400'\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:937:        INSERT INTO memory_index (id, spec_folder, file_path, title, content_text, created_at, updated_at)\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:1010:    it('RO6: TM-04/TM-06 interaction: similarity 0.89 passes TM-04, triggers TM-06 merge', async () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:1015:        INSERT INTO memory_index (id, spec_folder, file_path, title, content_text, importance_weight, created_at, updated_at)\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:1050:        'SELECT is_archived FROM memory_index WHERE id = 450'\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:1125:        INSERT INTO memory_index (id, spec_folder, file_path, title, content_text, importance_weight, created_at, updated_at)\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:1132:          INSERT INTO memory_index (id, spec_folder, file_path, title, content_text, importance_weight, created_at, updated_at)\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:1138:      const insertEdgeSpy = vi.spyOn(causalEdges, 'insertEdge')\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:1153:      const orphanRow = testDb.prepare('SELECT id FROM memory_index WHERE id = ?').get(orphanId);\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:1161:        INSERT INTO memory_index (id, spec_folder, file_path, title, content_text, importance_weight, created_at, updated_at)\\n.opencode/skills/system-spec-kit/mcp_server/tests/reconsolidation.vitest.ts:1179:        'SELECT content_text FROM memory_index WHERE id = ?'\\n.opencode/skills/system-spec-kit/mcp_server/tests/intent-routing.vitest.ts:15:  it('uses fixed causal edge weight baseline (caused=1.0)', () => {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:21:import { handleMemoryMatchTriggers } from './memory-triggers.js';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:33:import * as sessionManager from '../lib/session/session-manager.js';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:42:} from '../lib/search/session-transition.js';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:60:// Feature catalog: Unified context retrieval (memory_context)\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:84:  sessionId?: string;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:87:  includeTrace?: boolean; // CHK-040: Forward to internal memory_search calls\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:90:  sessionTransition?: SessionTransitionTrace;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:94:  sessionScope: 'caller' | 'ephemeral';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:121:  sessionId?: string;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:124:  includeTrace?: boolean; // CHK-040: Forward to internal memory_search calls\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:180:  sessionLifecycle: SessionLifecycleMetadata;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:186:  sessionTransition: SessionTransitionTrace;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:201:  preferredTool: 'code_graph_query';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:203:  preservesAuthority: 'session_bootstrap';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:323:    preferredTool: 'code_graph_query',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:324:    message: 'Advisory only: this looks like a structural question. Prefer `code_graph_query` before Grep or Glob for callers, imports, outline, and dependency lookups.',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:325:    preservesAuthority: 'session_bootstrap',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:386:          tool: 'memory_search',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:397:          tool: 'memory_search',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:649:  // Quick: Fast trigger-based matching for reactive context\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:652:    description: 'Fast trigger matching for real-time context (low latency)',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:653:    strategy: 'triggers',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:709:    session_id: options.sessionId,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:734:    sessionId: options.sessionId,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:735:    sessionTransition: options.sessionTransition,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:765:    sessionId: options.sessionId,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:766:    sessionTransition: options.sessionTransition,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:787:    query: input || 'resume work continue session',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:799:    sessionId: options.sessionId,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:800:    sessionTransition: options.sessionTransition,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:827:  // Security: session scope derived from server context, not caller input\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:828:  const trustedSession = sessionManager.resolveTrustedSession(args.sessionId ?? null, {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:865:  session: SessionLifecycleResolution,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:900:      session.resumed ||\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:901:      session.priorMode === 'resume' ||\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1004:    sessionLifecycle,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1010:    sessionTransition,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1031:            includeTrace === true ? sessionTransition : undefined,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1056:    sessionLifecycle,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1078:/** Handle memory_context tool — L1 orchestration layer that routes to optimal retrieval strategy.\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1092:      tool: 'memory_context',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1117:      tool: 'memory_context',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1227:    error: sessionScopeError,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1229:  if (sessionScopeError) {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1231:      tool: 'memory_context',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1232:      error: sessionScopeError,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1234:      details: { requestId, layer: 'L1:Orchestration', requestedSessionId: args.sessionId ?? null },\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1236:        hint: 'Retry without sessionId to let the server mint a trusted session, then reuse the returned effectiveSessionId.',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1240:  const sessionLifecycle: SessionLifecycleMetadata = {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1241:    sessionScope: requestedSessionId ? 'caller' : 'ephemeral',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1250:  const layerInfo: LayerInfo | null = layerDefs.getLayerInfo('memory_context');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1286:    sessionId: effectiveSessionId,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1318:  // Phase C: Intent-to-profile auto-routing for memory_context.\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1336:  const sessionTransition = buildSessionTransitionTrace({\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1345:  options.sessionTransition = options.includeTrace === true ? sessionTransition : undefined;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1352:  const sessionStateResult = sessionManager.saveSessionState(effectiveSessionId, {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1359:  if (!sessionStateResult.success) {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1361:      `[memory-context] Failed to persist session identity for ${effectiveSessionId}: ${sessionStateResult.error ?? 'unknown error'}`,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1375:      tool: 'memory_context',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1393:      tool: 'memory_context',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1418:    // Best-effort session state write — do not fail the handler\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1430:      sessionTransition,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1437:      sessionLifecycle.resumedContextCount = resumeContextItems.length;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1471:    tool: 'memory_context',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1478:      `For more granular control, use L2 tools: memory_search, memory_match_triggers`,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1491:      sessionLifecycle,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1502:      sessionTransition,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1530:        session_id: effectiveSessionId,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1583:      tool: 'memory_context',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1584:      error: 'memory_context failed due to an internal error',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1606:const handle_memory_context = handleMemoryContext;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-context.ts:1609:  handle_memory_context,\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/entity-extractor.ts:10:import type Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/entity-extractor.ts:77: * Results are deduplicated by normalized text with summed frequencies.\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/entity-extractor.ts:80: * @returns Array of extracted entities, deduplicated and frequency-counted.\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/entity-extractor.ts:120:  // Deduplicate by normalized text (lowercase, trimmed), summing frequencies\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/entity-extractor.ts:121:  return deduplicateEntities(raw);\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/entity-extractor.ts:164: * @param db - An initialized better-sqlite3 Database instance.\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/entity-extractor.ts:165: * @param memoryId - The memory_index row ID to associate entities with.\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/entity-extractor.ts:256: * @param db - An initialized better-sqlite3 Database instance.\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/entity-extractor.ts:398: * live `memory_index.content_text`, and then rebuilding `entity_catalog`\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/entity-extractor.ts:412:    FROM memory_index\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/entity-extractor.ts:428:        FROM memory_index m\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/entity-extractor.ts:455:        FROM memory_index m\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/entity-extractor.ts:491: * Deduplicate raw extraction results by normalized text.\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/entity-extractor.ts:495:function deduplicateEntities(\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/entity-extractor.ts:517:  deduplicateEntities,\\n.opencode/skills/system-spec-kit/scripts/test-fixtures/062-template-compliant-level1/implementation-summary.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/mcp_server/tests/hook-session-stop.vitest.ts:5:import { detectSpecFolder } from '../hooks/claude/session-stop.js';\\n.opencode/skills/system-spec-kit/mcp_server/tests/hook-session-stop.vitest.ts:7:describe('Claude session-stop spec folder detection', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/query-surrogates.vitest.ts:9:import Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/tests/query-surrogates.vitest.ts:155:  it('deduplicates aliases', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/query-surrogates.vitest.ts:374:  it('deduplicates questions', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/query-surrogates.vitest.ts:733:      paragraphs.push(`## Section ${i}\\\\nThis is paragraph ${i} about topic ${i % 10} with unique term term${i}.`);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-list.ts:99:      error: 'Database not initialized. Run memory_index_scan() to trigger schema creation, or restart the MCP server.',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-list.ts:127:    const countSql = `SELECT COUNT(*) as count FROM memory_index ${whereClause}`;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-list.ts:131:    const sql = `SELECT id, spec_folder, file_path, title, trigger_phrases, importance_weight, created_at, updated_at FROM memory_index ${whereClause} ORDER BY ${sortColumn} DESC LIMIT ? OFFSET ?`;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-list.ts:153:    triggerCount: safeJsonParseTyped<unknown[]>(row.trigger_phrases as string, 'array', []).length,\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/extraction-adapter.ts:5:import type Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/extraction-adapter.ts:42:    toolPattern: /^(read|memory_context|memory_search|memory_list)$/i,\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/extraction-adapter.ts:49:    toolPattern: /^(grep|memory_search)$/i,\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/extraction-adapter.ts:56:    toolPattern: /^(bash|memory_save|memory_update)$/i,\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/extraction-adapter.ts:164:        meta?: { sessionLifecycle?: { effectiveSessionId?: string }; sessionId?: string };\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/extraction-adapter.ts:165:        data?: { sessionId?: string };\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/extraction-adapter.ts:167:      const fromLifecycle = parsed?.meta?.sessionLifecycle?.effectiveSessionId;\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/extraction-adapter.ts:171:      const fromMeta = parsed?.meta?.sessionId;\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/extraction-adapter.ts:175:      const fromData = parsed?.data?.sessionId;\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/extraction-adapter.ts:194:    const exists = (db.prepare('SELECT id FROM memory_index WHERE id = ? LIMIT 1') as Database.Statement)\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/extraction-adapter.ts:205:      const canonicalRow = (db.prepare('SELECT id FROM memory_index WHERE canonical_file_path = ? LIMIT 1') as Database.Statement)\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/extraction-adapter.ts:217:    const filePathRow = (db.prepare('SELECT id FROM memory_index WHERE file_path = ? LIMIT 1') as Database.Statement)\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/extraction-adapter.ts:265:  const sessionId = resolveSessionId(result);\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/extraction-adapter.ts:267:    sessionId,\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/extraction-adapter.ts:278:    console.error(`[extraction-adapter] Inserted working_memory item for memory ${memoryId} (${matched.rule.id})`);\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-search-fn.vitest.ts:3:import Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-search-fn.vitest.ts:14:} as unknown as import('better-sqlite3').Database;\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-search-fn.vitest.ts:40:    CREATE TABLE memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-search-fn.vitest.ts:50:    CREATE TABLE causal_edges (\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-search-fn.vitest.ts:67:    INSERT INTO memory_index (id, spec_folder, file_path, title, importance_tier)\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-search-fn.vitest.ts:75:    INSERT INTO causal_edges (source_id, target_id, relation, strength)\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-search-fn.vitest.ts:143:  it('G1: deduplicates when source_id equals target_id (same numeric value)', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-search-fn.vitest.ts:154:    expect(uniqueIds.size).toBe(ids.length); // no duplicate entries\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-search-fn.vitest.ts:201:  it('uses memory_index content_text lookup in causal SQL', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-search-fn.vitest.ts:208:    const fallbackSql = sqlCalls.find(sql => sql.includes('FROM memory_index')) ?? '';\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-search-fn.vitest.ts:209:    expect(fallbackSql).toContain('FROM memory_index');\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-search-fn.vitest.ts:213:  it('returns empty array when causal query throws', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-search-fn.vitest.ts:227:      if (sql.includes('FROM causal_edges ce')) {\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-search-fn.vitest.ts:230:      if (sql.includes('FROM memory_index') && sql.includes('WHERE spec_folder IN')) {\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-search-fn.vitest.ts:262:  it('deduplicates FTS results using the highest composite score', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-search-fn.vitest.ts:305:        INSERT INTO causal_edges (source_id, target_id, relation, strength)\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-search-fn.vitest.ts:324:        sessionManager: { init: vi.fn(() => ({ success: true })) },\\n.opencode/skills/system-spec-kit/mcp_server/tests/confidence-truncation.vitest.ts:175:  it('T11: cutoffGap reflects the gap that triggered truncation', () => {\\n.opencode/skills/system-spec-kit/scripts/utils/spec-affinity.ts:9:// whether captured-session content is actually about that spec rather\\n.opencode/skills/system-spec-kit/scripts/utils/spec-affinity.ts:14:import type { CollectedDataSubset } from '../types/session-types';\\n.opencode/skills/system-spec-kit/scripts/utils/spec-affinity.ts:54:  'session',\\n.opencode/skills/system-spec-kit/scripts/utils/spec-affinity.ts:244:  triggerPhraseCandidates: string[];\\n.opencode/skills/system-spec-kit/scripts/utils/spec-affinity.ts:252:      triggerPhraseCandidates: [],\\n.opencode/skills/system-spec-kit/scripts/utils/spec-affinity.ts:271:      if (Array.isArray(parsed.triggerPhrases)) {\\n.opencode/skills/system-spec-kit/scripts/utils/spec-affinity.ts:272:        descriptionTriggerPhrases = parsed.triggerPhrases.filter((value): value is string => typeof value === 'string');\\n.opencode/skills/system-spec-kit/scripts/utils/spec-affinity.ts:280:  const triggerPhrases = parseFrontmatterValue(specDoc, 'trigger_phrases');\\n.opencode/skills/system-spec-kit/scripts/utils/spec-affinity.ts:285:    triggerPhraseCandidates: uniqueStrings([...triggerPhrases, ...descriptionTriggerPhrases]),\\n.opencode/skills/system-spec-kit/scripts/utils/spec-affinity.ts:338:        triggerPhraseCandidates: [],\\n.opencode/skills/system-spec-kit/scripts/utils/spec-affinity.ts:348:      ...metadata.triggerPhraseCandidates,\\n.opencode/skills/system-spec-kit/scripts/utils/spec-affinity.ts:373:      ...metadata.triggerPhraseCandidates,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-health.ts:4:// T018: MCP tool handler for session_health — reports session\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-health.ts:14:import { computeQualityScore, getLastToolCallAt } from '../lib/session/context-metrics.js';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-health.ts:15:import { buildStructuralBootstrapContract } from '../lib/session/session-snapshot.js';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-health.ts:16:import type { StructuralBootstrapContract } from '../lib/session/session-snapshot.js';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-health.ts:17:import type { QualityScore } from '../lib/session/context-metrics.js';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-health.ts:36:  sessionAgeMs: number;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-health.ts:65:/** Handle session_health tool call */\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-health.ts:81:    const { getSessionMetrics } = await import('../lib/session/context-metrics.js');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-health.ts:102:  const structuralContext = buildStructuralBootstrapContract('session_health');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-health.ts:104:  const sessionAgeMs = now - serverStartedAt;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-health.ts:120:    hints.push('Session has not been primed yet. Make any tool call to trigger auto-priming.');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-health.ts:123:    hints.push('Structural context is stale. Call session_bootstrap to refresh, or run code_graph_scan for a full rescan.');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-health.ts:125:    hints.push('No structural context available. Call session_bootstrap first, then run code_graph_scan.');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-health.ts:128:    hints.push('No tool calls in >60 min. Consider calling `memory_context` to refresh session state.');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-health.ts:140:        key: 'session-health',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-health.ts:143:        source: 'session',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-health.ts:160:      producer: 'session_health',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-health.ts:161:      sourceSurface: 'session_health',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-health.ts:165:      sourceRefs: ['memory-surface', 'context-metrics', 'session-snapshot'],\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-health.ts:170:    sourceSurface: 'session_health',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-health.ts:176:      sessionAgeMs,\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/README.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/README.md:115:| **Deduplication** | Results deduplicated by normalized text with summed frequencies |\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/README.md:119:| **Edge Density Check** | `computeEdgeDensity()` returns the ratio of causal edges to total memories |\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/README.md:155:| `reasons` | `string[]` | Human-readable list of matched patterns that triggered a block |\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/README.md:187:const toolOutput = { content: 'session summary text', memory_id: undefined };\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/README.md:239:| `lib/graph/` | Graph signals (N2) and community detection, consume entity and causal edge data |\\n.opencode/skills/system-spec-kit/mcp_server/tests/shared-spaces.vitest.ts:1:import Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/scripts/lib/README.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/lib/README.md:45:- `session-activity-signal.ts` - derives session activity signals from captured activity\\n.opencode/skills/system-spec-kit/scripts/lib/README.md:47:- `topic-keywords.ts` - shared lexical helpers for topic extraction\\n.opencode/skills/system-spec-kit/scripts/lib/README.md:48:- `trigger-extractor.ts` - extracts trigger phrases and activation cues\\n.opencode/skills/system-spec-kit/scripts/lib/README.md:62:- `embeddings.ts` and `trigger-extractor.ts` are wrapper/re-export style modules aligned with shared package behavior.\\n.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-search.vitest.ts:59:    it('T516-2: handle_memory_search alias is exported', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-search.vitest.ts:60:      expect(typeof handler.handle_memory_search).toBe('function');\\n.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-search.vitest.ts:182:        lexicalPath: 'fts5',\\n.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-search.vitest.ts:192:    expect(data?.lexicalPath).toBe('fts5');\\n.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-search.vitest.ts:330:  it('T002-3: duplicate sibling chunks (same parent_id) are collapsed to one row', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-search.vitest.ts:366:  it('T012-1: duplicate chunk dedup is identical for includeContent=false and includeContent=true', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:5:import Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:18:} from '../handlers/causal-links-processor';\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:67:    // Create memory_index table (matches production schema)\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:69:      CREATE TABLE IF NOT EXISTS memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:74:        trigger_phrases TEXT,\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:98:      CREATE TABLE IF NOT EXISTS memory_conflicts (\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:111:    // Create causal_edges table\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:113:      CREATE TABLE IF NOT EXISTS causal_edges (\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:130:      CREATE TABLE IF NOT EXISTS weight_history (\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:132:        edge_id INTEGER NOT NULL REFERENCES causal_edges(id) ON DELETE CASCADE,\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:146:      INSERT INTO memory_index (id, spec_folder, file_path, title, content, content_hash, stability, difficulty)\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:149:    stmt.run(1, 'specs/001-test', '/specs/001-test/memory/session-2025-01-15.md', 'Session Context Jan 15', 'Test memory content 1', 'hash1', 1.0, 5.0);\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:153:    stmt.run(5, 'specs/003-refactor', '/specs/003-refactor/memory/2024-12-01-session.md', 'Refactor Plan', 'Test memory content 5', 'hash5', 1.2, 5.0);\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:185:    it.skipIf(!resolveFn)('resolves session reference', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:188:      const result = resolveFn!(db, 'session-2025-01-15');\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:196:      const result = resolveFn!(db, '2024-12-01-session');\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:263:      db.exec('ALTER TABLE memory_index ADD COLUMN canonical_file_path TEXT');\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:265:      db.prepare('UPDATE memory_index SET canonical_file_path = file_path').run();\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:268:        INSERT INTO memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:392:      const edges = db.prepare('SELECT source_id, target_id, relation FROM causal_edges').all() as Array<{ source_id: string; target_id: string; relation: string }>;\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:437:        reason: 'High similarity duplicate detected',\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:504:        triggerPhrases: [],\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:518:      const row = db.prepare('SELECT id FROM memory_index LIMIT 1').get() as { id: number } | undefined;\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:527:        triggerPhrases: [],\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:547:      const row = db.prepare('SELECT id FROM memory_index LIMIT 1').get() as { id: number } | undefined;\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:552:      const triggerName = `skip_reinforce_${Date.now()}`;\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:557:        triggerPhrases: [],\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:566:          CREATE TRIGGER ${triggerName}\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:567:          BEFORE UPDATE ON memory_index\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:578:        db.exec(`DROP TRIGGER IF EXISTS ${triggerName}`);\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:587:        triggerPhrases: [],\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:610:        triggerPhrases: [],\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:620:          INSERT INTO memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:639:          FROM memory_index\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:676:      const row = db.prepare('SELECT id FROM memory_index LIMIT 1').get() as { id: number } | undefined;\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:682:      const original = db.prepare('SELECT importance_tier FROM memory_index WHERE id = ?').get(row.id) as { importance_tier: string } | undefined;\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:686:      const updated = db.prepare('SELECT importance_tier FROM memory_index WHERE id = ?').get(row.id) as { importance_tier: string } | undefined;\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:692:        db.prepare('UPDATE memory_index SET importance_tier = ? WHERE id = ?')\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:736:      const row = db.prepare('SELECT id FROM memory_index LIMIT 1').get() as { id: number } | undefined;\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:745:        triggerPhrases: ['trigger1', 'trigger2'],\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:763:      const row = db.prepare('SELECT id FROM memory_index LIMIT 1').get() as { id: number } | undefined;\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:772:        triggerPhrases: ['alpha', 'beta'],\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:781:      expect(result.triggerPhrases).toContain('alpha');\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:841:trigger_phrases: [\\\"test trigger\\\"]\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts:894:        triggerPhrases: [],\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/ontology-hooks.ts:7:// entities from polluting the causal graph.\\n.opencode/skills/system-spec-kit/mcp_server/lib/extraction/ontology-hooks.ts:35: * Default ontology schema — matches the causal_edges CHECK constraint\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-health.ts:16:import * as triggerMatcher from '../lib/parsing/trigger-matcher.js';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-health.ts:22:import * as causalEdges from '../lib/storage/causal-edges.js';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-health.ts:304:      const countResult = database.prepare('SELECT COUNT(*) as count FROM memory_index')\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-health.ts:319:        FROM memory_index\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-health.ts:334:        error: `Schema missing: ${sanitizeErrorForHint(message)}. Run memory_index_scan() to create the database schema, or restart the MCP server.`,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-health.ts:421:    'trigger_cache_refresh',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-health.ts:457:      const memoryCountRow = database.prepare('SELECT COUNT(*) as count FROM memory_index').get() as { count: number };\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-health.ts:461:          `FTS5 index out of sync: memory_index has ${memoryCountRow.count} rows, memory_fts has ${ftsCountRow.count} rows. ` +\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-health.ts:462:          `Run memory_index_scan with force:true to rebuild FTS5 index.`\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-health.ts:470:            triggerMatcher.refreshTriggerCache();\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-health.ts:471:            repair.actions.push('trigger_cache_refresh');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-health.ts:477:              hints.push('Auto-repair completed: FTS5 index rebuilt and trigger cache refreshed.');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-health.ts:480:              const warning = `Post-repair mismatch persists: memory_index=${memoryCountRow.count}, memory_fts=${repairedFtsCountRow.count}`;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-health.ts:502:  // Never invoked at runtime. Wire it into autoRepair so orphaned causal edges\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-health.ts:506:      // Fix F8 — ensure causal-edges DB init before orphan cleanup.\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-health.ts:507:      causalEdges.init(database);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-health.ts:508:      const orphanResult = causalEdges.cleanupOrphanedEdges();\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-crud-health.ts:512:        hints.push(`Auto-repair: removed ${orphanResult.deleted} orphaned causal edge(s)`);\\n.opencode/skills/system-spec-kit/scripts/tests/auto-detection-fixes.vitest.ts:9:import { buildSessionActivitySignal } from '../lib/session-activity-signal';\\n.opencode/skills/system-spec-kit/scripts/tests/auto-detection-fixes.vitest.ts:11:import { extractBlockers } from '../extractors/session-extractor';\\n.opencode/skills/system-spec-kit/scripts/tests/auto-detection-fixes.vitest.ts:13:import { buildRichSessionData } from './fixtures/session-data-factory';\\n.opencode/skills/system-spec-kit/scripts/tests/auto-detection-fixes.vitest.ts:63:    '010-perfect-session-capturing',\\n.opencode/skills/system-spec-kit/scripts/tests/auto-detection-fixes.vitest.ts:91:  const specRelativePath = 'system-spec-kit/022-hybrid-rag-fusion/010-perfect-session-capturing/013-auto-detection-fixes';\\n.opencode/skills/system-spec-kit/scripts/tests/auto-detection-fixes.vitest.ts:134:    parentChain: ['system-spec-kit', '022-hybrid-rag-fusion', '010-perfect-session-capturing'],\\n.opencode/skills/system-spec-kit/scripts/tests/auto-detection-fixes.vitest.ts:142:    session_summary: 'Implemented the phase 013 fixes and verified the rendered workflow metadata.',\\n.opencode/skills/system-spec-kit/scripts/tests/auto-detection-fixes.vitest.ts:155:          'Tool: Read File: .opencode/specs/system-spec-kit/022-hybrid-rag-fusion/010-perfect-session-capturing/013-auto-detection-fixes/spec.md',\\n.opencode/skills/system-spec-kit/scripts/tests/auto-detection-fixes.vitest.ts:171:    session_dedup: {\\n.opencode/skills/system-spec-kit/scripts/tests/auto-detection-fixes.vitest.ts:179:    causal_links: {\\n.opencode/skills/system-spec-kit/scripts/tests/auto-detection-fixes.vitest.ts:231:  it('builds a session activity signal with tool, git, and transcript boosts', () => {\\n.opencode/skills/system-spec-kit/scripts/tests/auto-detection-fixes.vitest.ts:245:              'Tool: Read File: .opencode/specs/system-spec-kit/022-hybrid-rag-fusion/010-perfect-session-capturing/013-auto-detection-fixes/spec.md',\\n.opencode/skills/system-spec-kit/scripts/tests/auto-detection-fixes.vitest.ts:252:              'Tool: Edit File: .opencode/specs/system-spec-kit/022-hybrid-rag-fusion/010-perfect-session-capturing/013-auto-detection-fixes/tasks.md',\\n.opencode/skills/system-spec-kit/scripts/tests/auto-detection-fixes.vitest.ts:258:            path: '.opencode/specs/system-spec-kit/022-hybrid-rag-fusion/010-perfect-session-capturing/013-auto-detection-fixes/checklist.md',\\n.opencode/skills/system-spec-kit/scripts/tests/auto-detection-fixes.vitest.ts:262:      'system-spec-kit/022-hybrid-rag-fusion/010-perfect-session-capturing/013-auto-detection-fixes',\\n.opencode/skills/system-spec-kit/scripts/tests/auto-detection-fixes.vitest.ts:273:  it('suppresses observation-derived decision duplicates when manual decisions exist (SC-002: 4+4 → 4)', async () => {\\n.opencode/skills/system-spec-kit/scripts/tests/auto-detection-fixes.vitest.ts:286:        narrative: `Observation duplicate of: ${title}`,\\n.opencode/skills/system-spec-kit/scripts/tests/auto-detection-fixes.vitest.ts:287:        facts: ['Option A: chosen', 'Rationale: auto-extracted duplicate'],\\n.opencode/skills/system-spec-kit/scripts/tests/auto-detection-fixes.vitest.ts:374:    process.env.MEMORY_DB_PATH = path.join(harness.dbDir, 'context-index.sqlite');\\n.opencode/skills/system-spec-kit/scripts/tests/auto-detection-fixes.vitest.ts:403:    expect(content).toContain('session_dedup:');\\n.opencode/skills/system-spec-kit/scripts/tests/auto-detection-fixes.vitest.ts:406:    expect(content).toContain('causal_links:');\\n.opencode/skills/system-spec-kit/scripts/tests/auto-detection-fixes.vitest.ts:433:  it('marks tied session-activity candidates as low confidence (Priority 3.5 fall-through guard)', () => {\\n.opencode/skills/system-spec-kit/scripts/tests/auto-detection-fixes.vitest.ts:436:      { path: '/specs/02--system/022-rag/010-capturing/001-child-a', mtimeMs: now, sessionActivityBoost: 0.8, sessionActivitySignalCount: 4 },\\n.opencode/skills/system-spec-kit/scripts/tests/auto-detection-fixes.vitest.ts:437:      { path: '/specs/02--system/022-rag/010-capturing/002-child-b', mtimeMs: now, sessionActivityBoost: 0.8, sessionActivitySignalCount: 4 },\\n.opencode/skills/system-spec-kit/scripts/tests/auto-detection-fixes.vitest.ts:444:  it('allows clear session-activity winner through Priority 3.5 without falling through', () => {\\n.opencode/skills/system-spec-kit/scripts/tests/auto-detection-fixes.vitest.ts:447:      { path: '/specs/02--system/022-rag/010-capturing/001-winner', mtimeMs: now, sessionActivityBoost: 0.9, sessionActivitySignalCount: 6 },\\n.opencode/skills/system-spec-kit/scripts/tests/auto-detection-fixes.vitest.ts:448:      { path: '/specs/02--system/022-rag/010-capturing/002-loser', mtimeMs: now, sessionActivityBoost: 0.3, sessionActivitySignalCount: 2 },\\n.opencode/skills/system-spec-kit/scripts/tests/auto-detection-fixes.vitest.ts:461:    const fullRelativePath = '.opencode/specs/system-spec-kit/022-hybrid-rag-fusion/010-perfect-session-capturing/003-data-fidelity';\\n.opencode/skills/system-spec-kit/scripts/tests/auto-detection-fixes.vitest.ts:477:    const multiSegmentPath = '022-hybrid-rag-fusion/010-perfect-session-capturing/003-data-fidelity';\\n.opencode/skills/system-spec-kit/scripts/test-fixtures/054-template-extra-header/spec.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/utils/file-helpers.ts:30:  /^(?:modified during session|tracked file history snapshot)$/i,\\n.opencode/skills/system-spec-kit/scripts/utils/file-helpers.ts:46:  /\\\\b(?:regex|parser|workflow|extractor|validator|scorer|threshold|enum|interface|schema|frontmatter|trigger|provenance|magnitude|capture|alignment|sufficiency|normalization|diffstat|commit-touch)\\\\b/i,\\n.opencode/skills/system-spec-kit/mcp_server/tests/governance-e2e.vitest.ts:5:import Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/tests/governance-e2e.vitest.ts:16:    CREATE TABLE config (\\n.opencode/skills/system-spec-kit/mcp_server/tests/governance-e2e.vitest.ts:21:    CREATE TABLE memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/governance-e2e.vitest.ts:28:      session_id TEXT,\\n.opencode/skills/system-spec-kit/mcp_server/tests/governance-e2e.vitest.ts:56:      INSERT INTO memory_index (id, spec_folder, file_path, tenant_id, user_id, session_id)\\n.opencode/skills/system-spec-kit/mcp_server/tests/governance-e2e.vitest.ts:58:    `).run(1, 'specs/008-hydra-db-based-features', '/tmp/tenant-a-user-1.md', 'tenant-a', 'user-1', 'session-1');\\n.opencode/skills/system-spec-kit/mcp_server/tests/governance-e2e.vitest.ts:60:      INSERT INTO memory_index (id, spec_folder, file_path, tenant_id, user_id, session_id)\\n.opencode/skills/system-spec-kit/mcp_server/tests/governance-e2e.vitest.ts:62:    `).run(2, 'specs/008-hydra-db-based-features', '/tmp/tenant-a-user-2.md', 'tenant-a', 'user-2', 'session-2');\\n.opencode/skills/system-spec-kit/mcp_server/tests/governance-e2e.vitest.ts:64:      INSERT INTO memory_index (id, spec_folder, file_path, tenant_id, user_id, session_id)\\n.opencode/skills/system-spec-kit/mcp_server/tests/governance-e2e.vitest.ts:66:    `).run(3, 'specs/008-hydra-db-based-features', '/tmp/tenant-b-user-1.md', 'tenant-b', 'user-1', 'session-3');\\n.opencode/skills/system-spec-kit/mcp_server/tests/governance-e2e.vitest.ts:69:      SELECT id, tenant_id, user_id, session_id\\n.opencode/skills/system-spec-kit/mcp_server/tests/governance-e2e.vitest.ts:70:      FROM memory_index\\n.opencode/skills/system-spec-kit/mcp_server/tests/governance-e2e.vitest.ts:91:      INSERT INTO memory_index (id, spec_folder, file_path, tenant_id, user_id, session_id)\\n.opencode/skills/system-spec-kit/mcp_server/tests/governance-e2e.vitest.ts:93:    `).run(10, 'specs/008-hydra-db-based-features', '/tmp/user-2.md', 'tenant-a', 'user-2', 'session-10');\\n.opencode/skills/system-spec-kit/mcp_server/tests/governance-e2e.vitest.ts:95:      INSERT INTO memory_index (id, spec_folder, file_path, tenant_id, agent_id, session_id)\\n.opencode/skills/system-spec-kit/mcp_server/tests/governance-e2e.vitest.ts:97:    `).run(11, 'specs/008-hydra-db-based-features', '/tmp/agent-2.md', 'tenant-a', 'agent-2', 'session-11');\\n.opencode/skills/system-spec-kit/mcp_server/tests/governance-e2e.vitest.ts:100:      SELECT id, tenant_id, user_id, agent_id, session_id\\n.opencode/skills/system-spec-kit/mcp_server/tests/governance-e2e.vitest.ts:101:      FROM memory_index\\n.opencode/skills/system-spec-kit/mcp_server/tests/assistive-reconsolidation.vitest.ts:221:    // Similarity of 0.9599 must not trigger auto-merge\\n.opencode/skills/system-spec-kit/mcp_server/tests/assistive-reconsolidation.vitest.ts:224:    // Similarity of 0.96 must trigger auto-merge\\n.opencode/skills/system-spec-kit/mcp_server/tests/job-queue-state-edge.vitest.ts:7:import Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/tests/job-queue-state-edge.vitest.ts:28:    CREATE TABLE ingest_jobs (\\n.opencode/skills/system-spec-kit/mcp_server/tests/job-queue-state-edge.vitest.ts:230:  it('T005b-Q9: enqueueIngestJob ignores duplicate enqueues for the same job ID', async () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/job-queue-state-edge.vitest.ts:237:    const filePath = createTempFile('duplicate-enqueue');\\n.opencode/skills/system-spec-kit/mcp_server/tests/job-queue-state-edge.vitest.ts:239:      id: 'job_duplicate_enqueue',\\n.opencode/skills/system-spec-kit/mcp_server/startup-checks.ts:140:    const result = db.prepare('SELECT sqlite_version() as version').get() as { version: string };\\n.opencode/skills/system-spec-kit/mcp_server/tests/reranker-eval-comparison.vitest.ts:73:    { id: 905, content: 'Memory archival operations and retention policies for old sessions. '.repeat(2) },\\n.opencode/skills/system-spec-kit/mcp_server/tests/reranker-eval-comparison.vitest.ts:86:    { id: 302, content: 'Watcher refresh logic avoids duplicate work when rapid file updates arrive together. '.repeat(2) },\\n.opencode/skills/system-spec-kit/mcp_server/tests/reranker-eval-comparison.vitest.ts:95:    { id: 403, content: 'Post-save review highlights title, trigger phrase, and importance tier issues. '.repeat(2) },\\n.opencode/skills/system-spec-kit/mcp_server/tests/entity-extractor.vitest.ts:6:import Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/tests/entity-extractor.vitest.ts:32:    CREATE TABLE memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/entity-extractor.vitest.ts:40:    CREATE TABLE memory_entities (\\n.opencode/skills/system-spec-kit/mcp_server/tests/entity-extractor.vitest.ts:51:    CREATE TABLE entity_catalog (\\n.opencode/skills/system-spec-kit/mcp_server/tests/entity-extractor.vitest.ts:60:    CREATE TABLE causal_edges (\\n.opencode/skills/system-spec-kit/mcp_server/tests/entity-extractor.vitest.ts:145:  it('deduplicates by normalized text', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/entity-extractor.vitest.ts:150:    // Should be deduplicated to a single entry\\n.opencode/skills/system-spec-kit/mcp_server/tests/entity-extractor.vitest.ts:155:  it('sums frequencies for duplicate entities', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/entity-extractor.vitest.ts:348:    db.prepare('INSERT INTO memory_index (id, spec_folder, file_path, title, content_text) VALUES (?, ?, ?, ?, ?)')\\n.opencode/skills/system-spec-kit/mcp_server/tests/entity-extractor.vitest.ts:530:    db.prepare('INSERT INTO memory_index (id, spec_folder, file_path, title, content_text) VALUES (?, ?, ?, ?, ?)')\\n.opencode/skills/system-spec-kit/mcp_server/tests/entity-extractor.vitest.ts:532:    db.prepare('INSERT INTO memory_index (id, spec_folder, file_path, title, content_text) VALUES (?, ?, ?, ?, ?)')\\n.opencode/skills/system-spec-kit/mcp_server/tests/entity-extractor.vitest.ts:578:    db.prepare('INSERT INTO memory_index (id, spec_folder, file_path, title, content_text) VALUES (?, ?, ?, ?, ?)')\\n.opencode/skills/system-spec-kit/mcp_server/tests/entity-extractor.vitest.ts:599:    db.prepare('INSERT INTO memory_index (id, spec_folder, file_path, title, content_text) VALUES (?, ?, ?, ?, ?)')\\n.opencode/skills/system-spec-kit/mcp_server/tests/entity-extractor.vitest.ts:601:    db.prepare('INSERT INTO memory_index (id, spec_folder, file_path, title, content_text) VALUES (?, ?, ?, ?, ?)')\\n.opencode/skills/system-spec-kit/mcp_server/tests/entity-extractor.vitest.ts:674:      db.prepare('INSERT INTO memory_index (id, spec_folder, file_path, title, content_text) VALUES (?, ?, ?, ?, ?)')\\n.opencode/skills/system-spec-kit/mcp_server/tests/entity-extractor.vitest.ts:679:      db.prepare('INSERT INTO causal_edges (source_id, target_id, relation) VALUES (?, ?, ?)')\\n.opencode/skills/system-spec-kit/mcp_server/tests/entity-extractor.vitest.ts:690:    db.prepare('INSERT INTO causal_edges (source_id, target_id, relation) VALUES (?, ?, ?)')\\n.opencode/skills/system-spec-kit/mcp_server/tests/entity-extractor.vitest.ts:725:// 9. __testables.deduplicateEntities (internal helper)\\n.opencode/skills/system-spec-kit/mcp_server/tests/entity-extractor.vitest.ts:728:describe('__testables.deduplicateEntities', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/entity-extractor.vitest.ts:735:    const result = __testables.deduplicateEntities(raw);\\n.opencode/skills/system-spec-kit/mcp_server/tests/entity-extractor.vitest.ts:744:    const result = __testables.deduplicateEntities([]);\\n.opencode/skills/system-spec-kit/mcp_server/tests/entity-extractor.vitest.ts:754:    const result = __testables.deduplicateEntities(raw);\\n.opencode/skills/system-spec-kit/mcp_server/tests/entity-extractor.vitest.ts:759:  it('treats differently-cased text as duplicates via normalization', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/entity-extractor.vitest.ts:764:    const result = __testables.deduplicateEntities(raw);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/code-graph/query.ts:4:// MCP tool handler for code_graph_query — queries structural relationships.\\n.opencode/skills/system-spec-kit/mcp_server/handlers/code-graph/query.ts:317:/** Handle code_graph_query tool call */\\n.opencode/skills/system-spec-kit/mcp_server/handlers/code-graph/query.ts:326:  // Auto-trigger: ensure graph is fresh before querying\\n.opencode/skills/system-spec-kit/mcp_server/handlers/code-graph/query.ts:361:          }, readiness, 'code_graph_query outline payload'),\\n.opencode/skills/system-spec-kit/mcp_server/handlers/code-graph/query.ts:400:          }, readiness, 'code_graph_query blast_radius payload'),\\n.opencode/skills/system-spec-kit/mcp_server/handlers/code-graph/query.ts:433:          }, readiness, `code_graph_query ${operation} payload`),\\n.opencode/skills/system-spec-kit/mcp_server/handlers/code-graph/query.ts:559:          }, readiness, `code_graph_query ${operation} payload`, result.edges[0]\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/content-normalizer.ts:29: * structured fields (title, trigger_phrases, context_type, etc.), so\\n.opencode/skills/system-spec-kit/scripts/lib/content-filter.ts:18:export type ContentType = 'noise' | 'empty' | 'duplicate' | 'lowQuality' | 'valid';\\n.opencode/skills/system-spec-kit/scripts/lib/content-filter.ts:70:  duplicatesRemoved: number;\\n.opencode/skills/system-spec-kit/scripts/lib/content-filter.ts:76:    duplicate: number;\\n.opencode/skills/system-spec-kit/scripts/lib/content-filter.ts:99:  deduplicate(prompts: PromptItem[]): PromptItem[];\\n.opencode/skills/system-spec-kit/scripts/lib/content-filter.ts:319:    duplicatesRemoved: 0,\\n.opencode/skills/system-spec-kit/scripts/lib/content-filter.ts:322:    filtered: { noise: 0, empty: 0, duplicate: 0, lowQuality: 0 },\\n.opencode/skills/system-spec-kit/scripts/lib/content-filter.ts:531:        filtered = this.deduplicate(filtered);\\n.opencode/skills/system-spec-kit/scripts/lib/content-filter.ts:603:    deduplicate(prompts: PromptItem[]): PromptItem[] {\\n.opencode/skills/system-spec-kit/scripts/lib/content-filter.ts:615:          filterStats.filtered.duplicate++;\\n.opencode/skills/system-spec-kit/scripts/lib/content-filter.ts:616:          filterStats.duplicatesRemoved++;\\n.opencode/skills/system-spec-kit/scripts/lib/content-filter.ts:624:            filterStats.filtered.duplicate++;\\n.opencode/skills/system-spec-kit/scripts/lib/content-filter.ts:625:            filterStats.duplicatesRemoved++;\\n.opencode/skills/system-spec-kit/mcp_server/tests/anchor-metadata.vitest.ts:310:    expect(typeOf('session-history')).toBe('session-history');\\n.opencode/skills/system-spec-kit/mcp_server/tests/anchor-metadata.vitest.ts:579:// SECTION 5: ANCHOR parsing does NOT mutate causal_edges (T011)\\n.opencode/skills/system-spec-kit/mcp_server/tests/anchor-metadata.vitest.ts:600:  it('N02: enrichResultsWithAnchorMetadata does not add causal edge fields', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/unit-normalization.vitest.ts:16:    trigger_phrases: 'auth, login, session',\\n.opencode/skills/system-spec-kit/mcp_server/tests/unit-normalization.vitest.ts:32:    session_id: 'sess-abc123',\\n.opencode/skills/system-spec-kit/mcp_server/tests/unit-normalization.vitest.ts:56:    triggerPhrases: 'auth, login, session',\\n.opencode/skills/system-spec-kit/mcp_server/tests/unit-normalization.vitest.ts:72:    sessionId: 'sess-abc123',\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:4:// Feature catalog: Trigger phrase matching (memory_match_triggers)\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:5:import type Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:23:  triggerId: number;\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:50:/** Statistics about a trigger matching operation */\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:146:    console.warn(`[trigger-matcher] ${operation}: ${durationMs}ms (target <50ms)`, details);\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:148:    console.error(`[trigger-matcher] ${operation}: ${durationMs}ms`, details);\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:157:// In-memory cache of trigger phrases for fast matching\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:158:let triggerCache: TriggerCacheEntry[] | null = null;\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:159:let triggerCandidateIndex: Map<string, Set<number>> | null = null;\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:162:const triggerCacheLoaderStatementByConnection = new WeakMap<Database.Database, Database.Statement>();\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:177:  SELECT id, spec_folder, file_path, title, trigger_phrases, importance_weight\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:178:  FROM memory_index\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:180:    AND trigger_phrases IS NOT NULL\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:181:    AND trigger_phrases != '[]'\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:182:    AND trigger_phrases != ''\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:187:  const cachedStatement = triggerCacheLoaderStatementByConnection.get(database);\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:193:  triggerCacheLoaderStatementByConnection.set(database, statement);\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:208:  // word breaks. For pure CJK trigger phrases, prefer substring matching so valid\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:272:  if (!triggerCandidateIndex) {\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:273:    triggerCandidateIndex = new Map();\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:278:    const indexedIds = triggerCandidateIndex.get(key);\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:280:      indexedIds.add(entry.triggerId);\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:284:    triggerCandidateIndex.set(key, new Set([entry.triggerId]));\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:306:/** Get or create a cached regex for a trigger phrase. @param phrase - The trigger phrase @returns Compiled RegExp */\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:337:/** Load all trigger phrases from the index into memory */\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:342:  if (triggerCache && (now - cacheTimestamp) < CONFIG.CACHE_TTL_MS) {\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:343:    return triggerCache;\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:349:    // Because trigger-matcher may be the first module to access the database in the\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:357:      console.warn('[trigger-matcher] Database not initialized. Server may still be starting up.');\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:366:      trigger_phrases: string;\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:371:    triggerCache = [];\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:372:    triggerCandidateIndex = new Map();\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:377:        phrases = JSON.parse(row.trigger_phrases);\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:380:        console.warn(`[trigger-matcher] Failed to parse trigger phrases for memory ${row.id}: ${message}`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:405:          triggerId: triggerCache.length,\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:415:        triggerCache.push(entry);\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:429:    return triggerCache;\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:432:    console.warn(`[trigger-matcher] Cache load failed: ${message}`);\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:443:/** Clear the trigger cache (useful for testing or after updates) */\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:445:  triggerCache = null;\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:446:  triggerCandidateIndex = null;\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:455:    size: triggerCache ? triggerCache.length : 0,\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:621:/** Match user prompt against trigger phrases using exact string matching */\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:683:  logExecutionTime('match_trigger_phrases', elapsed, {\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:694:/** Match trigger phrases with additional stats */\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:725:/** Get all unique trigger phrases in the cache */\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:732:  if (cache.length === 0 || !triggerCandidateIndex || triggerCandidateIndex.size === 0) {\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:743:    const indexedIds = triggerCandidateIndex.get(key);\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:748:    for (const triggerId of indexedIds) {\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:749:      candidateIds.add(triggerId);\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:759:    .map((triggerId) => cache[triggerId])\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:763:/** Get memories by trigger phrase */\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/trigger-matcher.ts:787:/** Refresh trigger cache (forces reload on next access) */\\n.opencode/skills/system-spec-kit/mcp_server/tests/pe-gating.vitest.ts:15:    session_id: string | null;\\n.opencode/skills/system-spec-kit/mcp_server/tests/pe-gating.vitest.ts:27:    session_id: null,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/code-graph/README.md:9:| `scan.ts` | `code_graph_scan` | Index workspace files, build structural graph |\\n.opencode/skills/system-spec-kit/mcp_server/handlers/code-graph/README.md:10:| `query.ts` | `code_graph_query` | Query structural relationships (outline, calls, imports) |\\n.opencode/skills/system-spec-kit/mcp_server/handlers/code-graph/README.md:11:| `status.ts` | `code_graph_status` | Report graph health and statistics |\\n.opencode/skills/system-spec-kit/mcp_server/handlers/code-graph/README.md:12:| `context.ts` | `code_graph_context` | LLM-oriented compact graph neighborhoods |\\n.opencode/skills/system-spec-kit/mcp_server/tests/stage2-fusion.vitest.ts:44:vi.mock('../lib/search/session-boost', () => ({\\n.opencode/skills/system-spec-kit/mcp_server/tests/stage2-fusion.vitest.ts:48:vi.mock('../lib/search/causal-boost', () => ({\\n.opencode/skills/system-spec-kit/mcp_server/tests/stage2-fusion.vitest.ts:130:  it('applies learned-trigger match.weight exactly once (no extra 0.7x scaling)', async () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/stage2-fusion.vitest.ts:280:  it('hydrates memoryState for community-injected rows from memory_index', async () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/stage2-fusion.vitest.ts:305:      'SELECT id, memory_state FROM memory_index WHERE id IN (?)'\\n.opencode/skills/system-spec-kit/mcp_server/tests/stage2-fusion.vitest.ts:362:  it('reports sessionBoostApplied as \\\"enabled\\\" when boost runs but finds no data', async () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/stage2-fusion.vitest.ts:363:    vi.doMock('../lib/search/session-boost', () => ({\\n.opencode/skills/system-spec-kit/mcp_server/tests/stage2-fusion.vitest.ts:366:        metadata: { applied: false, enabled: true, sessionId: 'test-001', boostedCount: 0, maxBoostApplied: 0 },\\n.opencode/skills/system-spec-kit/mcp_server/tests/stage2-fusion.vitest.ts:376:    input.config.sessionId = 'test-001';\\n.opencode/skills/system-spec-kit/mcp_server/tests/stage2-fusion.vitest.ts:379:    expect(result.metadata.sessionBoostApplied).toBe('enabled');\\n.opencode/skills/system-spec-kit/mcp_server/tests/stage2-fusion.vitest.ts:382:  it('reports causalBoostApplied as \\\"enabled\\\" when boost runs but finds no edges', async () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/stage2-fusion.vitest.ts:383:    vi.doMock('../lib/search/causal-boost', () => ({\\n.opencode/skills/system-spec-kit/mcp_server/tests/stage2-fusion.vitest.ts:398:    expect(result.metadata.causalBoostApplied).toBe('enabled');\\n.opencode/skills/system-spec-kit/mcp_server/tests/stage2-fusion.vitest.ts:401:  it('reports sessionBoostApplied as \\\"off\\\" when feature is disabled', async () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/stage2-fusion.vitest.ts:408:    input.config.sessionId = 'test-001';\\n.opencode/skills/system-spec-kit/mcp_server/tests/stage2-fusion.vitest.ts:411:    expect(result.metadata.sessionBoostApplied).toBe('off');\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/README.md:3:description: \\\"Markdown parsing, trigger matching, and content normalization for memory and spec-document ingestion.\\\"\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/README.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/README.md:6:  - \\\"trigger matcher\\\"\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/README.md:24:`lib/parsing/` turns markdown files into structured inputs for save, search, and trigger flows. The directory contains three focused modules:\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/README.md:27:- `trigger-matcher.ts` for cached phrase matching against surfaced memories.\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/README.md:37:| `memory-parser.ts` | Parses titles, trigger phrases, tiers, document type, causal links, anchors, and content hashes from markdown files |\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/README.md:38:| `trigger-matcher.ts` | Fast cached trigger matching with Unicode normalization, stats, and debug hooks |\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/README.md:46:- `trigger-matcher.ts` owns the trigger cache, cache stats, memory lookups by phrase, and word-boundary-aware matching.\\n.opencode/skills/system-spec-kit/mcp_server/shared-spaces/README.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/mcp_server/tests/adaptive-ranking-e2e.vitest.ts:7:import Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/tests/adaptive-ranking-e2e.vitest.ts:34:vi.mock('../lib/search/session-boost.js', () => ({\\n.opencode/skills/system-spec-kit/mcp_server/tests/adaptive-ranking-e2e.vitest.ts:38:vi.mock('../lib/search/causal-boost.js', () => ({\\n.opencode/skills/system-spec-kit/mcp_server/tests/hook-session-stop-replay.vitest.ts:5:describe.sequential('Claude session-stop replay harness', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/hook-session-stop-replay.vitest.ts:6:  const fixturePath = fileURLToPath(new URL('./fixtures/hooks/session-stop-replay.jsonl', import.meta.url));\\n.opencode/skills/system-spec-kit/mcp_server/tests/hook-session-stop-replay.vitest.ts:15:    sandbox = createStopReplaySandbox(fixturePath, 'producer-metadata-session');\\n.opencode/skills/system-spec-kit/mcp_server/tests/hook-session-stop-replay.vitest.ts:42:  it('replaying the same transcript twice keeps totals stable and avoids duplicate producer markers', async () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/hook-session-stop-replay.vitest.ts:43:    sandbox = createStopReplaySandbox(fixturePath, 'double-replay-session');\\n.opencode/skills/system-spec-kit/mcp_server/tests/hook-session-stop-replay.vitest.ts:54:    expect(secondRun.state!.claudeSessionId).toBe('double-replay-session');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/code-graph/ccc-reindex.ts:4:// MCP tool handler for ccc_reindex — triggers incremental re-indexing.\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:51:  triggerPhrases: string[];\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:61:  causalLinks: CausalLinks;\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:253:  const triggerPhrases = extractTriggerPhrases(content);\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:265:    triggerPhrases: triggerPhrases,\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:269:  // Extract causal_links for relationship tracking (CHK-231)\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:270:  const causalLinks = extractCausalLinks(content);\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:276:    triggerPhrases: triggerPhrases,\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:288:    causalLinks: causalLinks,\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:289:    hasCausalLinks: hasCausalLinks(causalLinks),\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:382:  'session summary',\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:383:  'session context',\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:541:/** Extract trigger phrases from ## Trigger Phrases section OR YAML frontmatter */\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:543:  const triggers: string[] = [];\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:547:  const inlineMatch = frontmatter.match(/(?:triggerPhrases|trigger_phrases):\\\\s*\\\\[([^\\\\]]+)\\\\]/i);\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:555:          triggers.push(cleaned);\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:562:  if (triggers.length === 0) {\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:567:      if (/^\\\\s*(?:triggerPhrases|trigger_phrases):\\\\s*$/i.test(line)) {\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:579:          if (phrase.length > 0 && phrase.length < 100 && !/^-+$/.test(phrase) && !triggers.includes(phrase)) {\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:580:            triggers.push(phrase);\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:599:        if (phrase.length > 0 && phrase.length < 100 && !triggers.includes(phrase)) {\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:600:          triggers.push(phrase);\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:606:  return triggers;\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:675: * Extract causal_links from memory content YAML metadata block (T126)\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:678:  const causalLinks: CausalLinks = {\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:686:  // Find the causal_links block in YAML metadata\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:687:  const causalBlockMatch = content.match(/(?:^|\\\\n)\\\\s*causalLinks:\\\\s*\\\\n((?:\\\\s+[a-z_]+:[\\\\s\\\\S]*?)*)(?=\\\\n[a-z_]+:|\\\\n```|\\\\n---|\\\\n\\\\n|\\\\n#|$)/i);\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:689:  if (!causalBlockMatch) {\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:690:    return causalLinks;\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:693:  const block = causalBlockMatch[1];\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:716:            if (cleaned && currentKey && !causalLinks[currentKey].includes(cleaned)) {\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:717:              causalLinks[currentKey].push(cleaned);\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:731:        if (value && value !== '[]' && !causalLinks[currentKey].includes(value)) {\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:732:          causalLinks[currentKey].push(value);\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:740:  return causalLinks;\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:744: * Check if causalLinks has any non-empty arrays\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:746:export function hasCausalLinks(causalLinks: CausalLinks | null | undefined): boolean {\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:747:  if (!causalLinks) return false;\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:748:  return Object.values(causalLinks).some((arr: string[]) => Array.isArray(arr) && arr.length > 0);\\n.opencode/skills/system-spec-kit/mcp_server/lib/parsing/memory-parser.ts:965:      // BUG-027 FIX: Skip symbolic links to prevent loops and duplicate scanning\\n.opencode/skills/system-spec-kit/mcp_server/tests/create-record-lineage-regressions.vitest.ts:1:import Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/tests/create-record-lineage-regressions.vitest.ts:19:    INSERT INTO memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/create-record-lineage-regressions.vitest.ts:25:      trigger_phrases,\\n.opencode/skills/system-spec-kit/mcp_server/tests/create-record-lineage-regressions.vitest.ts:52:      sqlite_vec_available: false,\\n.opencode/skills/system-spec-kit/mcp_server/tests/create-record-lineage-regressions.vitest.ts:62:  it('T070-1 routes cross-path PE supersedes to a causal edge target instead of the version chain', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/create-record-lineage-regressions.vitest.ts:75:    expect(routed.causalSupersedesMemoryId).toBe(99);\\n.opencode/skills/system-spec-kit/mcp_server/tests/create-record-lineage-regressions.vitest.ts:91:    expect(routed.causalSupersedesMemoryId).toBeNull();\\n.opencode/skills/system-spec-kit/scripts/tests/utils-regressions.vitest.ts:34:    expect(generateContentSlug('Development session', 'session-summary')).toMatch(/^session-[0-9a-f]{8}$/);\\n.opencode/skills/system-spec-kit/mcp_server/tests/ground-truth-feedback.vitest.ts:88:        sessionId: 'sess-123',\\n.opencode/skills/system-spec-kit/mcp_server/tests/ground-truth-feedback.vitest.ts:137:        searchMode: 'trigger',\\n.opencode/skills/system-spec-kit/mcp_server/tests/ground-truth-feedback.vitest.ts:141:        sessionId: 'sess-456',\\n.opencode/skills/system-spec-kit/mcp_server/tests/ground-truth-feedback.vitest.ts:151:      expect(sel.context.searchMode).toBe('trigger');\\n.opencode/skills/system-spec-kit/mcp_server/tests/ground-truth-feedback.vitest.ts:155:      expect(sel.context.sessionId).toBe('sess-456');\\n.opencode/skills/system-spec-kit/mcp_server/tests/ground-truth-feedback.vitest.ts:431:    it('deduplicates user selections by query_id:memory_id', () => {\\n.opencode/skills/system-spec-kit/scripts/lib/frontmatter-migration.ts:12:import { resolveImportanceTier } from '../extractors/session-extractor';\\n.opencode/skills/system-spec-kit/scripts/lib/frontmatter-migration.ts:58:  trigger_phrases?: string[];\\n.opencode/skills/system-spec-kit/scripts/lib/frontmatter-migration.ts:85:  'session summary',\\n.opencode/skills/system-spec-kit/scripts/lib/frontmatter-migration.ts:86:  'session context',\\n.opencode/skills/system-spec-kit/scripts/lib/frontmatter-migration.ts:1170:function syncMemoryMetadataTriggerPhrases(content: string, triggerPhrases: string[] | undefined): string {\\n.opencode/skills/system-spec-kit/scripts/lib/frontmatter-migration.ts:1171:  const resolvedTriggerPhrases = triggerPhrases && triggerPhrases.length > 0\\n.opencode/skills/system-spec-kit/scripts/lib/frontmatter-migration.ts:1172:    ? triggerPhrases\\n.opencode/skills/system-spec-kit/scripts/lib/frontmatter-migration.ts:1173:    : extractMemoryMetadataStringArray(content, 'trigger_phrases');\\n.opencode/skills/system-spec-kit/scripts/lib/frontmatter-migration.ts:1175:    ? ['trigger_phrases:', ...resolvedTriggerPhrases.map((triggerPhrase) => `  - \\\"${triggerPhrase}\\\"`)]\\n.opencode/skills/system-spec-kit/scripts/lib/frontmatter-migration.ts:1176:    : ['trigger_phrases: []'];\\n.opencode/skills/system-spec-kit/scripts/lib/frontmatter-migration.ts:1179:    upsertTopLevelYamlField(yamlBody, 'trigger_phrases', replacementLines)\\n.opencode/skills/system-spec-kit/scripts/lib/frontmatter-migration.ts:1218:  const trigger_phrases = existingTriggers.length > 0\\n.opencode/skills/system-spec-kit/scripts/lib/frontmatter-migration.ts:1220:    : ['memory dashboard', 'session summary', 'context template'];\\n.opencode/skills/system-spec-kit/scripts/lib/frontmatter-migration.ts:1225:    trigger_phrases,\\n.opencode/skills/system-spec-kit/scripts/lib/frontmatter-migration.ts:1240:  const existingTriggersValue = sectionValueByKeys(sections, ['trigger_phrases', 'triggerPhrases']);\\n.opencode/skills/system-spec-kit/scripts/lib/frontmatter-migration.ts:1278:  const trigger_phrases = inferTriggerPhrases(title, existingTriggers, classification);\\n.opencode/skills/system-spec-kit/scripts/lib/frontmatter-migration.ts:1290:    trigger_phrases,\\n.opencode/skills/system-spec-kit/scripts/lib/frontmatter-migration.ts:1303:  'trigger_phrases',\\n.opencode/skills/system-spec-kit/scripts/lib/frontmatter-migration.ts:1304:  'triggerPhrases',\\n.opencode/skills/system-spec-kit/scripts/lib/frontmatter-migration.ts:1330:  if (managed.trigger_phrases && managed.trigger_phrases.length > 0) {\\n.opencode/skills/system-spec-kit/scripts/lib/frontmatter-migration.ts:1331:    lines.push(...sectionToLines('trigger_phrases', managed.trigger_phrases));\\n.opencode/skills/system-spec-kit/scripts/lib/frontmatter-migration.ts:1396:    content = syncMemoryMetadataTriggerPhrases(content, managed.trigger_phrases);\\n.opencode/skills/system-spec-kit/scripts/lib/session-activity-signal.ts:8:// Aggregates spec-relevant session activity that can help spec-folder\\n.opencode/skills/system-spec-kit/scripts/lib/session-activity-signal.ts:11:import type { CollectedDataBase, FactValue, Observation } from '../types/session-types';\\n.opencode/skills/system-spec-kit/scripts/lib/session-activity-signal.ts:37:  'session',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/code-graph/context.ts:4:// MCP tool handler for code_graph_context — LLM-oriented graph neighborhoods.\\n.opencode/skills/system-spec-kit/mcp_server/handlers/code-graph/context.ts:87:/** Handle code_graph_context tool call */\\n.opencode/skills/system-spec-kit/mcp_server/handlers/code-graph/context.ts:97:    // Auto-trigger: ensure graph is fresh before querying\\n.opencode/skills/system-spec-kit/mcp_server/handlers/code-graph/context.ts:204:          error: 'code_graph_context failed',\\n.opencode/skills/system-spec-kit/mcp_server/tests/intent-classifier.vitest.ts:36:    'consolidate duplicate helper functions',\\n.opencode/skills/system-spec-kit/mcp_server/tests/intent-classifier.vitest.ts:482:describe('T059: autoDetectIntent Parameter (memory_search)', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/community-search.vitest.ts:3:import Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/tests/community-search.vitest.ts:31:    CREATE TABLE community_summaries (\\n.opencode/skills/system-spec-kit/mcp_server/tests/community-search.vitest.ts:120:  it('deduplicates member IDs across communities', () => {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/code-graph/scan.ts:4:// MCP tool handler for code_graph_scan — indexes workspace files.\\n.opencode/skills/system-spec-kit/mcp_server/handlers/code-graph/scan.ts:123:/** Handle code_graph_scan tool call */\\n.opencode/skills/system-spec-kit/mcp_server/tests/retry-manager.vitest.ts:6:import type Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/tests/retry-manager.vitest.ts:234:          INSERT OR REPLACE INTO memory_index\\n.opencode/skills/system-spec-kit/mcp_server/tests/retry-manager.vitest.ts:246:          UPDATE memory_index\\n.opencode/skills/system-spec-kit/mcp_server/tests/retry-manager.vitest.ts:257:        activeDb.prepare(\\\"DELETE FROM memory_index WHERE spec_folder = 'test/spec'\\\").run();\\n.opencode/skills/system-spec-kit/mcp_server/tests/retry-manager.vitest.ts:264:        testDbPath = path.join(os.tmpdir(), `retry-mgr-test-${Date.now()}.sqlite`);\\n.opencode/skills/system-spec-kit/mcp_server/tests/retry-manager.vitest.ts:433:        const row = activeDb.prepare('SELECT embedding_status, failure_reason FROM memory_index WHERE id = ?').get(4001) as {\\n.opencode/skills/system-spec-kit/mcp_server/tests/retry-manager.vitest.ts:449:        activeDb.prepare(\\\"UPDATE memory_index SET updated_at = ? WHERE id = ?\\\").run(oldDate, 4010);\\n.opencode/skills/system-spec-kit/mcp_server/tests/retry-manager.vitest.ts:453:        const row = activeDb.prepare('SELECT updated_at FROM memory_index WHERE id = ?').get(4010) as {\\n.opencode/skills/system-spec-kit/mcp_server/tests/retry-manager.vitest.ts:469:        const row = activeDb.prepare('SELECT embedding_status, retry_count, last_retry_at, failure_reason FROM memory_index WHERE id = ?').get(5001) as {\\n.opencode/skills/system-spec-kit/mcp_server/tests/retry-manager.vitest.ts:522:          CREATE TABLE IF NOT EXISTS vec_memories (\\n.opencode/skills/system-spec-kit/mcp_server/tests/retry-manager.vitest.ts:526:          CREATE TABLE IF NOT EXISTS embedding_cache (\\n.opencode/skills/system-spec-kit/mcp_server/tests/retry-manager.vitest.ts:545:          'SELECT embedding_status, retry_count, failure_reason FROM memory_index WHERE id = ?'\\n.opencode/skills/system-spec-kit/mcp_server/tests/retry-manager.vitest.ts:568:          'SELECT embedding_status, failure_reason FROM memory_index WHERE id = ?'\\n.opencode/skills/system-spec-kit/mcp_server/tests/retry-manager.vitest.ts:648:        const row = activeDb.prepare('SELECT failure_reason FROM memory_index WHERE id = ?').get(8001) as {\\n.opencode/skills/system-spec-kit/mcp_server/tests/retry-manager.vitest.ts:661:        const row1 = activeDb.prepare('SELECT embedding_status FROM memory_index WHERE id = ?').get(8010) as {\\n.opencode/skills/system-spec-kit/mcp_server/tests/retry-manager.vitest.ts:667:        const row2 = activeDb.prepare('SELECT embedding_status FROM memory_index WHERE id = ?').get(8010) as {\\n.opencode/skills/system-spec-kit/mcp_server/tests/contradiction-detection.vitest.ts:4:import Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/tests/contradiction-detection.vitest.ts:26:    CREATE TABLE causal_edges (\\n.opencode/skills/system-spec-kit/mcp_server/tests/contradiction-detection.vitest.ts:44:      INSERT INTO causal_edges (source_id, target_id, relation, invalid_at)\\n.opencode/skills/system-spec-kit/scripts/lib/cli-capture-shared.ts:61: * (gemini-cli uses JSON session files instead of JSONL.)\\n.opencode/skills/system-spec-kit/scripts/lib/cli-capture-shared.ts:182: * Builds a human-readable session title from the first non-empty\\n.opencode/skills/system-spec-kit/scripts/lib/cli-capture-shared.ts:184: * label using the CLI name and session ID prefix.\\n.opencode/skills/system-spec-kit/scripts/lib/cli-capture-shared.ts:190: * @param sessionId - Session identifier for fallback label\\n.opencode/skills/system-spec-kit/scripts/lib/cli-capture-shared.ts:195:  sessionId: string,\\n.opencode/skills/system-spec-kit/scripts/lib/cli-capture-shared.ts:203:  return `${cliName} session ${sessionId.slice(0, 8)}`;\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/core.ts:53:  memory_search: ERROR_CODES.SEARCH_FAILED,\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/core.ts:55:  memory_context: ERROR_CODES.SEARCH_FAILED,\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/core.ts:56:  memory_match_triggers: ERROR_CODES.SEARCH_FAILED,\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/core.ts:57:  memory_save: ERROR_CODES.MEMORY_SAVE_FAILED,\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/core.ts:63:  memory_causal_link: ERROR_CODES.CAUSAL_GRAPH_ERROR,\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/core.ts:64:  memory_causal_stats: ERROR_CODES.CAUSAL_GRAPH_ERROR,\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/core.ts:65:  memory_causal_unlink: ERROR_CODES.CAUSAL_GRAPH_ERROR,\\n.opencode/skills/system-spec-kit/mcp_server/tests/learning-stats-filters.vitest.ts:4:import * as handler from '../handlers/session-learning';\\n.opencode/skills/system-spec-kit/mcp_server/tests/learning-stats-filters.vitest.ts:7:import type { LearningHistoryPayload, LearningHistoryRow } from '../handlers/session-learning';\\n.opencode/skills/system-spec-kit/mcp_server/tests/learning-stats-filters.vitest.ts:88:  // SUITE: Summary stats respect sessionId filter\\n.opencode/skills/system-spec-kit/mcp_server/tests/learning-stats-filters.vitest.ts:89:  describe('T503: Summary stats respect sessionId filter', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/learning-stats-filters.vitest.ts:90:    it('T503-01: sessionId stats filter — totalTasks=1', async () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/learning-stats-filters.vitest.ts:103:        sessionId: sessA,\\n.opencode/skills/system-spec-kit/mcp_server/tests/learning-stats-filters.vitest.ts:120:        sessionId: sessB,\\n.opencode/skills/system-spec-kit/mcp_server/tests/learning-stats-filters.vitest.ts:130:      // Query with sessionId = sessA\\n.opencode/skills/system-spec-kit/mcp_server/tests/learning-stats-filters.vitest.ts:133:        sessionId: sessA,\\n.opencode/skills/system-spec-kit/mcp_server/tests/learning-stats-filters.vitest.ts:143:    it('T503-01b: sessionId records filter consistent', async () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/learning-stats-filters.vitest.ts:157:        sessionId: sessA,\\n.opencode/skills/system-spec-kit/mcp_server/tests/learning-stats-filters.vitest.ts:173:        sessionId: sessB,\\n.opencode/skills/system-spec-kit/mcp_server/tests/learning-stats-filters.vitest.ts:185:        sessionId: sessA,\\n.opencode/skills/system-spec-kit/mcp_server/tests/learning-stats-filters.vitest.ts:192:      const allMatch = data.learningHistory.every(row => row.sessionId === sessA);\\n.opencode/skills/system-spec-kit/mcp_server/tests/learning-stats-filters.vitest.ts:197:    it('T503-01c: sessionId filter normalizes whitespace to match stored records', async () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/learning-stats-filters.vitest.ts:200:      const sessionId = uniqueId('sess-trimmed');\\n.opencode/skills/system-spec-kit/mcp_server/tests/learning-stats-filters.vitest.ts:209:        sessionId: `  ${sessionId}  `,\\n.opencode/skills/system-spec-kit/mcp_server/tests/learning-stats-filters.vitest.ts:217:        sessionId: `  ${sessionId}  `,\\n.opencode/skills/system-spec-kit/mcp_server/tests/learning-stats-filters.vitest.ts:222:        sessionId: `  ${sessionId}  `,\\n.opencode/skills/system-spec-kit/mcp_server/tests/learning-stats-filters.vitest.ts:228:      expect(data.learningHistory[0].sessionId).toBe(sessionId);\\n.opencode/skills/system-spec-kit/mcp_server/tests/learning-stats-filters.vitest.ts:292:  // SUITE: Combined sessionId + onlyComplete filters\\n.opencode/skills/system-spec-kit/mcp_server/tests/learning-stats-filters.vitest.ts:293:  describe('T503: Combined sessionId + onlyComplete filters', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/learning-stats-filters.vitest.ts:306:        sessionId: sessC,\\n.opencode/skills/system-spec-kit/mcp_server/tests/learning-stats-filters.vitest.ts:323:        sessionId: sessC,\\n.opencode/skills/system-spec-kit/mcp_server/tests/learning-stats-filters.vitest.ts:329:        sessionId: sessC,\\n.opencode/skills/system-spec-kit/mcp_server/tests/learning-stats-filters.vitest.ts:353:        sessionId: sessC,\\n.opencode/skills/system-spec-kit/mcp_server/tests/learning-stats-filters.vitest.ts:369:        sessionId: sessC,\\n.opencode/skills/system-spec-kit/mcp_server/tests/learning-stats-filters.vitest.ts:374:        sessionId: sessC,\\n.opencode/skills/system-spec-kit/mcp_server/tests/learning-stats-filters.vitest.ts:429:        FROM session_learning\\n.opencode/skills/system-spec-kit/scripts/lib/decision-tree-generator.ts:20:import type { DecisionRecord } from '../types/session-types';\\n.opencode/skills/system-spec-kit/scripts/lib/decision-tree-generator.ts:28: * Scalar fields are derived from DecisionRecord (session-types.ts) via\\n.opencode/skills/system-spec-kit/mcp_server/tests/causal-boost.vitest.ts:3:import Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/tests/causal-boost.vitest.ts:4:import * as causalBoost from '../lib/search/causal-boost';\\n.opencode/skills/system-spec-kit/mcp_server/tests/causal-boost.vitest.ts:5:import type { RankedSearchResult } from '../lib/search/causal-boost';\\n.opencode/skills/system-spec-kit/mcp_server/tests/causal-boost.vitest.ts:10:    CREATE TABLE causal_edges (\\n.opencode/skills/system-spec-kit/mcp_server/tests/causal-boost.vitest.ts:22:    CREATE TABLE IF NOT EXISTS weight_history (\\n.opencode/skills/system-spec-kit/mcp_server/tests/causal-boost.vitest.ts:24:      edge_id INTEGER NOT NULL REFERENCES causal_edges(id) ON DELETE CASCADE,\\n.opencode/skills/system-spec-kit/mcp_server/tests/causal-boost.vitest.ts:32:    CREATE TABLE memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/causal-boost.vitest.ts:38:      trigger_phrases TEXT,\\n.opencode/skills/system-spec-kit/mcp_server/tests/causal-boost.vitest.ts:42:  causalBoost.init(db);\\n.opencode/skills/system-spec-kit/mcp_server/tests/causal-boost.vitest.ts:46:describe('T038-T044 causal boost', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/causal-boost.vitest.ts:54:      INSERT INTO memory_index (id, spec_folder, file_path, title, importance_tier, trigger_phrases)\\n.opencode/skills/system-spec-kit/mcp_server/tests/causal-boost.vitest.ts:72:  it('T039/T043: computes 1-hop and 2-hop neighbors from causal_edges', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/causal-boost.vitest.ts:74:      INSERT INTO causal_edges (source_id, target_id, relation)\\n.opencode/skills/system-spec-kit/mcp_server/tests/causal-boost.vitest.ts:78:    const boosts = causalBoost.getNeighborBoosts([1]);\\n.opencode/skills/system-spec-kit/mcp_server/tests/causal-boost.vitest.ts:85:  it('T040/T044: applies bounded boost and deduplicates existing semantic results', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/causal-boost.vitest.ts:87:      INSERT INTO causal_edges (source_id, target_id, relation)\\n.opencode/skills/system-spec-kit/mcp_server/tests/causal-boost.vitest.ts:93:      { id: 2, score: 0.6, sessionBoost: 0.1 },\\n.opencode/skills/system-spec-kit/mcp_server/tests/causal-boost.vitest.ts:96:    const { results, metadata } = causalBoost.applyCausalBoost(baseResults as unknown as RankedSearchResult[]);\\n.opencode/skills/system-spec-kit/mcp_server/tests/causal-boost.vitest.ts:106:    const empty = causalBoost.getNeighborBoosts([4]);\\n.opencode/skills/system-spec-kit/mcp_server/tests/causal-boost.vitest.ts:110:      INSERT INTO causal_edges (source_id, target_id, relation)\\n.opencode/skills/system-spec-kit/mcp_server/tests/causal-boost.vitest.ts:114:    const cycle = causalBoost.getNeighborBoosts([1]);\\n.opencode/skills/system-spec-kit/mcp_server/tests/causal-boost.vitest.ts:120:  it('RELATION_WEIGHT_MULTIPLIERS covers all relation types from causal-edges', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/causal-boost.vitest.ts:121:    const boostRelations = Object.keys(causalBoost.RELATION_WEIGHT_MULTIPLIERS);\\n.opencode/skills/system-spec-kit/mcp_server/tests/causal-boost.vitest.ts:133:      INSERT INTO memory_index (id, spec_folder, file_path, title, importance_tier, trigger_phrases)\\n.opencode/skills/system-spec-kit/mcp_server/tests/causal-boost.vitest.ts:146:      INSERT INTO causal_edges (source_id, target_id, relation, strength)\\n.opencode/skills/system-spec-kit/mcp_server/tests/causal-boost.vitest.ts:151:    causalBoost.init(localDb);\\n.opencode/skills/system-spec-kit/mcp_server/tests/causal-boost.vitest.ts:158:    const { results } = causalBoost.applyCausalBoost(baseResults as RankedSearchResult[]);\\n.opencode/skills/system-spec-kit/mcp_server/tests/causal-boost.vitest.ts:165:    expect(injectedResult?.causalBoost).toBeCloseTo(0.05, 6);\\n.opencode/skills/system-spec-kit/mcp_server/tests/causal-boost.vitest.ts:176:      INSERT INTO causal_edges (source_id, target_id, relation, strength)\\n.opencode/skills/system-spec-kit/mcp_server/tests/causal-boost.vitest.ts:179:    causalBoost.init(localDb);\\n.opencode/skills/system-spec-kit/mcp_server/tests/causal-boost.vitest.ts:181:    const boosts = causalBoost.getNeighborBoosts([1]);\\n.opencode/skills/system-spec-kit/mcp_server/tests/sparse-first-graph.vitest.ts:7:} from '../lib/search/causal-boost';\\n.opencode/skills/system-spec-kit/scripts/tests/validate-memory-quality-v8-regex-narrow.vitest.ts:41:  it('passes V8 for a good memory that only contains dates, session ids, and finding ids', () => {\\n.opencode/skills/system-spec-kit/scripts/tests/validate-memory-quality-v8-regex-narrow.vitest.ts:45:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/validate-memory-quality-v8-regex-narrow.vitest.ts:52:This memory references 2026-04-09, session-1775716659098-be14cbc33dbe, 002-I003-P1-001, 008-I001-P1-001,\\n.opencode/skills/system-spec-kit/scripts/tests/validate-memory-quality-v8-regex-narrow.vitest.ts:65:trigger_phrases:\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/README.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/README.md:39:| Tool-Specific Hints | 6 tools | memory_search, checkpoint_restore, memory_save, memory_index_scan, memory_drift_why, memory_causal_link |\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/README.md:132:  return buildErrorResponse('memory_search', error, { query });\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/README.md:142:const hint = getRecoveryHint('memory_search', ERROR_CODES.EMBEDDING_FAILED);\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/README.md:158:  'memory_save'\\n.opencode/skills/system-spec-kit/mcp_server/handlers/code-graph/status.ts:4:// MCP tool handler for code_graph_status — reports graph health.\\n.opencode/skills/system-spec-kit/mcp_server/handlers/code-graph/status.ts:9:/** Handle code_graph_status tool call */\\n.opencode/skills/system-spec-kit/scripts/lib/trigger-extractor.ts:15:} from '@spec-kit/shared/trigger-extractor';\\n.opencode/skills/system-spec-kit/scripts/lib/trigger-extractor.ts:61:export const extract_trigger_phrases = extractTriggerPhrases;\\n.opencode/skills/system-spec-kit/scripts/lib/trigger-extractor.ts:62:export const extract_trigger_phrases_with_stats = extractTriggerPhrasesWithStats;\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-lifecycle.vitest.ts:5:import Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-lifecycle.vitest.ts:45:    CREATE TABLE memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-lifecycle.vitest.ts:54:    CREATE TABLE causal_edges (\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-lifecycle.vitest.ts:65:    CREATE TABLE memory_entities (\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-lifecycle.vitest.ts:76:    CREATE TABLE entity_catalog (\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-lifecycle.vitest.ts:91:    INSERT INTO memory_index (id, spec_folder, file_path, content_text)\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-lifecycle.vitest.ts:96:/** Insert a causal edge between two nodes. */\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-lifecycle.vitest.ts:99:    INSERT OR IGNORE INTO causal_edges (source_id, target_id, relation, strength, created_by)\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-lifecycle.vitest.ts:204:  it('markDirty deduplicates repeated node IDs', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-lifecycle.vitest.ts:303:      INSERT OR IGNORE INTO causal_edges (source_id, target_id, relation, strength, created_by)\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-lifecycle.vitest.ts:314:      `SELECT strength FROM causal_edges WHERE target_id = '2' ORDER BY strength DESC LIMIT 1`\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-lifecycle.vitest.ts:324:    const row = db.prepare(`SELECT strength FROM causal_edges WHERE target_id = '6'`).get() as\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-lifecycle.vitest.ts:420:  it('does not trigger local recompute for empty nodeIds', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-lifecycle.vitest.ts:435:  it('triggers local recompute when component is small', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-lifecycle.vitest.ts:487:  it('deduplicates repeated technologies', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-lifecycle.vitest.ts:606:      `SELECT evidence, created_by FROM causal_edges WHERE source_id = '1' AND target_id = 'tech:typescript'`\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-lifecycle.vitest.ts:613:  it('is idempotent — INSERT OR IGNORE prevents duplicates', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-lifecycle.vitest.ts:676:      `SELECT relation FROM causal_edges WHERE source_id = '1' AND relation = 'heading_link'`\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-lifecycle.vitest.ts:688:      `SELECT relation FROM causal_edges WHERE source_id = '2' AND target_id = 'tech:typescript'`\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-lifecycle.vitest.ts:701:      `SELECT * FROM causal_edges WHERE relation = 'relation_phrase'`\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-lifecycle.vitest.ts:712:      `SELECT evidence FROM causal_edges WHERE created_by = 'graph_lifecycle'`\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-lifecycle.vitest.ts:752:// INTEGRATION: Save triggers dirty-node refresh (REQ-D3-003)\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-lifecycle.vitest.ts:755:describe('Integration: save triggers dirty-node refresh', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-lifecycle.vitest.ts:846:      `SELECT DISTINCT relation FROM causal_edges WHERE created_by = 'graph_lifecycle'`\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-lifecycle.vitest.ts:854:  it('onIndex is idempotent — re-indexing same content does not duplicate edges', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-lifecycle.vitest.ts:860:      `SELECT COUNT(*) AS cnt FROM causal_edges WHERE created_by = 'graph_lifecycle'`\\n.opencode/skills/system-spec-kit/mcp_server/tests/graph-lifecycle.vitest.ts:865:      `SELECT COUNT(*) AS cnt FROM causal_edges WHERE created_by = 'graph_lifecycle'`\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:157:      'Run memory_index_scan with force=true to rebuild index',\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:162:    toolTip: 'memory_index_scan({ force: true })'\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:278:      'If no checkpoint available, rebuild index: memory_index_scan({ force: true })'\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:357:      'Use memory_match_triggers() for prompt-based matching instead'\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:360:    toolTip: 'memory_match_triggers()'\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:467:      'Start a new session with fresh sessionId',\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:469:      'Consider using /spec_kit:resume for session recovery'\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:474:    hint: 'Invalid session identifier.',\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:476:      'Provide a valid session ID string',\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:478:      'Omit sessionId to disable session deduplication'\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:483:    hint: 'Failed to recover session state.',\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:486:      'Start fresh with new sessionId',\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:509:      'Use memory_save({ dryRun: true }) to validate first',\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:513:    toolTip: 'memory_save({ dryRun: true })'\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:539:      'Check memory_search() for existing similar content'\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:542:    toolTip: 'memory_save({ force: true })'\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:549:      'Run memory_save({ dryRun: true }) for detailed validation report',\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:554:    toolTip: 'memory_save({ dryRun: true })'\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:590:      'Check memory_causal_stats() for graph status'\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:593:    toolTip: 'memory_causal_stats()'\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:606:    hint: 'Invalid causal relation type.',\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:610:      'See memory_causal_link() documentation for relation semantics'\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:615:    hint: 'Cannot create self-referential causal link.',\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:625:    hint: 'The causal graph operation failed.',\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:628:      'Run memory_causal_stats() to inspect graph health',\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:632:    toolTip: 'memory_causal_stats()'\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:635:    hint: 'The causal traversal could not be completed.',\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:638:      'Run memory_causal_stats() to inspect graph integrity',\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:694:  memory_search: {\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:700:        'Try memory_match_triggers() for trigger-based matching'\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:703:      toolTip: 'memory_match_triggers()'\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:709:        'Run memory_index_scan() to rebuild if needed',\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:713:      toolTip: 'memory_index_scan()'\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:742:  memory_save: {\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:747:        'Create the memory file before calling memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:748:        'Use generate-context.js script to create memory files'\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:770:      toolTip: 'memory_save({ dryRun: true })'\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:775:  memory_index_scan: {\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:801:  // Memory_causal_link specific hints\\n.opencode/skills/system-spec-kit/mcp_server/lib/errors/recovery-hints.ts:802:  memory_causal_link: {\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-signal-extractor.ts:8:// Unifies script-side semantic preprocessing so topic, trigger,\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-signal-extractor.ts:9:// session, and summary extraction share one contract.\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-signal-extractor.ts:17:  deduplicateSubstrings,\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-signal-extractor.ts:27:} from '@spec-kit/shared/trigger-extractor';\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-signal-extractor.ts:32:} from './topic-keywords';\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-signal-extractor.ts:33:import { sanitizeTriggerPhrase } from './trigger-phrase-sanitizer';\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-signal-extractor.ts:35:export type SemanticSignalMode = 'topics' | 'triggers' | 'summary' | 'all';\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-signal-extractor.ts:56:  topics: string[];\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-signal-extractor.ts:102:  'session',\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-signal-extractor.ts:269:  const deduplicated = deduplicateSubstrings(allCandidates);\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-signal-extractor.ts:270:  const techFiltered = filterTechStopWords(deduplicated);\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-signal-extractor.ts:278:  if (topPhrases.length < minPhraseCount && deduplicated.length > 0) {\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-signal-extractor.ts:279:    return deduplicated\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-signal-extractor.ts:298:  const deduplicated = deduplicateSubstrings(scoredCandidates);\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-signal-extractor.ts:300:  return deduplicated\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-signal-extractor.ts:328: * Provides mode-aware extraction for topics, triggers, summaries, or all signals combined.\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-signal-extractor.ts:329: * All script-side extractors (trigger, topic, session, summary) delegate to this class.\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-signal-extractor.ts:341:    const minLength = options.mode === 'topics' ? 20 : TRIGGER_CONFIG.MIN_CONTENT_LENGTH;\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-signal-extractor.ts:351:        topics: [],\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-signal-extractor.ts:382:    const topics = buildTopicTerms(cleanedText, filteredTokens, ngramDepth);\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-signal-extractor.ts:383:    const rankedTerms = options.mode === 'topics'\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-signal-extractor.ts:384:      ? topics\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-signal-extractor.ts:397:      phrases: options.mode === 'topics' ? topics : phrases,\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-signal-extractor.ts:398:      topics,\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-signal-extractor.ts:412:  /** Extracts trigger phrases from text using balanced stopwords and ngram depth 2 by default. */\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-signal-extractor.ts:416:      mode: 'triggers',\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-signal-extractor.ts:424:  /** Extracts trigger phrases with extraction stats and breakdown metadata. */\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-signal-extractor.ts:428:      mode: 'triggers',\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-signal-extractor.ts:442:  /** Extracts topic terms from text using aggressive stopwords and ngram depth 2 by default. */\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-signal-extractor.ts:446:      mode: 'topics',\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-signal-extractor.ts:449:    }).topics;\\n.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-triggers.vitest.ts:4:import * as handler from '../handlers/memory-triggers';\\n.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-triggers.vitest.ts:6:import * as triggerMatcher from '../lib/parsing/trigger-matcher';\\n.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-triggers.vitest.ts:13:import * as sessionManager from '../lib/session/session-manager';\\n.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-triggers.vitest.ts:19:} from '../lib/parsing/trigger-matcher';\\n.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-triggers.vitest.ts:76:    it('T517-2: handle_memory_match_triggers alias exported', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-triggers.vitest.ts:77:      expect(typeof handler.handle_memory_match_triggers).toBe('function');\\n.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-triggers.vitest.ts:144:  it('logs final eval result even when no trigger matches are found', async () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-triggers.vitest.ts:145:    vi.spyOn(triggerMatcher, 'matchTriggerPhrasesWithStats').mockReturnValue(\\n.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-triggers.vitest.ts:161:    expect(data.matchType).toContain('trigger-phrase');\\n.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-triggers.vitest.ts:166:      fusionMethod: 'trigger',\\n.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-triggers.vitest.ts:170:  it('routes through trigger signal vocabulary path without changing response shape', async () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-triggers.vitest.ts:174:    vi.spyOn(triggerMatcher, 'matchTriggerPhrasesWithStats').mockReturnValue(\\n.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-triggers.vitest.ts:183:    const triggerSignals = getArray(meta.triggerSignals);\\n.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-triggers.vitest.ts:188:    expect(triggerSignals).toHaveLength(1);\\n.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-triggers.vitest.ts:191:  it('surfaces degraded trigger matching metadata when trigger parsing partially fails', async () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-triggers.vitest.ts:192:    vi.spyOn(triggerMatcher, 'matchTriggerPhrasesWithStats').mockReturnValue(\\n.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-triggers.vitest.ts:198:          failures: [{ code: 'E_TRIGGER_SOURCE_PARSE', message: 'bad trigger payload', memoryId: 9 }],\\n.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-triggers.vitest.ts:224:    vi.spyOn(triggerMatcher, 'matchTriggerPhrasesWithStats').mockReturnValue(\\n.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-triggers.vitest.ts:252:    vi.spyOn(workingMemory, 'sessionExists').mockReturnValue(true);\\n.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-triggers.vitest.ts:253:    vi.spyOn(sessionManager, 'resolveTrustedSession').mockReturnValue({\\n.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-triggers.vitest.ts:254:      requestedSessionId: 'session-1',\\n.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-triggers.vitest.ts:255:      effectiveSessionId: 'session-1',\\n.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-triggers.vitest.ts:269:      session_id: 'session-1',\\n.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-triggers.vitest.ts:276:    expect(data.matchType).toBe('trigger-phrase-cognitive');\\n.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-triggers.vitest.ts:282:  it('filters trigger matches by governed scope fields when provided', async () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-triggers.vitest.ts:283:    vi.spyOn(triggerMatcher, 'matchTriggerPhrasesWithStats').mockReturnValue(\\n.opencode/skills/system-spec-kit/scripts/tests/optimizer-replay-corpus.vitest.ts:61:      const content = '{\\\"type\\\":\\\"config\\\",\\\"topic\\\":\\\"test\\\"}\\\\n{\\\"type\\\":\\\"iteration\\\",\\\"run\\\":1}\\\\n';\\n.opencode/skills/system-spec-kit/scripts/tests/optimizer-replay-corpus.vitest.ts:64:      expect(result.records[0]).toEqual({ type: 'config', topic: 'test' });\\n.opencode/skills/system-spec-kit/mcp_server/tests/full-spec-doc-indexing.vitest.ts:55:import { createSpecDocumentChain, RELATION_TYPES } from '../lib/storage/causal-edges';\\n.opencode/skills/system-spec-kit/mcp_server/tests/full-spec-doc-indexing.vitest.ts:565:      // Query about bugs should not trigger spec bonus\\n.opencode/skills/system-spec-kit/mcp_server/tests/full-spec-doc-indexing.vitest.ts:855:        trigger_phrases: '[]',\\n.opencode/skills/system-spec-kit/mcp_server/tests/full-spec-doc-indexing.vitest.ts:871:        session_id: null,\\n.opencode/skills/system-spec-kit/mcp_server/tests/full-spec-doc-indexing.vitest.ts:898:        trigger_phrases: '[]',\\n.opencode/skills/system-spec-kit/mcp_server/tests/full-spec-doc-indexing.vitest.ts:914:        session_id: null,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/types.ts:5:// Previously declared duplicates locally — now imports from the\\n.opencode/skills/system-spec-kit/scripts/lib/memory-telemetry.ts:7:export const METRIC_M1_MEMORY_SAVE_OVERVIEW_LENGTH_HISTOGRAM = 'memory_save_overview_length_histogram';\\n.opencode/skills/system-spec-kit/scripts/lib/memory-telemetry.ts:8:export const METRIC_M2_MEMORY_SAVE_DECISION_FALLBACK_USED_TOTAL = 'memory_save_decision_fallback_used_total';\\n.opencode/skills/system-spec-kit/scripts/lib/memory-telemetry.ts:9:export const METRIC_M3_MEMORY_SAVE_TRIGGER_PHRASE_REJECTED_TOTAL = 'memory_save_trigger_phrase_rejected_total';\\n.opencode/skills/system-spec-kit/scripts/lib/memory-telemetry.ts:10:export const METRIC_M4_MEMORY_SAVE_FRONTMATTER_TIER_DRIFT_TOTAL = 'memory_save_frontmatter_tier_drift_total';\\n.opencode/skills/system-spec-kit/scripts/lib/memory-telemetry.ts:11:export const METRIC_M5_MEMORY_SAVE_CONTINUATION_SIGNAL_HIT_TOTAL = 'memory_save_continuation_signal_hit_total';\\n.opencode/skills/system-spec-kit/scripts/lib/memory-telemetry.ts:12:export const METRIC_M6_MEMORY_SAVE_GIT_PROVENANCE_MISSING_TOTAL = 'memory_save_git_provenance_missing_total';\\n.opencode/skills/system-spec-kit/scripts/lib/memory-telemetry.ts:13:export const METRIC_M7_MEMORY_SAVE_TEMPLATE_ANCHOR_VIOLATIONS_TOTAL = 'memory_save_template_anchor_violations_total';\\n.opencode/skills/system-spec-kit/scripts/lib/memory-telemetry.ts:14:export const METRIC_M8_MEMORY_SAVE_REVIEW_VIOLATION_TOTAL = 'memory_save_review_violation_total';\\n.opencode/skills/system-spec-kit/scripts/lib/memory-telemetry.ts:15:export const METRIC_M9_MEMORY_SAVE_DURATION_SECONDS = 'memory_save_duration_seconds';\\n.opencode/skills/system-spec-kit/mcp_server/tests/channel-representation.vitest.ts:379:      ['trigger', [makeChannelResult('t1', 0.4)]],\\n.opencode/skills/system-spec-kit/mcp_server/tests/channel-representation.vitest.ts:387:    expect(result.underRepresentedChannels).toContain('trigger');\\n.opencode/skills/system-spec-kit/mcp_server/tests/empty-result-recovery.vitest.ts:55:    triggerPhrases: ['retrieval', 'recovery'],\\n.opencode/skills/system-spec-kit/scripts/lib/memory-frontmatter.ts:6:import { extractTriggerPhrases } from './trigger-extractor';\\n.opencode/skills/system-spec-kit/scripts/lib/memory-frontmatter.ts:11:  'session summary',\\n.opencode/skills/system-spec-kit/scripts/lib/memory-frontmatter.ts:59:export function hasLegacyGenericTriggerPhrases(triggerPhrases: string[]): boolean {\\n.opencode/skills/system-spec-kit/scripts/lib/memory-frontmatter.ts:60:  if (triggerPhrases.length !== LEGACY_GENERIC_MEMORY_TRIGGER_PHRASES.length) {\\n.opencode/skills/system-spec-kit/scripts/lib/memory-frontmatter.ts:64:  const normalized = triggerPhrases\\n.opencode/skills/system-spec-kit/scripts/lib/memory-frontmatter.ts:71:export function containsLegacyGenericTriggerPhrase(triggerPhrases: string[]): boolean {\\n.opencode/skills/system-spec-kit/scripts/lib/memory-frontmatter.ts:72:  const normalized = triggerPhrases\\n.opencode/skills/system-spec-kit/mcp_server/tests/startup-brief.vitest.ts:20:    { name: 'handleSessionBootstrap', kind: 'function', filePath: 'mcp_server/handlers/session-bootstrap.ts', callCount: 5 },\\n.opencode/skills/system-spec-kit/mcp_server/tests/startup-brief.vitest.ts:30:    claudeSessionId: 'recent-session',\\n.opencode/skills/system-spec-kit/mcp_server/tests/startup-brief.vitest.ts:31:    speckitSessionId: 'speckit-session',\\n.opencode/skills/system-spec-kit/mcp_server/tests/startup-brief.vitest.ts:33:    sessionSummary: {\\n.opencode/skills/system-spec-kit/mcp_server/tests/startup-brief.vitest.ts:34:      text: 'Aligned structural bootstrap contract across auto-prime and session_* handlers.',\\n.opencode/skills/system-spec-kit/mcp_server/tests/startup-brief.vitest.ts:59:  it('builds graph outline and session continuity when data exists', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/startup-brief.vitest.ts:66:    expect(brief.sessionContinuity).toContain('Last session worked on');\\n.opencode/skills/system-spec-kit/mcp_server/tests/startup-brief.vitest.ts:67:    expect(brief.sessionContinuity).toContain('Summary:');\\n.opencode/skills/system-spec-kit/mcp_server/tests/startup-brief.vitest.ts:70:    expect(brief.startupSurface).toContain('- Memory: session continuity available');\\n.opencode/skills/system-spec-kit/mcp_server/tests/startup-brief.vitest.ts:97:    expect(brief.startupSurface).toContain('- Code Graph: empty -- run `code_graph_scan`');\\n.opencode/skills/system-spec-kit/mcp_server/tests/startup-brief.vitest.ts:150:    expect(brief.sessionContinuity).toBeNull();\\n.opencode/skills/system-spec-kit/mcp_server/handlers/checkpoints.ts:12:import * as triggerMatcher from '../lib/parsing/trigger-matcher.js';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/checkpoints.ts:92:  sessionId?: string;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/checkpoints.ts:127:    FROM sqlite_master\\n.opencode/skills/system-spec-kit/mcp_server/handlers/checkpoints.ts:492:      triggerMatcher.refreshTriggerCache();\\n.opencode/skills/system-spec-kit/mcp_server/handlers/checkpoints.ts:573:      : ['Restore merged with existing data - duplicates may exist', 'Search indexes rebuilt'],\\n.opencode/skills/system-spec-kit/mcp_server/handlers/checkpoints.ts:661:    sessionId,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/checkpoints.ts:688:      actor: sessionId ?? 'memory_validate',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/checkpoints.ts:741:      sessionId,\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:1:import Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:29:      sessionId: 'session-1',\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:40:      { id: 1, tenant_id: 'tenant-a', user_id: 'user-1', session_id: 'session-1' },\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:41:      { id: 2, tenant_id: 'tenant-a', user_id: 'user-2', session_id: 'session-1' },\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:42:      { id: 3, tenant_id: 'tenant-b', user_id: 'user-1', session_id: 'session-1' },\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:46:      sessionId: 'session-1',\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:55:      { tenant_id: 'a', user_id: 'u1', agent_id: null, session_id: null, shared_space_id: null },\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:56:      { tenant_id: 'b', user_id: 'u2', agent_id: null, session_id: null, shared_space_id: null },\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:64:  it('honors explicit session scope even when global scope enforcement is disabled', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:66:      { id: 1, tenant_id: 'tenant-a', user_id: 'user-1', session_id: 'session-1' },\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:67:      { id: 2, tenant_id: 'tenant-a', user_id: 'user-1', session_id: 'session-2' },\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:69:      sessionId: 'session-1',\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:78:      CREATE TABLE memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:82:        session_id TEXT\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:88:      action: 'memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:92:      sessionId: 'session-1',\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:103:      action: 'memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:110:  it('persists session_id as a queryable governance post-insert column', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:114:      sessionId: 'session-123',\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:125:      session_id: 'session-123',\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:127:    expect(ALLOWED_POST_INSERT_COLUMNS.has('session_id')).toBe(true);\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:133:      CREATE TABLE memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:137:        session_id TEXT\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:143:      action: 'memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:147:      sessionId: 'session-1',\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:152:      action: 'memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:156:      sessionId: 'session-1',\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:164:      sessionId: 'session-9',\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:170:      action: 'memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:176:    expect(review.summary.byAction).toEqual({ memory_save: 2 });\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:181:      action: 'memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:185:      sessionId: 'session-1',\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:189:      action: 'memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:198:      CREATE TABLE memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:202:        session_id TEXT\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:207:      action: 'memory_save',\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:211:      sessionId: 'session-1',\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:232:      { id: 1, tenant_id: 'tenant-a', user_id: 'user-1', session_id: 'session-1', shared_space_id: 'space-1' },\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:233:      { id: 2, tenant_id: 'tenant-a', user_id: 'user-1', session_id: 'session-1', shared_space_id: 'space-2' },\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:234:      { id: 3, tenant_id: 'tenant-a', user_id: 'user-2', session_id: 'session-1', shared_space_id: 'space-1' },\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:235:      { id: 4, tenant_id: 'tenant-b', user_id: 'user-1', session_id: 'session-1', shared_space_id: 'space-1' },\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:242:      sessionId: 'session-1',\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:249:      sessionId: 'session-1',\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-governance.vitest.ts:255:      sessionId: 'session-1',\\n.opencode/skills/system-spec-kit/mcp_server/tests/spec-folder-prefilter.vitest.ts:18:import Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/tests/spec-folder-prefilter.vitest.ts:71:vi.mock('../lib/search/sqlite-fts', () => ({\\n.opencode/skills/system-spec-kit/mcp_server/tests/spec-folder-prefilter.vitest.ts:72:  fts5Bm25Search: vi.fn(() => []),\\n.opencode/skills/system-spec-kit/mcp_server/tests/spec-folder-prefilter.vitest.ts:133:    sessionId: undefined,\\n.opencode/skills/system-spec-kit/mcp_server/tests/spec-folder-prefilter.vitest.ts:157:    CREATE TABLE IF NOT EXISTS memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/spec-folder-prefilter.vitest.ts:182:    `INSERT INTO memory_index (title, file_path, importance_tier, importance_weight, spec_folder)\\n.opencode/skills/system-spec-kit/mcp_server/tests/spec-folder-prefilter.vitest.ts:473:        concepts: ['authentication', 'session management'],\\n.opencode/skills/system-spec-kit/mcp_server/lib/eval/ground-truth-feedback.ts:28:  /** The search mode used (e.g. \\\"search\\\", \\\"context\\\", \\\"trigger\\\"). */\\n.opencode/skills/system-spec-kit/mcp_server/lib/eval/ground-truth-feedback.ts:37:  sessionId?: string;\\n.opencode/skills/system-spec-kit/mcp_server/lib/eval/ground-truth-feedback.ts:121:  CREATE TABLE IF NOT EXISTS eval_user_selections (\\n.opencode/skills/system-spec-kit/mcp_server/lib/eval/ground-truth-feedback.ts:129:    session_id TEXT,\\n.opencode/skills/system-spec-kit/mcp_server/lib/eval/ground-truth-feedback.ts:134:  CREATE TABLE IF NOT EXISTS eval_llm_judge_labels (\\n.opencode/skills/system-spec-kit/mcp_server/lib/eval/ground-truth-feedback.ts:238:         total_results_shown, session_id, notes)\\n.opencode/skills/system-spec-kit/mcp_server/lib/eval/ground-truth-feedback.ts:247:      selectionContext.sessionId ?? null,\\n.opencode/skills/system-spec-kit/mcp_server/lib/eval/ground-truth-feedback.ts:281:             selected_rank, total_results_shown, session_id, notes,\\n.opencode/skills/system-spec-kit/mcp_server/lib/eval/ground-truth-feedback.ts:295:      session_id: string | null;\\n.opencode/skills/system-spec-kit/mcp_server/lib/eval/ground-truth-feedback.ts:309:        sessionId: row.session_id ?? undefined,\\n.opencode/skills/system-spec-kit/mcp_server/tests/copilot-hook-wiring.vitest.ts:11:const sessionStartScriptPath = resolve(repoRoot, '.github/hooks/scripts/session-start.sh');\\n.opencode/skills/system-spec-kit/mcp_server/tests/copilot-hook-wiring.vitest.ts:18:    expect(parsed.hooks.sessionStart[0].bash).toContain('copilot-hook.sh sessionStart');\\n.opencode/skills/system-spec-kit/mcp_server/tests/copilot-hook-wiring.vitest.ts:19:    expect(parsed.hooks.sessionEnd[0].bash).toContain('copilot-hook.sh sessionEnd');\\n.opencode/skills/system-spec-kit/mcp_server/tests/copilot-hook-wiring.vitest.ts:24:  it('sessionStart wrapper emits the startup banner and snapshot note', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/copilot-hook-wiring.vitest.ts:25:    const output = execFileSync(sessionStartScriptPath, {\\n.opencode/skills/system-spec-kit/mcp_server/tests/copilot-hook-wiring.vitest.ts:36:    const output = execFileSync(supersetNotifyScriptPath, ['sessionEnd'], {\\n.opencode/skills/system-spec-kit/mcp_server/tests/mcp-tool-dispatch.vitest.ts:6:  { tool: 'memory_context', handler: 'handleMemoryContext', layer: 'L1' },\\n.opencode/skills/system-spec-kit/mcp_server/tests/mcp-tool-dispatch.vitest.ts:7:  { tool: 'memory_search', handler: 'handleMemorySearch', layer: 'L2' },\\n.opencode/skills/system-spec-kit/mcp_server/tests/mcp-tool-dispatch.vitest.ts:8:  { tool: 'memory_match_triggers', handler: 'handleMemoryMatchTriggers', layer: 'L2' },\\n.opencode/skills/system-spec-kit/mcp_server/tests/mcp-tool-dispatch.vitest.ts:9:  { tool: 'memory_save', handler: 'handleMemorySave', layer: 'L2' },\\n.opencode/skills/system-spec-kit/mcp_server/tests/mcp-tool-dispatch.vitest.ts:23:  { tool: 'memory_causal_link', handler: 'handleMemoryCausalLink', layer: 'L6' },\\n.opencode/skills/system-spec-kit/mcp_server/tests/mcp-tool-dispatch.vitest.ts:24:  { tool: 'memory_causal_stats', handler: 'handleMemoryCausalStats', layer: 'L6' },\\n.opencode/skills/system-spec-kit/mcp_server/tests/mcp-tool-dispatch.vitest.ts:25:  { tool: 'memory_causal_unlink', handler: 'handleMemoryCausalUnlink', layer: 'L6' },\\n.opencode/skills/system-spec-kit/mcp_server/tests/mcp-tool-dispatch.vitest.ts:28:  { tool: 'memory_index_scan', handler: 'handleMemoryIndexScan', layer: 'L7' },\\n.opencode/skills/system-spec-kit/mcp_server/tests/mcp-tool-dispatch.vitest.ts:33:  { camel: 'handleMemorySearch', snake: 'handle_memory_search' },\\n.opencode/skills/system-spec-kit/mcp_server/tests/mcp-tool-dispatch.vitest.ts:34:  { camel: 'handleMemoryMatchTriggers', snake: 'handle_memory_match_triggers' },\\n.opencode/skills/system-spec-kit/mcp_server/tests/mcp-tool-dispatch.vitest.ts:35:  { camel: 'handleMemorySave', snake: 'handle_memory_save' },\\n.opencode/skills/system-spec-kit/mcp_server/tests/mcp-tool-dispatch.vitest.ts:50:  { camel: 'handleMemoryCausalLink', snake: 'handle_memory_causal_link' },\\n.opencode/skills/system-spec-kit/mcp_server/tests/mcp-tool-dispatch.vitest.ts:51:  { camel: 'handleMemoryCausalStats', snake: 'handle_memory_causal_stats' },\\n.opencode/skills/system-spec-kit/mcp_server/tests/mcp-tool-dispatch.vitest.ts:52:  { camel: 'handleMemoryCausalUnlink', snake: 'handle_memory_causal_unlink' },\\n.opencode/skills/system-spec-kit/mcp_server/tests/mcp-tool-dispatch.vitest.ts:55:  { camel: 'handleMemoryIndexScan', snake: 'handle_memory_index_scan' },\\n.opencode/skills/system-spec-kit/mcp_server/tests/mcp-tool-dispatch.vitest.ts:56:  { camel: 'handleMemoryContext', snake: 'handle_memory_context' },\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:9:import type BetterSqlite3 from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:12:import * as causalEdges from '../lib/storage/causal-edges.js';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:17:// Feature catalog: Causal edge creation (memory_causal_link)\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:18:// Feature catalog: Causal edge deletion (memory_causal_unlink)\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:19:// Feature catalog: Memory indexing (memory_save)\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:26:  relation: typeof causalEdges.RELATION_TYPES[keyof typeof causalEdges.RELATION_TYPES];\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:67:  caused_by: { relation: causalEdges.RELATION_TYPES.CAUSED, reverse: true },\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:68:  supersedes: { relation: causalEdges.RELATION_TYPES.SUPERSEDES, reverse: false },\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:69:  derived_from: { relation: causalEdges.RELATION_TYPES.DERIVED_FROM, reverse: false },\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:70:  blocks: { relation: causalEdges.RELATION_TYPES.ENABLED, reverse: true },\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:71:  related_to: { relation: causalEdges.RELATION_TYPES.SUPPORTS, reverse: false }\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:105:    isSessionLike: normalizedLower.includes('session') || /^\\\\d{4}-\\\\d{2}-\\\\d{2}/.test(normalizedReference),\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:137:  const rows = database.prepare('PRAGMA table_info(memory_index)').all() as Array<{ name?: string }>;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:182:      FROM memory_index\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:218:        FROM memory_index\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:225:        FROM memory_index\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:263:      FROM memory_index\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:291:      FROM memory_index\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:299:      FROM memory_index\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:306:    FROM memory_index\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:340:/** Process causal link declarations from a memory file and insert edges into the graph */\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:341:function processCausalLinks(database: BetterSqlite3.Database, memoryId: number, causalLinks: CausalLinks): CausalLinksResult {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:350:  if (!causalLinks || typeof causalLinks !== 'object') {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:354:  // Initialize causal-edges module with database connection\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:355:  causalEdges.init(database);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:359:  for (const references of Object.values(causalLinks)) {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:366:  for (const [link_type, references] of Object.entries(causalLinks)) {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:373:      console.warn(`[causal-links] Unknown link type: ${link_type}`);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:387:        console.warn(`[causal-links] Failed to resolve reference \\\"${reference}\\\": ${message}`);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:402:        causalEdges.insertEdge(edgeSourceId, edgeTargetId, mapping.relation, 1.0, `Auto-extracted from ${link_type} in memory file`);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:404:        console.error(`[causal-links] Inserted edge: ${edgeSourceId} -[${mapping.relation}]-> ${edgeTargetId}`);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:408:          console.error(`[causal-links] Edge already exists: ${edgeSourceId} -[${mapping.relation}]-> ${edgeTargetId}`);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/causal-links-processor.ts:411:          console.warn(`[causal-links] Failed to insert edge: ${message}`);\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:5:// Returns 'duplicate' for identical content (same spec_folder,\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:9:import Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:27: * Create a minimal in-memory DB with the memory_index schema\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:33:    CREATE TABLE IF NOT EXISTS memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:40:      trigger_phrases TEXT,\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:50:      session_id TEXT,\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:58:    CREATE INDEX IF NOT EXISTS idx_content_hash ON memory_index(content_hash);\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:77:    sessionId?: string | null;\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:83:    INSERT INTO memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:93:      session_id,\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:107:    scope.sessionId ?? null,\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:117:    triggerPhrases: [],\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:147:    it('T054-1: Returns undefined when memory_index is empty', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:162:    it('T054-3: Detects duplicate when same content saved under different file path', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:163:      const content = 'This is duplicate content saved under two different paths.';\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:180:      expect(result!.status).toBe('duplicate');\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:184:    it('T054-4: Changing 1 character produces a different hash — dedup does NOT trigger', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:202:      // Query with modified hash — should NOT find a duplicate\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:213:        INSERT INTO memory_index (spec_folder, file_path, content_hash, embedding_status)\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:236:    it('T054-6aa: Cross-tenant duplicates do not dedup when governance scope differs', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:262:      const content = 'Same-tenant duplicates should still be caught.';\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:276:        buildParsedMemory(folder, content, 'Tenant A duplicate'),\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:283:      expect(result?.status).toBe('duplicate');\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:329:        INSERT INTO memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:413:        INSERT INTO memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:434:        INSERT INTO memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:452:    it('T054-6f: Same-path unchanged does not short-circuit when trigger phrases changed', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:453:      const content = 'Existing same-path row with stale trigger phrases.';\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:456:        INSERT INTO memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:457:          spec_folder, file_path, canonical_file_path, title, content_hash, embedding_status, trigger_phrases, quality_score, quality_flags, parent_id\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:465:        JSON.stringify(['legacy-trigger']),\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:482:    it('T054-6g: Same-path metadata drift is not reclassified as folder duplicate', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:483:      const content = 'Existing same-path row with stale trigger phrases.';\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:486:        INSERT INTO memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:487:          spec_folder, file_path, canonical_file_path, title, content_hash, embedding_status, trigger_phrases, quality_score, quality_flags, parent_id\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:495:        JSON.stringify(['legacy-trigger']),\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:504:          triggerPhrases: ['fresh-trigger'],\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:515:      const content = 'Intentional same-path force save should not be rejected as duplicate.';\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:518:        INSERT INTO memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:540:    it('T054-6h: Cross-path duplicates remain detectable when legacy rows have NULL canonical_file_path', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:545:        INSERT INTO memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:563:      expect(result?.status).toBe('duplicate');\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:572:        INSERT INTO memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:597:        INSERT INTO memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:626:        INSERT INTO memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:710:      expect(result).toHaveProperty('status', 'duplicate');\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:722:        INSERT INTO memory_index (spec_folder, file_path, content_hash, embedding_status)\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:747:              title: 'Canonical duplicate from FTS',\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:748:              content: 'fts duplicate entry',\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:770:      title: 'Canonical duplicate from vector',\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:771:      content: 'vector duplicate entry',\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:790:  it('deduplicates canonical IDs when includeContent=false (default production path)', async () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/content-hash-dedup.vitest.ts:812:  it('deduplicates canonical IDs when includeContent=true', async () => {\\n.opencode/skills/system-spec-kit/scripts/lib/phase-classifier.ts:15:} from '../types/session-types';\\n.opencode/skills/system-spec-kit/scripts/lib/phase-classifier.ts:53:/** Result of classifying conversation exchanges into topic clusters and phases. */\\n.opencode/skills/system-spec-kit/scripts/lib/phase-classifier.ts:55:  topicClusters: TopicCluster[];\\n.opencode/skills/system-spec-kit/scripts/lib/phase-classifier.ts:220:  for (const topic of extracted.topics) {\\n.opencode/skills/system-spec-kit/scripts/lib/phase-classifier.ts:221:    addWeight(vector, topic, 3);\\n.opencode/skills/system-spec-kit/scripts/lib/phase-classifier.ts:222:    addWeight(semanticVector, topic, 3);\\n.opencode/skills/system-spec-kit/scripts/lib/phase-classifier.ts:441:/** Classifies conversation exchanges into topic clusters, phases, and a flow pattern. */\\n.opencode/skills/system-spec-kit/scripts/lib/phase-classifier.ts:445:      topicClusters: [],\\n.opencode/skills/system-spec-kit/scripts/lib/phase-classifier.ts:510:    topicClusters: classifiedClusters.map(({\\n.opencode/skills/system-spec-kit/mcp_server/lib/eval/edge-density.ts:4:// Measures the edge density of the causal graph:\\n.opencode/skills/system-spec-kit/mcp_server/lib/eval/edge-density.ts:19:import type Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/lib/eval/edge-density.ts:31:  /** Total number of rows in causal_edges. */\\n.opencode/skills/system-spec-kit/mcp_server/lib/eval/edge-density.ts:35:  /** Total memories in memory_index (used for coverage context). */\\n.opencode/skills/system-spec-kit/mcp_server/lib/eval/edge-density.ts:45:  /** true when density < 0.5 — triggers R10 escalation. */\\n.opencode/skills/system-spec-kit/mcp_server/lib/eval/edge-density.ts:61: * Measure the edge density of the causal graph stored in `database`.\\n.opencode/skills/system-spec-kit/mcp_server/lib/eval/edge-density.ts:64: *   - Total edge count from causal_edges.\\n.opencode/skills/system-spec-kit/mcp_server/lib/eval/edge-density.ts:66: *   - Total memory count from memory_index (coverage context).\\n.opencode/skills/system-spec-kit/mcp_server/lib/eval/edge-density.ts:68: * @param database - An initialized better-sqlite3 Database instance.\\n.opencode/skills/system-spec-kit/mcp_server/lib/eval/edge-density.ts:75:      .prepare('SELECT COUNT(*) AS cnt FROM causal_edges')\\n.opencode/skills/system-spec-kit/mcp_server/lib/eval/edge-density.ts:83:          SELECT source_id AS node_id FROM causal_edges\\n.opencode/skills/system-spec-kit/mcp_server/lib/eval/edge-density.ts:85:          SELECT target_id AS node_id FROM causal_edges\\n.opencode/skills/system-spec-kit/mcp_server/lib/eval/edge-density.ts:91:    // Total memories in memory_index (for coverage context)\\n.opencode/skills/system-spec-kit/mcp_server/lib/eval/edge-density.ts:93:      .prepare('SELECT COUNT(*) AS cnt FROM memory_index')\\n.opencode/skills/system-spec-kit/mcp_server/lib/eval/edge-density.ts:98:    // If memory_index is empty but edges exist, fall back to participating nodes.\\n.opencode/skills/system-spec-kit/mcp_server/lib/eval/edge-density.ts:203:    '  Approach  : Add causal links for constitutional and critical tier memories',\\n.opencode/skills/system-spec-kit/mcp_server/tests/eval-metrics.vitest.ts:549:  it('T005-01: computePrecision deduplicates repeated relevant IDs', () => {\\n.opencode/skills/system-spec-kit/mcp_server/handlers/README.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/mcp_server/handlers/README.md:30:- `memory-triggers.ts` - Trigger phrase matching, tiered content injection, and session-aware matching.\\n.opencode/skills/system-spec-kit/mcp_server/handlers/README.md:37:- `session-learning.ts` - Task preflight, postflight, and learning history handlers.\\n.opencode/skills/system-spec-kit/mcp_server/handlers/README.md:38:- `causal-graph.ts` - Causal link, unlink, stats, and drift-why handlers.\\n.opencode/skills/system-spec-kit/mcp_server/handlers/README.md:44:- `code-graph/scan.ts` - `code_graph_scan`: index workspace files, build structural graph.\\n.opencode/skills/system-spec-kit/mcp_server/handlers/README.md:45:- `code-graph/query.ts` - `code_graph_query`: query structural relationships (outline, calls, imports).\\n.opencode/skills/system-spec-kit/mcp_server/handlers/README.md:46:- `code-graph/status.ts` - `code_graph_status`: report graph health and statistics.\\n.opencode/skills/system-spec-kit/mcp_server/handlers/README.md:47:- `code-graph/context.ts` - `code_graph_context`: LLM-oriented compact graph neighborhoods.\\n.opencode/skills/system-spec-kit/mcp_server/handlers/README.md:59:- `causal-links-processor.ts`, `chunking-orchestrator.ts` - Save/index support helpers.\\n.opencode/skills/system-spec-kit/mcp_server/handlers/README.md:70:- `memory-index.ts` and `mutation-hooks.ts` work together so index, update, and stale-delete flows clear trigger, constitutional, graph, co-activation, and degree caches.\\n.opencode/skills/system-spec-kit/mcp_server/handlers/README.md:80:- Post-mutation invalidation clears `clearDegreeCache()` alongside trigger and constitutional caches so graph-derived retrieval signals cannot serve stale data after mutations.\\n.opencode/skills/system-spec-kit/mcp_server/tests/ground-truth.vitest.ts:11:// T007.6  — No duplicate query strings\\n.opencode/skills/system-spec-kit/mcp_server/tests/ground-truth.vitest.ts:20:import Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/tests/ground-truth.vitest.ts:67:const VALID_SOURCES: QuerySource[] = ['manual', 'trigger_derived', 'pattern_derived', 'seed'];\\n.opencode/skills/system-spec-kit/mcp_server/tests/ground-truth.vitest.ts:74:  CREATE TABLE IF NOT EXISTS eval_queries (\\n.opencode/skills/system-spec-kit/mcp_server/tests/ground-truth.vitest.ts:85:  CREATE TABLE IF NOT EXISTS eval_ground_truth (\\n.opencode/skills/system-spec-kit/mcp_server/tests/ground-truth.vitest.ts:217:   T007.4: ≥30 manual queries (NOT trigger-derived)\\n.opencode/skills/system-spec-kit/mcp_server/tests/ground-truth.vitest.ts:226:  it('T007.4.2: manual queries are not source=\\\"trigger_derived\\\"', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/ground-truth.vitest.ts:229:      expect(q.source).not.toBe('trigger_derived');\\n.opencode/skills/system-spec-kit/mcp_server/tests/ground-truth.vitest.ts:288:   T007.6: No duplicate query strings\\n.opencode/skills/system-spec-kit/mcp_server/tests/ground-truth.vitest.ts:462:  it('T007.8.10: uniqueness gate passes (no duplicate strings)', () => {\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-summarizer.ts:88:  triggerPhrases: string[];\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-summarizer.ts:332:    /^modified? during session$/i,\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-summarizer.ts:476:  let task: string = 'Development session';\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-summarizer.ts:496:  if (task === 'Development session' && questionMessages.length > 0) {\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-summarizer.ts:589:  const triggerPhrases: string[] = SemanticSignalExtractor.extract({\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-summarizer.ts:603:    triggerPhrases: triggerPhrases,\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-summarizer.ts:650:  if (summary.triggerPhrases && summary.triggerPhrases.length > 0) {\\n.opencode/skills/system-spec-kit/scripts/lib/semantic-summarizer.ts:652:    lines.push(`\\\\`${summary.triggerPhrases.join('`, `')}\\\\``);\\n.opencode/skills/system-spec-kit/mcp_server/tests/hooks-ux-feedback.vitest.ts:10:      triggerCacheCleared: true,\\n.opencode/skills/system-spec-kit/mcp_server/tests/hooks-ux-feedback.vitest.ts:21:      triggerCacheCleared: true,\\n.opencode/skills/system-spec-kit/mcp_server/tests/hooks-ux-feedback.vitest.ts:37:      triggerCacheCleared: true,\\n.opencode/skills/system-spec-kit/mcp_server/tests/hooks-ux-feedback.vitest.ts:51:      triggerCacheCleared: true,\\n.opencode/skills/system-spec-kit/mcp_server/tests/hooks-ux-feedback.vitest.ts:86:      triggered: [{ id: 3 }],\\n.opencode/skills/system-spec-kit/mcp_server/tests/hooks-ux-feedback.vitest.ts:93:    expect(parsed.hints.some((hint: string) => hint.includes('Auto-surface hook: injected 2 constitutional and 1 triggered memories (6ms)'))).toBe(true);\\n.opencode/skills/system-spec-kit/mcp_server/tests/hooks-ux-feedback.vitest.ts:96:      triggeredCount: 1,\\n.opencode/skills/system-spec-kit/mcp_server/tests/hooks-ux-feedback.vitest.ts:111:    expect(() => appendAutoSurfaceHints(malformedResult, { constitutional: [], triggered: [] })).not.toThrow();\\n.opencode/skills/system-spec-kit/mcp_server/tests/hooks-ux-feedback.vitest.ts:115:    expect(() => appendAutoSurfaceHints(noTextResult, { constitutional: [], triggered: [] })).not.toThrow();\\n.opencode/skills/system-spec-kit/mcp_server/tests/hooks-ux-feedback.vitest.ts:118:  it('appendAutoSurfaceHints skips hint injection when constitutional and triggered are empty', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/hooks-ux-feedback.vitest.ts:133:    appendAutoSurfaceHints(result, { constitutional: [], triggered: [] });\\n.opencode/skills/system-spec-kit/scripts/lib/wave-segment-planner.cjs:238: * @param {string[]} [sources[].topics] - Topics this source covers\\n.opencode/skills/system-spec-kit/scripts/lib/wave-segment-planner.cjs:253:    topics: Array.isArray(s.topics) ? [...s.topics].sort() : [],\\n.opencode/skills/system-spec-kit/mcp_server/handlers/memory-index-discovery.ts:17:// Feature catalog: Workspace scanning and indexing (memory_index_scan)\\n.opencode/skills/system-spec-kit/mcp_server/tests/promotion-positive-validation-semantics.vitest.ts:6:import BetterSqlite3 from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/tests/promotion-positive-validation-semantics.vitest.ts:28:    INSERT INTO memory_index (id, title, confidence, validation_count, importance_tier, updated_at)\\n.opencode/skills/system-spec-kit/mcp_server/tests/promotion-positive-validation-semantics.vitest.ts:35:    dbPath = path.join(os.tmpdir(), `promotion-positive-semantics-${Date.now()}-${Math.random()}.sqlite`);\\n.opencode/skills/system-spec-kit/mcp_server/tests/promotion-positive-validation-semantics.vitest.ts:38:      CREATE TABLE IF NOT EXISTS memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/promotion-positive-validation-semantics.vitest.ts:111:    const row = db.prepare('SELECT importance_tier FROM memory_index WHERE id = 4').get() as {\\n.opencode/skills/system-spec-kit/mcp_server/tests/mpab-quality-gate-integration.vitest.ts:8:import Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/tests/mpab-quality-gate-integration.vitest.ts:111:    triggerPhrases: ['test', 'memory'],\\n.opencode/skills/system-spec-kit/mcp_server/tests/mpab-quality-gate-integration.vitest.ts:246:      // Content with no title, no triggers, very short — should fail structural + quality\\n.opencode/skills/system-spec-kit/mcp_server/tests/mpab-quality-gate-integration.vitest.ts:251:        triggerPhrases: [],\\n.opencode/skills/system-spec-kit/mcp_server/tests/mpab-quality-gate-integration.vitest.ts:266:trigger_phrases: [integration test, quality gate, validation]\\n.opencode/skills/system-spec-kit/mcp_server/tests/mpab-quality-gate-integration.vitest.ts:281:Signal density is computed as a weighted average of title quality, trigger quality, length quality,\\n.opencode/skills/system-spec-kit/mcp_server/tests/mpab-quality-gate-integration.vitest.ts:289:        triggerPhrases: ['integration test', 'quality gate', 'validation'],\\n.opencode/skills/system-spec-kit/mcp_server/tests/mpab-quality-gate-integration.vitest.ts:340:  it('S4-INT-09: Reconsolidation merges duplicates (similarity >= 0.88)', withEnvVars(\\n.opencode/skills/system-spec-kit/mcp_server/tests/mpab-quality-gate-integration.vitest.ts:359:          CREATE TABLE memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/mpab-quality-gate-integration.vitest.ts:365:            trigger_phrases TEXT DEFAULT '[]',\\n.opencode/skills/system-spec-kit/mcp_server/tests/mpab-quality-gate-integration.vitest.ts:377:          CREATE TABLE vec_memories (\\n.opencode/skills/system-spec-kit/mcp_server/tests/mpab-quality-gate-integration.vitest.ts:382:          CREATE TABLE causal_edges (\\n.opencode/skills/system-spec-kit/mcp_server/tests/mpab-quality-gate-integration.vitest.ts:395:          CREATE TABLE weight_history (\\n.opencode/skills/system-spec-kit/mcp_server/tests/mpab-quality-gate-integration.vitest.ts:405:          CREATE TABLE memory_lineage (\\n.opencode/skills/system-spec-kit/mcp_server/tests/mpab-quality-gate-integration.vitest.ts:420:          CREATE TABLE active_memory_projection (\\n.opencode/skills/system-spec-kit/mcp_server/tests/mpab-quality-gate-integration.vitest.ts:429:          INSERT INTO memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/mpab-quality-gate-integration.vitest.ts:484:  it('S4-INT-11: Save with similarity in [0.88, 0.92] passes quality gate then triggers reconsolidation merge', withEnvVars(\\n.opencode/skills/system-spec-kit/mcp_server/tests/mpab-quality-gate-integration.vitest.ts:490:trigger_phrases: [implementation, quality gate, reconsolidation]\\n.opencode/skills/system-spec-kit/mcp_server/tests/mpab-quality-gate-integration.vitest.ts:510:        triggerPhrases: ['implementation', 'quality gate', 'reconsolidation'],\\n.opencode/skills/system-spec-kit/mcp_server/tests/mpab-quality-gate-integration.vitest.ts:831:    // In this range, reconsolidation merges but quality gate does NOT reject as duplicate\\n.opencode/skills/system-spec-kit/mcp_server/tests/mpab-quality-gate-integration.vitest.ts:844:  it('S4-INT-26: Similarity >= 0.92 triggers both dedup rejection AND merge', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/mpab-quality-gate-integration.vitest.ts:845:    // At this similarity, quality gate WOULD reject as near-duplicate\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-types.vitest.ts:106:        { path: '/project/session-1-summary.md', expected: 'episodic' },\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-types.vitest.ts:167:        { title: 'Debug session notes', expected: 'episodic' },\\n.opencode/skills/system-spec-kit/mcp_server/tests/memory-types.vitest.ts:194:        triggerPhrases: [],\\n.opencode/skills/system-spec-kit/mcp_server/tests/token-snapshot-store.vitest.ts:9:  const sessionId = 'test-snapshot-store';\\n.opencode/skills/system-spec-kit/mcp_server/tests/token-snapshot-store.vitest.ts:12:  afterEach(() => { try { rmSync(getStatePath(sessionId)); } catch { /* ok */ } });\\n.opencode/skills/system-spec-kit/mcp_server/tests/token-snapshot-store.vitest.ts:15:    updateState(sessionId, {\\n.opencode/skills/system-spec-kit/mcp_server/tests/token-snapshot-store.vitest.ts:18:    const state = loadState(sessionId);\\n.opencode/skills/system-spec-kit/mcp_server/tests/token-snapshot-store.vitest.ts:26:    updateState(sessionId, {\\n.opencode/skills/system-spec-kit/mcp_server/tests/token-snapshot-store.vitest.ts:29:    updateState(sessionId, {\\n.opencode/skills/system-spec-kit/mcp_server/tests/token-snapshot-store.vitest.ts:32:    const state = loadState(sessionId);\\n.opencode/skills/system-spec-kit/mcp_server/tests/token-snapshot-store.vitest.ts:38:    updateState(sessionId, { lastSpecFolder: 'specs/test' });\\n.opencode/skills/system-spec-kit/mcp_server/tests/token-snapshot-store.vitest.ts:39:    updateState(sessionId, {\\n.opencode/skills/system-spec-kit/mcp_server/tests/token-snapshot-store.vitest.ts:42:    const state = loadState(sessionId);\\n.opencode/skills/system-spec-kit/mcp_server/tests/archival-manager.vitest.ts:21:import Database from 'better-sqlite3';\\n.opencode/skills/system-spec-kit/mcp_server/tests/archival-manager.vitest.ts:66:    CREATE TABLE memory_index (\\n.opencode/skills/system-spec-kit/mcp_server/tests/archival-manager.vitest.ts:105:    INSERT INTO memory_index (spec_folder, file_path, title, content_text, importance_tier, created_at, last_accessed, access_count, confidence, is_pinned, stability, half_life_days)\\n.opencode/skills/system-spec-kit/mcp_server/tests/archival-manager.vitest.ts:144:      const columns = requireDb().prepare('PRAGMA table_info(memory_index)').all() as Array<{ name: string }>;\\n.opencode/skills/system-spec-kit/mcp_server/tests/archival-manager.vitest.ts:295:      const row = requireDb().prepare('SELECT is_archived FROM memory_index WHERE id = ?').get(memory_id) as { is_archived: number };\\n.opencode/skills/system-spec-kit/mcp_server/tests/archival-manager.vitest.ts:314:      const row = requireDb().prepare('SELECT is_archived FROM memory_index WHERE id = ?').get(memory_id) as { is_archived: number };\\n.opencode/skills/system-spec-kit/mcp_server/tests/archival-manager.vitest.ts:371:    it('T059-011b: archiveMemory removes vec_memories row but preserves memory_index archive state', () => {\\n.opencode/skills/system-spec-kit/mcp_server/tests/archival-manager.vitest.ts:382:      requireDb().exec('CREATE TABLE IF NOT EXISTS vec_memories (embedding BLOB)');\\n.opencode/skills/system-spec-kit/mcp_server/tests/archival-manager.vitest.ts:396:        .prepare('SELECT is_archived FROM memory_index WHERE id = ?')\\n.opencode/skills/system-spec-kit/mcp_server/tests/archival-manager.vitest.ts:419:      requireDb().exec('CREATE TABLE IF NOT EXISTS vec_memories (embedding BLOB)');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-learning.ts:30:  sessionId?: string | null;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-learning.ts:41:  sessionId?: string | null;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-learning.ts:46:  sessionId?: string;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-learning.ts:68:  sessionId: string | null;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-learning.ts:113:  session_id?: string | null;\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-learning.ts:130:  CREATE TABLE IF NOT EXISTS session_learning (\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-learning.ts:135:    session_id TEXT,\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-learning.ts:161:  CREATE INDEX IF NOT EXISTS idx_session_learning_spec_folder\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-learning.ts:162:  ON session_learning(spec_folder)\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-learning.ts:166:  CREATE INDEX IF NOT EXISTS idx_session_learning_task_lookup\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-learning.ts:167:  ON session_learning(spec_folder, task_id, session_id, phase, updated_at, id)\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-learning.ts:175:  'session_id',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-learning.ts:209:    FROM sqlite_master\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-learning.ts:210:    WHERE type = 'table' AND name = 'session_learning'\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-learning.ts:217:  const tempTableName = 'session_learning_legacy_migration';\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-learning.ts:221:    database.exec(`ALTER TABLE session_learning RENAME TO ${tempTableName}`);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-learning.ts:224:      INSERT INTO session_learning (${SESSION_LEARNING_COLUMNS})\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-learning.ts:240:      'Failed to migrate session_learning schema',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-learning.ts:246:/** Initialize the session_learning table schema if not already created */\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-learning.ts:258:    console.error('[session-learning] Schema initialized');\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-learning.ts:261:    console.error('[session-learning] Schema initialization failed:', message);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-learning.ts:264:      'Failed to initialize session_learning schema',\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-learning.ts:272: * Extracted from duplicate blocks in handleTaskPreflight and handleTaskPostflight.\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-learning.ts:309:    sessionId: session_id = null\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-learning.ts:334:  const normalizedSessionId = normalizeSessionId(session_id);\\n.opencode/skills/system-spec-kit/mcp_server/handlers/session-learning.ts:337:  // same session (or in thekit/scripts/tests/input-normalizer-unit.vitest.ts:69:    expect(files[0].DESCRIPTION).toBe('Modified during session');\\n.opencode/skills/system-spec-kit/scripts/tests/input-normalizer-unit.vitest.ts:102:    expect(files[0].DESCRIPTION).toBe('Modified during session');\\n.opencode/skills/system-spec-kit/scripts/tests/input-normalizer-unit.vitest.ts:166:      sessionSummary: 'Test',\\n.opencode/skills/system-spec-kit/scripts/tests/input-normalizer-unit.vitest.ts:174:      sessionSummary: 'Test',\\n.opencode/skills/system-spec-kit/scripts/tests/input-normalizer-unit.vitest.ts:192:      sessionSummary: 'Test',\\n.opencode/skills/system-spec-kit/scripts/tests/input-normalizer-unit.vitest.ts:199:  it('preserves explicit title, description, and causalLinks through the slow path', () => {\\n.opencode/skills/system-spec-kit/scripts/tests/input-normalizer-unit.vitest.ts:201:      sessionSummary: 'Slow-path metadata propagation test.',\\n.opencode/skills/system-spec-kit/scripts/tests/input-normalizer-unit.vitest.ts:204:      causalLinks: {\\n.opencode/skills/system-spec-kit/scripts/tests/input-normalizer-unit.vitest.ts:205:        supersedes: ['previous-session'],\\n.opencode/skills/system-spec-kit/scripts/tests/input-normalizer-unit.vitest.ts:206:        derivedFrom: ['planning-session'],\\n.opencode/skills/system-spec-kit/scripts/tests/input-normalizer-unit.vitest.ts:212:    expect(result.causalLinks).toMatchObject({\\n.opencode/skills/system-spec-kit/scripts/tests/input-normalizer-unit.vitest.ts:213:      supersedes: ['previous-session'],\\n.opencode/skills/system-spec-kit/scripts/tests/input-normalizer-unit.vitest.ts:214:      derivedFrom: ['planning-session'],\\n.opencode/skills/system-spec-kit/scripts/tests/input-normalizer-unit.vitest.ts:215:      derived_from: ['planning-session'],\\n.opencode/skills/system-spec-kit/scripts/tests/input-normalizer-unit.vitest.ts:217:    expect(result.causal_links).toMatchObject({\\n.opencode/skills/system-spec-kit/scripts/tests/input-normalizer-unit.vitest.ts:218:      supersedes: ['previous-session'],\\n.opencode/skills/system-spec-kit/scripts/tests/input-normalizer-unit.vitest.ts:219:      derivedFrom: ['planning-session'],\\n.opencode/skills/system-spec-kit/scripts/tests/input-normalizer-unit.vitest.ts:223:  it('preserves explicit title, description, and causal_links through the fast path', () => {\\n.opencode/skills/system-spec-kit/scripts/tests/input-normalizer-unit.vitest.ts:230:      causal_links: {\\n.opencode/skills/system-spec-kit/scripts/tests/input-normalizer-unit.vitest.ts:238:    expect(result.causalLinks).toMatchObject({\\n.opencode/skills/system-spec-kit/scripts/tests/input-normalizer-unit.vitest.ts:243:    expect(result.causal_links).toMatchObject({\\n.opencode/skills/system-spec-kit/scripts/tests/input-normalizer-unit.vitest.ts:253:      user_prompts: ['Capture the session context'],\\n.opencode/skills/system-spec-kit/scripts/tests/input-normalizer-unit.vitest.ts:259:    expect(result.userPrompts[0].prompt).toBe('Capture the session context');\\n.opencode/skills/system-spec-kit/scripts/tests/input-normalizer-unit.vitest.ts:280:      sessionSummary: 'Patched the fast-path normalizer and verified the save flow end to end.',\\n.opencode/skills/system-spec-kit/scripts/tests/input-normalizer-unit.vitest.ts:305:  it('deduplicates duplicate observations in fast-path structured payloads', () => {\\n.opencode/skills/system-spec-kit/scripts/tests/workflow-e2e.vitest.ts:12:import { buildRichSessionData, buildSparseSessionData, buildTreeThinningSessionData } from './fixtures/session-data-factory';\\n.opencode/skills/system-spec-kit/scripts/tests/workflow-e2e.vitest.ts:32:const SPEC_RELATIVE_PATH = 'system-spec-kit/022-hybrid-rag-fusion/009-perfect-session-capturing/010-integration-testing';\\n.opencode/skills/system-spec-kit/scripts/tests/workflow-e2e.vitest.ts:80:    description: 'Integration testing coverage for the perfect session capturing save pipeline.',\\n.opencode/skills/system-spec-kit/scripts/tests/workflow-e2e.vitest.ts:114:      'trigger_phrases:',\\n.opencode/skills/system-spec-kit/scripts/tests/workflow-e2e.vitest.ts:115:      '  - \\\"perfect session capturing\\\"',\\n.opencode/skills/system-spec-kit/scripts/tests/workflow-e2e.vitest.ts:153:    session_summary: 'Implemented the integration testing phase with a real workflow save harness and Vitest migration.',\\n.opencode/skills/system-spec-kit/scripts/tests/workflow-e2e.vitest.ts:154:    trigger_phrases: [\\n.opencode/skills/system-spec-kit/scripts/tests/workflow-e2e.vitest.ts:155:      'perfect session capturing',\\n.opencode/skills/system-spec-kit/scripts/tests/workflow-e2e.vitest.ts:166:        prompt: 'Cover duplicate deduplication, insufficiency aborts, index failures, and tree-thinning interaction.',\\n.opencode/skills/system-spec-kit/scripts/tests/workflow-e2e.vitest.ts:190:        request: 'Finish integration testing for perfect session capturing.',\\n.opencode/skills/system-spec-kit/scripts/tests/workflow-e2e.vitest.ts:208:      'Keep deterministic session data collection limited to save-boundary assertions that would otherwise flap.',\\n.opencode/skills/system-spec-kit/scripts/tests/workflow-e2e.vitest.ts:272:  process.env.MEMORY_DB_PATH = path.join(harness.dbDir, 'context-index.sqlite');\\n.opencode/skills/system-spec-kit/scripts/tests/workflow-e2e.vitest.ts:411:    expect(rendered).not.toContain('> **Note:** This session had limited actionable content');\\n.opencode/skills/system-spec-kit/scripts/tests/workflow-e2e.vitest.ts:412:    expect(rendered).not.toContain('<!-- WARNING: This is simulated/placeholder content - NOT from a real session -->');\\n.opencode/skills/system-spec-kit/scripts/tests/workflow-e2e.vitest.ts:444:      session_summary: 'Exercise the write-only indexing disposition for an index-blocking rule.',\\n.opencode/skills/system-spec-kit/scripts/tests/workflow-e2e.vitest.ts:469:  it('skips duplicate markdown content on a second identical save without bumping description tracking', async () => {\\n.opencode/skills/system-spec-kit/scripts/tests/workflow-e2e.vitest.ts:472:    const dataFile = writeInputFile(harness, 'duplicate.json', createExplicitJsonInput());\\n.opencode/skills/system-spec-kit/scripts/tests/workflow-e2e.vitest.ts:474:    const sessionDataFactory = async (_collectedData: unknown, specFolderName?: string | null) => (\\n.opencode/skills/system-spec-kit/scripts/tests/workflow-e2e.vitest.ts:481:      collectSessionDataFn: sessionDataFactory,\\n.opencode/skills/system-spec-kit/scripts/tests/workflow-e2e.vitest.ts:489:      collectSessionDataFn: sessionDataFactory,\\n.opencode/skills/system-spec-kit/scripts/tests/workflow-e2e.vitest.ts:502:  it.skip('creates unique filenames and independent indexing records for same-minute non-duplicate saves', async () => {\\n.opencode/skills/system-spec-kit/scripts/tests/workflow-e2e.vitest.ts:511:      session_summary: 'First same-minute save to verify unique filename generation.',\\n.opencode/skills/system-spec-kit/scripts/tests/workflow-e2e.vitest.ts:524:      session_summary: 'Second same-minute save to verify collision-safe filename generation.',\\n.opencode/skills/system-spec-kit/scripts/tests/workflow-e2e.vitest.ts:567:      session_summary: 'Sparse insufficiency probe for the workflow guard chain.',\\n.opencode/skills/system-spec-kit/scripts/tests/workflow-e2e.vitest.ts:568:      trigger_phrases: ['integration testing', 'sufficiency'],\\n.opencode/skills/system-spec-kit/scripts/tests/workflow-e2e.vitest.ts:624:      trigger_phrases: ['tree thinning', 'workflow integration', 'memory sequence'],\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:7:const Database = require('better-sqlite3');\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:17:// Track sqlite-vec availability (loaded once)\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:18:let sqliteVecAvailable = false;\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:20:let sqliteVecUnavailableReason = '';\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:26:  const sqliteVec = require('sqlite-vec');\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:27:  loadSqliteVec = sqliteVec.load;\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:31:    sqliteVecAvailable = true;\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:33:    sqliteVecUnavailableReason = e instanceof Error ? e.message : String(e);\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:34:    sqliteVecAvailable = false;\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:39:  sqliteVecUnavailableReason = e instanceof Error ? e.message : String(e);\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:40:  sqliteVecAvailable = false;\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:111: * @param {boolean} opts.withVec - Include vec_memories virtual table (default true, requires sqlite-vec)\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:112: * @returns {Database} better-sqlite3 Database instance\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:123:  // Core memory_index table (simplified for tests)\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:125:    CREATE TABLE memory_index (\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:140:      CREATE TABLE memory_history (\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:149:        FOREIGN KEY (memory_id) REFERENCES memory_index(id)\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:154:  // Vec_memories virtual table (requires sqlite-vec extension)\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:155:  if (withVec && sqliteVecAvailable) {\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:168: * Insert a memory record into memory_index.\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:173:    INSERT INTO memory_index (spec_folder, file_path, title)\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:234:    if (content.includes('memory_history') && content.includes('LEFT JOIN memory_index')) {\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:324:    LEFT JOIN memory_index m ON h.memory_id = m.id\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:350:    db.prepare('DELETE FROM memory_index WHERE id = ?').run(memId);\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:382:    db.prepare('DELETE FROM memory_index WHERE id = ?').run(toDeleteId);\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:404:    db.prepare('DELETE FROM memory_index WHERE id = ?').run(toDeleteId);\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:436:  if (!sqliteVecAvailable) {\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:437:    skip('T-COV-003a: Orphaned vector detection (entire section)', `sqlite-vec unavailable: ${sqliteVecUnavailableReason || 'unknown reason'}`);\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:444:    LEFT JOIN memory_index m ON v.rowid = m.id\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:468:    db.prepare('DELETE FROM memory_index WHERE id = ?').run(memId);\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:501:      db.prepare('DELETE FROM memory_index WHERE id = ?').run(memIds[i]);\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:518:    db.prepare('DELETE FROM memory_index WHERE id = ?').run(memId);\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:548:    db.exec('DELETE FROM memory_index');\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:589:    const db = createTestDatabase({ withVec: sqliteVecAvailable });\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:597:    if (sqliteVecAvailable) {\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:603:    const memoryCount = db.prepare('SELECT COUNT(*) as count FROM memory_index').get();\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:604:    assertEqual(memoryCount.count, 2, 'T-COV-004a: memory_index count is correct');\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:609:    if (sqliteVecAvailable) {\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:613:      skip('T-COV-004c: vec_memories count', `sqlite-vec unavailable: ${sqliteVecUnavailableReason || 'unknown reason'}`);\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:623:    const db = createTestDatabase({ withVec: sqliteVecAvailable });\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:635:    if (sqliteVecAvailable) {\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:642:    db.prepare('DELETE FROM memory_index WHERE id = ?').run(toDelete);\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:647:      LEFT JOIN memory_index m ON h.memory_id = m.id\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:656:    if (sqliteVecAvailable) {\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:659:        LEFT JOIN memory_index m ON v.rowid = m.id\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:669:    const finalMemCount = db.prepare('SELECT COUNT(*) as count FROM memory_index').get();\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:670:    assertEqual(finalMemCount.count, 2, 'T-COV-004d: memory_index count after cleanup');\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:675:    if (sqliteVecAvailable) {\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:679:      skip('T-COV-004f: vec_memories count after cleanup', `sqlite-vec unavailable: ${sqliteVecUnavailableReason || 'unknown reason'}`);\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:750:      LEFT JOIN memory_index m ON h.memory_id = m.id\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:760:  // Test 3: Database with only memory_index (no history, no vectors to clean)\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:768:      LEFT JOIN memory_index m ON h.memory_id = m.id\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:784:    db.prepare('DELETE FROM memory_index WHERE id = ?').run(memId);\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:863:    db.prepare(`INSERT INTO memory_index (id, spec_folder, file_path, title) VALUES (?, ?, ?, ?)`).run(\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:869:    db.prepare('DELETE FROM memory_index WHERE id = ?').run(99999);\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:873:      LEFT JOIN memory_index m ON h.memory_id = m.id\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:896:  if (!sqliteVecAvailable) {\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:897:    skip('T-COV-006a: Full cleanup workflow (entire section)', `sqlite-vec unavailable: ${sqliteVecUnavailableReason || 'unknown reason'}`);\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:927:      db.prepare('DELETE FROM memory_index WHERE id = ?').run(id);\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:931:    const preMemCount = db.prepare('SELECT COUNT(*) as count FROM memory_index').get();\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:946:      LEFT JOIN memory_index m ON h.memory_id = m.id\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:967:      LEFT JOIN memory_index m ON v.rowid = m.id\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:992:    const finalMemCount = db.prepare('SELECT COUNT(*) as count FROM memory_index').get();\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:1004:      LEFT JOIN memory_index m ON h.memory_id = m.id WHERE m.id IS NULL\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:1010:      LEFT JOIN memory_index m ON v.rowid = m.id WHERE m.id IS NULL\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:1122:  log(`sqlite-vec available: ${sqliteVecAvailable}`);\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:1123:  if (!sqliteVecAvailable && sqliteVecUnavailableReason) {\\n.opencode/skills/system-spec-kit/scripts/tests/test-cleanup-orphaned-vectors.js:1124:    log(`sqlite-vec unavailable reason: ${sqliteVecUnavailableReason}`);\\n.opencode/skills/system-spec-kit/scripts/renderers/README.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/renderers/README.md:25:The `renderers/` directory turns extracted session data into markdown output for memory and spec-context documents.\\n.opencode/skills/system-spec-kit/scripts/renderers/template-renderer.ts:8:// Mustache-based template engine — renders memory files from collected session data\\n.opencode/skills/system-spec-kit/scripts/types/README.md:3:description: \\\"Shared session type definitions used across the Spec Kit scripts pipeline.\\\"\\n.opencode/skills/system-spec-kit/scripts/types/README.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/types/README.md:5:  - \\\"session types\\\"\\n.opencode/skills/system-spec-kit/scripts/types/README.md:7:  - \\\"session data interface\\\"\\n.opencode/skills/system-spec-kit/scripts/types/README.md:12:> Shared session type definitions used across the Spec Kit scripts pipeline.\\n.opencode/skills/system-spec-kit/scripts/types/README.md:23:- [5. ROOT TYPE: SESSIONDATA](#5--root-type-sessiondata)\\n.opencode/skills/system-spec-kit/scripts/types/README.md:34:**Shared session type definitions** used across the Spec Kit scripts pipeline. This module is the **canonical source of truth** for all session-related types, eliminating parallel type hierarchies that previously existed between `simulation-factory` and the extractors (resolves **TECH-DEBT P6-05**).\\n.opencode/skills/system-spec-kit/scripts/types/README.md:45:└── session-types.ts    # Canonical session interfaces across 4 sections\\n.opencode/skills/system-spec-kit/scripts/types/README.md:50:- `../extractors/session-extractor` for `ToolCounts`, `SpecFileEntry`\\n.opencode/skills/system-spec-kit/scripts/types/README.md:64:├── SpecFileEntry[]           ← from session-extractor\\n.opencode/skills/system-spec-kit/scripts/types/README.md:65:├── ToolCounts                ← from session-extractor\\n.opencode/skills/system-spec-kit/scripts/types/README.md:123:| `OutcomeEntry` | `OUTCOME`, `TYPE?` | Single session outcome |\\n.opencode/skills/system-spec-kit/scripts/types/README.md:124:| `SessionData` | 35+ fields | **Root type**: complete AI coding session context |\\n.opencode/skills/system-spec-kit/scripts/types/README.md:130:<!-- ANCHOR:session-data -->\\n.opencode/skills/system-spec-kit/scripts/types/README.md:133:`SessionData` is the top-level type representing a complete session. Key field groups:\\n.opencode/skills/system-spec-kit/scripts/types/README.md:146:<!-- /ANCHOR:session-data -->\\n.opencode/skills/system-spec-kit/scripts/types/README.md:153:**Before:** Types duplicated in `simulation-factory.ts` and extractor modules.\\n.opencode/skills/system-spec-kit/scripts/types/README.md:154:**After:** Single source in `types/session-types.ts`, imported by all consumers.\\n.opencode/skills/system-spec-kit/scripts/types/README.md:166:| Session extractor (provides `ToolCounts`, `SpecFileEntry`) | `../extractors/session-extractor.ts` |\\n.opencode/skills/system-spec-kit/scripts/tests/deep-loop-wave-resume.vitest.ts:67:      const b = board.createBoard({ sessionId: 's1', loopType: 'review' });\\n.opencode/skills/system-spec-kit/scripts/tests/deep-loop-wave-resume.vitest.ts:109:      const s1 = segState.createSegmentState('seg-1', { sessionId: 's1' });\\n.opencode/skills/system-spec-kit/scripts/tests/deep-loop-wave-resume.vitest.ts:112:      const s2 = segState.createSegmentState('seg-2', { sessionId: 's1' });\\n.opencode/skills/system-spec-kit/scripts/tests/deep-loop-wave-resume.vitest.ts:124:      const b = board.createBoard({ sessionId: 's1', loopType: 'review' });\\n.opencode/skills/system-spec-kit/scripts/tests/deep-loop-wave-resume.vitest.ts:139:      const b = board.createBoard({ sessionId: 's1', loopType: 'review' });\\n.opencode/skills/system-spec-kit/scripts/tests/deep-loop-wave-resume.vitest.ts:259:      const state = segState.createSegmentState('seg-1', { sessionId: 's1' });\\n.opencode/skills/system-spec-kit/scripts/tests/deep-loop-wave-resume.vitest.ts:268:      const state = segState.createSegmentState('seg-1', { sessionId: 's1' });\\n.opencode/skills/system-spec-kit/scripts/tests/workflow-warning.vitest.ts:8:import type { SessionData } from '../types/session-types';\\n.opencode/skills/system-spec-kit/scripts/tests/workflow-warning.vitest.ts:62:    SESSION_ID: 'session-workflow-warning',\\n.opencode/skills/system-spec-kit/scripts/tests/progressive-validation.vitest.js:469:            // File with trailing spaces → triggers WHITESPACE fix\\n.opencode/skills/system-spec-kit/scripts/tests/progressive-validation.vitest.js:500:            // File with trailing spaces → will trigger WHITESPACE fix\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-trigger.test.ts:7:import type { CollectedDataFull } from '../extractors/collect-session-data';\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-trigger.test.ts:36:  sessionSummary: string;\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-trigger.test.ts:37:  triggerPhrases?: string[];\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-trigger.test.ts:57:      'title: \\\"Spec: Phase 6 trigger fixture\\\"',\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-trigger.test.ts:58:      'trigger_phrases:',\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-trigger.test.ts:59:      '  - \\\"phase 6 trigger fixture\\\"',\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-trigger.test.ts:71:  const triggerIndex = lines.findIndex((line) => line.trim() === 'trigger_phrases:');\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-trigger.test.ts:72:  if (triggerIndex === -1) {\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-trigger.test.ts:77:  for (let index = triggerIndex + 1; index < lines.length; index++) {\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-trigger.test.ts:101:describe('Phase 6 trigger-surface duplication fixes', () => {\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-trigger.test.ts:103:    const fixture = readFixture('F-DUP-001-trigger-cluster.json');\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-trigger.test.ts:104:    const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'speckit-phase6-trigger-cluster-'));\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-trigger.test.ts:119:    const triggerPhrases = parseFrontmatterTriggerPhrases(rendered);\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-trigger.test.ts:121:    expect(triggerPhrases).toContain('claude optimization settings');\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-trigger.test.ts:122:    expect(triggerPhrases).toContain('graphify research');\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-trigger.test.ts:123:    expect(triggerPhrases).not.toContain('graph and context optimization');\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-trigger.test.ts:124:    expect(triggerPhrases).not.toContain('kit/026');\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-trigger.test.ts:125:    expect(triggerPhrases).not.toContain('optimization/001');\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-trigger.test.ts:128:  it('collapses hyphen-space aliases to one canonical trigger while preserving api cli mcp anchors', async () => {\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-trigger.test.ts:129:    const fixture = readFixture('F-DUP-003-canonical-trigger.json');\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-trigger.test.ts:130:    const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'speckit-phase6-trigger-canonical-'));\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-trigger.test.ts:145:    const triggerPhrases = parseFrontmatterTriggerPhrases(rendered);\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-trigger.test.ts:147:    expect(triggerPhrases).toContain('codex-cli-compact');\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-trigger.test.ts:148:    expect(triggerPhrases).toContain('tree-sitter');\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-trigger.test.ts:149:    expect(triggerPhrases).toContain('implementation-summary');\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-trigger.test.ts:150:    expect(triggerPhrases).not.toContain('codex cli compact');\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-trigger.test.ts:151:    expect(triggerPhrases).not.toContain('tree sitter');\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-trigger.test.ts:152:    expect(triggerPhrases).not.toContain('implementation summary');\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-trigger.test.ts:153:    expect(triggerPhrases).toContain('api');\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-trigger.test.ts:154:    expect(triggerPhrases).toContain('cli');\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-trigger.test.ts:155:    expect(triggerPhrases).toContain('mcp');\\n.opencode/skills/system-spec-kit/scripts/tests/truncate-on-word-boundary.vitest.ts:16:    'session',\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC3-path-fragment.json:3:  \\\"sessionSummary\\\": \\\"Phase 3 replay verifies that reusable trigger sanitization strips folder leaks before persistence while preserving the intended memory pipeline phrasing for retrieval.\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC3-path-fragment.json:4:  \\\"triggerPhrases\\\": [\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC3-path-fragment.json:13:      \\\"description\\\": \\\"Routes merged and folder-derived trigger phrases through the D3 sanitizer\\\"\\n.opencode/skills/system-spec-kit/scripts/tests/file-capture-structured-mode.vitest.ts:15:    const { collectSessionData } = await import('../extractors/collect-session-data');\\n.opencode/skills/system-spec-kit/scripts/tests/file-capture-structured-mode.vitest.ts:17:    const sessionData = await collectSessionData({\\n.opencode/skills/system-spec-kit/scripts/tests/file-capture-structured-mode.vitest.ts:19:      sessionSummary: 'Verified structured file capture counts.',\\n.opencode/skills/system-spec-kit/scripts/tests/file-capture-structured-mode.vitest.ts:24:        { path: 'scripts/extractors/collect-session-data.ts', description: 'Fixed packet doc discovery.' },\\n.opencode/skills/system-spec-kit/scripts/tests/file-capture-structured-mode.vitest.ts:29:    expect(sessionData.CAPTURED_FILE_COUNT).toBe(5);\\n.opencode/skills/system-spec-kit/scripts/tests/file-capture-structured-mode.vitest.ts:30:    expect(sessionData.FILESYSTEM_FILE_COUNT).toBe(5);\\n.opencode/skills/system-spec-kit/scripts/tests/file-capture-structured-mode.vitest.ts:31:    expect(sessionData.GIT_CHANGED_FILE_COUNT).toBe(5);\\n.opencode/skills/system-spec-kit/scripts/tests/file-capture-structured-mode.vitest.ts:35:    const { collectSessionData } = await import('../extractors/collect-session-data');\\n.opencode/skills/system-spec-kit/scripts/tests/file-capture-structured-mode.vitest.ts:37:    const sessionData = await collectSessionData({\\n.opencode/skills/system-spec-kit/scripts/tests/file-capture-structured-mode.vitest.ts:39:      sessionSummary: 'Verified fallback git capture counts.',\\n.opencode/skills/system-spec-kit/scripts/tests/file-capture-structured-mode.vitest.ts:43:    expect(sessionData.CAPTURED_FILE_COUNT).toBe(2);\\n.opencode/skills/system-spec-kit/scripts/tests/file-capture-structured-mode.vitest.ts:44:    expect(sessionData.FILESYSTEM_FILE_COUNT).toBe(2);\\n.opencode/skills/system-spec-kit/scripts/tests/file-capture-structured-mode.vitest.ts:45:    expect(sessionData.GIT_CHANGED_FILE_COUNT).toBe(2);\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC1-truncation.json:3:  \\\"sessionSummary\\\": \\\"Phase 1 foundation work focused on two narrow repairs that improve memory quality without widening the remediation packet into unrelated metadata or reviewer behavior. The first repair aligned the OVERVIEW anchor identity so the table of contents, the HTML anchor, and the internal comment marker all point to the same destination. The second repair extracted a shared truncation helper so long session summaries stop at a clean word boundary and carry the canonical Unicode ellipsis instead of drifting between punctuation styles. The fixture describes a realistic verification pass where the helper was reused by the observation summary path, the OVERVIEW owner adopted the same contract, the compiled CLI replay was exercised with explicit JSON input, and the temporary replay artifacts were removed immediately after the check so the packet memory store stayed clean for the real documentation workflow.\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC1-truncation.json:11:      \\\"path\\\": \\\".opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC1-truncation.json:22:  \\\"triggerPhrases\\\": [\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC8-clean.json:5:    \\\"sessionSummary\\\": \\\"This healthy overview proves the reviewer stays quiet when the saved artifact remains internally consistent and the telemetry contract is satisfied end to end.\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC8-clean.json:19:    \\\"trigger_phrases:\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC8-clean.json:49:    \\\"session_id: \\\\\\\"phase4-pr9-clean\\\\\\\"\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC8-clean.json:57:    \\\"causal_links:\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/causal-links-auto-populate.vitest.ts:7:import type { CollectedDataFull } from '../extractors/collect-session-data';\\n.opencode/skills/system-spec-kit/scripts/tests/causal-links-auto-populate.vitest.ts:37:describe('causal link auto-population', () => {\\n.opencode/skills/system-spec-kit/scripts/tests/causal-links-auto-populate.vitest.ts:39:    const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'speckit-causal-links-'));\\n.opencode/skills/system-spec-kit/scripts/tests/causal-links-auto-populate.vitest.ts:49:        '010-causal-link-fixture',\\n.opencode/skills/system-spec-kit/scripts/tests/causal-links-auto-populate.vitest.ts:62:session_id: \\\"planning-save-1\\\"\\n.opencode/skills/system-spec-kit/scripts/tests/causal-links-auto-populate.vitest.ts:74:session_id: \\\"review-save-1\\\"\\n.opencode/skills/system-spec-kit/scripts/tests/causal-links-auto-populate.vitest.ts:89:        sessionId: 'implementation-save-2',\\n.opencode/skills/system-spec-kit/scripts/tests/causal-links-auto-populate.vitest.ts:92:          sessionSummary: 'Implemented the follow-on runtime after the planning save.',\\n.opencode/skills/system-spec-kit/scripts/tests/causal-links-auto-populate.vitest.ts:95:            { path: 'scripts/core/memory-metadata.ts', description: 'Auto-populated causal links from prior saves.' },\\n.opencode/skills/system-spec-kit/scripts/tests/causal-links-auto-populate.vitest.ts:97:          triggerPhrases: ['causal links', 'derived from'],\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:172:    const { extractKeyTopics } = require(path.join(SCRIPTS_DIR, 'core', 'topic-extractor'));\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:204:    // Test 4: extractKeyTopics returns array of topics\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:205:    const topics = extractKeyTopics('Implemented OAuth authentication with JWT tokens');\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:206:    if (Array.isArray(topics) && topics.length > 0) {\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:207:      pass('T-002k: extractKeyTopics extracts topics', `Found: ${topics.slice(0, 3).join(', ')}`);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:209:      fail('T-002k: extractKeyTopics extracts topics', 'No topics extracted');\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:290:      sessionSummary: 'Test session summary',\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:309:    // Test 5: validateInputData throws on invalid triggerPhrases type\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:310:    assertThrows(() => validateInputData({ triggerPhrases: 'not-an-array' }),\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:311:      'T-004e: validateInputData throws on invalid triggerPhrases');\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:330:    const summaryObs = buildSessionSummaryObservation('Test summary', ['trigger1', 'trigger2']);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:332:      pass('T-004h: buildSessionSummaryObservation creates observation', 'Facts include triggers');\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:342:      sessionTitle: 'Test Session'\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:707:    if (pipeline.filter && pipeline.filterNoise && pipeline.deduplicate) {\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:916:    // Test 1: create_session_data creates valid structure\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:917:    const session = createSessionData({ specFolder: 'test-spec' });\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:918:    if (session.TITLE && session.SPEC_FOLDER === 'test-spec' && session.DATE) {\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:919:      pass('T-013a: create_session_data creates valid structure', 'Key fields present');\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:921:      fail('T-013a: create_session_data creates valid structure', 'Missing fields');\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:987:    const topics = extractConversationTopics(data);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:988:    if (Array.isArray(topics) && topics.includes('oauth')) {\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:989:      pass('T-014b: extractConversationTopics extracts topics', topics.join(', '));\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:991:      fail('T-014b: extractConversationTopics extracts topics', topics.join(', '));\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1237:    const files = [{ FILE_PATH: '/test/file.js', DESCRIPTION: 'Modified during session' }];\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1343:  log('\\\\n🔬 EXTRACTORS: session-extractor.js');\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1354:    } = require(path.join(SCRIPTS_DIR, 'extractors', 'session-extractor'));\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1417:    // Test 8: extractKeyTopics extracts topics\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1418:    const topics = extractKeyTopics('Implemented OAuth authentication with JWT');\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1419:    if (Array.isArray(topics) && topics.length > 0) {\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1420:      pass('T-022i: extractKeyTopics extracts topics', topics.slice(0, 3).join(', '));\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1422:      fail('T-022i: extractKeyTopics extracts topics', 'No topics');\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1431:  log('\\\\n🔬 EXTRACTORS: collect-session-data.js');\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1434:    const { collectSessionData, shouldAutoSave } = require(path.join(SCRIPTS_DIR, 'extractors', 'collect-session-data'));\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1436:    // Test 1: shouldAutoSave triggers at message count threshold\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1440:      pass('T-023a: shouldAutoSave triggers at threshold', `Threshold: ${CONFIG.MESSAGE_COUNT_TRIGGER}`);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1442:      fail('T-023a: shouldAutoSave triggers at threshold', `shouldSave: ${shouldSave}`);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1457:    skip('T-023d: collectSessionData returns full session data', 'Requires mock spec folder');\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1460:    fail('T-023: Collect session data module', error.message);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1576:    const topicFromFolder = extractMainTopic([], '042-oauth-authentication');\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1577:    if (topicFromFolder === 'oauth-authentication') {\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1578:      pass('T-026c: extractMainTopic extracts from spec folder', topicFromFolder);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1580:      fail('T-026c: extractMainTopic extracts from spec folder', topicFromFolder);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1585:    const topicFromObs = extractMainTopic(obsWithTopic, null);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1586:    if (topicFromObs.includes('user') || topicFromObs.includes('profile')) {\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1587:      pass('T-026d: extractMainTopic extracts from observations', topicFromObs);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1589:      fail('T-026d: extractMainTopic extracts from observations', topicFromObs);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1696:  log('\\\\n🔬 EXTRACTORS: session-extractor.js (Additional Functions)');\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1699:    const sessionExtractor = require(path.join(SCRIPTS_DIR, 'extractors', 'session-extractor'));\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1702:    assertType(sessionExtractor.extractActiveFile, 'function', 'T-027a: extractActiveFile exported');\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1705:    assertType(sessionExtractor.extractNextAction, 'function', 'T-027b: extractNextAction exported');\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1708:    assertType(sessionExtractor.extractBlockers, 'function', 'T-027c: extractBlockers exported');\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1711:    assertType(sessionExtractor.buildFileProgress, 'function', 'T-027d: buildFileProgress exported');\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1714:    assertType(sessionExtractor.calculateExpiryEpoch, 'function', 'T-027e: calculateExpiryEpoch exported');\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1717:    assertType(sessionExtractor.detectRelatedDocs, 'function', 'T-027f: detectRelatedDocs exported');\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1720:    assertType(sessionExtractor.detectSessionCharacteristics, 'function', 'T-027g: detectSessionCharacteristics exported');\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1723:    assertType(sessionExtractor.buildProjectStateSnapshot, 'function', 'T-027h: buildProjectStateSnapshot exported');\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1730:    const activeFile = sessionExtractor.extractActiveFile(obsWithFiles, []);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1734:    const fallbackFile = sessionExtractor.extractActiveFile([], [{ FILE_PATH: '/backup.js' }]);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1738:    const noFileResult = sessionExtractor.extractActiveFile([], []);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1743:    const nextAction = sessionExtractor.extractNextAction(obsWithNext, []);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1751:    const defaultNext = sessionExtractor.extractNextAction([], []);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1756:    const blocker = sessionExtractor.extractBlockers(obsWithBlocker);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1764:    const noBlocker = sessionExtractor.extractBlockers([{ narrative: 'Everything is working fine.' }]);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1769:    const progress = sessionExtractor.buildFileProgress(specFiles);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1777:    const emptyProgress = sessionExtractor.buildFileProgress(null);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1786:    const criticalExpiry = sessionExtractor.calculateExpiryEpoch('critical', createdAt);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1790:    const constitutionalExpiry = sessionExtractor.calculateExpiryEpoch('constitutional', createdAt);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1794:    const tempExpiry = sessionExtractor.calculateExpiryEpoch('temporary', createdAt);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1803:    const normalExpiry = sessionExtractor.calculateExpiryEpoch('normal', createdAt);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1812:    const relatedDocs = await sessionExtractor.detectRelatedDocs(__dirname);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1823:    const characteristics = sessionExtractor.detectSessionCharacteristics(observations, userPrompts, FILES);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:1841:    const snapshot = sessionExtractor.buildProjectStateSnapshot(snapshotInput);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:2025:      // \\\"Chose:\\\" at start triggers decision classification\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:2235:    assertEqual(isDescriptionValid('Modified during session'), false, 'T-034f: isDescriptionValid rejects garbage patterns');\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:2463:  log('\\\\n🔬 LIB: trigger-extractor.js (re-export verification)');\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:2466:    const triggerModule = require(path.join(SCRIPTS_DIR, 'lib', 'trigger-extractor'));\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:2469:    assertType(triggerModule.extractTriggerPhrases, 'function', 'T-037a: extractTriggerPhrases is exported');\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:2471:    // Test 2: extract_trigger_phrases is also exported (snake_case alias)\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:2472:    assertType(triggerModule.extractTriggerPhrases, 'function', 'T-037b: extract_trigger_phrases is exported');\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:2476:    const phrases = triggerModule.extractTriggerPhrases(text);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:2484:    const emptyResult = triggerModule.extractTriggerPhrases(null);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:2492:    const shortResult = triggerModule.extractTriggerPhrases('Hi');\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:2500:    const configPreview = triggerModule.CONFIG\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:2501:      ? JSON.stringify(triggerModule.CONFIG).substring(0, 50)\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:2503:    assertExists(triggerModule.CONFIG, 'T-037f: CONFIG is exported', configPreview);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:2506:    if (triggerModule.STOP_WORDS_ENGLISH instanceof Set) {\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:2507:      pass('T-037g: STOP_WORDS_ENGLISH is exported', `${triggerModule.STOP_WORDS_ENGLISH.size} words`);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:2602:    // Test 3: extractConversationTopics extracts topics correctly\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:2607:    const topics = extractConversationTopics(testData);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:2608:    if (Array.isArray(topics) && topics.some(t => t.includes('oauth'))) {\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:2609:      pass('T-039c: extractConversationTopics extracts OAuth topics', topics.join(', '));\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:2611:      fail('T-039c: extractConversationTopics extracts OAuth topics', topics.join(', '));\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:2627:    // Test 5: calculateAlignmentScore returns high score for matching topics\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:2635:    // Test 6: calculateAlignmentScore returns low score for non-matching topics\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:2688:    // Test 3: extractPhasesFromData returns empty for short sessions\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:2692:      pass('T-040c: extractPhasesFromData returns empty for short sessions', 'Empty array');\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:2694:      fail('T-040c: extractPhasesFromData returns empty for short sessions', `Length: ${shortResult.length}`);\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:2841:  log('\\\\n🔬 MEMORY: generate-context.js');\\n.opencode/skills/system-spec-kit/scripts/tests/test-scripts-modules.js:2848:    } = require(path.join(SCRIPTS_DIR, 'memory', 'generate-context'));\\n.opencode/skills/system-spec-kit/scripts/tests/project-phase-e2e.vitest.ts:11:} from '../extractors/session-extractor';\\n.opencode/skills/system-spec-kit/scripts/tests/test-integration.vitest.ts:77:  const dbPath = path.join(workspaceRoot, 'test-context-index.sqlite');\\n.opencode/skills/system-spec-kit/scripts/tests/test-integration.vitest.ts:326:  it('confirms generate-context.js compiled entrypoint exists', () => {\\n.opencode/skills/system-spec-kit/scripts/tests/test-integration.vitest.ts:327:    // W1-T3 parity: compiled generate-context must be present for CLI invocation\\n.opencode/skills/system-spec-kit/scripts/tests/test-integration.vitest.ts:328:    const generateContextPath = path.join(SCRIPTS_DIR, 'dist', 'memory', 'generate-context.js');\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/deep-loop-replay/028/sample-iterations.jsonl:1:{\\\"type\\\":\\\"config\\\",\\\"mode\\\":\\\"research\\\",\\\"topic\\\":\\\"Legacy holdout replay fixture\\\",\\\"maxIterations\\\":5,\\\"convergenceThreshold\\\":0.15,\\\"stuckThreshold\\\":3,\\\"sessionId\\\":\\\"replay-028-fixture\\\"}\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC7-anchor.json:3:  \\\"sessionSummary\\\": \\\"Phase 1 foundation work aligned the OVERVIEW anchor names across the template.\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC7-anchor.json:17:  \\\"triggerPhrases\\\": [\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC6-provenance.json:3:  \\\"sessionSummary\\\": \\\"Phase 2 PR-4 adds JSON-mode git provenance without changing the authored memory narrative.\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC6-provenance.json:27:      \\\"rationale\\\": \\\"Avoid leaking captured-session summary, observations, trigger phrases, and decisions into structured JSON saves.\\\"\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC6-provenance.json:30:  \\\"triggerPhrases\\\": [\\n.opencode/skills/system-spec-kit/scripts/tests/test-five-checks.js:559:      pass('T-LA-005: >100 LOC threshold documented', '>100 LOC trigger found');\\n.opencode/skills/system-spec-kit/scripts/tests/test-five-checks.js:564:    // Test: Architectural decisions trigger documented\\n.opencode/skills/system-spec-kit/scripts/tests/test-five-checks.js:566:      pass('T-LA-006: Architectural decisions trigger documented', 'Architectural trigger found');\\n.opencode/skills/system-spec-kit/scripts/tests/test-five-checks.js:568:      fail('T-LA-006: Architectural decisions trigger documented', 'Architectural trigger not documented');\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase2-pr4.test.ts:8:import type { CollectedDataFull } from '../extractors/collect-session-data';\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase2-pr4.test.ts:9:import type { SessionData } from '../types/session-types';\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase2-pr4.test.ts:73:  sessionSummary: string;\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase2-pr4.test.ts:77:  triggerPhrases: string[];\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase2-pr4.test.ts:222:      expect(rendered).toContain(fixture.sessionSummary);\\n.opencode/skills/system-spec-kit/scripts/tests/deep-research-reducer.vitest.ts:47:        topic: 'Reducer fixture topic',\\n.opencode/skills/system-spec-kit/scripts/tests/deep-research-reducer.vitest.ts:54:          sessionId: 'session-001',\\n.opencode/skills/system-spec-kit/scripts/tests/deep-research-reducer.vitest.ts:69:      '{\\\"type\\\":\\\"config\\\",\\\"topic\\\":\\\"Reducer fixture topic\\\",\\\"maxIterations\\\":5,\\\"convergenceThreshold\\\":0.05,\\\"createdAt\\\":\\\"2026-04-03T00:00:00Z\\\",\\\"specFolder\\\":\\\"fixture\\\"}',\\n.opencode/skills/system-spec-kit/scripts/tests/deep-research-reducer.vitest.ts:89:<!-- ANCHOR:topic -->\\n.opencode/skills/system-spec-kit/scripts/tests/deep-research-reducer.vitest.ts:91:Reducer fixture topic\\n.opencode/skills/system-spec-kit/scripts/tests/deep-research-reducer.vitest.ts:92:<!-- /ANCHOR:topic -->\\n.opencode/skills/system-spec-kit/scripts/tests/deep-research-reducer.vitest.ts:256:    expect(firstDashboard).toContain('Session ID: session-001');\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase3-pr5.vitest.ts:7:import type { CollectedDataFull } from '../extractors/collect-session-data';\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase3-pr5.vitest.ts:8:import { sanitizeTriggerPhrase } from '../lib/trigger-phrase-sanitizer';\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase3-pr5.vitest.ts:37:  sessionSummary: string;\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase3-pr5.vitest.ts:38:  triggerPhrases?: string[];\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase3-pr5.vitest.ts:62:      'trigger_phrases:',\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase3-pr5.vitest.ts:64:      '  - \\\"trigger phrase sanitizer\\\"',\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase3-pr5.vitest.ts:76:  const triggerIndex = lines.findIndex((line) => line.trim() === 'trigger_phrases:');\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase3-pr5.vitest.ts:77:  if (triggerIndex === -1) {\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase3-pr5.vitest.ts:82:  for (let index = triggerIndex + 1; index < lines.length; index++) {\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase3-pr5.vitest.ts:124:  it.each(fixtureNames)('keeps saved triggers and rendered topics free of junk for %s', async (fixtureName) => {\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase3-pr5.vitest.ts:142:    const triggerPhrases = parseFrontmatterTriggerPhrases(rendered);\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase3-pr5.vitest.ts:145:      (fixture.triggerPhrases ?? []).map((phrase) => phrase.toLowerCase()),\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase3-pr5.vitest.ts:148:    for (const phrase of triggerPhrases) {\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase3-pr5.vitest.ts:161:      expect(triggerPhrases).not.toContain(phrase.toLowerCase());\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase3-pr5.vitest.ts:165:      expect(triggerPhrases).toContain(phrase.toLowerCase());\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC2-degraded-fallback.json:3:  \\\"sessionSummary\\\": \\\"Degraded payload with no authored decisions but decision-like prose that should still produce lexical placeholders.\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/session-cached-consumer.vitest.ts.test.ts:12:} from '../../mcp_server/handlers/session-resume.js';\\n.opencode/skills/system-spec-kit/scripts/tests/session-cached-consumer.vitest.ts.test.ts:20:const VALID_SPEC_FOLDER = 'specs/system-spec-kit/026-graph-and-context-optimization/012-cached-sessionstart-consumer-gated';\\n.opencode/skills/system-spec-kit/scripts/tests/session-cached-consumer.vitest.ts.test.ts:51:  run: (context: { sessionId: string }) => Promise<T>,\\n.opencode/skills/system-spec-kit/scripts/tests/session-cached-consumer.vitest.ts.test.ts:58:  const sessionId = `session-${Date.now()}-${Math.random().toString(16).slice(2, 8)}`;\\n.opencode/skills/system-spec-kit/scripts/tests/session-cached-consumer.vitest.ts.test.ts:70:    return await run({ sessionId });\\n.opencode/skills/system-spec-kit/scripts/tests/session-cached-consumer.vitest.ts.test.ts:82:  sessionId: string,\\n.opencode/skills/system-spec-kit/scripts/tests/session-cached-consumer.vitest.ts.test.ts:99:    claudeSessionId: sessionId,\\n.opencode/skills/system-spec-kit/scripts/tests/session-cached-consumer.vitest.ts.test.ts:100:    speckitSessionId: `speckit-${sessionId}`,\\n.opencode/skills/system-spec-kit/scripts/tests/session-cached-consumer.vitest.ts.test.ts:102:    sessionSummary: {\\n.opencode/skills/system-spec-kit/scripts/tests/session-cached-consumer.vitest.ts.test.ts:125:  saveState(sessionId, state);\\n.opencode/skills/system-spec-kit/scripts/tests/session-cached-consumer.vitest.ts.test.ts:277:    expect(additiveResult.cachedSummary?.continuityText).toContain('Last session worked on');\\n.opencode/skills/system-spec-kit/scripts/tests/session-cached-consumer.vitest.ts.test.ts:281:  it('exercises session_resume, session_bootstrap, and session-prime against the frozen corpus via hook state', async () => {\\n.opencode/skills/system-spec-kit/scripts/tests/session-cached-consumer.vitest.ts.test.ts:304:    vi.doMock('../../mcp_server/lib/session/context-metrics.js', () => ({\\n.opencode/skills/system-spec-kit/scripts/tests/session-cached-consumer.vitest.ts.test.ts:310:    vi.doMock('../../mcp_server/lib/session/session-snapshot.js', () => ({\\n.opencode/skills/system-spec-kit/scripts/tests/session-cached-consumer.vitest.ts.test.ts:314:        recommendedAction: 'Use code_graph_query for structural lookups.',\\n.opencode/skills/system-spec-kit/scripts/tests/session-cached-consumer.vitest.ts.test.ts:315:        sourceSurface: 'session_bootstrap',\\n.opencode/skills/system-spec-kit/scripts/tests/session-cached-consumer.vitest.ts.test.ts:320:    vi.doMock('../../mcp_server/handlers/session-health.js', () => ({\\n.opencode/skills/system-spec-kit/scripts/tests/session-cached-consumer.vitest.ts.test.ts:332:        sessionContinuity: null,\\n.opencode/skills/system-spec-kit/scripts/tests/session-cached-consumer.vitest.ts.test.ts:348:    const { handleSessionResume } = await import('../../mcp_server/handlers/session-resume.js');\\n.opencode/skills/system-spec-kit/scripts/tests/session-cached-consumer.vitest.ts.test.ts:349:    const { handleSessionBootstrap } = await import('../../mcp_server/handlers/session-bootstrap.js');\\n.opencode/skills/system-spec-kit/scripts/tests/session-cached-consumer.vitest.ts.test.ts:350:    const { handleStartup } = await import('../../mcp_server/hooks/claude/session-prime.js');\\n.opencode/skills/system-spec-kit/scripts/tests/session-cached-consumer.vitest.ts.test.ts:375:      await withHookSandbox(async ({ sessionId }) => {\\n.opencode/skills/system-spec-kit/scripts/tests/session-cached-consumer.vitest.ts.test.ts:378:        const liveStartup = handleStartup({ session_id: sessionId, specFolder: VALID_SPEC_FOLDER });\\n.opencode/skills/system-spec-kit/scripts/tests/session-cached-consumer.vitest.ts.test.ts:380:        seedHookState(sessionId, scenario);\\n.opencode/skills/system-spec-kit/scripts/tests/session-cached-consumer.vitest.ts.test.ts:384:        const cachedStartup = handleStartup({ session_id: sessionId, specFolder: VALID_SPEC_FOLDER });\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase4-pr7.test.ts:9:import type { CollectedDataFull } from '../extractors/collect-session-data';\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase4-pr7.test.ts:65:  it('returns the exact predecessor when continuation lineage supplies a matching source session id', async () => {\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase4-pr7.test.ts:71:      sessionId: 'hit-current-3',\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase4-pr7.test.ts:79:  it('returns null when a continuation save has no valid predecessor session id to attach', async () => {\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase4-pr7.test.ts:85:      sessionId: 'miss-current-2',\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase4-pr7.test.ts:98:      sessionId: 'ambiguity-current-3',\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase4-pr7.test.ts:105:  it('renders causal_links.supersedes into the saved memory on the hit path', async () => {\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase4-pr7.test.ts:125:        sessionId: 'hit-current-3',\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase4-pr7.test.ts:130:          sessionSummary: 'Extended continuation run for the lineage fixture.',\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase4-pr7.test.ts:141:              narrative: 'The save should inherit the predecessor session id before render.',\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase4-pr7.test.ts:142:              facts: ['Touched workflow.ts immediately before causal link render.'],\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase4-pr7.test.ts:156:              description: 'Inject predecessor discovery before causal link render.',\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase4-pr7.test.ts:159:          triggerPhrases: ['phase 4 pr7', 'auto supersedes'],\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase4-pr7.test.ts:166:      expect(rendered).toContain('causal_links:');\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/migration/F-MIG-003-title-overlap.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/migration/F-MIG-003-title-overlap.md:6:  - \\\"trigger phrase migration\\\"\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/session-data-factory.ts:8:import type { SessionData } from '../../types/session-types';\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/session-data-factory.ts:49:      OBSERVATION: 'Verified duplicate content skips the markdown write and leaves bookkeeping unchanged.',\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/session-data-factory.ts:56:  SESSION_ID: 'session-workflow-e2e',\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/session-data-factory.ts:157:    LAST_ACTION: 'Prepared a sparse session to verify the sufficiency abort path.',\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/deep-loop-replay/040/sample-iterations.jsonl:1:{\\\"type\\\":\\\"config\\\",\\\"mode\\\":\\\"review\\\",\\\"topic\\\":\\\"Replay fixture for 040\\\",\\\"maxIterations\\\":7,\\\"convergenceThreshold\\\":0.10,\\\"stuckThreshold\\\":2,\\\"sessionId\\\":\\\"replay-040-fixture\\\"}\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-template.test.ts:58:    TRIGGER_PHRASES_YAML: 'trigger_phrases:\\\\n  - \\\"phase 6 template fixture\\\"\\\\n  - \\\"memory duplication reduction\\\"',\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-template.test.ts:182:    'trigger_phrases:',\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-template.test.ts:183:    ...frontmatterTriggers.map((triggerPhrase) => `  - \\\"${triggerPhrase}\\\"`),\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-template.test.ts:193:    'session_id: \\\"phase6-mirror-drift\\\"',\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-template.test.ts:196:    'trigger_phrases:',\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-template.test.ts:197:    ...metadataTriggers.map((triggerPhrase) => `  - \\\"${triggerPhrase}\\\"`),\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-template.test.ts:217:  const frontmatterTriggers = spec.frontmatterTriggerPhrases ?? ['phase 6 reviewer fixture', 'clean trigger'];\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-template.test.ts:245:    'trigger_phrases:',\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-template.test.ts:246:    ...frontmatterTriggers.map((triggerPhrase) => `  - \\\"${triggerPhrase}\\\"`),\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-template.test.ts:303:    'session_id: \\\"phase6-dup-fixture\\\"',\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-template.test.ts:310:    'trigger_phrases:',\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-template.test.ts:311:    ...metadataTriggers.map((triggerPhrase) => `  - \\\"${triggerPhrase}\\\"`),\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-template.test.ts:313:    'causal_links:',\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-template.test.ts:346:  it.skip('F004.1 keeps a single closeout instruction for completed sessions and preserves all continuation surfaces for in-progress sessions', async () => {\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-template.test.ts:361:    expect(inProgress).toContain('Collapse completed-session closure duplication');\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-template.test.ts:374:    expect(rendered).toContain('<!-- ANCHOR:continue-session -->');\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-template.test.ts:403:    expect(rewrite.content).not.toContain('  - \\\"stale metadata trigger\\\"');\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-template.test.ts:412:        sessionSummary: 'Phase 6 mirror drift reviewer fixture.',\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-template.test.ts:424:      field: 'trigger_phrases',\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-template.test.ts:434:        sessionSummary: 'Phase 6 clean mirror reviewer fixture.',\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-template.test.ts:448:      { fixture: 'F-CHECK-DUP1-trigger.json', checkId: 'DUP1', severity: 'MEDIUM', field: 'observations' },\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-template.test.ts:449:      { fixture: 'F-CHECK-DUP2-trigger.json', checkId: 'DUP2', severity: 'MEDIUM', field: 'decisions' },\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-template.test.ts:450:      { fixture: 'F-CHECK-DUP3-trigger.json', checkId: 'DUP3', severity: 'MEDIUM', field: 'continuation' },\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-template.test.ts:451:      { fixture: 'F-CHECK-DUP4-trigger.json', checkId: 'DUP4', severity: 'MEDIUM', field: 'resume_context' },\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-template.test.ts:452:      { fixture: 'F-CHECK-DUP5-trigger.json', checkId: 'DUP5', severity: 'HIGH', field: 'trigger_phrases' },\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-template.test.ts:453:      { fixture: 'F-CHECK-DUP6-trigger.json', checkId: 'DUP6', severity: 'MEDIUM', field: 'anchors' },\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-template.test.ts:454:      { fixture: 'F-CHECK-DUP7-trigger.json', checkId: 'DUP7', severity: 'MEDIUM', field: 'files' },\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-template.test.ts:466:          sessionSummary: `Trigger fixture for ${expectation.checkId}.`,\\n.opencode/skills/system-spec-kit/scripts/tests/memory-quality-phase6-template.test.ts:487:        sessionSummary: 'Clean Phase 6 duplication reviewer fixture.',\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-DUP-004a-in-progress.json:10:        \\\"TASK_DESCRIPTION\\\": \\\"Collapse completed-session closure duplication\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-creation/expected-2phase-default/tasks.md:5:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/migration/F-MIG-002-clean.md:3:description: \\\"Fixture whose trigger_phrases should remain unchanged.\\\"\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/migration/F-MIG-002-clean.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-creation/expected-2phase-default/002-phase-2/spec.md:5:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-creation/expected-2phase-default/002-phase-2/spec.md:44:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-creation/expected-2phase-default/001-phase-1/spec.md:5:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-creation/expected-2phase-default/001-phase-1/spec.md:44:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/deep-loop-optimizer/sample-040-corpus.jsonl:1:{\\\"type\\\":\\\"config\\\",\\\"mode\\\":\\\"review\\\",\\\"topic\\\":\\\"Review of graph optimization module\\\",\\\"reviewTarget\\\":\\\"specs/040-graph-optimization\\\",\\\"reviewTargetType\\\":\\\"spec-folder\\\",\\\"reviewDimensions\\\":[\\\"correctness\\\",\\\"security\\\",\\\"traceability\\\",\\\"maintainability\\\"],\\\"sessionId\\\":\\\"rvw-2026-03-20T14-00-00Z\\\",\\\"parentSessionId\\\":null,\\\"lineageMode\\\":\\\"new\\\",\\\"generation\\\":1,\\\"continuedFromRun\\\":null,\\\"maxIterations\\\":7,\\\"convergenceThreshold\\\":0.10,\\\"stuckThreshold\\\":2,\\\"createdAt\\\":\\\"2026-03-20T14:00:00Z\\\",\\\"specFolder\\\":\\\"040-graph-optimization\\\",\\\"releaseReadinessState\\\":\\\"in-progress\\\"}\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/deep-loop-optimizer/sample-040-corpus.jsonl:2:{\\\"type\\\":\\\"iteration\\\",\\\"mode\\\":\\\"review\\\",\\\"run\\\":1,\\\"status\\\":\\\"complete\\\",\\\"focus\\\":\\\"D1 Correctness - reducer logic review\\\",\\\"dimensions\\\":[\\\"correctness\\\"],\\\"filesReviewed\\\":[\\\"src/graph-reducer.ts\\\",\\\"src/parser.ts\\\"],\\\"sessionId\\\":\\\"rvw-2026-03-20T14-00-00Z\\\",\\\"parentSessionId\\\":null,\\\"lineageMode\\\":\\\"new\\\",\\\"generation\\\":1,\\\"continuedFromRun\\\":null,\\\"findingsCount\\\":4,\\\"findingsSummary\\\":{\\\"P0\\\":1,\\\"P1\\\":2,\\\"P2\\\":1},\\\"findingsNew\\\":{\\\"P0\\\":1,\\\"P1\\\":2,\\\"P2\\\":1},\\\"newFindingsRatio\\\":0.90,\\\"timestamp\\\":\\\"2026-03-20T14:12:00Z\\\",\\\"durationMs\\\":72000}\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/deep-loop-optimizer/sample-040-corpus.jsonl:3:{\\\"type\\\":\\\"iteration\\\",\\\"mode\\\":\\\"review\\\",\\\"run\\\":2,\\\"status\\\":\\\"complete\\\",\\\"focus\\\":\\\"D2 Security - injection prevention audit\\\",\\\"dimensions\\\":[\\\"security\\\",\\\"correctness\\\"],\\\"filesReviewed\\\":[\\\"src/sanitizer.ts\\\",\\\"src/input-validator.ts\\\"],\\\"sessionId\\\":\\\"rvw-2026-03-20T14-00-00Z\\\",\\\"parentSessionId\\\":null,\\\"lineageMode\\\":\\\"new\\\",\\\"generation\\\":1,\\\"continuedFromRun\\\":null,\\\"findingsCount\\\":6,\\\"findingsSummary\\\":{\\\"P0\\\":1,\\\"P1\\\":3,\\\"P2\\\":2},\\\"findingsNew\\\":{\\\"P0\\\":0,\\\"P1\\\":1,\\\"P2\\\":1},\\\"newFindingsRatio\\\":0.40,\\\"timestamp\\\":\\\"2026-03-20T14:24:00Z\\\",\\\"durationMs\\\":65000}\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/deep-loop-optimizer/sample-040-corpus.jsonl:5:{\\\"type\\\":\\\"iteration\\\",\\\"mode\\\":\\\"review\\\",\\\"run\\\":3,\\\"status\\\":\\\"complete\\\",\\\"focus\\\":\\\"D3 Traceability + D4 Maintainability sweep\\\",\\\"dimensions\\\":[\\\"traceability\\\",\\\"maintainability\\\"],\\\"filesReviewed\\\":[\\\"specs/040/spec.md\\\",\\\"src/graph-reducer.ts\\\",\\\"src/utils.ts\\\"],\\\"sessionId\\\":\\\"rvw-2026-03-20T14-00-00Z\\\",\\\"parentSessionId\\\":null,\\\"lineageMode\\\":\\\"new\\\",\\\"generation\\\":1,\\\"continuedFromRun\\\":null,\\\"findingsCount\\\":7,\\\"findingsSummary\\\":{\\\"P0\\\":0,\\\"P1\\\":3,\\\"P2\\\":4},\\\"findingsNew\\\":{\\\"P0\\\":0,\\\"P1\\\":0,\\\"P2\\\":2},\\\"newFindingsRatio\\\":0.08,\\\"convergenceSignals\\\":{\\\"rollingAvg\\\":0.09,\\\"madScore\\\":0.06,\\\"noveltyRatio\\\":0.08,\\\"compositeStop\\\":0.62},\\\"timestamp\\\":\\\"2026-03-20T14:36:00Z\\\",\\\"durationMs\\\":58000}\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-creation/expected-2phase-default/spec.md:5:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-creation/expected-2phase-default/spec.md:179:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-creation/expected-3phase-named/decision-record.md:5:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-creation/expected-2phase-default/checklist.md:5:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-creation/expected-2phase-default/002-phase-2/tasks.md:5:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-creation/expected-2phase-default/plan.md:5:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-creation/expected-2phase-default/002-phase-2/plan.md:5:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-creation/expected-2phase-default/001-phase-1/plan.md:5:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/migration/F-MIG-001-junk-residual.md:3:description: \\\"Fixture with stale residual triggers plus useful short anchors.\\\"\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/migration/F-MIG-001-junk-residual.md:4:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-broken-D8.json:5:    \\\"sessionSummary\\\": \\\"This healthy overview proves the reviewer catches anchor drift without introducing unrelated findings.\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-broken-D8.json:19:    \\\"trigger_phrases:\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-broken-D8.json:49:    \\\"session_id: \\\\\\\"phase4-pr9-d8\\\\\\\"\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-broken-D8.json:57:    \\\"causal_links:\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-CHECK-DUP3-trigger.json:2:  \\\"pendingNoTasksLine\\\": \\\"- No pending tasks - session completed successfully\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-creation/expected-3phase-named/spec.md:5:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-creation/expected-3phase-named/spec.md:227:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC3-synthetic-bigrams.json:3:  \\\"sessionSummary\\\": \\\"We reject across 4 prioritization tiers and the full Level 3 spec set while the spec kit validator stays green for adjacent topic extraction.\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC3-synthetic-bigrams.json:4:  \\\"triggerPhrases\\\": [\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC3-synthetic-bigrams.json:6:    \\\"session for\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC3-synthetic-bigrams.json:22:    \\\"session for\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC4-importance-tier.json:3:  \\\"sessionSummary\\\": \\\"Phase 2 PR-3 validation keeps the importance-tier resolver authoritative while the managed-frontmatter rewrite re-emits both serialized tier locations from the same resolved value. This fixture models the historical drift case where an explicit important-tier save could later be normalized back to a default-looking frontmatter tier if migration treated the serializer as a second authority.\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC4-importance-tier.json:14:      \\\"decision\\\": \\\"Use session-extractor as the canonical importance-tier resolver\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC4-importance-tier.json:18:  \\\"triggerPhrases\\\": [\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC4-importance-tier.json:24:    \\\"Replay the fixture through generate-context.js and confirm tier parity\\\"\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-creation/expected-2phase-default/001-phase-1/tasks.md:5:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-DUP-004b-last-clipping.json:9:        \\\".opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts\\\"\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC3-happy-path.json:3:  \\\"sessionSummary\\\": \\\"Phase 3 replay preserves spec kit retrieval language, semantic search adjacency, and the mcp integration topic without introducing junk trigger phrases.\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC3-happy-path.json:4:  \\\"triggerPhrases\\\": [\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC3-happy-path.json:13:      \\\"description\\\": \\\"Applies the reusable sanitizer without disturbing healthy trigger phrases\\\"\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-broken-D4.json:5:    \\\"sessionSummary\\\": \\\"This healthy overview proves the reviewer catches tier drift without introducing unrelated findings.\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-broken-D4.json:19:    \\\"trigger_phrases:\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-broken-D4.json:53:    \\\"session_id: \\\\\\\"phase4-pr9-d4\\\\\\\"\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-broken-D4.json:61:    \\\"causal_links:\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-DUP-002b-proposition-overlap.json:3:  \\\"session_summary\\\": \\\"Decision and outcome dedupe fixture for Phase 6 extractor coverage.\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-DUP-002b-proposition-overlap.json:6:      \\\"prompt\\\": \\\"Deduplicate repeated propositions across outcomes and decisions without dropping authored rationale.\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-DUP-002b-proposition-overlap.json:24:        \\\".opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts\\\"\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-DUP-002b-proposition-overlap.json:32:        \\\".opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts\\\"\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-DUP-002b-proposition-overlap.json:47:      \\\"path\\\": \\\".opencode/skills/system-spec-kit/scripts/extractors/collect-session-data.ts\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-DUP-002b-proposition-overlap.json:48:      \\\"changes_summary\\\": \\\"Remove duplicate outcome propositions before rendering.\\\"\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-DUP-003-canonical-trigger.json:3:  \\\"sessionSummary\\\": \\\"Codex-cli-compact audit for tree-sitter and implementation-summary coverage across api cli mcp entry points.\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-DUP-003-canonical-trigger.json:4:  \\\"triggerPhrases\\\": [\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-DUP-003-canonical-trigger.json:23:      \\\"path\\\": \\\".opencode/skills/system-spec-kit/scripts/lib/trigger-phrase-sanitizer.ts\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC3-suspicious-prefix.json:3:  \\\"sessionSummary\\\": \\\"Phase 3 replay keeps meaningful indexing terms while removing numbered and identifier-shaped junk that previously polluted saved trigger phrases.\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC3-suspicious-prefix.json:4:  \\\"triggerPhrases\\\": [\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC3-suspicious-prefix.json:13:      \\\"path\\\": \\\".opencode/skills/system-spec-kit/scripts/lib/trigger-phrase-sanitizer.ts\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC3-suspicious-prefix.json:19:    \\\"Verify the saved trigger list\\\"\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-creation/expected-3phase-named/plan.md:5:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC3-standalone-stopwords.json:3:  \\\"sessionSummary\\\": \\\"Phase 3 replay proves standalone trigger junk no longer survives the save path when the packet context includes graph and issues language next to a valid mcp surface.\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC3-standalone-stopwords.json:4:  \\\"triggerPhrases\\\": [\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC3-standalone-stopwords.json:15:      \\\"path\\\": \\\".opencode/skills/system-spec-kit/scripts/lib/trigger-phrase-sanitizer.ts\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-DUP-001-trigger-cluster.json:3:  \\\"sessionSummary\\\": \\\"Investigated sibling-memory trigger duplication while keeping the claude optimization settings continuation discoverable for Phase 6.\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-DUP-001-trigger-cluster.json:4:  \\\"triggerPhrases\\\": [\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-DUP-001-trigger-cluster.json:17:      \\\"description\\\": \\\"Guarded the fallback cluster anchor append for trigger phrase generation.\\\"\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-DUP-005a-anchor-scaffolding.json:25:    \\\"continue-session\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-DUP-005a-anchor-scaffolding.json:31:    \\\"session-history\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-broken-D7.json:5:    \\\"sessionSummary\\\": \\\"This healthy overview proves the reviewer catches missing provenance without introducing unrelated findings.\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-broken-D7.json:19:    \\\"trigger_phrases:\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-broken-D7.json:53:    \\\"session_id: \\\\\\\"phase4-pr9-d7\\\\\\\"\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-broken-D7.json:61:    \\\"causal_links:\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC2-authored-decisions.json:3:  \\\"sessionSummary\\\": \\\"Short neutral session summary for decision precedence testing.\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-creation/expected-3phase-named/tasks.md:5:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-DUP-002a-blank-observation-titles.json:3:  \\\"session_summary\\\": \\\"Observation-title filtering fixture for Phase 6 extractor coverage.\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-broken-D1.json:5:    \\\"sessionSummary\\\": \\\"This broken overview proves the reviewer catches truncation when the rendered text still ends mid token and falls back to the old ASCII ellipsis shape instead of the boundary safe contract that Phase 1 pinned down for JSON mode saves.\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-broken-D1.json:19:    \\\"trigger_phrases:\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-broken-D1.json:53:    \\\"session_id: \\\\\\\"phase4-pr9-d1\\\\\\\"\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-broken-D1.json:61:    \\\"causal_links:\\\",\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-DUP-005b-frontmatter-mirror.json:9:    \\\"stale metadata trigger\\\"\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-creation/expected-3phase-named/checklist.md:5:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-creation/expected-3phase-named/001-design/spec.md:5:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-creation/expected-3phase-named/001-design/spec.md:44:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-creation/expected-3phase-named/003-verify/spec.md:5:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-creation/expected-3phase-named/003-verify/spec.md:44:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-creation/expected-3phase-named/001-design/plan.md:5:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-detection/phase-blocked-by-level/spec.md:19:- Phase score: 30/50 (3 of 5 dimensions triggered -- qualifies on its own)\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-creation/expected-3phase-named/001-design/tasks.md:5:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-detection/phase-maximum/spec.md:12:Maximum-complexity fixture that triggers all 5 phase scoring dimensions,\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-detection/phase-maximum/spec.md:18:- Phase score: 50/50 (all 5 dimensions triggered)\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-detection/phase-high/spec.md:12:High-complexity fixture that triggers 4 of 5 phase scoring dimensions.\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-detection/phase-high/spec.md:18:- Phase score: 40/50 (4 of 5 dimensions triggered)\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-creation/expected-3phase-named/002-build/spec.md:5:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-creation/expected-3phase-named/002-build/spec.md:44:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-creation/expected-3phase-named/003-verify/tasks.md:5:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC5-lineage/hit/memory/06-04-26_12-30__project-notes.md:4:session_id: \\\"hit-unrelated-2\\\"\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC5-lineage/miss/memory/06-04-26_09-00__orphan-notes.md:3:description: \\\"Malformed predecessor fixture without a session id.\\\"\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-creation/expected-3phase-named/003-verify/plan.md:5:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC5-lineage/ambiguity/memory/06-04-26_09-00__candidate-b.md:4:session_id: \\\"ambiguous-b\\\"\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-creation/expected-3phase-named/002-build/plan.md:5:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-creation/expected-3phase-named/002-build/tasks.md:5:trigger_phrases:\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-detection/no-phase/spec.md:18:- Phase score: 0/50 (no dimensions triggered)\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC5-lineage/hit/memory/06-04-26_12-05__deep-research-run-8.md:4:session_id: \\\"hit-predecessor-1\\\"\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/phase-detection/phase-minimum/spec.md:20:- Phase score: 30/50 (3 of 5 dimensions triggered)\\n.opencode/skills/system-spec-kit/scripts/tests/fixtures/memory-quality/F-AC5-lineage/ambiguity/memory/06-04-26_09-00__candidate-a.md:4:session_id: \\\"ambiguous-a\\\"\\n\", truncated_after_lines: None }, duration: 0ns, timed_out: false }, network_policy_decision: None }))" }
.opencode/specs/system-spec-kit/022-hybrid-rag-fusion/013-agents-alignment/implementation-summary.md:121:| Memory command surface only /memory:save in orchestrate | P1 | Added the live memory routing surface to all 5 runtimes, including `/memory:search` and `/memory:manage shared` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:4886:.opencode/skills/system-spec-kit/assets/template_mapping.md:322:**Generation:** Use `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"###-name","sessionSummary":"..."}' specs/###-name/` to auto-generate properly formatted memory files.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:9519:    92	| `/memory:save` | Save conversation context | 4 tools |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:11895:.opencode/skills/system-spec-kit/assets/template_mapping.md:322:**Generation:** Use `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"###-name","sessionSummary":"..."}' specs/###-name/` to auto-generate properly formatted memory files.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:12049:.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:126:- [ ] Save context if significant progress: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:12050:.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:159:- [ ] Memory context saved: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:12825:.opencode/skills/system-spec-kit/references/templates/level_specifications.md:764:| `memory/` | Session context preservation | `generate-context.js` runtime script via `/memory:save` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:12826:.opencode/skills/system-spec-kit/references/templates/level_specifications.md:769:- Use `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:27095:    92	| `/memory:save` | Save conversation context | 4 tools |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:30526:.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:126:- [ ] Save context if significant progress: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:30527:.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:159:- [ ] Memory context saved: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:30649:.opencode/skills/system-spec-kit/assets/template_mapping.md:322:**Generation:** Use `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"###-name","sessionSummary":"..."}' specs/###-name/` to auto-generate properly formatted memory files.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:30678:.opencode/skills/system-spec-kit/references/templates/level_specifications.md:764:| `memory/` | Session context preservation | `generate-context.js` runtime script via `/memory:save` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:30679:.opencode/skills/system-spec-kit/references/templates/level_specifications.md:769:- Use `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:41961:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/README.md:448:| `/memory:save`   | 4          | Save conversation context to a spec folder's `memory/` directory with semantic indexing                                                 |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:51803:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/assets/template_mapping.md:322:**Generation:** Use `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"###-name","sessionSummary":"..."}' specs/###-name/` to auto-generate properly formatted memory files.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:53834:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:126:- [ ] Save context if significant progress: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:53835:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:159:- [ ] Memory context saved: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:53924:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/references/templates/level_specifications.md:764:| `memory/` | Session context preservation | `generate-context.js` runtime script via `/memory:save` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:53925:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/references/templates/level_specifications.md:769:- Use `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:53934:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/feature_catalog/feature_catalog.md:60:| `/memory:save` | 4 | shared | `memory_save`, `memory_index_scan`, `memory_stats`, `memory_update` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:170948:   510	- Trigger: `/memory:save`, "save context", or "save memory"
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:172990:| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:173083:Trigger: "save context", "save memory", `/memory:save`, memory file creation
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:187557:.opencode/skills/system-spec-kit/assets/template_mapping.md:322:**Generation:** Use `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"###-name","sessionSummary":"..."}' specs/###-name/` to auto-generate properly formatted memory files.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:191366:.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:126:- [ ] Save context if significant progress: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:191367:.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:159:- [ ] Memory context saved: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:191473:.opencode/skills/system-spec-kit/references/templates/level_specifications.md:764:| `memory/` | Session context preservation | `generate-context.js` runtime script via `/memory:save` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:191474:.opencode/skills/system-spec-kit/references/templates/level_specifications.md:769:- Use `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:197649:| `/memory:save` | Manual memory save (deep research auto-saves) |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:197705:| `/memory:save` | Manual context preservation |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:212496:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/assets/template_mapping.md:322:**Generation:** Use `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"###-name","sessionSummary":"..."}' specs/###-name/` to auto-generate properly formatted memory files.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:212784:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/SKILL.md:566:**Memory Commands:** 4 memory slash commands (`/memory:save`, `/memory:manage`, `/memory:learn`, `/memory:search`) cover the memory command surface, with shared-memory operations available under `/memory:manage shared`, while `/spec_kit:resume` owns session recovery through the broader memory/session recovery stack. The `/memory:search` command covers all analysis and retrieval workflows. See `.opencode/commands/memory/` and `.opencode/commands/spec_kit/resume.md` for command documentation.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:212943:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:126:- [ ] Save context if significant progress: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:212944:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:159:- [ ] Memory context saved: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:213250:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/references/templates/level_specifications.md:764:| `memory/` | Session context preservation | `generate-context.js` runtime script via `/memory:save` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:213251:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/references/templates/level_specifications.md:769:- Use `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:213752:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/README.md:641:The **commands** are the doors into the system. Each command opens access to the tools it needs. `/spec_kit:complete` runs a full workflow from spec through implementation and packet-local changelog closeout when applicable. `/memory:save` saves context. `/spec_kit:resume` recovers or continues a previous session.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:214073:   641	The **commands** are the doors into the system. Each command opens access to the tools it needs. `/spec_kit:complete` runs a full workflow from spec through implementation and packet-local changelog closeout when applicable. `/memory:save` saves context. `/spec_kit:resume` recovers or continues a previous session.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:236539:.opencode/skills/system-spec-kit/scripts/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json:1:{"version":"4.0.18","results":[[":tests/task-enrichment.vitest.ts",{"duration":3721.023625,"failed":false}],[":tests/import-policy-rules.vitest.ts",{"duration":2.07350000000001,"failed":false}],[":tests/memory-render-fixture.vitest.ts",{"duration":0,"failed":false}],[":tests/generate-context-cli-authority.vitest.ts",{"duration":39.283833000000016,"failed":false}],[":tests/progressive-validation.vitest.ts",{"duration":104443.710666,"failed":false}],[":tests/tree-thinning.vitest.ts",{"duration":5.051583000000008,"failed":false}],[":tests/runtime-memory-inputs.vitest.ts",{"duration":1179.463959,"failed":false}],[":tests/slug-uniqueness.vitest.ts",{"duration":44.24137499999999,"failed":false}],[":tests/architecture-boundary-enforcement.vitest.ts",{"duration":439.068958,"failed":false}],[":tests/stateless-enrichment.vitest.ts",{"duration":2148.6485,"failed":false}],[":tests/memory-learn-command-docs.vitest.ts",{"duration":3.4485829999999993,"failed":false}],[":tests/claude-code-capture.vitest.ts",{"duration":560.6047919999999,"failed":false}],[":tests/quality-scorer-calibration.vitest.ts",{"duration":2.725999999999999,"failed":false}],[":tests/copilot-cli-capture.vitest.ts",{"duration":142.51012499999996,"failed":false}],[":tests/codex-cli-capture.vitest.ts",{"duration":530.625708,"failed":false}],[":tests/gemini-cli-capture.vitest.ts",{"duration":144.06766699999997,"failed":false}],[":tests/alignment-drift-fixture-preservation.vitest.ts",{"duration":61.86708300000001,"failed":false}],[":tests/workspace-identity.vitest.ts",{"duration":5.6456249999999955,"failed":false}],[":tests/spec-affinity.vitest.ts",{"duration":8.090292000000005,"failed":false}],[":tests/memory-sufficiency.vitest.ts",{"duration":4.3359999999999985,"failed":false}],[":tests/historical-memory-remediation.vitest.ts",{"duration":82.25087499999998,"failed":false}],[":tests/memory-template-contract.vitest.ts",{"duration":5.070624999999993,"failed":false}],[":tests/decision-confidence.vitest.ts",{"duration":5.001500000000007,"failed":false}],[":tests/description-enrichment.vitest.ts",{"duration":5.807291000000006,"failed":false}],[":tests/semantic-signal-golden.vitest.ts",{"duration":11.462625000000003,"failed":false}],[":tests/phase-classification.vitest.ts",{"duration":20.530292000000003,"failed":false}],[":tests/memory-indexer-weighting.vitest.ts",{"duration":6.473709000000014,"failed":false}],[":tests/test-integration.vitest.ts",{"duration":5358.835416,"failed":false}],[":tests/workflow-e2e.vitest.ts",{"duration":0,"failed":false}],[":tests/template-structure.vitest.ts",{"duration":9.337332999999987,"failed":false}],[":tests/outsourced-agent-handback-docs.vitest.ts",{"duration":2.731833999999992,"failed":false}],[":tests/auto-detection-fixes.vitest.ts",{"duration":0,"failed":false}],[":tests/content-filter-parity.vitest.ts",{"duration":3.858000000000004,"failed":false}],[":tests/opencode-capture.vitest.ts",{"duration":6565.4814160000005,"failed":false}],[":tests/contamination-filter.vitest.ts",{"duration":4.250416999999999,"failed":false}],[":tests/tool-sanitizer.vitest.ts",{"duration":6.2548340000000024,"failed":false}],[":tests/validation-rule-metadata.vitest.ts",{"duration":8.121292000000011,"failed":false}],[":tests/input-normalizer-unit.vitest.ts",{"duration":7.571291000000002,"failed":false}],[":tests/collect-session-data.vitest.ts",{"duration":3.6773749999999836,"failed":false}],[":tests/utils-regressions.vitest.ts",{"duration":3.574457999999993,"failed":false}],[":tests/workflow-warning.vitest.ts",{"duration":0,"failed":false}],[":tests/backfill-frontmatter.vitest.ts",{"duration":4.885750000000002,"failed":false}],[":tests/ascii-boxes.vitest.ts",{"duration":1.6262920000000065,"failed":false}],[":tests/memory-pipeline-regressions.vitest.ts",{"duration":103.00512499999996,"failed":false}],[":tests/session-enrichment.vitest.ts",{"duration":1659.6574580000001,"failed":false}],[":tests/post-save-review.vitest.ts",{"duration":7.135207999999992,"failed":false}],[":tests/validate-memory-quality.vitest.ts",{"duration":11.845458000000008,"failed":false}],[":tests/template-mustache-sections.vitest.ts",{"duration":2.146583000000007,"failed":false}],[":tests/validation-v13-v14-v12.vitest.ts",{"duration":13.966583999999997,"failed":false}],[":tests/project-phase-e2e.vitest.ts",{"duration":2.9768749999999926,"failed":false}],[":tests/trigger-phrase-filter.vitest.ts",{"duration":2.7874999999999943,"failed":false}],[":tests/workflow-session-id.vitest.ts",{"duration":0,"failed":false}],[":tests/deep-review-contract-parity.vitest.ts",{"duration":4.952833999999996,"failed":false}],[":tests/deep-review-reducer-schema.vitest.ts",{"duration":6.017708999999996,"failed":false}],[":tests/deep-research-reducer.vitest.ts",{"duration":11.902167000000006,"failed":false}],[":tests/deep-research-contract-parity.vitest.ts",{"duration":4.104624999999999,"failed":false}],[":tests/nested-changelog.vitest.ts",{"duration":8.951540999999992,"failed":false}],[":tests/truncate-on-word-boundary.vitest.ts",{"duration":3.0917080000000112,"failed":false}],[":tests/memory-quality-phase1.vitest.ts",{"duration":4.649042000000009,"failed":false}],[":tests/memory-quality-phase2-pr3.test.ts",{"duration":34.39741599999999,"failed":false}],[":tests/memory-quality-phase2-pr4.test.ts",{"duration":0,"failed":false}],[":tests/memory-quality-phase3-pr6.vitest.ts",{"duration":6.0858340000000055,"failed":false}],[":tests/memory-quality-phase3-pr5.vitest.ts",{"duration":8324.530334000001,"failed":false}],[":tests/trigger-phrase-sanitizer.vitest.ts",{"duration":3.2274170000000026,"failed":false}],[":tests/memory-quality-phase4-pr7.test.ts",{"duration":1785.2562910000001,"failed":false}],[":tests/memory-quality-phase4-pr9.test.ts",{"duration":11292.949958000001,"failed":false}],[":tests/memory-quality-phase6-trigger.test.ts",{"duration":15784.889916,"failed":false}],[":tests/memory-quality-phase6-migration.test.ts",{"duration":22.469125000000005,"failed":false}],[":tests/memory-quality-phase6-extractors.test.ts",{"duration":0,"failed":false}],[":tests/memory-quality-phase6-template.test.ts",{"duration":0,"failed":false}],[":tests/detector-regression-floor.vitest.ts.test.ts",{"duration":2.3494579999999985,"failed":false}],[":tests/session-cached-consumer.vitest.ts.test.ts",{"duration":41.66779199999996,"failed":false}],[":tests/warm-start-bundle-benchmark.vitest.ts.test.ts",{"duration":3.004374999999996,"failed":false}],[":tests/graph-upgrades-regression-floor.vitest.ts.test.ts",{"duration":8.53958399999999,"failed":false}],[":tests/title-builder-no-filename-suffix.vitest.ts",{"duration":1.404083,"failed":false}],[":tests/causal-links-auto-populate.vitest.ts",{"duration":19222.669583,"failed":false}],[":tests/parent-spec-resolver.vitest.ts",{"duration":2.8945420000000013,"failed":false}],[":tests/distinguishing-evidence-dedup.vitest.ts",{"duration":1.9157090000000068,"failed":false}],[":tests/trigger-phrase-no-prose-bigrams.vitest.ts",{"duration":2500.716792,"failed":false}],[":tests/file-capture-structured-mode.vitest.ts",{"duration":43.31995900000001,"failed":false}],[":tests/post-save-render-round-trip.vitest.ts",{"duration":31265.156917,"failed":false}],[":tests/canonical-sources-auto-discovery.vitest.ts",{"duration":22.136375000000015,"failed":false}],[":tests/phase-status-from-payload.vitest.ts",{"duration":385.11299999999994,"failed":false}],[":tests/quality-scorer-disambiguation.vitest.ts",{"duration":2.6033749999999998,"failed":false}],[":tests/overview-boundary-safe-truncation.vitest.ts",{"duration":409.92999999999995,"failed":false}],[":tests/memory-save-d5-continuation-and-causal-links.vitest.ts",{"duration":23001.531832999997,"failed":false}],[":tests/memory-save-title-description-override.vitest.ts",{"duration":27686.461084,"failed":false}],[":tests/validate-memory-quality-v8-regex-narrow.vitest.ts",{"duration":9.813291000000007,"failed":false}],[":tests/validate-memory-quality-v12-normalization.vitest.ts",{"duration":19.502959000000004,"failed":false}],[":tests/trigger-phrase-sanitizer-manual-preservation.vitest.ts",{"duration":2.276332999999994,"failed":false}],[":tests/deep-review-behavioral.vitest.ts",{"duration":3.47175,"failed":false}],[":tests/deep-research-behavioral.vitest.ts",{"duration":6.690291000000002,"failed":false}],[":tests/coverage-graph-convergence.vitest.ts",{"duration":6.243124999999992,"failed":true}],[":tests/coverage-graph-core.vitest.ts",{"duration":4.352542,"failed":false}],[":tests/coverage-graph-signals.vitest.ts",{"duration":3.4984579999999994,"failed":false}],[":tests/optimizer-replay-runner.vitest.ts",{"duration":3.9926249999999897,"failed":false}],[":tests/optimizer-replay-corpus.vitest.ts",{"duration":5.6733329999999995,"failed":false}],[":tests/optimizer-promote.vitest.ts",{"duration":4.054167000000007,"failed":false}],[":tests/optimizer-search.vitest.ts",{"duration":7.103207999999995,"failed":false}],[":tests/optimizer-rubric.vitest.ts",{"duration":3.810582999999994,"failed":false}],[":tests/deep-loop-wave-executor.vitest.ts",{"duration":4.258250000000004,"failed":false}],[":tests/deep-loop-wave-planner.vitest.ts",{"duration":10.907374999999988,"failed":false}],[":tests/deep-loop-wave-resume.vitest.ts",{"duration":3.687584000000001,"failed":false}],[":tests/deep-loop-wave-merge.vitest.ts",{"duration":10.03887499999999,"failed":false}],[":tests/coverage-graph-cross-layer.vitest.ts",{"duration":26.17741699999999,"failed":false}],[":tests/coverage-graph-integration.vitest.ts",{"duration":5.079166999999998,"failed":false}],[":tests/coverage-graph-stress.vitest.ts",{"duration":24.975625000000008,"failed":false}]]}
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:257563:    92	| `/memory:save` | Save conversation context | 4 tools |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:258219:   224	    "/memory:save": "MEMORY",
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:268816:- **Migration risk**: planner-only first, execution later; bundling this into Q1 would compound routing and repair risk
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:268870:  - **Q2**: ship planner-first `spec-kit doctor`, then layer freshness/provenance hints into that flow
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:268956:  - `SPECKIT_GUIDED_SURFACE_EXECUTION=false` for planner/prompt mode first
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:269029:Define the Q1 rollout contract as a small acceptance matrix: checker scope, advisory-to-blocking promotion criteria, wrapper routing behavior under stale structural context, and the exact conditions under which planner-only maintenance can ever gain execution privileges.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:269294:### Finding 2: The guided maintenance surface fits only as a planner over existing authority boundaries
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:269297:- **Why it matters**: The compatibility answer is yes, but only for a thin planner/wrapper. A guided surface can safely aggregate findings and next steps, or export a repair brief, but it should not become a new execution authority that silently writes memories, repairs indexes, or bypasses confirmation semantics already enforced by the underlying MCP tools.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:269305:- **Why it matters**: Any future integrity work should plug into this existing bridge as extra hints, annotations, or planner inputs, not as a rival index or alternate search path. The conflict to avoid is building a second discovery subsystem for documentation drift when the runtime already has a better separation: lexical integrity for docs truthfulness, CocoIndex for semantic recall, and code graph for structural expansion.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:269321:- **Why it matters**: This makes a broad, all-in-one doctor command risky if it tries to flatten the stack. The compatible design is a native Spec Kit planner that reports integrity, readiness, and suggested next actions, then hands off to explicit internal tools first and to external MCPs only as second-order, opt-in actions. Otherwise a docs-integrity feature inherits unrelated transport, credential, and orchestration risk.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:269348:- **Questions answered**: the integrity lane is compatible only as a separate lexical surface; the guided maintenance surface is compatible only as a planner over existing tools; the right integration seam is the existing CocoIndex-to-code-graph bridge; commit-time automation must stay non-indexing by default; and any future doctor surface must preserve the native-vs-external MCP split
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:269367:3. the planner-only versus execution-enabled boundary for a future `spec-kit doctor`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:269390:- **Why it matters**: If we adopt the lexical integrity lane and guided maintenance planner, the main DX improvement should be a smaller mental model, not more knobs. The right addition is one explicit integrity entry point that routes to existing tools and preserves their authority boundaries.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:269406:- **Why it matters**: The adoptable UX pattern is not auto-fix itself; it is the clarity of a targeted repair brief. In Public, the safe developer experience is a planner-first command that can emit issue JSON, a repair plan, and explicit next steps before any write-capable operation is allowed to run.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:269421:- **What it does**: Mex presents one CLI family, so "use check/sync/watch" is unambiguous. Public already has distinct namespaces with overlapping "health", "save", "resume", and "doctor" language: `/doctor:mcp_debug` for broken MCP servers, `/memory:manage health` for DB/index health, `/memory:save` for session persistence, and `/spec_kit:resume` for recovery.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:269449:- **Questions answered**: one thin integrity surface is justified; `session_bootstrap` and `/spec_kit:resume` should stay canonical; repair should be planner-first and confirmation-gated; Mex-style mandatory pattern growth should not migrate; command-routing documentation is mandatory
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:269450:- **Novelty justification**: earlier iterations established the integrity lane and planner direction; this pass adds the missing operator-facing command contract and migration-map constraints for a real rollout
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:269467:3. publish the routing matrix against `/doctor:mcp_debug`, `/memory:manage health`, `/memory:save`, and `/spec_kit:resume`;
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:269551:### Finding 3: The main new control-plane element is a thin planner surface that sits **above** existing authorities
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:269553:- **What it does**: The operator-facing evolution is not “integrity checker only.” It is a planner/wrapper surface that can run integrity checks, summarize readiness, emit repair briefs, and route operators to the correct existing tool without taking over mutation authority itself.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:269587:- **What it does**: The end-state architecture includes only two core additions to the current system: the advisory integrity lane and the thin planner surface. Everything else is constrained:
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:269620:- **Questions addressed**: what the current architecture already is; which new lane is actually being added; where the planner surface sits; whether startup/recovery authority moves; which candidate additions are truly part of the final architecture versus sidecars or rejections
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:269621:- **Questions answered**: the current system already has distinct retrieval, routing, and maintenance planes; the adopted architecture adds one advisory integrity lane and one thin planner surface; recovery authority stays with `session_bootstrap` and `/spec_kit:resume`; repair authority stays with existing explicit tools; freshness and scaffold-growth remain optional sidecars rather than core memory authority
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:269670:- **What it does**: research settled that Public should eventually expose a thin planner over existing tools, but the concrete UX is still open: command namespace (`spec_kit:doctor` vs `memory:manage integrity`), allowed modes (`check`, `--json`, `--plan`, deferred `--fix`), exact handoff payloads, and the boundary between planner-only advice and any execution-capable follow-up. Mex's verb set is simple; Public still distributes next-step guidance across `session_bootstrap`, `memory_health`, and `memory_save` dry-run semantics.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:269761:2. choose the doctor namespace and freeze planner-only versus execution-enabled boundaries
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:269817:- **Why it matters**: This is the main divergence that survives every comparison. The five systems do **not** agree on one best persistence model, one best authoring model, or one best write authority. That means the right outcome for Public remains selective adoption: take the integrity lane, planner ergonomics, and bounded lifecycle improvements; reject any attempt to replace Spec Kit with Engram, Modus, Mnemosyne, Mex, or MemPalace wholesale.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:269864:3. define the exact boundaries for the integrity lane, doctor/planner surface, and relation-plane annotations
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:270195:**Executive summary:** Mex should **not** replace Spec Kit Memory. The durable import from 40 iterations is a **separate advisory markdown integrity lane** plus, later, a **thin planner surface** over existing maintenance tools. Keep `session_bootstrap`/`/spec_kit:resume`, hybrid retrieval, CocoIndex, code graph, causal links, and explicit repair/save authority exactly where they already live. Treat freshness only as advisory metadata. Reject score-first health and any design that mixes integrity into retrieval/ranking.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:270206:| 8 | Design planner-only `spec-kit doctor` handoff payloads | **New feature** | High | Medium |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:270218:8. Design planner-only `spec-kit doctor`.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:270223:- **Decision:** adopt a narrow lexical integrity lane and a thin planner UX layer; do not adopt Mex as the memory substrate.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/002-mex-main/research/research.md:270225:- **Build next:** planner-only `spec-kit doctor` over existing authorities.
.opencode/specs/system-spec-kit/022-hybrid-rag-fusion/009-perfect-session-capturing/scratch/agent-output-iter-003-codex-A2.md:248:.opencode/specs/system-spec-kit/022-hybrid-rag-fusion/009-perfect-session-capturing/005-confidence-calibration/memory/16-03-26_19-21__confidence-calibration.md:442:# AGENTS.md instructions for /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public  # AI Assistant Framework (Universal Template) > **Universal behavior framework** defining guardrails, standards, and decision protocols. --- ## 1. 🚨 CRITICAL RULES **HARD BLOCKERS (The "Four Laws" of Agent Safety):** 1. **READ FIRST:** Never edit a file without reading it first. Understand context before modifying. 2. **SCOPE LOCK:** Only modify files explicitly in scope. **NO** "cleaning up" or "improving" adjacent code. Scope in `spec.md` is FROZEN. 3. **VERIFY:** Syntax checks and tests **MUST** pass before claiming completion. **NO** blind commits. 4. **HALT:** Stop immediately if uncertain, if line numbers don't match, or if tests fail. (See "Halt Conditions" below). **OPERATIONAL MANDATES:** - **All file modifications require a spec folder** (Gate 3). - **Never lie or fabricate** - use "UNKNOWN" when uncertain. - **Clarify** if confidence < 80% (see §5 Confidence Framework). - **Use explicit uncertainty:** Prefix claims with "I'M UNCERTAIN ABOUT THIS:". **QUALITY PRINCIPLES:** - **Prefer simplicity**, reuse existing patterns, and cite evidence with sources - Solve only the stated problem; **avoid over-engineering** and premature optimization - **Verify with checks** (simplicity, performance, maintainability, scope) before making changes - **Truth over agreement** - correct user misconceptions with evidence; do not agree for conversational flow **HALT CONDITIONS (Stop and Report):** - [ ] Target file does not exist or line numbers don't match. - [ ] Syntax check or Tests fail after edit. - [ ] Merge conflicts encountered. - [ ] Edit tool reports "string not found". - [ ] Test/Production boundary is unclear. **MANDATORY TOOLS:** - **Spec Kit Memory MCP** for research tasks, context recovery, and finding prior work. **Memory saves MUST use `node.opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js [spec-folder-path]`** - NEVER manually create memory files. **GIT WORKFLOW:** Full details: `.opencode/skills/sk-git/` - Worktree setup, conventional commits, PR creation, branch management - Trigger keywords: worktree, branch, commit, merge, pr, pull request, git workflow, finish work, integrate changes ### Quick Reference: Common Workflows | Task | Flow | | ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | | **File modification** | Gate 3 (ask spec folder) → Gate 1 → Gate 2 → Load memory context → Execute | | **Research/exploration** | `memory_match_triggers()` → `memory_context()` (unified) OR `memory_search()` (targeted) → Document findings | | **Code search** | `Grep()` for text patterns, `Glob()` for file discovery, `Read()` for file contents | | **Resume prior work** | `/memory:continue` OR `memory_search({ query, specFolder, anchors: ['state', 'next-steps'] })` → Review checklist → Continue | | **Save context** | `/memory:save` OR `node.opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js [spec-folder-path]` → Auto-indexed | | **Claim completion** | Validation runs automatically → Load `checklist.md` → Verify ALL items → Mark with evidence | | **End session** | `/spec_kit:handover` → Save context → Provide continuation prompt | | **New spec folder** | Option B (Gate 3) → Research via Task tool → Evidence-based plan → Approval → Implement | | **Complex multi-step** | Task tool → Decompose → Delegate → Synthesize | | **Documentation** | sk-doc skill → Classify → Load template → Fill → Validate (`validate_document.py`) → DQI score → Verify | | **Web code** | sk-code-web skill → Webflow/CDN standards, minification, browser testing | | **OpenCode system code** | sk-code-opencode skill → JS/TS/Python/Shell standards, language detection, quality checklists | | **Git workflow** | sk-git skill → Worktree setup / Commit / Finish (PR) | | **Phase workflow** | `/spec_kit:phase` → Decompose → `create.sh --phase` → Populate parent/children → `validate.sh --recursive` | | **Database maintenance** | `/memory:manage` → stats, health, cleanup, checkpoint, ingest operations | | **Analysis/evaluation** | `/memory:analyze` → preflight, postflight, causal graph, ablation, dashboard, history | ### Coding Analysis Lenses | Lens | Focus | Detection Questions | | ------------------ | ---------------- | ---------------------------------------------------------------------------------- | | **CLARITY** | Simplicity | Is this the simplest code that solves the problem? Are abstractions earned? | | **SYSTEMS** | Dependencies | What does this change touch? What calls this? What are the side effects? | | **BIAS** | Wrong problem | Is user solving a symptom? Is this premature optimization? Is the framing correct? | | **SUSTAINABILITY** | Maintainability | Will future devs understand this? Is it self-documenting? Tech debt implications? | | **VALUE** | Actual impact | Does this change behavior or just refactor? Is it cosmetic or functional? | | **SCOPE** | Complexity match | Does solution complexity match problem size? Single-line fix or new abstraction? | ### Coding Anti-Patterns (Detect Silently) | Anti-Pattern | Trigger Phrases | Response | | ---------------------- | ----------------------------------------------- | --------------------------------------------------------------------------- | | Over-engineering | "for flexibility", "future-proof", "might need" | Ask: "Is this solving a current problem or a hypothetical one?" | | Premature optimization | "could be slow", "might bottleneck" | Ask: "Has this been measured? What's the actual performance?" | | Cargo culting | "best practice", "always should" | Ask: "Does this pattern fit this specific case?" | | Gold-plating | "while we're here", "might as well" | Flag scope creep: "That's a separate change - shall I note it for later?" | | Wrong abstraction | "DRY this up" for 2 instances | "These look similar but might not be the same concept. Let's verify first." | | Scope creep | "also add", "bonus feature" | "That's outside the current scope. Want to track it separately?" | --- ## 2. ⛔ MANDATORY GATES - STOP BEFORE ACTING **⚠️ BEFORE using ANY tool (except Gate Actions: memory_match_triggers, skill_advisor.py), you MUST pass all applicable gates below.** ### 🔒 PRE-EXECUTION GATES (Pass before ANY tool use) #### GATE 1: UNDERSTANDING + CONTEXT SURFACING [SOFT] BLOCK Trigger: EACH new user message (re-evaluate even in ongoing conversations) 1. Call `memory_match_triggers(prompt)` → Surface relevant context 2. Classify intent: Research or Implementation 3. Parse request → Check confidence AND uncertainty (see §4) 4. **Dual-threshold:** confidence ≥ 0.70 AND uncertainty ≤ 0.35 → PROCEED. Either fails → INVESTIGATE (max 3 iterations) → ESCALATE. Simple: <40% ASK | 40-69% CAUTION | ≥70% PASS > Gate 1 is SOFT — if file modification detected, Gate 3 (HARD) takes precedence. Ask spec folder question BEFORE analysis. #### GATE 2: SKILL ROUTING [REQUIRED for non-trivial tasks] 1. A) Run: `python3.opencode/skills/scripts/skill_advisor.py "[request]" --threshold 0.8` 2. B) Cite user's explicit direction: "User specified: [exact quote]" - Confidence ≥ 0.8 → MUST invoke skill | < 0.8 → general approach | User names skill → cite and proceed - Output: `SKILL ROUTING: [result]` or `SKILL ROUTING: User directed → [name]` - Skip: trivial queries only (greetings, single-line questions) #### GATE 3: SPEC FOLDER QUESTION [HARD] BLOCK — PRIORITY GATE - **Overrides Gates 1-2:** If file modification detected → ask Gate 3 BEFORE any analysis/tool calls - **Triggers:** rename, move, delete, create, add, remove, update, change, modify, edit, fix, refactor, implement, build, write, generate, configure, analyze, decompose, phase — or any task resulting in file changes - **Options:** A) Existing | B) New | C) Update related | D) Skip | E) Phase folder (e.g., `specs/NNN-name/001-phase/`) - **DO NOT** use Read/Edit/Write/Bash (except Gate Actions) before asking. ASK FIRST, wait for response, THEN proceed - **Phase boundary:** Gate 3 answers apply ONLY within current workflow phase. Plan→implement transition MUST re-evaluate. Exception: carry-over IS valid for Memory Save Rule #### CONSOLIDATED QUESTION PROTOCOL When multiple inputs are needed, consolidate into a SINGLE prompt — never split across messages. Include only applicable questions; omit when pre-determined. - **Round-trip optimization** — Only 1 user interaction needed for setup - **First Message Protocol** — ALL questions asked BEFORE any analysis or tool calls - **Violation:** Multiple separate prompts → STOP, apologize, re-present as single prompt - **Bypass phrases:** "skip context" / "fresh start" / "skip memory" / [skip] for memory loading; Level 1 tasks skip completion verification --- ### 🔒 POST-EXECUTION RULES #### MEMORY SAVE RULE [HARD] BLOCK Trigger: "save context", "save memory", `/memory:save`, memory file creation - If spec folder established at Gate 3 → USE IT (don't re-ask). Carry-over applies ONLY to memory saves - If NO folder and Gate 3 never answered → HARD BLOCK → Ask user - **Script:** `node.opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js [spec-folder-path]` - Mode 1 (JSON): Write JSON to `/tmp/save-context-data.json`, pass as arg - Mode 2 (Direct): Pass spec folder path (e.g., `specs/005-memory`) - Subfolder: `003-parent/121-child` or bare `121-child` (auto-searches parents) - **Indexing:** For immediate MCP visibility after save: `memory_index_scan({ specFolder })` or `memory_save()` - **Violation:** Write tool on `memory/` path → DELETE and re-run via script #### COMPLETION VERIFICATION RULE [HARD] BLOCK Trigger: Claiming "done", "complete", "finished", "works" 1. Validation runs automatically on spec folder (if exists) 2. Load `checklist.md` → Verify ALL items → Mark `[x]` with evidence - Skip: Level 1 tasks (no checklist.md required) | Exit 0 = pass, Exit 1 = warnings, Exit 2 = errors (must fix) #### VIOLATION RECOVERY [SELF-CORRECTION] Trigger: About to skip gates, or realized gates were skipped → STOP → STATE: "Before I proceed, I need to ask about documentation:" → ASK Gate 3 (A/B/C/D/E) → WAIT #### Self-Check (before ANY tool-using response): - [ ] File modification? Asked spec folder question? - [ ] Skill routing verified? - [ ] Saving memory? Using `generate-context.js` (not Write tool)? - [ ] Aligned with ORIGINAL request? No scope drift? - [ ] Claiming completion? `checklist.md` verified? --- ## 3. 📝 CONVERSATION DOCUMENTATION Every conversation that modifies files MUST have a spec folder. **Full details:** system-spec-kit SKILL.md (§1 When to Use, §3 How it Works, §4 Rules) ### Documentation Levels | Level | LOC | Required Files | Use When | | ------ | -------------- | ----------------------------------------------------- | ---------------------------------- | | **1** | <100 | spec.md, plan.md, tasks.md, implementation-summary.md | All features (minimum) | | **2** | 100-499 | Level 1 + checklist.md | QA validation needed | | **3** | ≥500 | Level 2 + decision-record.md (+ optional research/research.md) | Complex/architecture changes | | **3+** | Complexity 80+ | Level 3 + AI protocols, extended checklist, sign-offs | Multi-agent, enterprise governance | > **Note:** `implementation-summary.md` is REQUIRED for all levels but created **after implementation completes**, not at spec folder creation time. See SKILL.md §4 Rule 13. **Rules:** When in doubt → higher level. LOC is soft guidance (risk/complexity can override). Single typo/whitespace fixes (<5 characters in one file) are exempt. **Spec folder path:** `specs/[###-short-name]/` | **Templates:** `.opencode/skills/system-spec-kit/templates/` **For details on:** folder structure, `scratch/` vs `memory/` usage, sub-folder versioning, checklist verification (P0/P1/P2), and completion workflow — see system-spec-kit SKILL.md §3. --- ## 4. 🧑🏫 CONFIDENCE & CLARIFICATION FRAMEWORK **Core Principle:** If confidence < 80%, pause and ask for clarification with multiple-choice options. | Confidence | Action | | ------------ | -------------------------------------------- | | **≥80%** | Proceed with citable source | | **40-79%** | Proceed with caveats | | **<40%** | Ask for clarification or mark "UNKNOWN" | | **Override** | Blockers/conflicts → ask regardless of score | **Logic-Sync Protocol:** On contradiction (Spec vs Code, conflicting requirements) → HALT → Report "LOGIC-SYNC REQUIRED: [Fact A] contradicts [Fact B]" → Ask "Which truth prevails?" **Escalation:** Confidence stays <80% after two failed attempts → ask with 2-3 options. Blockers beyond control → escalate with evidence and proposed next step. --- ## 5. 🧠 REQUEST ANALYSIS & SOLUTION FRAMEWORK **Flow:** Parse request → Read files first → Analyze → Design simplest solution → Validate → Execute | Principle | Rule | Anti-Pattern | | ----------------- | -------------------------------------------------- | --------------------------------------- | | **Simplicity** | Reuse patterns; earn every abstraction | Utilities for <3 uses, single-impl intf | | **Evidence** | Cite `[SOURCE: file:lines]` or `[CITATION: NONE]` | Claims without verification | | **Scope Match** | Solution size = problem size | Refactoring during bug fix | | **Right Problem** | Root cause, not symptom; measure before optimizing | Premature optimization, wrong framing | **CLARITY Triggers** (justify before proceeding): - Utility for <3 uses | Config for single value | Abstraction without clear boundary - Pattern where simple code suffices | Interface for single impl - On bias → don't argue, redirect to root cause **Pre-Change Checklist:** - [ ] Read first? | Simplest solution? | Scope discipline? - [ ] Confidence ≥80%? | Sources cited? | Spec folder? | Approval? **Five Checks (>100 LOC):** Necessary now? | Alternatives (≥2)? | Simplest sufficient? | On critical path? | No tech debt? **STOP CONDITIONS:** Any check unchecked | no spec folder | no approval → STOP and address --- ## 6. 🤖 AGENT ROUTING When using the orchestrate agent or Task tool for complex multi-step workflows, route to specialized agents: ### Runtime Agent Directory Resolution Use the agent directory that matches the active runtime/provider profile: | Runtime / Profile | Agent Directory | Usage Rule | | -------------------------------------- | -------------------------- | ----------------------------------------------------------- | | **Copilot (default OpenCode profile)** | `.opencode/agents/` | Load base agent definitions from this directory | | **ChatGPT profile** | `.opencode/agents/chatgpt/` | Load ChatGPT-specific agent definitions from this directory | | **Claude profile** | `.claude/agents/` | Load Claude-specific agent definitions from this directory | | **Gemini CLI** | `.gemini/agents/` | Load Gemini-specific agent definitions from this directory | **Resolution rule:** pick one directory by runtime and stay consistent for that workflow phase. ### Agent Definitions - **`@general`** — Implementation, complex tasks - **`@context`** — ALL codebase exploration, file search, pattern discovery, context loading. Dispatches sub-agents for fast search and deep investigation - **`@orchestrate`** — Multi-agent coordination, complex workflows - **`@research`** — Evidence gathering, planning, Gate 3 Option B. May write `research/research.md` inside spec folders - **`@write`** — Creating READMEs, Skills, Guides - **`@review`** — Code review, PRs, quality gates (READ-ONLY) - **`@speckit`** — Spec folder creation Level 1-3+. **EXCLUSIVE:** Only agent permitted to write `*.md` inside spec folders. Exceptions: `memory/` (generate-context.js), `scratch/` (any agent), `handover.md` (@handover), `research/research.md` (@research), `debug-delegation.md` (@debug) - **`@debug`** — Fresh perspective debugging, root cause analysis. May write `debug-delegation.md` inside spec folders - **`@handover`** — Session continuation, context preservation. May write `handover.md` inside spec folders - **`@ultra-think`** — Multi-strategy planning architect. Dispatches diverse thinking strategies, scores via 5-dimension rubric, synthesizes optimal plan. Planning-only: no file modifications --- ## 7. ⚙️ MCP CONFIGURATION **Two systems:** 1. **Native MCP** (`opencode.json`) - Direct tools, called natively - Sequential Thinking, Spec Kit Memory, Code Mode server 2. **Code Mode MCP** (`.utcp_config.json`) - External tools via `call_tool_chain()` - Figma, Github, ClickUp, Chrome DevTools, etc. - Naming: `{manual_name}.{manual_name}_{tool_name}` (e.g., `clickup.clickup_get_teams({})`) - Discovery: `search_tools()`, `list_tools()`, or read `.utcp_config.json` --- ## 8. 🧩 SKILLS SYSTEM Skills are specialized, on-demand capabilities that provide domain expertise. Unlike knowledge files (passive references), skills are explicitly invoked to handle complex, multi-step workflows. ### How Skills Work ``` Task Received → Gate 2: Run skill_advisor.py ↓ Confidence > 0.8 → MUST invoke recommended skill ↓ Invoke Skill → Read(".opencode/skills/<skill-name>/SKILL.md") ↓ Instructions Load → SKILL.md content + resource paths ↓ Follow Instructions → Complete task using skill guidance ``` ### Skill Loading Protocol 1. Gate 2 provides skill recommendation via `skill_advisor.py` 2. Invoke using appropriate method for your environment 3. Read bundled resources from `references/`, `scripts/`, `assets/` paths 4. Follow skill instructions to completion 5. Do NOT re-invoke a skill already in context ### Primary Skill: sk-code-opencode For ALL OpenCode system code (`.opencode/`, MCP servers, scripts), `sk-code-opencode` provides multi-language standards. Includes the `system-spec-kit` skill for spec folder workflows and the Spec Kit Memory system for context preservation across sessions. **Supported Languages:** | Language | Target | Key Patterns | | ---------- | ----------------------------- | ------------------------------------------- | | JavaScript | MCP servers, CommonJS modules | `require`/`module.exports`, strict mode | | TypeScript | Type-safe modules, configs | Interfaces, strict tsconfig, type guards | | Python | Validators, advisors, tests | snake_case, argparse, pytest, docstrings | | Shell | Automation, deployment | `set -euo pipefail`, shebang, quoting | | JSON/JSONC | Manifests, schemas, configs | Schema validation, commented config | **Key Systems:** - **system-spec-kit**: Spec folder lifecycle (Levels 1-3+), validation, template architecture - **Spec Kit Memory**: Context preservation, semantic search, session continuity (`/memory:save`, `/memory:continue`) **Invocation:** Automatic via Gate 2 routing when OpenCode system code tasks detected. ### Git Workflow Skill: sk-git For ALL git workflows, `sk-git` orchestrates workspace setup, commit hygiene, and work completion. **Sub-workflows:** - **Worktree**: Branch creation via `git worktree`, workspace isolation, parallel development - **Commit**: Conventional commit format, staged change analysis, clean commit messages - **Finish**: PR creation, branch cleanup, integration workflows **Trigger Keywords:** worktree, branch, commit, merge, pr, pull request, git workflow, conventional commits, finish work, integrate changes **Invocation:** Automatic via Gate 2 routing when git tasks detected, or manually via `Read(".opencode/skills/sk-git/SKILL.md")`. ## Skills A skill is a set of local instructions to follow that is stored in a `SKILL.md` file. Below is the list of skills that can be used. Each entry includes a name, description, and file path so you can open the source for full instructions when using a specific skill. ### Available skills - cli-claude-code: Claude Code CLI orchestrator enabling external AI assistants (Gemini, Codex, Copilot) to invoke Anthropic's Claude Code CLI for supplementary tasks including deep reasoning, code editing, structured output, code review, agent delegation, and extended thinking. (file: /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public/.opencode/skills/cli-claude-code/SKILL.md) - cli-codex: Codex CLI orchestrator enabling any AI assistant to invoke OpenAI's Codex CLI for supplementary AI tasks including code generation, code review, web research, codebase analysis, cross-AI validation, and parallel task processing. (file: /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public/.opencode/skills/cli-codex/SKILL.md) - cli-copilot: GitHub Copilot CLI orchestrator enabling external AI assistants to invoke the standalone 'copilot' binary for supplementary tasks including collaborative planning, cloud delegation, versatile code generation, and autonomous task execution. (file: /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public/.opencode/skills/cli-copilot/SKILL.md) - cli-gemini: Gemini CLI orchestrator enabling any AI assistant to invoke Google's Gemini CLI for supplementary AI tasks including code generation, web research via Google Search, codebase architecture analysis, cross-AI validation, and parallel task processing. (file: /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public/.opencode/skills/cli-gemini/SKILL.md) - mcp-chrome-devtools: Chrome DevTools orchestrator providing intelligent routing between CLI (bdg) and MCP (Code Mode) approaches. CLI prioritized for speed and token efficiency; MCP fallback for multi-tool integration scenarios. (file: /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public/.opencode/skills/mcp-chrome-devtools/SKILL.md) - mcp-clickup: ClickUp project management orchestrator providing intelligent routing between CLI (cu) and MCP (Code Mode) approaches. CLI prioritized for speed and token efficiency; MCP for enterprise features like docs, goals, webhooks, and bulk operations. (file: /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public/.opencode/skills/mcp-clickup/SKILL.md) - mcp-code-mode: MCP orchestration via TypeScript execution for efficient multi-tool workflows. Use Code Mode for ALL MCP tool calls (ClickUp, Notion, Figma, Webflow, Chrome DevTools, etc.). Provides 98.7% context reduction, 60% faster execution, and type-safe invocation. Mandatory for external tool integration. (file: /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public/.opencode/skills/mcp-code-mode/SKILL.md) - mcp-figma: Figma design file access via MCP providing 18 tools for file retrieval, image export, component/style extraction, team management, and collaborative commenting. Accessed via Code Mode for token-efficient workflows. (file: /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public/.opencode/skills/mcp-figma/SKILL.md) - sk-code-full-stack: Stack-agnostic development orchestrator guiding developers through implementation, testing, and verification phases with automatic stack detection via marker files and bundled stack-specific knowledge. (file: /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public/.opencode/skills/sk-code-full-stack/SKILL.md) - sk-code-opencode: Multi-language code standards for OpenCode system code (JavaScript, TypeScript, Python, Shell, JSON/JSONC) with language detection routing, universal patterns, and quality checklists. (file: /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public/.opencode/skills/sk-code-opencode/SKILL.md) - sk-code-review: Stack-agnostic code review baseline skill with findings-first severity analysis, mandatory security/correctness minimums, and adaptive overlay compatibility with sk-code-opencode, sk-code-web, and sk-code-full-stack standards. (file: /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public/.opencode/skills/sk-code-review/SKILL.md) - sk-code-web: Orchestrator guiding developers through implementation, debugging, and verification phases across specialized code quality skills (project) (file: /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public/.opencode/skills/sk-code-web/SKILL.md) - sk-doc: Unified markdown and OpenCode component specialist providing document quality enforcement, content optimization, component creation workflows (skills, agents, commands), ASCII flowcharts and install guides. (file: /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public/.opencode/skills/sk-doc/SKILL.md) - sk-git: Git workflow orchestrator guiding developers through workspace setup, clean commits, and work completion across git-worktrees, git-commit, and git-finish skills (file: /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public/.opencode/skills/sk-git/SKILL.md) - sk-improve-prompt: Prompt engineering specialist that transforms vague requests into structured, scored AI prompts using 7 proven frameworks (RCAF, COSTAR, RACE, CIDI, TIDD-EC, CRISPE, CRAFT), DEPTH thinking methodology, and CLEAR scoring across text modes. (file: /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public/.opencode/skills/sk-improve-prompt/SKILL.md) - system-spec-kit: Unified documentation and context preservation: spec folder workflow (levels 1-3+), CORE + ADDENDUM template architecture (v2.2), validation, and Spec Kit Memory for context preservation. Mandatory for all file modifications. (file: /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public/.opencode/skills/system-spec-kit/SKILL.md) - openai-docs: Use when the user asks how to build with OpenAI products or APIs and needs up-to-date official documentation with citations, help choosing the latest model for a use case, or explicit GPT-5.4 upgrade and prompt-upgrade guidance; prioritize OpenAI docs MCP tools, use bundled references only as helper context, and restrict any fallback browsing to official OpenAI domains. (file: /Users/michelkerkmeester/.codex/skills/.system/openai-docs/SKILL.md) - skill-creator: Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Codex's capabilities with specialized knowledge, workflows, or tool integrations. (file: /Users/michelkerkmeester/.codex/skills/.system/skill-creator/SKILL.md) - skill-installer: Install Codex skills into $CODEX_HOME/skills from a curated list or a GitHub repo path. Use when a user asks to list installable skills, install a curated skill, or install a skill from another repo (including private repos). (file: /Users/michelkerkmeester/.codex/skills/.system/skill-installer/SKILL.md) ### How to use skills - Discovery: The list above is the skills available in this session (name + description + file path). Skill bodies live on disk at the listed paths. - Trigger rules: If the user names a skill (with `$SkillName` or plain text) OR the task clearly matches a skill's description shown above, you must use that skill for that turn. Multiple mentions mean use them all. Do not carry skills across turns unless re-mentioned. - Missing/blocked: If a named skill isn't in the list or the path can't be read, say so briefly and continue with the best fallback. - How to use a skill (progressive disclosure): 1) After deciding to use a skill, open its `SKILL.md`. Read only enough to follow the workflow. 2) When `SKILL.md` references relative paths (e.g., `scripts/foo.py`), resolve them relative to the skill directory listed above first, and only consider other paths if needed. 3) If `SKILL.md` points to extra folders such as `references/`, load only the specific files needed for the request; don't bulk-load everything. 4) If `scripts/` exist, prefer running or patching them instead of retyping large code blocks. 5) If `assets/` or templates exist, reuse them instead of recreating from scratch. - Coordination and sequencing: - If multiple skills apply, choose the minimal set that covers the request and state the order you'll use them. - Announce which skill(s) you're using and why (one short line). If you skip an obvious skill, say why. - Context hygiene: - Keep context small: summarize long sections instead of pasting them; only load extra files when needed. - Avoid deep reference-chasing: prefer opening only files directly linked from `SKILL.md` unless you're blocked. - When variants exist (frameworks, providers, domains), pick only the relevant reference file(s) and note that choice. - Safety and fallback: If a skill can't be applied cleanly (missing files, unclear instructions), state the issue, pick the next-best approach, and continue. Files called AGENTS.md commonly appear in many places inside a container - at "/", in "~", deep within git repositories, or in any other directory; their location is not limited to version-controlled folders. Their purpose is to pass along human guidance to you, the agent. Such guidance can include coding standards, explanations of the project layout, steps for building or testing, and even wording that must accompany a GitHub pull-request description produced by the agent; all of it is to be followed. Each AGENTS.md governs the entire directory that contains it and every child directory beneath that point. Whenever you change a file, you have to comply with every AGENTS.md whose scope covers that file. Naming conventions, stylistic rules and similar directives are restricted to the code that falls inside that scope unless the document explicitly states otherwise. When two AGENTS.md files disagree, the one located deeper in the directory structure overrides the higher-level file, while instructions given directly in the prompt by the system, developer, or user outrank any AGENTS.md content.   /Users/michelkerkmeester/MEGA/Development/Opencode Env/Public zsh 2026-03-16 Europe/Amsterdam
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/005-mempalace/research/iterations/iteration-015.md:2679:.opencode/skills/system-spec-kit/feature_catalog/feature_catalog_in_simple_terms.md:404:This measures how richly connected the knowledge graph is by counting the average number of links per memory. If there are too few connections, graph-based features would not add much value. If there are too many, the system holds off on creating new links to avoid a tangled mess. It is like a city planner checking road density before building more highways.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/005-mempalace/research/iterations/iteration-015.md:2948:.opencode/skills/system-spec-kit/feature_catalog/10--graph-signal-activation/03-edge-density-measurement.md:12:This measures how richly connected the knowledge graph is by counting the average number of links per memory. If there are too few connections, graph-based features would not add much value. If there are too many, the system holds off on creating new links to avoid a tangled mess. It is like a city planner checking road density before building more highways.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/005-mempalace/research/iterations/iteration-015.md:2988:.opencode/skills/system-spec-kit/feature_catalog/feature_catalog.md:1541:This measures how richly connected the knowledge graph is by counting the average number of links per memory. If there are too few connections, graph-based features would not add much value. If there are too many, the system holds off on creating new links to avoid a tangled mess. It is like a city planner checking road density before building more highways.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:2570:   127	- `/memory:save` - preserve the current session context into spec memory
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:2849:   142	/memory:save       # Save current conversation context
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:2970:/bin/zsh -lc 'rg -n "/spec_kit:resume|/memory:save|memory_context|memory_match_triggers|memory_search|generate-context" .opencode/skills/system-spec-kit/references .opencode/skills/system-spec-kit/scripts .opencode/skills/system-spec-kit/feature_catalog' in /Users/michelkerkmeester/MEGA/Development/Code_Environment/Public
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:2972:.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:126:- [ ] Save context if significant progress: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:2973:.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:159:- [ ] Memory context saved: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:2980:.opencode/skills/system-spec-kit/references/structure/folder_routing.md:244:1. User says "save context" or `/memory:save`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:2995:.opencode/skills/system-spec-kit/feature_catalog/feature_catalog_in_simple_terms.md:62:| `/memory:save` | Save conversation context (4 tools, borrowed) | `memory_save`, `memory_index_scan`, `memory_stats`, `memory_update` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:3018:.opencode/skills/system-spec-kit/references/templates/level_specifications.md:764:| `memory/` | Session context preservation | `generate-context.js` runtime script via `/memory:save` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:3019:.opencode/skills/system-spec-kit/references/templates/level_specifications.md:769:- Use `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:3049:.opencode/skills/system-spec-kit/references/workflows/quick_reference.md:127:- `/memory:save` - preserve the current session context into spec memory
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:3051:.opencode/skills/system-spec-kit/references/workflows/quick_reference.md:497:- Command: `/memory:save`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:3085:.opencode/skills/system-spec-kit/scripts/scripts-registry.json:12:      "trigger": ["save context", "save memory", "/memory:save"],
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:3127:.opencode/skills/system-spec-kit/references/memory/trigger_config.md:18:1. **Command Trigger** - `/memory:save` command for explicit saves
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:3128:.opencode/skills/system-spec-kit/references/memory/trigger_config.md:29:| `/memory:save` Command | Primary save trigger | Immediate |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:3135:.opencode/skills/system-spec-kit/references/memory/trigger_config.md:187:/memory:save
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:3160:.opencode/skills/system-spec-kit/references/memory/save_workflow.md:142:/memory:save       # Save current conversation context
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:3230:.opencode/skills/system-spec-kit/feature_catalog/16--tooling-and-scripts/17-json-primary-deprecation-posture.md:53:- The save command (`/memory:save`) updated to document the JSON-primary posture.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:3267:.opencode/skills/system-spec-kit/feature_catalog/feature_catalog.md:60:| `/memory:save` | 4 | shared | `memory_save`, `memory_index_scan`, `memory_stats`, `memory_update` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:3296:.opencode/skills/system-spec-kit/scripts/tests/memory-learn-command-docs.vitest.ts:19:    expect(learnDoc).toContain('[s] use /memory:save instead');
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:3350:    62	| `/memory:save` | Save conversation context (4 tools, borrowed) | `memory_save`, `memory_index_scan`, `memory_stats`, `memory_update` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:5394:   142	/memory:save specs/007-feature-name
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:5820:- **What it does**: Mnemosyne exposes five direct verbs (`memory_recall`, `memory_recall_global`, `memory_store`, `memory_store_global`, `memory_delete`), while Public exposes a much richer but more distributed command/tool stack across `/memory:search`, `/memory:save`, `/memory:manage`, `/memory:learn`, and `/spec_kit:resume`.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:5852:- **What it does**: Mnemosyne recommends a simple ritual: recall at session start, store after important decisions, delete contradictions, use global for cross-project preferences. Public already has a stronger recovery contract, but it is expressed as `/spec_kit:resume`, `session_bootstrap()`, `memory_context(resume)`, `/memory:save`, and `/memory:learn`.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:5900:3. a migration guide that maps `memory_recall`, `memory_store`, `memory_delete`, `global`, and `core` onto `/spec_kit:resume`, `session_bootstrap()`, `/memory:save`, `/memory:learn`, and governed retrieval scope.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:5917:- **What it does**: Mnemosyne exposes five direct verbs (`memory_recall`, `memory_recall_global`, `memory_store`, `memory_store_global`, `memory_delete`), while Public exposes a much richer but more distributed command/tool stack across `/memory:search`, `/memory:save`, `/memory:manage`, `/memory:learn`, and `/spec_kit:resume`.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:5949:- **What it does**: Mnemosyne recommends a simple ritual: recall at session start, store after important decisions, delete contradictions, use global for cross-project preferences. Public already has a stronger recovery contract, but it is expressed as `/spec_kit:resume`, `session_bootstrap()`, `memory_context(resume)`, `/memory:save`, and `/memory:learn`.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:5997:3. a migration guide that maps `memory_recall`, `memory_store`, `memory_delete`, `global`, and `core` onto `/spec_kit:resume`, `session_bootstrap()`, `/memory:save`, `/memory:learn`, and governed retrieval scope.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/005-mempalace/research/iterations/iteration-011.md:9843:.opencode/skills/system-spec-kit/scripts/lib/wave-segment-planner.cjs:10:// Segment identity and ordering are reproducible from the same inputs.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-012.md:3781:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/scripts/lib/wave-segment-planner.cjs:7:// v1: heuristic-based (file counts, directory grouping, hotspot ranking)
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-037.md:224:3. a migration guide that maps `memory_recall`, `memory_store`, `memory_delete`, `global`, and `core` onto `/spec_kit:resume`, `session_bootstrap()`, `/memory:save`, `/memory:learn`, and governed retrieval scope.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-037.md:2877:.opencode/specs/system-spec-kit/999-agentic-system-upgrade/001-research-agentic-systems/002-babysitter-main/external/library/methodologies/automaker/agents/feature-planner/README.md
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-037.md:4188:.opencode/specs/system-spec-kit/999-agentic-system-upgrade/001-research-agentic-systems/002-babysitter-main/external/library/methodologies/cc10x/agents/planner/README.md
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-037.md:4247:.opencode/specs/system-spec-kit/999-agentic-system-upgrade/001-research-agentic-systems/002-babysitter-main/external/library/methodologies/everything-claude-code/agents/planner/README.md
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-037.md:4437:.opencode/specs/system-spec-kit/999-agentic-system-upgrade/001-research-agentic-systems/002-babysitter-main/external/library/methodologies/gsd/agents/gsd-planner/README.md
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-037.md:4959:.opencode/specs/system-spec-kit/999-agentic-system-upgrade/001-research-agentic-systems/002-babysitter-main/external/library/methodologies/spec-kit/agents/technical-planner/README.md
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-037.md:5096:.opencode/specs/system-spec-kit/999-agentic-system-upgrade/001-research-agentic-systems/002-babysitter-main/external/library/methodologies/ccpm/agents/product-planner/README.md
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-037.md:5703:.opencode/specs/system-spec-kit/999-agentic-system-upgrade/001-research-agentic-systems/002-babysitter-main/external/library/specializations/ux-ui-design/agents/refinement-planner/README.md
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-037.md:5820:.opencode/specs/system-spec-kit/999-agentic-system-upgrade/001-research-agentic-systems/002-babysitter-main/external/library/specializations/ai-agents-conversational/agents/plan-execute-planner/README.md
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/005-mempalace/research/iterations/iteration-022.md:3833:.opencode/skills/system-spec-kit/assets/template_mapping.md:322:**Generation:** Use `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"###-name","sessionSummary":"..."}' specs/###-name/` to auto-generate properly formatted memory files.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/005-mempalace/research/iterations/iteration-022.md:5104:.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:126:- [ ] Save context if significant progress: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/005-mempalace/research/iterations/iteration-022.md:5105:.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:159:- [ ] Memory context saved: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/005-mempalace/research/iterations/iteration-022.md:5351:.opencode/skills/system-spec-kit/references/templates/level_specifications.md:764:| `memory/` | Session context preservation | `generate-context.js` runtime script via `/memory:save` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/005-mempalace/research/iterations/iteration-022.md:5352:.opencode/skills/system-spec-kit/references/templates/level_specifications.md:769:- Use `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-007.md:403:    55	| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-007.md:496:   148	Trigger: "save context", "save memory", `/memory:save`, memory file creation
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-039.md:171:3. a migration guide that maps `memory_recall`, `memory_store`, `memory_delete`, `global`, and `core` onto `/spec_kit:resume`, `session_bootstrap()`, `/memory:save`, `/memory:learn`, and governed retrieval scope.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-039.md:1074:| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-039.md:1167:Trigger: "save context", "save memory", `/memory:save`, memory file creation
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-038.md:219:3. a migration guide that maps `memory_recall`, `memory_store`, `memory_delete`, `global`, and `core` onto `/spec_kit:resume`, `session_bootstrap()`, `/memory:save`, `/memory:learn`, and governed retrieval scope.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-038.md:8642:.opencode/specs/system-spec-kit/999-hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:2972:.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:126:- [ ] Save context if significant progress: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-038.md:8643:.opencode/specs/system-spec-kit/999-hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:2973:.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:159:- [ ] Memory context saved: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-038.md:8658:.opencode/specs/system-spec-kit/999-hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:2995:.opencode/skills/system-spec-kit/feature_catalog/feature_catalog_in_simple_terms.md:62:| `/memory:save` | Save conversation context (4 tools, borrowed) | `memory_save`, `memory_index_scan`, `memory_stats`, `memory_update` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-038.md:8668:.opencode/specs/system-spec-kit/999-hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:3018:.opencode/skills/system-spec-kit/references/templates/level_specifications.md:764:| `memory/` | Session context preservation | `generate-context.js` runtime script via `/memory:save` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-038.md:8669:.opencode/specs/system-spec-kit/999-hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:3019:.opencode/skills/system-spec-kit/references/templates/level_specifications.md:769:- Use `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-038.md:8758:.opencode/specs/system-spec-kit/999-hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:3267:.opencode/skills/system-spec-kit/feature_catalog/feature_catalog.md:60:| `/memory:save` | 4 | shared | `memory_save`, `memory_index_scan`, `memory_stats`, `memory_update` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-038.md:8777:.opencode/specs/system-spec-kit/999-hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:3350:    62	| `/memory:save` | Save conversation context (4 tools, borrowed) | `memory_save`, `memory_index_scan`, `memory_stats`, `memory_update` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-038.md:8851:.opencode/specs/system-spec-kit/999-hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:5820:- **What it does**: Mnemosyne exposes five direct verbs (`memory_recall`, `memory_recall_global`, `memory_store`, `memory_store_global`, `memory_delete`), while Public exposes a much richer but more distributed command/tool stack across `/memory:search`, `/memory:save`, `/memory:manage`, `/memory:learn`, and `/spec_kit:resume`.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-038.md:8855:.opencode/specs/system-spec-kit/999-hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:5852:- **What it does**: Mnemosyne recommends a simple ritual: recall at session start, store after important decisions, delete contradictions, use global for cross-project preferences. Public already has a stronger recovery contract, but it is expressed as `/spec_kit:resume`, `session_bootstrap()`, `memory_context(resume)`, `/memory:save`, and `/memory:learn`.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-038.md:8858:.opencode/specs/system-spec-kit/999-hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:5900:3. a migration guide that maps `memory_recall`, `memory_store`, `memory_delete`, `global`, and `core` onto `/spec_kit:resume`, `session_bootstrap()`, `/memory:save`, `/memory:learn`, and governed retrieval scope.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-038.md:8859:.opencode/specs/system-spec-kit/999-hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:5917:- **What it does**: Mnemosyne exposes five direct verbs (`memory_recall`, `memory_recall_global`, `memory_store`, `memory_store_global`, `memory_delete`), while Public exposes a much richer but more distributed command/tool stack across `/memory:search`, `/memory:save`, `/memory:manage`, `/memory:learn`, and `/spec_kit:resume`.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-038.md:8863:.opencode/specs/system-spec-kit/999-hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:5949:- **What it does**: Mnemosyne recommends a simple ritual: recall at session start, store after important decisions, delete contradictions, use global for cross-project preferences. Public already has a stronger recovery contract, but it is expressed as `/spec_kit:resume`, `session_bootstrap()`, `memory_context(resume)`, `/memory:save`, and `/memory:learn`.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-038.md:8866:.opencode/specs/system-spec-kit/999-hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:5997:3. a migration guide that maps `memory_recall`, `memory_store`, `memory_delete`, `global`, and `core` onto `/spec_kit:resume`, `session_bootstrap()`, `/memory:save`, `/memory:learn`, and governed retrieval scope.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-038.md:8892:.opencode/specs/system-spec-kit/999-hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-037.md:224:3. a migration guide that maps `memory_recall`, `memory_store`, `memory_delete`, `global`, and `core` onto `/spec_kit:resume`, `session_bootstrap()`, `/memory:save`, `/memory:learn`, and governed retrieval scope.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/005-mempalace/research/iterations/iteration-013.md:452:| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed                                 |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/005-mempalace/research/iterations/iteration-013.md:513:Trigger: "save context", "save memory", `/memory:save`, memory file creation
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-009.md:3098:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/specs/system-spec-kit/999-hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-007.md:403:    55	| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-009.md:3835:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/specs/system-spec-kit/999-hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-007.md:403:    55	| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/deep-research-strategy.md:56:- [ ] Q6. `/memory:save` user flow — What does invoking save feel like?
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-019.md:377:| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-019.md:470:Trigger: "save context", "save memory", `/memory:save`, memory file creation
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/iterations/iteration-014.md:2:title: "Iteration 014 — /memory:save user flow under Option C"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/iterations/iteration-014.md:9:focus: "UX walkthrough for /memory:save under the new model. Interactive and auto modes. Confirmation screen. Routing transparency."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/iterations/iteration-014.md:22:# Iteration 014 — Q6: /memory:save User Flow
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/iterations/iteration-014.md:26:Walk through the `/memory:save` user experience under Option C. Show what the user sees at each step, how routing is visible, and how failures surface.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/iterations/iteration-014.md:32:User runs `/memory:save` with no args at session end. The command:
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/iterations/iteration-014.md:41:✓ /memory:save complete
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/iterations/iteration-014.md:61:User runs `/memory:save --interactive` or `/memory:save --dry-run`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/iterations/iteration-014.md:69:/memory:save will perform 6 operations:
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/iterations/iteration-014.md:102:User runs `/memory:save --force --route-as "narrative_progress"` to bypass classification and force all content into one target. For expert users who know exactly what they want.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/iterations/iteration-014.md:163:This transforms `/memory:save` from a black-box operation into an auditable one. Users can fix routing mistakes BEFORE they land in spec docs.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/005-mempalace/research/iterations/iteration-023.md:4037:.opencode/skills/system-spec-kit/scripts/lib/wave-segment-planner.cjs:47:const HOTSPOT_SPREAD_THRESHOLD = 0.15;
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/005-mempalace/research/iterations/iteration-023.md:4038:.opencode/skills/system-spec-kit/scripts/lib/wave-segment-planner.cjs:84:  if (hotspotSpread < HOTSPOT_SPREAD_THRESHOLD) {
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/005-mempalace/research/iterations/iteration-023.md:4039:.opencode/skills/system-spec-kit/scripts/lib/wave-segment-planner.cjs:87:      reason: `Hotspot spread ${hotspotSpread.toFixed(3)} below threshold ${HOTSPOT_SPREAD_THRESHOLD}`,
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/005-mempalace/research/iterations/iteration-023.md:4040:.opencode/skills/system-spec-kit/scripts/lib/wave-segment-planner.cjs:143:   3. HOTSPOT INVENTORY (T-WE-NEW-2)
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/005-mempalace/research/iterations/iteration-023.md:4041:.opencode/skills/system-spec-kit/scripts/lib/wave-segment-planner.cjs:607:  HOTSPOT_SPREAD_THRESHOLD,
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/005-mempalace/research/iterations/iteration-023.md:6182:.opencode/skills/system-spec-kit/scripts/tests/deep-loop-wave-planner.vitest.ts:18:  HOTSPOT_SPREAD_THRESHOLD: number;
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/iterations/iteration-005.md:59:1. `/memory:save` targets it for the first time, OR
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/iterations/iteration-005.md:122:Every `/memory:save` that triggers a merge operation also triggers a continuity block update:
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/005-mempalace/research/iterations/iteration-018.md:442:| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed                                 |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/005-mempalace/research/iterations/iteration-018.md:503:Trigger: "save context", "save memory", `/memory:save`, memory file creation
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/iterations/iteration-015.md:37:2. **Explicit overrides win over implicit routes.** If a human passed `--route-as X` to `/memory:save`, the classifier's choice is ignored.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/iterations/iteration-001.md:42:│ /memory:save → generate-context.ts CLI               │
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/iterations/iteration-001.md:84:│ /memory:save → generate-context.ts (refactored)      │
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/iterations/iteration-006.md:54:**Cache invalidation**: when a spec doc is re-indexed (after a `/memory:save` merge), the `trigger_phrases` column is refreshed from the updated frontmatter. The index auto-updates.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/iterations/iteration-022.md:171:2. Recompute canonical fingerprint over normalized frontmatter + body bytes using the same hash function the planner used.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/iterations/iteration-022.md:187:- Runs inside `/memory:save` and future merge commands.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/iterations/iteration-002.md:104:The `RoutingDecision.overrideable: true` field lets callers override the classifier's choice. `/memory:save` can accept a `--route-as <category>` flag, and interactive sessions can prompt "Content classified as X with confidence Y; route anyway?".
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/iterations/iteration-002.md:136:- **F2.5**: The routing decision shape (category, target, confidence, fallback, explanation, overrideable) gives callers everything they need for UX transparency. `/memory:save` can echo "Routed 3 chunks: 2 to implementation-summary.md, 1 to decision-record.md ADR-005" in the response.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/iterations/iteration-026.md:55:- Detector: `/memory:save --route-as <category>` requests a target that differs from the classifier winner and the classifier confidence for the requested target is low; override semantics come from iteration 002 and save UX from `findings/save-journey.md`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-memory-terminology/phrasing-audit.md:32:| `SKILL.md:503-506` (Memory Save Rule heading + body) | `Trigger: /memory:save, "save context", or "save memory"` | `Trigger: /memory:save, "save context", or "save continuity"` (slash command name unchanged) | "save memory" trigger phrase is documentation prose; the slash command name `/memory:save` stays. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-memory-terminology/phrasing-audit.md:108:| `CLAUDE.md:144` | `Save context: \`/memory:save\` OR compose JSON → \`generate-context.js --json '<data>' [spec-folder]\` → Auto-indexed` | `Save context: \`/memory:save\` OR compose JSON → \`generate-context.js --json '<data>' [spec-folder]\` → Auto-indexed into the spec-doc continuity store` |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-memory-terminology/phrasing-audit.md:191:| Slash command names | `/memory:save`, `/memory:search`, `/memory:learn`, `/memory:manage` | UNCHANGED |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/iterations/iteration-013.md:188:Iteration 14 — /memory:save user flow.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-memory-terminology/spec.md:94:- **Tool, command, frontmatter, table, file, and folder names** — `memory_search`, `memory_save`, `/memory:save`, `/memory:learn`, `_memory.continuity`, `memory_index` SQL table, `memory-search.ts` handler files, `references/memory/` folder, `scripts/dist/memory/` folder — all stay exactly as-is. The prior research output (archived) recommended a rename; the user explicitly scoped that out.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/iterations/iteration-027.md:43:| Write (`/memory:save`) | 1100-1250ms | 1940ms | 2600-2900ms | Safe under the `<2s` target with modest headroom |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/iterations/iteration-017.md:127:| 14 | /memory:save flow | Routing transparency + interactive mode + failure messages |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-memory-terminology/review/iterations/iteration-005.md:11:| REQ-001 identifier preservation | Precise `tool-schemas.ts` `name: 'memory_*'` count = 21. Handler files matching `mcp_server/handlers/memory-*.ts` = 17. Unique slash-command mentions across OpenCode, Claude, and Gemini mirrors = 4 (`/memory:save`, `/memory:search`, `/memory:learn`, `/memory:manage`). Each runtime command folder has 4 command files. `_memory:` remains in `spec.md:15`. `references/memory/` and `scripts/dist/memory/` are present. `working_memory` remains present in the cognitive subsystem. | PASS |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-memory-terminology/review/iterations/iteration-001.md:24:Identifier rename audit passed: all 21 no-touch `memory_*` tool names are present in `tool-schemas.ts`, `/memory:save`, `/memory:search`, `/memory:learn`, and `/memory:manage` remain present in command docs, `_memory:` remains at `spec.md:15`, handler filename count is 17, `references/memory/` and `scripts/dist/memory/` exist, and SQL table names including `working_memory` remain present.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/iterations/iteration-018.md:38:4. `/spec_kit:plan` does NOT run `/memory:save` — the plan docs themselves are the initial memory
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/iterations/iteration-018.md:46:**At session end**: user runs `/memory:save`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/iterations/iteration-018.md:49:1. `/memory:save` collects session context (exchanges, tool calls, decisions, blockers)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/iterations/iteration-018.md:108:3. Calls `/memory:save` with final session context
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/iterations/iteration-018.md:137:If a user runs `/memory:save` before any `implementation-summary.md` exists (e.g., mid-implementation before running `/spec_kit:complete`), the merge has no target. Router falls back to saving to `handover.md` as "pending implementation" content.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/iterations/iteration-019.md:101:- Manual save flow (user runs `/memory:save`, inspects routing output)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-memory-terminology/review/iterations/iteration-003.md:14:- `/memory:save`, `/memory:search`, `/memory:learn`, and `/memory:manage` command files remain present across OpenCode, Claude, and Gemini mirrors.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/deep-research-dashboard.md:115:- [x] **Q6** — /memory:save user flow (iter 14)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/iterations/iteration-039.md:268:   2. Run /memory:save --continue scratch/pending-save-...
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/findings-registry.json:101:      "question": "/memory:save user flow",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/findings-registry.json:230:      "title": "Routing transparency is the core UX win for /memory:save",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/003-continuity-refactor-gates/research/research.md:61:### Q6. `/memory:save` user flow
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/spec.md:101:| 4 | `004-memory-save-rewrite/` | Complete | Feature Specification: /memory:save Planner-First Default |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-memory-terminology/review/prompts/iteration-001.md:21:   - 4 slash commands: /memory:save, /memory:search, /memory:learn, /memory:manage
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-memory-terminology/review/prompts/iteration-001.md:52:   grep -rn '/memory:save\|/memory:search\|/memory:learn\|/memory:manage' .opencode/commands/memory/
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:46450:    55	| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:46543:   148	Trigger: "save context", "save memory", `/memory:save`, memory file creation
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:59007:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/specs/system-spec-kit/999-hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-007.md:403:    55	| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:59744:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/specs/system-spec-kit/999-hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-007.md:403:    55	| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:83780:/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/skills/system-spec-kit/scripts/lib/wave-segment-planner.cjs:7:// v1: heuristic-based (file counts, directory grouping, hotspot ranking)
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:125912:| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:126005:Trigger: "save context", "save memory", `/memory:save`, memory file creation
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:136920:| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:137013:Trigger: "save context", "save memory", `/memory:save`, memory file creation
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:249246:   127	- `/memory:save` - preserve the current session context into spec memory
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:249525:   142	/memory:save       # Save current conversation context
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:249646:/bin/zsh -lc 'rg -n "/spec_kit:resume|/memory:save|memory_context|memory_match_triggers|memory_search|generate-context" .opencode/skills/system-spec-kit/references .opencode/skills/system-spec-kit/scripts .opencode/skills/system-spec-kit/feature_catalog' in /Users/michelkerkmeester/MEGA/Development/Code_Environment/Public
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:249648:.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:126:- [ ] Save context if significant progress: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:249649:.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:159:- [ ] Memory context saved: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:249656:.opencode/skills/system-spec-kit/references/structure/folder_routing.md:244:1. User says "save context" or `/memory:save`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:249671:.opencode/skills/system-spec-kit/feature_catalog/feature_catalog_in_simple_terms.md:62:| `/memory:save` | Save conversation context (4 tools, borrowed) | `memory_save`, `memory_index_scan`, `memory_stats`, `memory_update` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:249694:.opencode/skills/system-spec-kit/references/templates/level_specifications.md:764:| `memory/` | Session context preservation | `generate-context.js` runtime script via `/memory:save` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:249695:.opencode/skills/system-spec-kit/references/templates/level_specifications.md:769:- Use `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:249725:.opencode/skills/system-spec-kit/references/workflows/quick_reference.md:127:- `/memory:save` - preserve the current session context into spec memory
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:249727:.opencode/skills/system-spec-kit/references/workflows/quick_reference.md:497:- Command: `/memory:save`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:249761:.opencode/skills/system-spec-kit/scripts/scripts-registry.json:12:      "trigger": ["save context", "save memory", "/memory:save"],
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:249803:.opencode/skills/system-spec-kit/references/memory/trigger_config.md:18:1. **Command Trigger** - `/memory:save` command for explicit saves
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:249804:.opencode/skills/system-spec-kit/references/memory/trigger_config.md:29:| `/memory:save` Command | Primary save trigger | Immediate |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:249811:.opencode/skills/system-spec-kit/references/memory/trigger_config.md:187:/memory:save
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:249836:.opencode/skills/system-spec-kit/references/memory/save_workflow.md:142:/memory:save       # Save current conversation context
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:249906:.opencode/skills/system-spec-kit/feature_catalog/16--tooling-and-scripts/17-json-primary-deprecation-posture.md:53:- The save command (`/memory:save`) updated to document the JSON-primary posture.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:249943:.opencode/skills/system-spec-kit/feature_catalog/feature_catalog.md:60:| `/memory:save` | 4 | shared | `memory_save`, `memory_index_scan`, `memory_stats`, `memory_update` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:249972:.opencode/skills/system-spec-kit/scripts/tests/memory-learn-command-docs.vitest.ts:19:    expect(learnDoc).toContain('[s] use /memory:save instead');
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:250026:    62	| `/memory:save` | Save conversation context (4 tools, borrowed) | `memory_save`, `memory_index_scan`, `memory_stats`, `memory_update` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:252070:   142	/memory:save specs/007-feature-name
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:252496:- **What it does**: Mnemosyne exposes five direct verbs (`memory_recall`, `memory_recall_global`, `memory_store`, `memory_store_global`, `memory_delete`), while Public exposes a much richer but more distributed command/tool stack across `/memory:search`, `/memory:save`, `/memory:manage`, `/memory:learn`, and `/spec_kit:resume`.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:252528:- **What it does**: Mnemosyne recommends a simple ritual: recall at session start, store after important decisions, delete contradictions, use global for cross-project preferences. Public already has a stronger recovery contract, but it is expressed as `/spec_kit:resume`, `session_bootstrap()`, `memory_context(resume)`, `/memory:save`, and `/memory:learn`.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:252576:3. a migration guide that maps `memory_recall`, `memory_store`, `memory_delete`, `global`, and `core` onto `/spec_kit:resume`, `session_bootstrap()`, `/memory:save`, `/memory:learn`, and governed retrieval scope.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:252593:- **What it does**: Mnemosyne exposes five direct verbs (`memory_recall`, `memory_recall_global`, `memory_store`, `memory_store_global`, `memory_delete`), while Public exposes a much richer but more distributed command/tool stack across `/memory:search`, `/memory:save`, `/memory:manage`, `/memory:learn`, and `/spec_kit:resume`.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:252625:- **What it does**: Mnemosyne recommends a simple ritual: recall at session start, store after important decisions, delete contradictions, use global for cross-project preferences. Public already has a stronger recovery contract, but it is expressed as `/spec_kit:resume`, `session_bootstrap()`, `memory_context(resume)`, `/memory:save`, and `/memory:learn`.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:252673:3. a migration guide that maps `memory_recall`, `memory_store`, `memory_delete`, `global`, and `core` onto `/spec_kit:resume`, `session_bootstrap()`, `/memory:save`, `/memory:learn`, and governed retrieval scope.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:252902:3. a migration guide that maps `memory_recall`, `memory_store`, `memory_delete`, `global`, and `core` onto `/spec_kit:resume`, `session_bootstrap()`, `/memory:save`, `/memory:learn`, and governed retrieval scope.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:255555:.opencode/specs/system-spec-kit/999-agentic-system-upgrade/001-research-agentic-systems/002-babysitter-main/external/library/methodologies/automaker/agents/feature-planner/README.md
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:256866:.opencode/specs/system-spec-kit/999-agentic-system-upgrade/001-research-agentic-systems/002-babysitter-main/external/library/methodologies/cc10x/agents/planner/README.md
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:256925:.opencode/specs/system-spec-kit/999-agentic-system-upgrade/001-research-agentic-systems/002-babysitter-main/external/library/methodologies/everything-claude-code/agents/planner/README.md
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:257115:.opencode/specs/system-spec-kit/999-agentic-system-upgrade/001-research-agentic-systems/002-babysitter-main/external/library/methodologies/gsd/agents/gsd-planner/README.md
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:257637:.opencode/specs/system-spec-kit/999-agentic-system-upgrade/001-research-agentic-systems/002-babysitter-main/external/library/methodologies/spec-kit/agents/technical-planner/README.md
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:257774:.opencode/specs/system-spec-kit/999-agentic-system-upgrade/001-research-agentic-systems/002-babysitter-main/external/library/methodologies/ccpm/agents/product-planner/README.md
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:258381:.opencode/specs/system-spec-kit/999-agentic-system-upgrade/001-research-agentic-systems/002-babysitter-main/external/library/specializations/ux-ui-design/agents/refinement-planner/README.md
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:258498:.opencode/specs/system-spec-kit/999-agentic-system-upgrade/001-research-agentic-systems/002-babysitter-main/external/library/specializations/ai-agents-conversational/agents/plan-execute-planner/README.md
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:265543:3. a migration guide that maps `memory_recall`, `memory_store`, `memory_delete`, `global`, and `core` onto `/spec_kit:resume`, `session_bootstrap()`, `/memory:save`, `/memory:learn`, and governed retrieval scope.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:273966:.opencode/specs/system-spec-kit/999-hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:2972:.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:126:- [ ] Save context if significant progress: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:273967:.opencode/specs/system-spec-kit/999-hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:2973:.opencode/skills/system-spec-kit/references/validation/phase_checklists.md:159:- [ ] Memory context saved: `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:273982:.opencode/specs/system-spec-kit/999-hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:2995:.opencode/skills/system-spec-kit/feature_catalog/feature_catalog_in_simple_terms.md:62:| `/memory:save` | Save conversation context (4 tools, borrowed) | `memory_save`, `memory_index_scan`, `memory_stats`, `memory_update` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:273992:.opencode/specs/system-spec-kit/999-hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:3018:.opencode/skills/system-spec-kit/references/templates/level_specifications.md:764:| `memory/` | Session context preservation | `generate-context.js` runtime script via `/memory:save` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:273993:.opencode/specs/system-spec-kit/999-hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:3019:.opencode/skills/system-spec-kit/references/templates/level_specifications.md:769:- Use `/memory:save` or `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js --json '{"specFolder":"...","sessionSummary":"..."}' specs/###-folder/`
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:274082:.opencode/specs/system-spec-kit/999-hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:3267:.opencode/skills/system-spec-kit/feature_catalog/feature_catalog.md:60:| `/memory:save` | 4 | shared | `memory_save`, `memory_index_scan`, `memory_stats`, `memory_update` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:274101:.opencode/specs/system-spec-kit/999-hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:3350:    62	| `/memory:save` | Save conversation context (4 tools, borrowed) | `memory_save`, `memory_index_scan`, `memory_stats`, `memory_update` |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:274175:.opencode/specs/system-spec-kit/999-hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:5820:- **What it does**: Mnemosyne exposes five direct verbs (`memory_recall`, `memory_recall_global`, `memory_store`, `memory_store_global`, `memory_delete`), while Public exposes a much richer but more distributed command/tool stack across `/memory:search`, `/memory:save`, `/memory:manage`, `/memory:learn`, and `/spec_kit:resume`.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:274179:.opencode/specs/system-spec-kit/999-hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:5852:- **What it does**: Mnemosyne recommends a simple ritual: recall at session start, store after important decisions, delete contradictions, use global for cross-project preferences. Public already has a stronger recovery contract, but it is expressed as `/spec_kit:resume`, `session_bootstrap()`, `memory_context(resume)`, `/memory:save`, and `/memory:learn`.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:274182:.opencode/specs/system-spec-kit/999-hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:5900:3. a migration guide that maps `memory_recall`, `memory_store`, `memory_delete`, `global`, and `core` onto `/spec_kit:resume`, `session_bootstrap()`, `/memory:save`, `/memory:learn`, and governed retrieval scope.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:274183:.opencode/specs/system-spec-kit/999-hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:5917:- **What it does**: Mnemosyne exposes five direct verbs (`memory_recall`, `memory_recall_global`, `memory_store`, `memory_store_global`, `memory_delete`), while Public exposes a much richer but more distributed command/tool stack across `/memory:search`, `/memory:save`, `/memory:manage`, `/memory:learn`, and `/spec_kit:resume`.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:274187:.opencode/specs/system-spec-kit/999-hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:5949:- **What it does**: Mnemosyne recommends a simple ritual: recall at session start, store after important decisions, delete contradictions, use global for cross-project preferences. Public already has a stronger recovery contract, but it is expressed as `/spec_kit:resume`, `session_bootstrap()`, `memory_context(resume)`, `/memory:save`, and `/memory:learn`.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:274190:.opencode/specs/system-spec-kit/999-hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-036.md:5997:3. a migration guide that maps `memory_recall`, `memory_store`, `memory_delete`, `global`, and `core` onto `/spec_kit:resume`, `session_bootstrap()`, `/memory:save`, `/memory:learn`, and governed retrieval scope.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:274216:.opencode/specs/system-spec-kit/999-hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/iterations/iteration-037.md:224:3. a migration guide that maps `memory_recall`, `memory_store`, `memory_delete`, `global`, and `core` onto `/spec_kit:resume`, `session_bootstrap()`, `/memory:save`, `/memory:learn`, and governed retrieval scope.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:274930:3. a migration guide that maps `memory_recall`, `memory_store`, `memory_delete`, `global`, and `core` onto `/spec_kit:resume`, `session_bootstrap()`, `/memory:save`, `/memory:learn`, and governed retrieval scope.
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:275833:| **Save context**          | `/memory:save` OR compose JSON → `generate-context.js --json '<data>' [spec-folder]` → Auto-indexed |
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:275926:Trigger: "save context", "save memory", `/memory:save`, memory file creation
.opencode/specs/system-spec-kit/z_future/hybrid-rag-fusion-upgrade/001-research-hybrid-rag-fusion-systems/004-opencode-mnemosyne-main/research/research.md:288629:3. a migration guide that maps `memory_recall`, `memory_store`, `memory_delete`, `global`, and `core` onto `/spec_kit:resume`, `session_bootstrap()`, `/memory:save`, `/memory:learn`, and governed retrieval scope.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/005-code-graph/002-code-graph-context-and-scan-scope/research/research.md:483:| Refresh memory index | `/memory:save` |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/002-memory-quality-remediation/research/deep-research-strategy.md:75:- Does NOT propose UI/UX changes for `/memory:save` slash command
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-memory-terminology/research_archive/rename-pivot-2026-04-26-pt-01/001-memory-terminology-pt-01/deep-research-strategy.md:238:### **Treating `memory_save` as a T2 because of its a=0 (zero agent-def quotes)** — finding 4 explains save is routed through `/memory:save` slash command, not invoked from agent prose. Top-doc presence (4 hits in triad) + skill-docs intensity (164) + handover hits (4) + the absence of save in agent prose are all consistent with first-class operator-facing tool. T1 assignment confirmed. (iteration 2) -- BLOCKED (iteration 2, 1 attempts)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-memory-terminology/research_archive/rename-pivot-2026-04-26-pt-01/001-memory-terminology-pt-01/deep-research-strategy.md:239:- What was tried: **Treating `memory_save` as a T2 because of its a=0 (zero agent-def quotes)** — finding 4 explains save is routed through `/memory:save` slash command, not invoked from agent prose. Top-doc presence (4 hits in triad) + skill-docs intensity (164) + handover hits (4) + the absence of save in agent prose are all consistent with first-class operator-facing tool. T1 assignment confirmed. (iteration 2)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-memory-terminology/research_archive/rename-pivot-2026-04-26-pt-01/001-memory-terminology-pt-01/deep-research-strategy.md:241:- Do NOT retry: **Treating `memory_save` as a T2 because of its a=0 (zero agent-def quotes)** — finding 4 explains save is routed through `/memory:save` slash command, not invoked from agent prose. Top-doc presence (4 hits in triad) + skill-docs intensity (164) + handover hits (4) + the absence of save in agent prose are all consistent with first-class operator-facing tool. T1 assignment confirmed. (iteration 2)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-memory-terminology/research_archive/rename-pivot-2026-04-26-pt-01/001-memory-terminology-pt-01/deep-research-strategy.md:274:- **Treating `memory_save` as a T2 because of its a=0 (zero agent-def quotes)** — finding 4 explains save is routed through `/memory:save` slash command, not invoked from agent prose. Top-doc presence (4 hits in triad) + skill-docs intensity (164) + handover hits (4) + the absence of save in agent prose are all consistent with first-class operator-facing tool. T1 assignment confirmed. (iteration 2) (iteration 2)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-memory-terminology/research_archive/rename-pivot-2026-04-26-pt-01/001-memory-terminology-pt-01/iterations/iteration-001.md:17:5. **Anthropic's Claude Memory tool primary terminology is narrow and well-bounded.** Verbatim noun phrases used by Anthropic: "memory tool", "memory file directory", "memory directory", "memory operations", "memory commands" (the six are `view`, `create`, `str_replace`, `insert`, `delete`, `rename`), "memory artifacts", "memory store", "memory backend", "/memories" (the canonical container path), "memory_20250818" (the API beta tool type identifier), and "memory tool helpers". The conceptual layers are: (1) the LLM tool surface (`tools: [{type: "memory_20250818", name: "memory"}]`), (2) the client-side handler implementation (`BetaAbstractMemoryTool` / `betaMemoryTool`), and (3) the on-disk container (`/memories`). Anthropic does NOT use the terms `continuity`, `spec doc`, `packet`, `handover`, `recovery ladder`, `causal graph`, or `lineage` — none of our internal vocabulary collides downward. The collision surface is bidirectional and asymmetric: any of our identifiers that contain the bare token `memory` (especially `memory_save`, `memory_search`, `memory_context`, `memory_match_triggers`, `/memory:save`, `/memory:search`, `_memory.continuity`) will read in our READMEs as if they refer to Anthropic's tool. The reverse is not true — Anthropic's `memory_20250818` is dated and clearly Anthropic-branded. This means the rename's collision-mitigation work falls entirely on the local side; we do NOT need a defensive Anthropic-side disambiguation strategy beyond a one-line positioning callout. [SOURCE: https://platform.claude.com/docs/en/docs/agents-and-tools/tool-use/memory-tool]
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-memory-terminology/review/deep-review-strategy.md:75:- 4 slash commands: `/memory:save`, `/memory:search`, `/memory:learn`, `/memory:manage`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/003-system-hardening/spec.md:90:- **SSK-RR-2** — Canonical-save pipeline invariant research. Post-H-56-1, `/memory:save` writes across four state layers with no invariant spec. Validator already classifies observed drift as "benign clock skew" — is that correct, or masking real divergence?
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-memory-terminology/research_archive/rename-pivot-2026-04-26-pt-01/001-memory-terminology-pt-01/iterations/iteration-002.md:47:4. **The agent-def class is dominated by 4 tools and shows a clean cliff at the rest.** Of 16 agent-def files (`.claude/agents/*.md` + `.opencode/agents/*.md`) that reference any memory tool, the class count distribution is: `memory_context`=52, `memory_search`=42, `memory_match_triggers`=34, `memory_list`=10, `memory_stats`=4, `memory_save`=0, all 15 others=0. The cliff between `memory_stats` (4) and the next non-zero (`memory_list`=10) is shallow but the cliff from `memory_list` (10) down to all 15 zero-counts is total. Sample quotes confirm context (e.g., `.claude/agents/deep-review.md:` `"Do NOT redundantly call memory_context or memory_match_triggers for the same information"`) — these are operator-instruction quotes, not casual mentions. `memory_save` having `a=0` is interesting: agent definitions never invoke save directly; saves are routed through `/memory:save` slash command. This means `memory_save` is a top-doc-tier quote (CLAUDE.md MEMORY SAVE RULE) but not an agent-def-tier quote. Tiering still places it as T1 because top-doc presence + skill-docs intensity (164) + handover quotes (4) carry it. [SOURCE: `.claude/agents/deep-review.md`, `.claude/agents/context.md`, plus 14 other agent files; per-file-class grep iteration 2]
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-memory-terminology/research_archive/rename-pivot-2026-04-26-pt-01/001-memory-terminology-pt-01/iterations/iteration-002.md:71:- **Treating `memory_save` as a T2 because of its a=0 (zero agent-def quotes)** — finding 4 explains save is routed through `/memory:save` slash command, not invoked from agent prose. Top-doc presence (4 hits in triad) + skill-docs intensity (164) + handover hits (4) + the absence of save in agent prose are all consistent with first-class operator-facing tool. T1 assignment confirmed. (iteration 2)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/spec.md:68:The dominant finding is **H-56-1** (compound P1, confidence 0.93): the default `/memory:save` canonical-save path is a **structural metadata-freshness no-op**. Composed from three existing conditions:
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/spec.md:71:2. `scripts/core/workflow.ts:1333` gates `refreshGraphMetadata` on `plannerMode === 'full-auto'`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/spec.md:72:3. `scripts/memory/generate-context.ts:415` defaults to `plannerMode = 'plan-only'`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/spec.md:74:Net effect: every default `/memory:save` invocation writes **zero** metadata to `description.json.lastUpdated` and `graph-metadata.json.derived.*`. The review-surfaced symptom "0 of 16 sibling folders have fresh `description.json.lastUpdated`" (R5-P1-001) is not drift over time — it is the **deterministic output** of a default code path that never writes. Every `/memory:save` invocation since this code shipped has been a metadata no-op.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/spec.md:135:- FC-1: Every `/memory:save` writes `description.json.lastUpdated` + refreshes `graph-metadata.json.derived.*`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/spec.md:152:- **FC-1**: Every `/memory:save` invocation (any `plannerMode`) writes `description.json.lastUpdated` and refreshes `graph-metadata.json.derived.*` on the target spec folder.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/plan.md:98:- Canary `/memory:save` on test folder (pre-Wave C sweep)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/plan.md:150:3. Lift the `plannerMode === 'full-auto'` gate at workflow.ts:1333 — `refreshGraphMetadata` now runs on every canonical save regardless of plannerMode.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-memory-terminology/research_archive/rename-pivot-2026-04-26-pt-01/001-memory-terminology-pt-01/research.md:14:The system-spec-kit's "memory" vocabulary overloads six distinct concept layers and ~270+ identifiers, creates a future naming clash with Anthropic's Claude Memory tool, and confuses operators on first read of `/memory:save`. Ten autonomous research iterations converged on a **single `continuity_*` axis** rename, scoped via a **6-row layer-based contract** (L1 SQL tables stay; L2 markdown stays; L3 frontmatter renames in templates with parser-fallback for the 1,916-file corpus; L4 ladder phrase rewrites in 5 files; L5 21 MCP tools rename with **3-tier deprecation alias matrix** — T1 permanent / T2 2-release / T3 1-release; L6 cognitive subsystem carves out FSRS / Miller's-Law literature loanwords, with 5 conditional identifiers locked to L1=NO-ACTION). Implementation lands as a **linear 4-PR chain** (parser → tools → templates+glossary → triad+cognitive). Two HIGH-severity risks (parser atomicity across 6 sites; cross-repo `AGENTS_Barter.md` symlink) have concrete mitigations. The verdict is differentiated and defensible against the OSS ecosystem (LangChain dissolved, LlamaIndex avoids "memory", MCP-registry has reference `memory` server, Cursor + Letta partition differently).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/review/016-foundational-runtime-pt-01/iterations/iteration-004.md:103:2. **`description.json.lastUpdated` has no auto-refresh mechanism; the drift observed in R3-P2-001 is the predictable outcome of an infrastructure gap, not a one-off lapse** — `.opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js` (grep: zero `lastUpdated` references), `.git/hooks/` (all `.sample`, zero active), `.opencode/skills/system-spec-kit/scripts/dist/memory/*.js` (zero hits across all 9 dist scripts) — R3-P2-001 documented the drift between `description.json.lastUpdated: 2026-04-16T21:45:00Z` and `graph-metadata.json.last_save_at: 2026-04-17T11:20:00Z`. This iteration confirms the **root cause**: no code path in `generate-context.js` writes `lastUpdated`, no git hook refreshes either file on commit, and the `.githooks`/`.husky` directories do not exist. The drift is guaranteed to recur every time a spec folder's code lands but the corresponding `/memory:save` is not explicitly run. Because `description.json` is cited in `graph-metadata.json.authoritativeSources` and is consumed by `memory_search` / `skill_advisor` / continuity recovery flows, any consumer that reads `description.json` as its source-of-truth for "current folder state" gets a stale snapshot whenever the auto-save cadence falls behind commit cadence. Classified P1 because this is the direct maintainability root cause of an already-flagged P2 traceability finding AND because the fix requires new infrastructure (a post-commit hook or a `lastUpdated` writer in `generate-context.js`), not just a one-line docs tweak. Reinforces the R3 theme that canonical-save-surface hygiene is inconsistent.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/review/016-foundational-runtime-pt-01/iterations/iteration-004.md:117:      "counterevidenceSought": "Checked whether generate-context.js has a lastUpdated-writing helper under a different name (e.g., refreshDescriptionMetadata) — no such helper exists; the file is 571 lines and none of its functions reference the string 'lastUpdated'. Checked whether /memory:save is documented as the exclusive path for keeping description.json fresh — CLAUDE.md §3 says 'description.json and graph-metadata.json are auto-generated/refreshed by generate-context.js during canonical saves' but this is only accurate for graph-metadata.json, not description.json.",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-memory-terminology/research_archive/rename-pivot-2026-04-26-pt-01/001-memory-terminology-pt-01/findings-registry.json:74:      "text": "**Anthropic's Claude Memory tool primary terminology is narrow and well-bounded.** Verbatim noun phrases used by Anthropic: \"memory tool\", \"memory file directory\", \"memory directory\", \"memory operations\", \"memory commands\" (the six are `view`, `create`, `str_replace`, `insert`, `delete`, `rename`), \"memory artifacts\", \"memory store\", \"memory backend\", \"/memories\" (the canonical container path), \"memory_20250818\" (the API beta tool type identifier), and \"memory tool helpers\". The conceptual layers are: (1) the LLM tool surface (`tools: [{type: \"memory_20250818\", name: \"memory\"}]`), (2) the client-side handler implementation (`BetaAbstractMemoryTool` / `betaMemoryTool`), and (3) the on-disk container (`/memories`). Anthropic does NOT use the terms `continuity`, `spec doc`, `packet`, `handover`, `recovery ladder`, `causal graph`, or `lineage` — none of our internal vocabulary collides downward. The collision surface is bidirectional and asymmetric: any of our identifiers that contain the bare token `memory` (especially `memory_save`, `memory_search`, `memory_context`, `memory_match_triggers`, `/memory:save`, `/memory:search`, `_memory.continuity`) will read in our READMEs as if they refer to Anthropic's tool. The reverse is not true — Anthropic's `memory_20250818` is dated and clearly Anthropic-branded. This means the rename's collision-mitigation work falls entirely on the local side; we do NOT need a defensive Anthropic-side disambiguation strategy beyond a one-line positioning callout. [SOURCE: https://platform.claude.com/docs/en/docs/agents-and-tools/tool-use/memory-tool]",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-memory-terminology/research_archive/rename-pivot-2026-04-26-pt-01/001-memory-terminology-pt-01/findings-registry.json:259:      "text": "**The agent-def class is dominated by 4 tools and shows a clean cliff at the rest.** Of 16 agent-def files (`.claude/agents/*.md` + `.opencode/agents/*.md`) that reference any memory tool, the class count distribution is: `memory_context`=52, `memory_search`=42, `memory_match_triggers`=34, `memory_list`=10, `memory_stats`=4, `memory_save`=0, all 15 others=0. The cliff between `memory_stats` (4) and the next non-zero (`memory_list`=10) is shallow but the cliff from `memory_list` (10) down to all 15 zero-counts is total. Sample quotes confirm context (e.g., `.claude/agents/deep-review.md:` `\"Do NOT redundantly call memory_context or memory_match_triggers for the same information\"`) — these are operator-instruction quotes, not casual mentions. `memory_save` having `a=0` is interesting: agent definitions never invoke save directly; saves are routed through `/memory:save` slash command. This means `memory_save` is a top-doc-tier quote (CLAUDE.md MEMORY SAVE RULE) but not an agent-def-tier quote. Tiering still places it as T1 because top-doc presence + skill-docs intensity (164) + handover quotes (4) carry it. [SOURCE: `.claude/agents/deep-review.md`, `.claude/agents/context.md`, plus 14 other agent files; per-file-class grep iteration 2]",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-memory-terminology/research_archive/rename-pivot-2026-04-26-pt-01/001-memory-terminology-pt-01/findings-registry.json:2213:      "text": "**Treating `memory_save` as a T2 because of its a=0 (zero agent-def quotes)** — finding 4 explains save is routed through `/memory:save` slash command, not invoked from agent prose. Top-doc presence (4 hits in triad) + skill-docs intensity (164) + handover hits (4) + the absence of save in agent prose are all consistent with first-class operator-facing tool. T1 assignment confirmed. (iteration 2)",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/002-memory-quality-remediation/research/research.md:52:Topic: root cause analysis and backend remediation for memory quality issues in JSON-mode `generate-context.js` saves for `.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-memory-quality-issues`. Scope included the structured JSON save path (`--json`, `/tmp/save-context-data.json`, and `--stdin`), the render pipeline, extractor behavior, template behavior, and any supporting migration or enrichment layers that shaped the broken sample outputs. Non-goals included manual repair of the seven broken memory files, redesign of the broader memory system, capture-mode investigations outside the JSON path, V8 contamination work, embedding-model changes, and `/memory:save` UX work. Stop conditions were: answer Q1-Q7, map D1-D8 to concrete owners, and converge by max-iteration or diminishing new information. [REFERENCE: deep-research-strategy.md]
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/merged-phase-map.md:46:| `014-memory-save-rewrite/` | Feature Specification: /memory:save Planner-First Default | Complete | `002-continuity-memory-runtime/` | `002-continuity-memory-runtime/004-memory-save-rewrite/` |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/review/016-foundational-runtime-pt-01/iterations/iteration-003.md:102:1. **`description.json` metadata drift — `lastUpdated` and `status` stale relative to `graph-metadata.json` and Phase 017 remediation state** — `.opencode/specs/system-spec-kit/026-graph-and-context-optimization/008-runtime-executor-hardening/001-foundational-runtime/001-initial-research/description.json:37`, `:46-47`, `.opencode/specs/system-spec-kit/026-graph-and-context-optimization/008-runtime-executor-hardening/001-foundational-runtime/001-initial-research/graph-metadata.json:162-163` — `description.json.lastUpdated` reads `2026-04-16T21:45:00Z` and `status: "ready_for_implementation"` / `phaseStage: "stage-2-planning-complete"`. `graph-metadata.json.derived.last_save_at` reads `2026-04-17T11:20:00Z` and `status: "implemented"`. Git log confirms `description.json` was last touched at `6b4de51fc` (Stage 2 charter, pre-Phase 017) and never refreshed after 27 subsequent `fix(016)` commits landed. `graph-metadata.json` was refreshed at `bc47d3dce` (Apr 17). The divergence means any memory-search consumer that reads `description.json` sees "ready for implementation" while graph traversal through `graph-metadata.json` sees "implemented". Reconciliation is required at next `/memory:save` via `generate-context.js`. Classified P2 because the remediation IS complete in code and the graph-metadata side correctly reflects it; only the description-layer is stale, and the drift is auto-resolvable by re-running the canonical save script. Reinforces the prior-iteration theme that canonical-save-surface hygiene has gaps.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-memory-terminology/research_archive/rename-pivot-2026-04-26-pt-01/001-memory-terminology-pt-01/deep-research-dashboard.md:80:- **Treating `memory_save` as a T2 because of its a=0 (zero agent-def quotes)** — finding 4 explains save is routed through `/memory:save` slash command, not invoked from agent prose. Top-doc presence (4 hits in triad) + skill-docs intensity (164) + handover hits (4) + the absence of save in agent prose are all consistent with first-class operator-facing tool. T1 assignment confirmed. (iteration 2) (iteration 2)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/002-memory-quality-remediation/research/archive/strategy-v2-iter020.md:75:- Does NOT propose UI/UX changes for `/memory:save` slash command
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/scratch/deep-review-research-suggestions.md:281:3. **Canonical-save pipeline contract** — after the H-56-1 fix, `/memory:save` writes metadata through `generate-context.js → description.json → graph-metadata.json → memory index`. Root validator runs already show clock-drift warnings (`CONTINUITY_FRESHNESS deltaMs=-8455798` treated as benign). Is the "benign" classification correct, or is it masking real state divergence?
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/scratch/deep-review-research-suggestions.md:362:**Why**: After H-56-1 shipped, `/memory:save` writes through `generate-context.js → description.json → graph-metadata.json → memory index`. Root validator runs already surface `CONTINUITY_FRESHNESS deltaMs=-8455798` (continuity timestamp newer than graph-metadata by 8.4M ms / ~2.3 hours) treated as "benign clock drift." But the 026 root validation also showed `EVIDENCE_MARKER_LINT: 1 malformed`, and `SPEC_DOC_INTEGRITY: 15 references missing` in recursive mode (child packets point at files under skill trees that don't exist in this checkout). Are these real divergences or expected artifacts? No single invariant spec exists.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/scratch/deep-review-research-suggestions.md:365:- Enumerate every state write performed during `/memory:save` (plan-only and full-auto modes): frontmatter fields touched, `description.json` fields written, `graph-metadata.json` `derived.*` fields updated, memory index rows inserted/updated, checkpoint state.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/scratch/deep-review-research-suggestions.md:375:Scope: Canonical-save pipeline invariant research. The /memory:save pipeline
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/002-memory-quality-remediation/research/archive/research-v2-iter020-snapshot.md:33:Topic: root cause analysis and backend remediation for memory quality issues in JSON-mode `generate-context.js` saves for `.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-memory-quality-issues`. Scope included the structured JSON save path (`--json`, `/tmp/save-context-data.json`, and `--stdin`), the render pipeline, extractor behavior, template behavior, and any supporting migration or enrichment layers that shaped the broken sample outputs. Non-goals included manual repair of the seven broken memory files, redesign of the broader memory system, capture-mode investigations outside the JSON path, V8 contamination work, embedding-model changes, and `/memory:save` UX work. Stop conditions were: answer Q1-Q7, map D1-D8 to concrete owners, and converge by max-iteration or diminishing new information. [REFERENCE: deep-research-strategy.md]
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/006-skill-advisor/002-skill-graph-daemon-native-advisor-tools/battle-plan.md:237:- If test is pre-existing failure from outside 027 scope (see Phase 020 deferral list: `transcript-planner-export.vitest.ts`, `deep-loop/prompt-pack.vitest.ts`, `context-server-error-envelope.vitest.ts`), document as known non-regression and proceed.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/review/016-foundational-runtime-pt-01/deltas/iter-004.jsonl:3:{"type":"finding","id":"R4-P1-002","severity":"P1","dimension":"maintainability","title":"description.json.lastUpdated has no auto-refresh mechanism; R3-P2-001 drift is structurally inevitable","file":".opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js (0 lastUpdated hits)",".git/hooks/ (14 .sample entries, 0 active)","evidence":"generate-context.js refreshes graph-metadata.json per its comments but contains zero references to lastUpdated across all 571 lines. Same for other 8 dist/memory/ scripts. No .git/hooks are active (all .sample). No .husky or .githooks directory. The drift R3-P2-001 observed is the predictable outcome of zero infrastructure, not a one-off lapse.","impact":"Memory-search consumers reading description.json as source-of-truth for folder status get stale snapshots whenever /memory:save cadence falls behind commit cadence. Phase 016 targeted canonical-packet hygiene, making this a scope gap.","recommendation":"Add lastUpdated writer to generate-context.js during canonical save; OR add .git/hooks/post-commit to auto-refresh; OR amend CLAUDE.md §3 to declare description.json.lastUpdated is manually maintained.","confidence":0.90,"claimAdjudication":{"counterevidenceSought":"Checked for lastUpdated-writing helper under a different name in generate-context.js — zero matches. Checked CLAUDE.md §3 wording — says 'description.json and graph-metadata.json are auto-generated/refreshed by generate-context.js during canonical saves' which is only accurate for graph-metadata.json.","alternativeExplanation":"Team may consider it manual-edit; but description.json is machine-parsed and cited as authoritative, contradicting manual-maintenance intent.","downgradeTrigger":"generate-context.js updated to write lastUpdated OR post-commit hook added OR CLAUDE.md amended"},"crossRefs":["R3-P2-001 (drift observed)","R3-P1-002 (research folder missing metadata)"]}
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/review/016-foundational-runtime-pt-01/review-report.md:369:/memory:save
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/002-memory-quality-remediation/research/archive/spec-pre-phase-decomposition.md:120:- `/memory:save` UX or CLI surface changes.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/002-memory-quality-remediation/research/archive/research-v3-iter025-pre-expansion-snapshot.md:33:Topic: root cause analysis and backend remediation for memory quality issues in JSON-mode `generate-context.js` saves for `.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-memory-quality-issues`. Scope included the structured JSON save path (`--json`, `/tmp/save-context-data.json`, and `--stdin`), the render pipeline, extractor behavior, template behavior, and any supporting migration or enrichment layers that shaped the broken sample outputs. Non-goals included manual repair of the seven broken memory files, redesign of the broader memory system, capture-mode investigations outside the JSON path, V8 contamination work, embedding-model changes, and `/memory:save` UX work. Stop conditions were: answer Q1-Q7, map D1-D8 to concrete owners, and converge by max-iteration or diminishing new information. [REFERENCE: deep-research-strategy.md]
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/scratch/changelog-audit-v3.4.0.0.md:55:**Current changelog wording:** `## Memory Folder Retirement` is framed as **Phase 013** and `## Save-Flow Planner-First Trim` is framed as **Phase 015** [`.opencode/changelog/01--system-spec-kit/v3.4.0.0.md:232-332`](../../../../changelog/01--system-spec-kit/v3.4.0.0.md).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/scratch/changelog-audit-v3.4.0.0.md:74:**Current changelog wording:** the lead says **"Three follow-on cutovers close the remaining drift..."** and then lists memory-folder retirement, middleware deprecation, and planner-first save-flow trim [`.opencode/changelog/01--system-spec-kit/v3.4.0.0.md:5`](../../../../changelog/01--system-spec-kit/v3.4.0.0.md).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-codex/evidence/CX-013/step-3-stdout.txt:139:The calling AI acts as the orchestrator (planner, validator, integrator) while Codex CLI executes targeted tasks. The value comes from combining different model perspectives and leveraging Codex's sandbox-controlled execution, not from redundant work.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-codex/evidence/CX-013/step-3-stdout.txt:227:Documents the active Codex agents in `.codex/agents/` and how any AI assistant orchestrates them. The calling AI acts as the **conductor** (planner, validator, integrator) while Codex CLI executes targeted tasks through its agent system.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/002-memory-quality-remediation/research/archive/research-v1-iter010-snapshot.md:33:Topic: root cause analysis and backend remediation for memory quality issues in JSON-mode `generate-context.js` saves for `.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-memory-quality-issues`. Scope included the structured JSON save path (`--json`, `/tmp/save-context-data.json`, and `--stdin`), the render pipeline, extractor behavior, template behavior, and any supporting migration or enrichment layers that shaped the broken sample outputs. Non-goals included manual repair of the seven broken memory files, redesign of the broader memory system, capture-mode investigations outside the JSON path, V8 contamination work, embedding-model changes, and `/memory:save` UX work. Stop conditions were: answer Q1-Q7, map D1-D8 to concrete owners, and converge by max-iteration or diminishing new information. [REFERENCE: deep-research-strategy.md]
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/review/016-foundational-runtime-pt-02/iterations/iteration-001.md:72:- **Summary:** T-CNS-01 and T-W1-CNS-04 remediation are both present and unconditional. `lastUpdated`, `memorySequence`, and `graph-metadata.json` refresh all run on every canonical save (not gated on `plannerMode` or on the legacy `ctxFileWritten` stub).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/002-memory-quality-remediation/research/archive/strategy-v1-iter010.md:75:- Does NOT propose UI/UX changes for `/memory:save` slash command
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/decision-record.md:3:description: "ADR ledger for the planner-first /memory:save contract: the trim-targeted verdict, planner-first default output, reconsolidation opt-in, enrichment deferral, router category contract, hard-blocker preservation, and the scoped content-router.ts exception."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/decision-record.md:6:  - "memory save planner first adr"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/decision-record.md:7:  - "planner-first save"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/decision-record.md:17:    recent_action: "Rewrote ADR ledger as cohesive planner-first decision sequence"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/decision-record.md:25:      fingerprint: "sha256:014-planner-first-adr-2026-04-15"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/decision-record.md:26:      session_id: "014-planner-first-adr-2026-04-15"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/decision-record.md:27:      parent_session_id: "014-planner-first-seed"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/decision-record.md:31:      - "All ADRs reframed under the planner-first delivery arc."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/decision-record.md:34:# Decision Record: /memory:save Planner-First Default
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/decision-record.md:91:### ADR-002: Planner-First Output Contract for `/memory:save`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/decision-record.md:107:**We chose**: Make planner-first output the default `/memory:save` contract and preserve `full-auto` as explicit fallback.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/decision-record.md:109:**How it works**: The handler computes the same route and legality data as before, but the default path stops short of mutation and returns structured planner output instead.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/decision-record.md:128:| Replace the save system with a new planner service | Wider scope and safety risk |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/decision-record.md:158:**How it works**: Planner mode surfaces reconsolidation as follow-up capability. `full-auto` or explicit flags preserve access when operators want it.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/decision-record.md:167:- Added some operator choice and documentation complexity. Mitigation: planner follow-up guidance and env-reference alignment.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/decision-record.md:205:**How it works**: The planner surfaces enrichment opportunities, and the follow-up APIs or explicit fallback path handle the actual execution when it is wanted.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/decision-record.md:299:**How it works**: The planner reports advisory quality issues, but malformed or unsafe saves still block.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/decision-record.md:308:- Some fixes now require explicit edits. Mitigation: planner output shows them clearly.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:3:description: "Make /memory:save planner-first (non-mutating) by default while preserving full-auto as an explicit fallback, retire the legacy [spec]/memory/*.md write path, and decouple freshness (graph-metadata refresh, spec-doc reindex, enrichment) from the hot save path via explicit follow-up APIs."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:7:  - "memory save planner first"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:8:  - "planner-first memory save"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:10:  - "speckit_save_planner_mode"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:23:    recent_action: "Folder renamed; spec rewritten under planner-first framing"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:37:      fingerprint: "sha256:014-planner-first-default-2026-04-15"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:38:      session_id: "014-planner-first-default-2026-04-15"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:39:      parent_session_id: "014-planner-first-default-closeout"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:45:      - "Implementation shipped planner-first default with explicit full-auto fallback; freshness work moved to explicit follow-up APIs."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:49:# Feature Specification: /memory:save Planner-First Default
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:58:`/memory:save` was doing too much on every invocation. The runtime still created, wrote, indexed, and read `[spec]/memory/*.md` even though v3.4.0.0 docs claimed that artifact was retired; on top of that legacy write path, every save triggered Tier 3 routing, a heavy quality-loop auto-fix, reconsolidation-on-save, post-insert enrichment, unconditional graph-metadata refresh, and unconditional spec-doc reindex — regardless of whether the caller actually wanted mutation. Auditing the code proved the system was half-migrated, turning vague drift into 25 concrete findings. Classifying the remaining 15 save-flow subsystems proved which ones still earned runtime cost (the canonical atomic writer, routed record identity, the content-router category contract, and thin continuity validation) and which ones did not belong on the default path.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:60:This packet delivers the end state implied by that analysis. `/memory:save` is planner-first by default: the handler computes the same route and legality data as before but stops short of mutation and returns structured planner output instead. `full-auto` is preserved as an explicit fallback via `SPECKIT_SAVE_PLANNER_MODE=full-auto`, with canonical atomic mutation, `POST_SAVE_FINGERPRINT` safety parity, same-path identity, and rollback intact. The legacy `[spec]/memory/*.md` write path is retired. Four previously default-on behaviors become explicit opt-in: `SPECKIT_ROUTER_TIER3_ENABLED`, `SPECKIT_QUALITY_AUTO_FIX`, `SPECKIT_RECONSOLIDATION_ENABLED`, `SPECKIT_POST_INSERT_ENRICHMENT_ENABLED`. Freshness becomes follow-up work via three new APIs: `refreshGraphMetadata`, `reindexSpecDocs`, `runEnrichmentBackfill`. `hybrid` is documented as reserved and currently behaves like `plan-only`. The content-router category contract is preserved with one honest, scoped exception: a Tier 3 default-disable and manual-review guard inside `content-router.ts`. 43 implementation tasks shipped under v3.4.1.0. A deep-review pass flagged 3 P0, 5 P1, and 1 P2 findings on router honesty, fallback safety parity, blocker classification, deferred-helper coverage, and changelog accuracy; all 9 were resolved before closeout.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:91:`/memory:save` mutated by default, did work that had nothing to do with the caller's intent, and still honored an artifact family that had supposedly been retired. The audit produced 25 concrete findings across runtime write path, runtime read path, indexing, documentation contradictions, template drift, test drift, and a phantom save-side dedup contract. Relevance research then classified the remaining 15 save-flow subsystems and showed that four core pieces earned their cost (canonical atomic writer, routed record identity, content-router category contract, thin continuity validation) while four others (Tier 3 routing, reconsolidation-on-save, heavy quality-loop auto-fix, post-insert enrichment) did not belong on the default path. That combined picture made the default contract untenable: operators got mutation they didn't ask for, freshness work they didn't need, and an artifact surface docs claimed was gone.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:95:Ship a `/memory:save` contract that matches the evidence: planner-first by default so operators see the plan before anything changes, full-auto preserved as an explicit fallback for the cases that still need it, and freshness work moved to callable follow-up APIs so every save doesn't pay for work it doesn't need. Retire the legacy `[spec]/memory/*.md` write path end-to-end. Make four previously default-on behaviors opt-in via per-subsystem env flags, preserve `hybrid` as a reserved value, and record the scoped router exception honestly so docs match the code.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:105:- Make `/memory:save` planner-first by default: the default path computes route + legality data, returns structured planner output, does not mutate files.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:106:- Preserve the `full-auto` writer path as an explicit fallback activated via `SPECKIT_SAVE_PLANNER_MODE=full-auto` with canonical atomic mutation, promotion, rollback, and same-path identity intact.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:112:- Reserve `hybrid` as a valid value for `SPECKIT_SAVE_PLANNER_MODE` that currently behaves like `plan-only`; document it as reserved honestly.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:114:- Promote template-contract failures from advisories to planner blockers.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:117:- Update tests across `memory-save`, `content-router`, `quality-loop`, `save-quality-gate`, reconsolidation-bridge, reconsolidation, assistive-reconsolidation, chunking, graph-refresh, thin-continuity, planner UX, CLI target authority, and memory-save integration to prove planner-default + fallback end-to-end behavior.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:118:- Validate planner-first behavior against three real session transcripts before closeout.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:124:- Replacing the save system with a new planner service; the existing handler owns the contract.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:133:| Planner contract core | `memory-save.ts`, `types.ts`, `response-builder.ts`, `validation-responses.ts`, `generate-context.ts` | Modify | Introduce planner-first default + shared types + blocker/advisory separation |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:139:| Command docs | `../../../../command/memory/save.md`, `../../../../command/memory/manage.md` | Modify | Document planner-first default, fallback, and follow-up freshness actions |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:141:| Env reference | `../../../../skill/system-spec-kit/mcp_server/ENV_REFERENCE.md` | Modify | Document `SPECKIT_SAVE_PLANNER_MODE`, per-subsystem flags, reserved `hybrid` honestly |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:143:| Test surfaces | See tasks.md §Testing — broad vitest + transcript prototype sweep | Modify | Prove planner-default, fallback parity, gate behavior, continuity upserts |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:149:The packet carries packet-local snapshots of the audit report, research synthesis, deep-review report, and planner-first transcript prototypes so a reader can inspect the most important artifacts without leaving the folder. Those snapshots live under `research/013-audit-snapshot/`, `research/014-research-snapshot/`, `review/015-deep-review-snapshot/`, and `scratch/transcripts-snapshot/` inside this flattened `004-memory-save-rewrite` packet.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:161:| REQ-001 | The default `/memory:save` path must be planner-first and non-mutating. | Default invocation returns structured planner output (route, legality, blockers, advisories, follow-up actions) and mutates no files on disk. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:162:| REQ-002 | Explicit `full-auto` must remain available as fallback. | Setting `SPECKIT_SAVE_PLANNER_MODE=full-auto` runs the canonical atomic writer with promotion, rollback, and same-path identity intact. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:168:| REQ-008 | Unconditional graph refresh and spec-doc reindex must leave planner-default saves. | Planner-default saves no longer trigger these; explicit follow-up APIs handle the work when wanted. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:171:| REQ-011 | Template-contract failures must be planner blockers. | Template-contract misses surface as `blocker` entries in planner output, not as advisories. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:172:| REQ-012 | Deferred helpers must return explicit deferred status. | When default-path skips reconsolidation, enrichment, Tier 3 routing, or quality auto-fix, the planner response records `deferred` rather than success-shaped output. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:173:| REQ-013 | `hybrid` must be documented as reserved. | `SPECKIT_SAVE_PLANNER_MODE=hybrid` is recognized; current behavior matches `plan-only`; docs and env reference describe it as reserved for future behavior. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:174:| REQ-014 | Shipped documentation must match the runtime contract. | `/memory:save` docs, `ENV_REFERENCE.md`, release notes, and templates describe planner-first default, explicit fallback, follow-up APIs, reserved `hybrid`, and the scoped router exception honestly. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:181:| REQ-016 | Planner output must preserve blocker/advisory separation. | Types and helpers distinguish `blocker` entries (must fix) from `advisory` entries (informational) in all code paths and tests. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:182:| REQ-017 | CLI target authority must stay deterministic. | Planner-default CLI tests prove the same target selection as full-auto for identical inputs. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:183:| REQ-018 | Same-path identity must remain deterministic after the refactor. | Record identity tests confirm identical path semantics for the same-target save case across planner and full-auto paths. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:184:| REQ-019 | `/spec_kit:resume` recovery ladder must stay intact. | Recovery ladder tests show no regression when the save path is planner-first. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:185:| REQ-020 | Transcript prototypes must ground planner behavior. | Three real session transcripts are exercised; no unexpected drops, wrong-anchor outcomes, or unsafe target exposures are produced. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:186:| REQ-021 | Planner output must not expose unsafe file targets. | Target authority tests verify the planner emits only caller-authorized paths. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:197:| REQ-027 | No new network dependency on the default path. | Planner-default never depends on new network calls introduced by this packet. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:200:| REQ-030 | Follow-up actions surface consistently. | Planner output surfaces follow-up actions in a single consistent schema across router, quality, reconsolidation, enrichment, and indexing scenarios. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:208:- **SC-001**: `/memory:save` with no env override returns structured planner output and mutates no files.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:209:- **SC-002**: `SPECKIT_SAVE_PLANNER_MODE=full-auto` runs the canonical atomic writer with `POST_SAVE_FINGERPRINT` parity, promotion, and rollback intact.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:216:- **SC-009**: `hybrid` is recognized as reserved for `SPECKIT_SAVE_PLANNER_MODE`; documented as currently behaving like `plan-only`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:218:- **SC-011**: Template-contract failures produce `blocker` entries in planner output.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:219:- **SC-012**: Docs (`/memory:save`, `ENV_REFERENCE.md`, release notes, templates) match the shipped contract; router scope is described honestly.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:226:- **SC-019**: Three real session transcripts validate planner-first behavior with no wrong-anchor or unsafe-target outcomes.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:238:| Dependency | Vitest + transcript fixtures | High | Broad test sweep covers planner, fallback, router, quality, reconsolidation, enrichment, follow-up APIs, continuity |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:240:| Risk | Default path still mutates on some branch | High | Planner-default tests assert non-mutation; CI catches regression |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:244:| Risk | Deferred helpers appear to have "succeeded" when they ran nothing | Medium | Explicit `deferred` status in planner output (P015-R004) |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:245:| Risk | Template-contract misses hide as advisories | Medium | Promote to planner blockers (P015-R003) |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:256:- **NFR-C01**: The planner-default path must not mutate any file on disk.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:258:- **NFR-C03**: Router target authority must be identical between planner and fallback paths for the same inputs.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:263:- **NFR-SA02**: Planner output must expose only caller-authorized file targets.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:268:- **NFR-T01**: Every planner output item must map to a typed entry (`blocker` or `advisory` or `deferred`) with a source reason.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:282:- **NFR-G03**: Release notes, `/memory:save` docs, and `ENV_REFERENCE.md` must agree on the same default/opt-in/reserved vocabulary.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:286:- **NFR-U01**: Planner output must be human-readable and action-oriented.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:287:- **NFR-U02**: Operator docs must describe planner-first default, explicit fallback, and follow-up APIs in consistent language.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:298:- **NFR-TH01**: Transcript snapshots retained in packet-local `scratch/` or `review/` directories must not contain raw API keys, bearer tokens, or user credentials. The planner and fallback paths must strip or redact credential-shaped strings before writing any transcript artifact to disk.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:307:- Caller invokes `/memory:save` with no args → planner-default; returns plan; does not mutate.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:311:- Malformed template-contract save → planner output contains at least one `blocker` entry.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:312:- Default-path call that would otherwise run reconsolidation → planner returns a `deferred` entry naming reconsolidation explicitly.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:313:- `SPECKIT_SAVE_PLANNER_MODE=hybrid` → behaves like `plan-only`; documented as reserved.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:318:- A reader assumes "planner-first" means `full-auto` was deleted → docs must be explicit that `full-auto` remains available as fallback.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:342:| R-001 | Default path mutates under a hidden branch | High | Low | Planner-default non-mutation tests |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:355:### US-001: Planner-first default
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:357:**As an** operator running `/memory:save`, **I want** the default path to show me a plan before anything changes, **so that** I can review routing, legality, and follow-up actions without committing to mutation.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:360:1. Given a caller invokes `/memory:save` with no args, when the handler runs, then it returns structured planner output and mutates nothing.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:361:2. Given a caller sees a planner blocker, when they correct the blocker, then a subsequent planner call shows the blocker resolved.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:365:**As an** operator who still wants mutation, **I want** `SPECKIT_SAVE_PLANNER_MODE=full-auto` to run the canonical writer, **so that** automation workflows that depended on in-save mutation keep working.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:368:1. Given `SPECKIT_SAVE_PLANNER_MODE=full-auto`, when the handler runs, then canonical atomic mutation + rollback + same-path identity behave exactly as before.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:376:1. Given a planner-default save completes, when I call `refreshGraphMetadata`, then graph metadata refreshes without mutating saved records.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:384:1. Given `SPECKIT_SAVE_PLANNER_MODE=hybrid`, when the handler runs, then behavior matches `plan-only`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:400:1. Given a template-contract miss, when the planner runs, then the output contains at least one `blocker` entry naming the contract.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:405:**As an** operator reading planner output, **I want** `deferred` status on skipped subsystems, **so that** I don't misread the result as "everything ran and succeeded."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:408:1. Given `SPECKIT_RECONSOLIDATION_ENABLED=false`, when the planner runs, then reconsolidation shows `deferred` in the output (not success-shaped).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:409:2. Given multiple subsystems are deferred, when the planner returns, then each appears as its own `deferred` entry naming the subsystem.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:433:- [x] Runtime contract described consistently across `/memory:save` docs, `ENV_REFERENCE.md`, release notes, and templates.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:439:- [x] Implementation truth preserved: planner-first default + explicit fallback + follow-up APIs.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:457:| Tooling operators | `/memory:save` users | Medium | Need clear default, fallback, and follow-up behavior |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:458:| AI orchestrators | Session continuity readers | High | Need the planner-first contract documented end-to-end |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:466:- Shipped planner-first default for `/memory:save` with explicit `full-auto` fallback.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:478:### Scenario 1: Planner-first default is the shipped contract
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:482:**Then** they understand that `/memory:save` now returns a structured planner response by default and no longer mutates files on the default path.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:488:**Then** they see that `SPECKIT_SAVE_PLANNER_MODE=full-auto` still preserves canonical atomic mutation, promotion, rollback, and same-path identity.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:496:### Scenario 4: `SPECKIT_SAVE_PLANNER_MODE` is the primary planner flag
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:541:| Research | Could the save system be redesigned without replacing the core writer? | Yes. The research recommended a planner-first wrapper around the existing canonical prep and fallback writer. | `research/014-research-snapshot/research.md`, `research/014-research-snapshot/iterations/iteration-020.md` |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:544:| Implementation | What became the new default operator contract? | Planner-first `/memory:save` with structured non-mutating output. | `review/015-deep-review-snapshot/primary-docs/spec.md`, `review/015-deep-review-snapshot/primary-docs/implementation-summary.md`, `../../../../changelog/01--system-spec-kit/v3.4.1.0.md` |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:557:None. The packet records the shipped and remediated state of `/memory:save` as of 2026-04-15.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:3:description: "Milestoned delivery (M1-M10) for the planner-first /memory:save contract: audit + retirement of the legacy [spec]/memory/*.md write path, 20-iteration relevance research, planner contract + fallback implementation, routing/quality/reconsolidation/enrichment trim, follow-up API extraction, verification, release alignment, and deep-review remediation."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:6:  - "memory save planner first"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:7:  - "planner-first memory save plan"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:9:  - "retirement audit to planner-first"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:17:    recent_action: "Folder renamed; plan rewritten as M1-M10 planner-first delivery"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:28:      fingerprint: "sha256:014-planner-first-plan-2026-04-15"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:29:      session_id: "014-planner-first-plan-2026-04-15"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:30:      parent_session_id: "014-planner-first-seed"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:34:      - "The planner-first default + explicit fallback architecture preserves the canonical writer while eliminating the default-path overreach."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:38:# Implementation Plan: /memory:save Planner-First Default
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:60:The plan delivers a planner-first default for `/memory:save` while preserving the canonical atomic writer as an explicit fallback. It retires the legacy `[spec]/memory/*.md` write path end-to-end, gates four previously default-on save-path behaviors behind explicit env flags, and extracts freshness into three explicit follow-up APIs. Delivery runs through 10 sequential milestones: audit surface + classification, retirement cutover, relevance research, planner contract build-out, routing + quality trim, verification + transcript prototypes, release alignment, and deep-review remediation.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:68:| M3 | Retirement cutover | v3.4.1.0 removes legacy memory-file write path + aligns docs | Bridges audit to planner work |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:71:| M6 | Planner contract | Planner-first default + flag plumbing + type surface + shared types | Ships the new operator contract |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:73:| M8 | Verification + transcripts | Targeted tests, transcript prototypes, packet validation | Grounds planner behavior in real operator flows |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:88:- [x] Packet scope limited to the planner contract, retirement of legacy write path, subsystem gating, follow-up APIs, and docs alignment.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:92:- [x] Packet canonical docs exist and agree on the planner-first contract.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:98:- [x] Planner-default runtime tests prove the default path is non-mutating.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:111:Planner-first wrapper around the preserved canonical atomic writer. The default path computes route + legality + advisory data and returns structured planner output without mutating files. An explicit fallback path activates the canonical writer with full atomic semantics intact. Freshness work lives in callable follow-up APIs.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:115:- **Planner-first handler (`memory-save.ts`)**: Default execution path returning planner output (routes, blockers, advisories, follow-up actions). No mutation on default.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:116:- **Canonical atomic writer (preserved: `create-record.ts`, `atomic-index-memory.ts`, `thin-continuity-record.ts`, `post-insert.ts`)**: Fallback path when `SPECKIT_SAVE_PLANNER_MODE=full-auto`. Rollback, promotion, same-path identity, `POST_SAVE_FINGERPRINT` parity intact.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:127:Caller invokes /memory:save
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:130:Resolve SPECKIT_SAVE_PLANNER_MODE
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:135:    |       Return structured planner output (no mutation)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:146:See `spec.md §3 Files to Change` for the consolidated table covering legacy write-path retirement, planner contract core, canonical writer preservation, content router scoped exception, quality gate updates, reconsolidation gating, enrichment deferral, freshness APIs, command + reference + env docs, release notes, test surfaces, and packet metadata.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:154:| Planner contract | `types.ts`, `response-builder.ts`, `validation-responses.ts`, `generate-context.ts`, `/memory:save` docs | Default non-mutating output |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:172:  -> M6 Planner contract
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:193:After the retirement cutover, open relevance research with Q1-Q10 covering load-bearing core, planner-first feasibility, quality-check classification, reindex vs freshness, graph-metadata refresh, entity extraction, reconsolidation cost, router classifier overfitting, trigger harmonization, and continuity ownership. Evidence: `research/014-research-snapshot/primary-docs/spec.md`, `research/014-research-snapshot/deep-research-strategy.md`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:199:### M6 — Planner contract
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:201:Build the planner-first default, CLI defaults, docs, and type surfaces:
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:203:- [x] T001-T005 Add planner-default and fallback flag definitions; planner response interfaces; response serialization helpers; planner blocker and advisory response helpers.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:204:- [x] T006-T008 Make `generate-context.ts` request planner-first behavior by default; update `/memory:save` docs; make `memory-save.ts` return planner output by default with explicit fallback.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:205:- [x] T009-T012 Update aggregate and handler tests for planner-default behavior; focused planner-first regression coverage.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:214:- [x] T027-T034 Move unconditional graph refresh + spec-doc reindex out of planner-default saves; expose explicit follow-up indexing entry points; keep graph refresh callable as explicit follow-up; update reconsolidation-bridge, reconsolidation, assistive-reconsolidation, chunking, graph-refresh tests.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:218:Prove the planner-first model holds up against real session evidence:
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:220:- [x] T035-T037 Memory-save integration tests for planner-default plus fallback end-to-end; planner UX regression tests for readable output; thin-continuity tests for normalization + upsert parity.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:221:- [x] T038 Prototype planner-first behavior against three real session transcripts. Evidence: `scratch/transcripts-snapshot/`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:223:- [x] T041-T043 Review structural parity between `/memory:save` + `AGENTS.md` + system-spec-kit skill doc; review fallback safety against `atomic-index-memory.ts` + `create-record.ts`; review transcript mismatches and convert unresolved issues into follow-on tasks.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:235:- **F003 [P0]**: template-contract failures hidden as advisories → resolved by promoting them to planner blockers.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:253:| Runtime contract tests | Planner-default + fallback parity + router + quality + follow-up APIs | Vitest suites + targeted sweeps | `review/015-deep-review-snapshot/primary-docs/tasks.md`, `review/015-deep-review-snapshot/primary-docs/checklist.md`, `review/015-deep-review-snapshot/primary-docs/implementation-summary.md` |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:254:| Transcript validation | Planner-first behavior against real sessions | Transcript markdown + planner-output JSON + transcript reviews | `scratch/transcripts-snapshot/` |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:275:- Planner-first contract built before trim work.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:312:- **Trigger**: Planner-default mutates under some branch, fallback loses atomic safety parity, router preservation claim contradicts code, or remediation reopens a closed finding.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:321:| M6 planner contract | Planner output schema drift or default mutation | Revert planner commits; re-enable prior handler default | None |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:329:Because the canonical atomic writer is preserved, rollback means reverting the planner-first wrapper + env-flag gates + follow-up API exports. Fallback behavior continues to work with full atomic semantics intact.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:342:  -> M6 Planner contract
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:370:| Planner contract | High | 0.5-1 day |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:383:| Implementation | 43 tasks across planner + trim + verification | Explains why the contract cannot be summarized as a small one-line change |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:392:- [x] Planner-default runtime tests pass
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:399:1. Revert planner commits atomically; fallback behavior continues via canonical writer.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:429:│ Planner +    │
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:455:| Research | Retirement cutover | Trim-targeted verdict | Planner contract |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:456:| Planner contract | Research | Non-mutating default + fallback | Trim milestones |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:457:| Trim milestones | Planner contract | Gated subsystems + follow-up APIs | Verification |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:469:4. **Ship the planner-first default + full-auto fallback** — critical because it is the operator-facing contract.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:475:**Total Critical Path**: Audit → Retirement → Research → Planner + Trim → Verification → Release → Remediation
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:488:| M6 | Planner contract | Planner-first default + fallback + shared types | Runtime handler |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:491:| M9 | Release alignment | v3.4.1.0 + `/memory:save` docs + env reference + templates | Release artifacts |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:501:| ADR-002 | Planner-first output becomes the default `/memory:save` contract |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:516:- [x] Confirm planner default stays non-mutating
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:522:| EXEC-SEQ | Ship planner contract before trim work |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:549:| Runtime contract docs | `/memory:save` docs + `ENV_REFERENCE.md` + templates | Align to shipped contract |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:573:| W-C | Planner contract + trim | Runtime handlers + env flags + follow-up APIs | Runtime TypeScript |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:575:| W-E | Docs + release alignment | `/memory:save` docs + env reference + release notes + packet docs | Docs surface |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:597:- **Checkpoint 4**: Planner + trim + follow-up APIs merged.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:622:| Runtime correctness | Complete | Planner default non-mutating + fallback atomic parity |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:623:| Documentation alignment | Complete | `/memory:save` docs + env reference + release notes agree |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-release-cleanup-playbooks/review/006-continuity-refactor-gates-pt-01/iterations/iteration-028.md:20:- The `system-spec-kit` skill and `/memory:save` command both define `_memory.continuity` in `implementation-summary.md` as the primary continuity block for canonical saves. [SOURCE: .opencode/skills/system-spec-kit/SKILL.md:520-542] [SOURCE: .opencode/commands/memory/save.md:67-71]
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/checklist.md:3:description: "Verification ledger covering audit + retirement, relevance research, planner + trim implementation, deep-review remediation, and packet-level merge checks. Every item is source-backed."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/checklist.md:6:  - "memory save planner first checklist"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/checklist.md:7:  - "planner-first verification"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/checklist.md:17:    recent_action: "Rewrote checklist under planner-first framing preserving all verification items"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/checklist.md:25:      fingerprint: "sha256:014-planner-first-checklist-2026-04-15"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/checklist.md:26:      session_id: "014-planner-first-checklist-2026-04-15"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/checklist.md:27:      parent_session_id: "014-planner-first-seed"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/checklist.md:34:# Verification Checklist: /memory:save Planner-First Default
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/checklist.md:64:- [x] ✅ **CHK-CODE-002 [P1]** Remediation corrected the planner blocker contract and fallback parity. Evidence: `review/015-deep-review-snapshot/review-report.md`, `review/015-deep-review-snapshot/primary-docs/implementation-summary.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/checklist.md:70:- [x] ✅ **CHK-TEST-001 [P0]** Test coverage included planner, fallback, router, quality, and continuity paths. Evidence: `review/015-deep-review-snapshot/primary-docs/checklist.md`, `review/015-deep-review-snapshot/primary-docs/implementation-summary.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/checklist.md:112:- [x] ✅ **CHK-014-002 [P0]** Research resolved Q2 and confirmed planner-first substitution was feasible. Evidence: `research/014-research-snapshot/findings-registry.json`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/checklist.md:128:- [x] ✅ **CHK-001 [P0]** Planner-first default and explicit fallback were defined in the packet docs. Evidence: `review/015-deep-review-snapshot/primary-docs/checklist.md`, `review/015-deep-review-snapshot/primary-docs/spec.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/checklist.md:136:- [x] ✅ **CHK-009 [P1]** The packet preserved the planner schema and follow-up guidance coherently across docs. Evidence: `review/015-deep-review-snapshot/primary-docs/spec.md`, `review/015-deep-review-snapshot/primary-docs/plan.md`, `review/015-deep-review-snapshot/primary-docs/tasks.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/checklist.md:137:- [x] ✅ **CHK-010 [P0]** The planner-default path stayed non-mutating. Evidence: `review/015-deep-review-snapshot/primary-docs/checklist.md`, `review/015-deep-review-snapshot/primary-docs/implementation-summary.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/checklist.md:139:- [x] ✅ **CHK-012 [P1]** Shared planner schema types existed and were reused. Evidence: `review/015-deep-review-snapshot/primary-docs/checklist.md`, `review/015-deep-review-snapshot/primary-docs/tasks.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/checklist.md:145:- [x] ✅ **CHK-018 [P1]** Planner-default saves no longer ran unconditional reindex or graph refresh. Evidence: `review/015-deep-review-snapshot/primary-docs/checklist.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/checklist.md:146:- [x] ✅ **CHK-019 [P1]** Planner output preserved blocker and advisory separation. Evidence: `review/015-deep-review-snapshot/primary-docs/tasks.md`, `review/015-deep-review-snapshot/primary-docs/decision-record.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/checklist.md:147:- [x] ✅ **CHK-020 [P0]** Focused `memory-save` tests passed for planner and fallback scenarios. Evidence: `review/015-deep-review-snapshot/primary-docs/checklist.md`, `review/015-deep-review-snapshot/primary-docs/implementation-summary.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/checklist.md:148:- [x] ✅ **CHK-021 [P0]** Integration tests passed for planner-default and fallback behavior. Evidence: `review/015-deep-review-snapshot/primary-docs/checklist.md`, `review/015-deep-review-snapshot/primary-docs/implementation-summary.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/checklist.md:154:- [x] ✅ **CHK-027 [P1]** CLI authority tests passed with planner-default behavior. Evidence: `review/015-deep-review-snapshot/primary-docs/checklist.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/checklist.md:156:- [x] ✅ **CHK-029 [P1]** Planner UX regression tests passed for readable operator-facing output. Evidence: `review/015-deep-review-snapshot/primary-docs/checklist.md`, `review/015-deep-review-snapshot/primary-docs/implementation-summary.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/checklist.md:161:- [x] ✅ **CHK-034 [P2]** Planner output did not expose unsafe file targets. Evidence: `review/015-deep-review-snapshot/primary-docs/checklist.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/checklist.md:164:- [x] ✅ **CHK-037 [P1]** Planner output preserved the same target authority as the fallback path. Evidence: `review/015-deep-review-snapshot/primary-docs/tasks.md`, `review/015-deep-review-snapshot/primary-docs/checklist.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/checklist.md:168:- [x] ✅ **CHK-041 [P1]** `/memory:save` docs described planner-first default, fallback, and follow-up freshness actions. Evidence: `review/015-deep-review-snapshot/primary-docs/checklist.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/checklist.md:187:- [x] ✅ **CHK-R003 [P0]** F003 template-contract failures promoted to planner blockers. Evidence: `review/015-deep-review-snapshot/review-report.md`, `review/015-deep-review-snapshot/primary-docs/implementation-summary.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/checklist.md:205:- [x] ✅ **CHK-014-007 [P1]** Packet primary docs describe the runtime contract accurately (planner default, fallback, follow-up APIs, reserved `hybrid`, scoped router exception). Evidence: packet primary docs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/implementation-summary.md:65:- **`004-memory-save-rewrite/`**: `/memory:save` is planner-first by default. Invoking it now returns a structured planner response — routes, legality blockers, advisories, follow-up actions — and mutates no files on disk. Operators who still need automatic mutation can opt in by setting `S...
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-013/real-pre.sha:24649:780801f7f77b6c9326386449fe818c427b20391eadeec5a507b6be32c799ff8c  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-1x/system-spec-kit--01/scripts/tests/deep-loop-wave-planner.vitest.ts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-013/real-pre.sha:24650:780801f7f77b6c9326386449fe818c427b20391eadeec5a507b6be32c799ff8c  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-2x/system-spec-kit--01/scripts/tests/deep-loop-wave-planner.vitest.ts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-013/real-pre.sha:24651:780801f7f77b6c9326386449fe818c427b20391eadeec5a507b6be32c799ff8c  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-2x/system-spec-kit--02/scripts/tests/deep-loop-wave-planner.vitest.ts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-013/real-pre.sha:24652:780801f7f77b6c9326386449fe818c427b20391eadeec5a507b6be32c799ff8c  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--01/scripts/tests/deep-loop-wave-planner.vitest.ts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-013/real-pre.sha:24653:780801f7f77b6c9326386449fe818c427b20391eadeec5a507b6be32c799ff8c  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--02/scripts/tests/deep-loop-wave-planner.vitest.ts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-013/real-pre.sha:24654:780801f7f77b6c9326386449fe818c427b20391eadeec5a507b6be32c799ff8c  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--03/scripts/tests/deep-loop-wave-planner.vitest.ts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-013/real-pre.sha:24655:780801f7f77b6c9326386449fe818c427b20391eadeec5a507b6be32c799ff8c  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--04/scripts/tests/deep-loop-wave-planner.vitest.ts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-013/real-pre.sha:24656:780801f7f77b6c9326386449fe818c427b20391eadeec5a507b6be32c799ff8c  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--05/scripts/tests/deep-loop-wave-planner.vitest.ts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-013/real-pre.sha:36686:ab34a1b833fa988474d3a34b173e55499591864a96b57a4b91ebcd7b48ca051d  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-1x/system-spec-kit--01/scripts/lib/wave-segment-planner.cjs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-013/real-pre.sha:36687:ab34a1b833fa988474d3a34b173e55499591864a96b57a4b91ebcd7b48ca051d  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-2x/system-spec-kit--01/scripts/lib/wave-segment-planner.cjs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-013/real-pre.sha:36688:ab34a1b833fa988474d3a34b173e55499591864a96b57a4b91ebcd7b48ca051d  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-2x/system-spec-kit--02/scripts/lib/wave-segment-planner.cjs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-013/real-pre.sha:36689:ab34a1b833fa988474d3a34b173e55499591864a96b57a4b91ebcd7b48ca051d  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--01/scripts/lib/wave-segment-planner.cjs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-013/real-pre.sha:36690:ab34a1b833fa988474d3a34b173e55499591864a96b57a4b91ebcd7b48ca051d  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--02/scripts/lib/wave-segment-planner.cjs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-013/real-pre.sha:36691:ab34a1b833fa988474d3a34b173e55499591864a96b57a4b91ebcd7b48ca051d  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--03/scripts/lib/wave-segment-planner.cjs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-013/real-pre.sha:36692:ab34a1b833fa988474d3a34b173e55499591864a96b57a4b91ebcd7b48ca051d  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--04/scripts/lib/wave-segment-planner.cjs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-013/real-pre.sha:36693:ab34a1b833fa988474d3a34b173e55499591864a96b57a4b91ebcd7b48ca051d  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--05/scripts/lib/wave-segment-planner.cjs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/005-memory-search-runtime-bugs/plan.md:153:| Sibling packet `004-memory-save-rewrite` (planner-first contract) | Internal | Green (complete) | None — already landed |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-2-review.md:1:<!-- SNAPSHOT: copied from 015-save-flow-planner-first-trim/scratch/transcript-2-review.md on 2026-04-15. Authoritative source at original packet. -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-2-review.md:5:description: "Alignment review for transcript 2 planner-first prototype."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-2-review.md:13:Transcript 2 aligned with the continuity-only planner path.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/005-memory-search-runtime-bugs/tasks.md:165:  - `../004-memory-save-rewrite/` — planner-first save contract
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-2.md:1:<!-- SNAPSHOT: copied from 015-save-flow-planner-first-trim/scratch/transcript-2.md on 2026-04-15. Authoritative source at original packet. -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-2.md:8:  - "planner-transcript"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-2.md:61:Packet 014 concluded that the canonical atomic writer and continuity contract remain load-bearing, while the default operator flow should move toward planner-first output plus explicit follow-up actions instead of always-on save-time automation.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-2.md:68:- The review explicitly recommends opening an implementation packet for planner-first default-path trim.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-2.md:77:- Keep the continuity target stable and use the planner output to confirm the implementation packet receives the same packet pointer and next-safe-action values.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/review/016-foundational-runtime-pt-02/review-report.md:417:/memory:save
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-release-cleanup-playbooks/review/006-continuity-refactor-gates-pt-01/008-cmd-memory-speckit-revisit/iterations/iteration-001.md:13:Compare `/memory:save` against the shipped canonical save path to verify that the documented side effects still match runtime behavior.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-release-cleanup-playbooks/review/006-continuity-refactor-gates-pt-01/008-cmd-memory-speckit-revisit/iterations/iteration-001.md:32:1. `/memory:save` still describes canonical saves as updating packet docs, `_memory.continuity`, and indexed continuity data, but the live workflow now also refreshes the packet root `graph-metadata.json` on every canonical save. That omission leaves the primary save command behind the shipped workflow behavior.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-release-cleanup-playbooks/review/006-continuity-refactor-gates-pt-01/008-cmd-memory-speckit-revisit/iterations/iteration-001.md:44:  "claim": "/memory:save omits the graph-metadata refresh that canonical saves now perform.",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-release-cleanup-playbooks/review/006-continuity-refactor-gates-pt-01/008-cmd-memory-speckit-revisit/iterations/iteration-001.md:70:- `/memory:save` does not reintroduce standalone memory markdown as the primary operator-facing destination.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-3.md:1:<!-- SNAPSHOT: copied from 015-save-flow-planner-first-trim/scratch/transcript-3.md on 2026-04-15. Authoritative source at original packet. -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-3.md:8:  - "planner-transcript"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-3.md:36:- `.opencode/specs/system-spec-kit/026-graph-and-context-optimization/015-save-flow-planner-first-trim/tasks.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-3.md:42:The Packet 013 audit found a half-migrated state: active runtime write and read paths still touch `[spec]/memory/*.md`, while multiple docs and templates claim the surface is retired. The transcript asks for a follow-on task but does not name a concrete `T###` or `CHK-###` identifier, so the planner should refuse to auto-target a specific checklist row.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-3.md:58:- Expect a blocked planner result and convert the mismatch into a new follow-on task in Packet 015 closeout docs.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-release-cleanup-playbooks/review/006-continuity-refactor-gates-pt-01/review-report.md:48:| Continuity command and skill contract cleanup | 5, 6 | Bring `/memory:save`, `/memory:manage`, and the skill guide into parity with the live graph-metadata refresh/indexing behavior. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/checklist.md:149:- [ ] `workflow.ts:1333` no longer contains `plannerMode === 'full-auto'` gate on `refreshGraphMetadata` [EVIDENCE: pending]
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/checklist.md:150:- [ ] `graph-metadata.json.derived.last_save_at` advances on every `/memory:save` [EVIDENCE: pending]
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/checklist.md:315:- [ ] All 16 sibling 026 folders have fresh `description.json.lastUpdated` after a `/memory:save` [EVIDENCE: pending]
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/deep-research-strategy.md:32:- [ ] Q1 — Advisory-lock, sentinel-file, and generation-bumping paths in the continuity runtime (deep-research lock, cache-warning hooks, /memory:save): where can two concurrent writers or an interrupted writer + resumer corrupt or silently drop state? (race conditions, atomicity, fail-closed guarantees)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/deep-research-strategy.md:33:- [ ] Q2 — /memory:save planner-first rewrite: does the routing table in code match the documented behavior for every intent (decision, narrative_progress, narrative_delivery, handover_state, research_finding, task_update, metadata_only, drop)? Where is the specified-but-unimplemented gap or implemented-but-undocumented behavior?
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/deep-research-strategy.md:124:- **004-memory-save-rewrite**: `/memory:save` is planner-first by default; returns structured planner response with routes/blockers/advisories and mutates nothing unless the operator opts in (`SPECKIT_MEMORY_SAVE_EXECUTE`).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/tasks.md:65:- Verified: Manual test: `/memory:save` on test folder sets `lastUpdated` to current time [EVIDENCE: aaf0f49a8]
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/tasks.md:77:1. Remove `plannerMode === 'full-auto'` gate at workflow.ts:1333.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/tasks.md:78:2. `refreshGraphMetadata` runs on every canonical save regardless of plannerMode.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/tasks.md:82:- Verified: `graph-metadata.json.derived.last_save_at` advances on every `/memory:save` invocation [EVIDENCE: aaf0f49a8]
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-3-review.md:1:<!-- SNAPSHOT: copied from 015-save-flow-planner-first-trim/scratch/transcript-3-review.md on 2026-04-15. Authoritative source at original packet. -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-3-review.md:5:description: "Alignment review for transcript 3 planner-first prototype."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-release-cleanup-playbooks/review/006-continuity-refactor-gates-pt-01/batch-phase-review-state.json:34:        "/memory:save omits the graph-metadata refresh side effect.",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-release-cleanup-playbooks/review/006-continuity-refactor-gates-pt-01/008-cmd-memory-speckit-revisit/iterations/iteration-012.md:4:Post-remediation validation of `/memory:save` and `/memory:manage` against the shipped canonical save and scan behavior. I re-checked the two previously flagged command surfaces to confirm the graph-metadata refresh and four-source scan updates actually landed.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-release-cleanup-playbooks/review/006-continuity-refactor-gates-pt-01/008-cmd-memory-speckit-revisit/iterations/iteration-012.md:18:- `/memory:save` now names `graph-metadata.json` refresh and the narrowed `_memory.continuity` direct-edit allowance — `.opencode/commands/memory/save.md:67-72`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-release-cleanup-playbooks/review/006-continuity-refactor-gates-pt-01/008-cmd-memory-speckit-revisit/iterations/iteration-012.md:22:- The contract table at `/memory:save` stays high level, but the detailed routing section now accurately covers the shipped save behavior, so there is no source-backed drift left in the requested surfaces — `.opencode/commands/memory/save.md:67-83`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/implementation-summary.md:77:Phase 017 closed the remediation surface surfaced by the deep-review of v3.4.0.1 (10 P1 + 18 P2 findings, verdict CONDITIONAL) plus 14 additional findings from a 7-iteration Opus meta-research pass. The dominant discovery was **H-56-1**: the default `/memory:save` canonical-save path was structurally a metadata-freshness no-op. Not drift — by design, since a dead-code guard shipped. The fix cascaded through four waves of infrastructure hardening.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/implementation-summary.md:81:**Primitive 1 — Canonical save writes metadata.** `scripts/core/workflow.ts:1259` no longer hardcodes `ctxFileWritten = false`. The 70-LOC description.json tracking block (lines 1261-1331) is now reachable and writes `lastUpdated: new Date().toISOString()` on every canonical save. `workflow.ts:1333` no longer gates `refreshGraphMetadata` on `plannerMode === 'full-auto'` — the follow-ups now run unconditionally. Net effect: every `/memory:save` invocation refreshes `description.json.lastUpdated` + `graph-metadata.json.derived.*`. Atomic-shipped in commit `aaf0f49a8` (T-CNS-01 + T-W1-CNS-04).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/implementation-summary.md:276:- H-56-1 fix proven working in practice: `/memory:save` invocations during the session cascaded `lastUpdated` refresh across 38 folder metadata files (commit `8859da9cd`)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/implementation-summary.md:312:**H-56-1 confirmed (segment-2):** Default `/memory:save` was structural metadata-freshness no-op: `workflow.ts:1259 const ctxFileWritten = false` dead code + `workflow.ts:1333 plannerMode === 'full-auto'` gate with default `'plan-only'`. Fix shipped in `002-infrastructure-primitives`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/implementation-summary.md:322:**T-CNS-01 + T-W1-CNS-04 (H-56-1 fix, commit `aaf0f49a8`):** `workflow.ts:1259` — `const ctxFileWritten = false` replaced with `true`. `workflow.ts:1333` — `shouldRunExplicitSaveFollowUps = options.plannerMode === 'full-auto'` changed to `true` (unconditional). 38-folder `lastUpdated` cascade proven as side-effect. Test: `workflow-canonical-save-metadata.vitest.ts` (4/4 + 1 skipped).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-1-planner-output.json:5:  "summary": "Planner prepared canonical save plan",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-1-planner-output.json:6:  "message": "Planner prepared a non-mutating canonical save plan.",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-1-planner-output.json:7:  "plannerMode": "plan-only",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-1-planner-output.json:26:      "contentPreview": "---\ntitle: \"Packet 012 Closeout Transcript Replay\"\ndescription: \"Transcript prototype derived from the Packet 012 implementation summary closeout.\"\ntrigger_phrases:\n  - \"packet-012-closeout\"\n  - \"planner-transcript\"\nimportance_tier: \"important\"\ncontextType: \"implementation\"\n---\n\n"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-1-planner-output.json:89:      "message": "Reconsolidation available as follow-up action. Planner-first saves do not run supersede, reinforce, or create-linked reconsolidation work by default.",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-1-planner-output.json:109:        "plannerMode": "full-auto",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-1-planner-output.json:140:        "plannerMode": "full-auto",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-3-planner-output.json:3:  "plannerMode": "plan-only",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-3-planner-output.json:5:  "targetDocPath": ".opencode/specs/system-spec-kit/026-graph-and-context-optimization/015-save-flow-planner-first-trim/tasks.md",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-3-planner-output.json:8:    "Planner requires a concrete task or checklist identifier before it can target an update-in-place save safely."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-2-planner-output.json:3:  "plannerMode": "plan-only",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-2-planner-output.json:5:  "targetDocPath": ".opencode/specs/system-spec-kit/026-graph-and-context-optimization/015-save-flow-planner-first-trim/implementation-summary.md",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/iterations/iteration-001.md:30:| `.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts` | 004 | mcp-tool | H | Primary `/memory:save` handler; planner-first default, blockers, routing, and fallback all converge here. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/iterations/iteration-001.md:31:| `.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts` | 004 | shared-module | H | Shapes planner output, follow-up actions, and safety-critical response semantics. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/iterations/iteration-001.md:32:| `.opencode/skills/system-spec-kit/mcp_server/handlers/save/validation-responses.ts` | 004 | shared-module | H | Converts legality/template failures into planner blockers versus advisories. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/iterations/iteration-001.md:34:| `.opencode/skills/system-spec-kit/mcp_server/handlers/save/atomic-index-memory.ts` | 004 | shared-module | H | Canonical mutation path preserved under planner-first fallback. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/iterations/iteration-001.md:36:| `.opencode/skills/system-spec-kit/mcp_server/handlers/quality-loop.ts` | 004 | shared-module | H | Planner-first packet demotes auto-fix; this is the live quality-loop seam. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/iterations/iteration-001.md:39:| `.opencode/skills/system-spec-kit/mcp_server/lib/continuity/thin-continuity-record.ts` | 004 | shared-module | H | Thin continuity upsert/rehydration surface reused by planner and fallback paths. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/iterations/iteration-001.md:40:| `.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-save.vitest.ts` | 004 | script | H | Handler-level executable proof for the planner contract. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/iterations/iteration-001.md:41:| `.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-planner-first.vitest.ts` | 004 | script | H | Direct verification that default `/memory:save` is planner-only and non-mutating. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/iterations/iteration-001.md:43:| `.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-pipeline-enforcement.vitest.ts` | 004 | script | H | End-to-end enforcement surface for planner, blockers, and follow-up behavior. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/iterations/iteration-001.md:67:| `.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-dedup-order.vitest.ts` | 004 | script | M | Verifies dedup/ordering invariants under planner-first flow. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/iterations/iteration-001.md:68:| `.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-extended.vitest.ts` | 004 | script | M | Broad save-path regression suite beyond the minimal planner contract. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/iterations/iteration-001.md:70:| `.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-ux-regressions.vitest.ts` | 004 | script | M | Guards planner readability and response-shape regressions. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/iterations/iteration-001.md:72:| `.opencode/commands/memory/save.md` | 004 | CLI | M | Operator-facing `/memory:save` command surface for planner-first behavior. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/iterations/iteration-001.md:87:2. **Q2 `/memory:save` planner-first routing table (code vs docs drift)** - candidate files: `.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts`, `.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts`, `.opencode/skills/system-spec-kit/mcp_server/ENV_REFERENCE.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-release-cleanup-playbooks/review/006-continuity-refactor-gates-pt-01/008-cmd-memory-speckit-revisit/deep-review-findings-registry.json:7:      "title": "/memory:save omits the graph-metadata refresh that canonical saves now perform",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-1-review.md:1:<!-- SNAPSHOT: copied from 015-save-flow-planner-first-trim/scratch/transcript-1-review.md on 2026-04-15. Authoritative source at original packet. -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-1-review.md:5:description: "Alignment review for transcript 1 planner-first prototype."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-1-review.md:13:Transcript 1 aligned with the planner-first contract.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-1-review.md:20:- Follow-up path: explicit `apply` action with `plannerMode: "full-auto"`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-1-review.md:24:- The existing planner output kept the target stable even with advisories present.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-mcp-runtime-stress-remediation/001-search-intelligence-stress-playbook/001-search-scenario-design/spec.md:136:- **Prompt**: `Find the spec for the /memory:save planner-first contract.`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-mcp-runtime-stress-remediation/001-search-intelligence-stress-playbook/001-search-scenario-design/spec.md:138:- **Target tools**: `memory_search`, `memory_match_triggers` (trigger phrase "planner-first" should hit)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-mcp-runtime-stress-remediation/001-search-intelligence-stress-playbook/001-search-scenario-design/spec.md:150:- **Prompt**: `Find decisions in 026/003/004 about SPECKIT_SAVE_PLANNER_MODE.`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-mcp-runtime-stress-remediation/001-search-intelligence-stress-playbook/001-search-scenario-design/spec.md:153:- **Success indicators**: Returns the SPECKIT_SAVE_PLANNER_MODE decision rationale
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-mcp-runtime-stress-remediation/001-search-intelligence-stress-playbook/001-search-scenario-design/spec.md:179:- **Expected outcome**: Routes to `/memory:save` with planner-first default; returns structured planner output (no file mutation per 004)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-mcp-runtime-stress-remediation/001-search-intelligence-stress-playbook/001-search-scenario-design/spec.md:180:- **Target tools**: `/memory:save` invocation
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-mcp-runtime-stress-remediation/001-search-intelligence-stress-playbook/001-search-scenario-design/spec.md:181:- **Success indicators**: Recognizes save intent; uses planner-first contract; no surprise mutations
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-mcp-runtime-stress-remediation/001-search-intelligence-stress-playbook/001-search-scenario-design/spec.md:182:- **Cross-ref**: 003/004 (planner-first contract)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-release-cleanup-playbooks/review/006-continuity-refactor-gates-pt-01/008-cmd-memory-speckit-revisit/deep-review-strategy.md:38:| D1 Correctness | CONDITIONAL | 1 | `/memory:save` under-documents the canonical save side effects by omitting graph-metadata refresh. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-release-cleanup-playbooks/review/006-continuity-refactor-gates-pt-01/008-cmd-memory-speckit-revisit/deep-review-strategy.md:87:| `spec_code` | core | pass | 12 | `/memory:save` and `/memory:manage` now describe the live save/scan behavior accurately. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-1.md:1:<!-- SNAPSHOT: copied from 015-save-flow-planner-first-trim/scratch/transcript-1.md on 2026-04-15. Authoritative source at original packet. -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-1.md:8:  - "planner-transcript"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-1.md:62:- The planner output should keep `append-as-paragraph` and `what-built` stable.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/scratch/transcripts-snapshot/transcript-1.md:68:- Compare the planner target with the full-auto canonical diff before treating the transcript as aligned.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/iterations/iteration-002.md:3:Audit Q1 concurrency and race-condition surfaces across Stop-hook state, `/memory:save`, `generate-context`, and deep-research packet locking.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/iterations/iteration-002.md:19:- `FIND-iter002-post-save-rollback-clobber` | Severity: `P0` | File:line: `.opencode/skills/system-spec-kit/mcp_server/handlers/save/spec-folder-mutex.ts:10-27`, `.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1597-1603`, `.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:3118-3124`, `.opencode/skills/system-spec-kit/mcp_server/lib/validation/spec-doc-structure.ts:981-1014` | Description: `/memory:save` serializes canonical saves with an in-memory `Map`, not a cross-process lock. After the pending file is already promoted, the validator rereads the live target and, on fingerprint mismatch, restores `snapshotContent`, which is the pre-merge document, not the competing writer's result. | Repro / observed behavior: run two separate Node processes saving different routed updates to the same `implementation-summary.md`; if process B overwrites the file before process A reaches `validateCanonicalPreparedSave()`, A hits `currentFingerprint !== expectedFingerprint` and executes `fs.writeFileSync(targetPath, postSavePlan.snapshotContent, 'utf8')` at `spec-doc-structure.ts:999`. | Why it matters: one accepted concurrent write can erase another and the target document can regress past both writers, which is direct state loss.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/iterations/iteration-002.md:46:3. `/memory:save` pending-file promotion, in-process-only mutexing, and post-save fingerprint rollback behavior.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/iterations/iteration-002.md:57:1. **Q2 `/memory:save` planner-first routing table drift** - compare live handler routing, response-builder output, and operator docs for mismatches in default behavior and fallback wording.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/iterations/iteration-002.md:66:Audit **Q2** next by tracing planner-first routing and fallback behavior through `.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts`, `.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts`, and `.opencode/skills/system-spec-kit/mcp_server/ENV_REFERENCE.md`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-release-cleanup-playbooks/review/006-continuity-refactor-gates-pt-01/008-cmd-memory-speckit-revisit/review-report.md:15:`/memory:save` still describes canonical saves as updating packet docs, `_memory.continuity`, and indexed continuity data, but the live workflow now also refreshes the packet root `graph-metadata.json` on every canonical save. That omission makes the primary save command under-document a shipped side effect.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-release-cleanup-playbooks/review/006-continuity-refactor-gates-pt-01/008-cmd-memory-speckit-revisit/review-report.md:20:  "claim": "/memory:save omits the graph-metadata refresh that canonical saves now perform.",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-release-cleanup-playbooks/review/006-continuity-refactor-gates-pt-01/008-cmd-memory-speckit-revisit/review-report.md:70:`/spec_kit:resume` already documents `graph-metadata.json` as a secondary packet hint after the canonical docs. The drift is localized to `/memory:save` and `/memory:manage`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-051.md:57:const shouldRunExplicitSaveFollowUps = options.plannerMode === 'full-auto';
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-051.md:67:let plannerMode: 'plan-only' | 'full-auto' | 'hybrid' = 'plan-only';
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-051.md:70:Default mode is `'plan-only'`. Only `--full-auto` (or `--planner-mode full-auto`) triggers the refresh. So under the default canonical save path:
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-051.md:77:The refresh also needs to fire on `--planner-mode plan-only`, which is the documented default path (scripts/memory/generate-context.ts:67). Since `/memory:save` and `generate-context.js --json` both default to plan-only (line 402), **the happy path never refreshes graph-metadata**.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-051.md:150:### R51-P1-002 | Default planner-mode `plan-only` skips graph-metadata refresh | Cluster B (extends R3-P2-001, R5-P1-001)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-051.md:153:**Claim**: `refreshGraphMetadata` is gated on `options.plannerMode === 'full-auto'`. The default planner mode (set at line 415 of generate-context.ts) is `'plan-only'`. Therefore the default `/memory:save` path NEVER refreshes `graph-metadata.json.derived.last_save_at` / `derived.status` / `derived.source_docs`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-051.md:157:let plannerMode: 'plan-only' | 'full-auto' | 'hybrid' = 'plan-only';
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-051.md:160:const shouldRunExplicitSaveFollowUps = options.plannerMode === 'full-auto';
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-051.md:209:- **"generate-context.js is bundled and the dist file is somehow different from src"**: Refuted. Line counts differ (647 src, 571 dist), but the dist preserves the `plannerMode = 'plan-only'` default and the `shouldRunExplicitSaveFollowUps` guard identically (dist file does not include the description-update workflow code — that lives in `workflow.js` which we traced via the .ts source).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-013/real-post.sha:24649:780801f7f77b6c9326386449fe818c427b20391eadeec5a507b6be32c799ff8c  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-1x/system-spec-kit--01/scripts/tests/deep-loop-wave-planner.vitest.ts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-013/real-post.sha:24650:780801f7f77b6c9326386449fe818c427b20391eadeec5a507b6be32c799ff8c  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-2x/system-spec-kit--01/scripts/tests/deep-loop-wave-planner.vitest.ts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-013/real-post.sha:24651:780801f7f77b6c9326386449fe818c427b20391eadeec5a507b6be32c799ff8c  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-2x/system-spec-kit--02/scripts/tests/deep-loop-wave-planner.vitest.ts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-013/real-post.sha:24652:780801f7f77b6c9326386449fe818c427b20391eadeec5a507b6be32c799ff8c  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--01/scripts/tests/deep-loop-wave-planner.vitest.ts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-013/real-post.sha:24653:780801f7f77b6c9326386449fe818c427b20391eadeec5a507b6be32c799ff8c  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--02/scripts/tests/deep-loop-wave-planner.vitest.ts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-013/real-post.sha:24654:780801f7f77b6c9326386449fe818c427b20391eadeec5a507b6be32c799ff8c  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--03/scripts/tests/deep-loop-wave-planner.vitest.ts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-013/real-post.sha:24655:780801f7f77b6c9326386449fe818c427b20391eadeec5a507b6be32c799ff8c  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--04/scripts/tests/deep-loop-wave-planner.vitest.ts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-013/real-post.sha:24656:780801f7f77b6c9326386449fe818c427b20391eadeec5a507b6be32c799ff8c  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--05/scripts/tests/deep-loop-wave-planner.vitest.ts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-013/real-post.sha:36686:ab34a1b833fa988474d3a34b173e55499591864a96b57a4b91ebcd7b48ca051d  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-1x/system-spec-kit--01/scripts/lib/wave-segment-planner.cjs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-013/real-post.sha:36687:ab34a1b833fa988474d3a34b173e55499591864a96b57a4b91ebcd7b48ca051d  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-2x/system-spec-kit--01/scripts/lib/wave-segment-planner.cjs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-013/real-post.sha:36688:ab34a1b833fa988474d3a34b173e55499591864a96b57a4b91ebcd7b48ca051d  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-2x/system-spec-kit--02/scripts/lib/wave-segment-planner.cjs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-013/real-post.sha:36689:ab34a1b833fa988474d3a34b173e55499591864a96b57a4b91ebcd7b48ca051d  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--01/scripts/lib/wave-segment-planner.cjs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-013/real-post.sha:36690:ab34a1b833fa988474d3a34b173e55499591864a96b57a4b91ebcd7b48ca051d  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--02/scripts/lib/wave-segment-planner.cjs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-013/real-post.sha:36691:ab34a1b833fa988474d3a34b173e55499591864a96b57a4b91ebcd7b48ca051d  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--03/scripts/lib/wave-segment-planner.cjs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-013/real-post.sha:36692:ab34a1b833fa988474d3a34b173e55499591864a96b57a4b91ebcd7b48ca051d  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--04/scripts/lib/wave-segment-planner.cjs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-013/real-post.sha:36693:ab34a1b833fa988474d3a34b173e55499591864a96b57a4b91ebcd7b48ca051d  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--05/scripts/lib/wave-segment-planner.cjs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:6:  - "memory save planner first"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:7:  - "planner-first tasks"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:19:    recent_action: "Rewrote task ledger as cohesive planner-first delivery sequence"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:28:      fingerprint: "sha256:014-planner-first-tasks-2026-04-15"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:29:      session_id: "014-planner-first-tasks-2026-04-15"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:30:      parent_session_id: "014-planner-first-seed"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:37:# Tasks: /memory:save Planner-First Default
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:52:| `P015-` | Planner + trim implementation |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:95:- [x] **P014-Q2** Resolve whether planner-first `/memory:save` can replace default-path automation. Evidence: `research/014-research-snapshot/findings-registry.json`, `research/014-research-snapshot/research.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:148:- [x] **P015-T001** Add planner-default and fallback flag definitions. Evidence: `review/015-deep-review-snapshot/primary-docs/tasks.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:149:- [x] **P015-T002** Document planner, fallback, and deferred follow-up flags. Evidence: `review/015-deep-review-snapshot/primary-docs/tasks.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:150:- [x] **P015-T003** Add planner response interfaces and follow-up action types. Evidence: `review/015-deep-review-snapshot/primary-docs/tasks.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:151:- [x] **P015-T004** Add planner response serialization helpers. Evidence: `review/015-deep-review-snapshot/primary-docs/tasks.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:152:- [x] **P015-T005** Add planner blocker and advisory response helpers. Evidence: `review/015-deep-review-snapshot/primary-docs/tasks.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:153:- [x] **P015-T006** Make `generate-context.ts` request planner-first behavior by default. Evidence: `review/015-deep-review-snapshot/primary-docs/tasks.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:154:- [x] **P015-T007** Update `/memory:save` docs for planner-first default and fallback. Evidence: `review/015-deep-review-snapshot/primary-docs/tasks.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:155:- [x] **P015-T008** Make `memory-save.ts` return planner output by default with explicit fallback. Evidence: `review/015-deep-review-snapshot/primary-docs/tasks.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:156:- [x] **P015-T009** Update aggregate `memory-save` tests for planner-default behavior. Evidence: `review/015-deep-review-snapshot/primary-docs/tasks.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:158:- [x] **P015-T011** Update CLI target-authority tests for planner-default execution. Evidence: `review/015-deep-review-snapshot/primary-docs/tasks.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:159:- [x] **P015-T012** Create focused planner-first regression coverage. Evidence: `review/015-deep-review-snapshot/primary-docs/tasks.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:169:- [x] **P015-T022** Update pipeline-enforcement tests so the planner path still surfaces legality blockers. Evidence: `review/015-deep-review-snapshot/primary-docs/tasks.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:174:- [x] **P015-T027** Move unconditional graph refresh and spec-doc reindex out of planner-default saves. Evidence: `review/015-deep-review-snapshot/primary-docs/tasks.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:182:- [x] **P015-T035** Update memory-save integration tests for planner-default plus fallback end-to-end behavior. Evidence: `review/015-deep-review-snapshot/primary-docs/tasks.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:183:- [x] **P015-T036** Update planner UX regression tests for readable, action-oriented output. Evidence: `review/015-deep-review-snapshot/primary-docs/tasks.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:185:- [x] **P015-T038** Prototype planner-first behavior against three real session transcripts. Evidence: `review/015-deep-review-snapshot/primary-docs/tasks.md`, `scratch/transcripts-snapshot/`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:188:- [x] **P015-T041** Review structural parity between `/memory:save`, `AGENTS.md`, and the system-spec-kit skill doc. Evidence: `review/015-deep-review-snapshot/primary-docs/tasks.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:194:- [x] **P015-M1** Planner contract and flag plumbing complete. Evidence: `review/015-deep-review-snapshot/primary-docs/plan.md`, `review/015-deep-review-snapshot/primary-docs/tasks.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:206:- [x] **P015-R003** Promote template-contract failures to planner blockers instead of advisories. Evidence: `review/015-deep-review-snapshot/review-report.md`, `review/015-deep-review-snapshot/primary-docs/implementation-summary.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:238:- [x] Planner-default runtime tests pass (non-mutating default)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:240:- [x] Three real session transcripts prototype planner-first behavior without unexpected drops or wrong-anchor outcomes
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:241:- [x] `/memory:save` docs, `ENV_REFERENCE.md`, templates, and v3.4.1.0 release notes align on default/opt-in/reserved/fallback vocabulary
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/iterations/iteration-003.md:3:Audit Q2: `/memory:save` planner-first routing drift, with emphasis on the 8-category route table, planner-vs-apply gating, fallback behavior, and route/merge semantics that are documented differently from the live handler.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/iterations/iteration-003.md:7:1. Read the operator contract in `.opencode/commands/memory/save.md` and the routing reference in `.opencode/skills/system-spec-kit/references/memory/save_workflow.md`; extracted the documented 8-category table plus the planner-first/full-auto wording.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/iterations/iteration-003.md:8:2. Read `.opencode/skills/system-spec-kit/mcp_server/ENV_REFERENCE.md`; confirmed the live runtime flag is `SPECKIT_SAVE_PLANNER_MODE`, not a `SPECKIT_MEMORY_SAVE_EXECUTE` gate.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/iterations/iteration-003.md:10:4. Read `.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts`; traced `shouldPlanCanonicalSave`, planner response construction, full-auto handoff, and the canonical prepared-save path.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/iterations/iteration-003.md:11:5. Read `.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts` and `handlers/save/validation-responses.ts`; confirmed the planner response shape is blockers/advisories/follow-up actions only and does not invoke an external save workflow.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/iterations/iteration-003.md:34:- `FIND-iter003-planner-default-gated-by-hints`  
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/iterations/iteration-003.md:35:  The docs say canonical save requests are planner-first by default and only mutate after explicit `plannerMode: "full-auto"` opt-in, but the handler only enters planner mode when at least one routing hint is already present. `save.md` documents planner-first default and full-auto opt-in (`.opencode/commands/memory/save.md:78-79`), while the live gate is `const shouldPlanCanonicalSave = !dryRun && plannerMode !== 'full-auto' && Boolean(routeAs || mergeModeHint || targetAnchorId);` (`.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:2637-2638`). If that condition is false, the request falls through to `indexMemoryFile(...)` and mutates immediately (`.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:2969-2978`). This is specified-but-unimplemented default planner behavior.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/iterations/iteration-003.md:38:  The command docs still frame `generate-context.js` as the primary save mechanism around the planner-first rewrite, but the live planner path never invokes it and its follow-up actions only point back to the in-handler atomic writer and local maintenance steps. The docs say `generate-context.js` remains the primary save mechanism and describe planner-first/full-auto around that flow (`.opencode/commands/memory/save.md:77-79`), but the planner follow-ups are `apply`, `refresh-graph`, `reindex`, `reconsolidate`, and `enrich` (`.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1684-1739`), and the planner branch returns `buildPlannerResponse(...)` directly from `atomicSaveMemory(...)` (`.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:2937-2967`). The response builder is a pure envelope serializer, not a workflow bridge (`.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:446-485`). That makes the advertised fallback-to-`generate-context.js` behavior doc-only in this runtime slice.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/iterations/iteration-003.md:61:4. **Planner-first default**: drifted. The live handler only plans when routing hints are already supplied.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/iterations/iteration-003.md:62:5. **Fallback parity**: drifted. The live planner/follow-up path does not call `generate-context.js`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/description.json:2:  "title": "/memory:save Planner-First Default",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/description.json:4:    "memory save planner-first default",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/description.json:5:    "planner-first save contract",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/description.json:11:    "SPECKIT_SAVE_PLANNER_MODE configuration",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/description.json:12:    "planner mode hybrid reserved",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/description.json:33:  "description": "Feature Specification: /memory:save Planner-First Default",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/description.json:39:    "planner-first",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-041.md:9:- **File:** `.opencode/commands/spec_kit/assets/spec_kit_plan_auto.yaml`; `.opencode/commands/spec_kit/plan.md`; `.opencode/skills/system-spec-kit/references/intake-contract.md`; `.opencode/skills/system-spec-kit/mcp_server/tests/transcript-planner-export.vitest.ts`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-041.md:10:- **Lines:** `spec_kit_plan_auto.yaml:338-355,371-372`; `plan.md:93-99`; `intake-contract.md:66-77,217-222`; `transcript-planner-export.vitest.ts:146-217`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-041.md:13:- **Evidence:** `spec_kit_plan_auto.yaml` classifies `folder_state` as `no-spec | partial-folder | repair-mode | placeholder-upgrade | populated`, then gates `on_skip.when: "folder_state == populated"` while only mapping `start_state` to `populated-folder` (`spec_kit_plan_auto.yaml:338-355,371-372`). The operator-facing plan contract and canonical intake reference both define the healthy state as `populated-folder` and say that state should skip or no-op the intake block (`plan.md:93-99`; `intake-contract.md:66-77,217-222`). The nearby planner export suite only asserts downstream `planned`/`blocked` response summaries and never exercises these Step 0.5 string conditions (`transcript-planner-export.vitest.ts:146-217`).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-041.md:17:- **File:** `AGENTS.md`; `.opencode/commands/spec_kit/plan.md`; `.opencode/commands/spec_kit/complete.md`; `.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-planner-first.vitest.ts`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-041.md:18:- **Lines:** `AGENTS.md:182-186`; `plan.md:86-89`; `complete.md:74-77`; `memory-save-planner-first.vitest.ts:12-214`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-041.md:21:- **Evidence:** `AGENTS.md` says Gate 3 fires on the literal trigger list `rename, move, delete, create, add, remove, update, change, modify, edit, fix, refactor, implement, build, write, generate, configure, analyze, decompose, phase` (`AGENTS.md:182-186`). Both planning and completion docs then state `Gate 1 trigger matching handled at agent level (AGENTS.md)` instead of defining a local or shared classifier (`plan.md:86-89`; `complete.md:74-77`). The nearby planner-first response suite covers response shaping only; it does not verify Gate 3 trigger classification at all (`memory-save-planner-first.vitest.ts:12-214`).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/prompts/iteration-004.md:18:- P1 FIND-iter003-planner-default-gated-by-hints — planner-first is not the live default
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/prompts/iteration-004.md:19:- P1 FIND-iter003-generate-context-fallback-doc-only — docs still center generate-context.js but live planner never invokes it
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:3:description: "Packet closeout for the /memory:save planner-first default: audit + retirement, relevance research, planner + trim implementation, transcript-grounded verification, and deep-review remediation all documented in one surface."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:7:  - "memory save planner first closeout"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:8:  - "planner-first save closeout"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:9:  - "save flow planner first delivery"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:17:    recent_action: "Folder renamed; impl-summary rewritten under planner-first framing"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:26:      fingerprint: "sha256:014-planner-first-closeout-2026-04-15"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:27:      session_id: "014-planner-first-closeout-2026-04-15"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:28:      parent_session_id: "014-planner-first-seed"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:32:      - "Packet is complete; shipped contract is planner-first default with explicit full-auto fallback."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:58:`/memory:save` is planner-first by default. Invoking it now returns a structured planner response — routes, legality blockers, advisories, follow-up actions — and mutates no files on disk. Operators who still need automatic mutation can opt in by setting `SPECKIT_SAVE_PLANNER_MODE=full-auto`, which runs the canonical atomic writer with `POST_SAVE_FINGERPRINT` safety parity, same-path identity, promotion, and rollback intact. `hybrid` is reserved and currently behaves like `plan-only`. The legacy `[spec]/memory/*.md` write path is retired runtime-wide. Four previously default-on save-path behaviors are now explicit opt-in: Tier 3 routing (`SPECKIT_ROUTER_TIER3_ENABLED`), quality-loop auto-fix (`SPECKIT_QUALITY_AUTO_FIX`), reconsolidation-on-save (`SPECKIT_RECONSOLIDATION_ENABLED`), and post-insert enrichment (`SPECKIT_POST_INSERT_ENRICHMENT_ENABLED`). Freshness is callable via three new follow-up APIs: `refreshGraphMetadata`, `reindexSpecDocs`, `runEnrichmentBackfill`. Docs, env reference, and release notes all agree on the same default/opt-in/reserved/fallback vocabulary.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:66:20 iterations of research resolved Q1 through Q10 and classified the 15 remaining subsystems. Four stayed load-bearing (canonical atomic writer, routed record identity, content-router core, thin continuity validation). Four became trim targets (Tier 3 routing, reconsolidation-on-save, heavy quality-loop auto-fix, post-insert enrichment). Seven were deferred or follow-up. The synthesis produced the `trim-targeted` top-line recommendation that made planner-first the right shape for the default contract.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:70:43 of 43 tasks completed under v3.4.1.0. The planner-first contract + flag plumbing (M1) landed before the trim work (M2-M4) so the schema was stable by the time routing, quality, reconsolidation, and enrichment moved behind env gates. Follow-up APIs (`refreshGraphMetadata`, `reindexSpecDocs`, `runEnrichmentBackfill`) expose freshness as callable work instead of baked-in side effects. Targeted tests covered planner-default behavior, fallback parity, router deterministic default, quality advisory output, structural blocker preservation, reconsolidation opt-in, enrichment deferral, continuity upsert parity, planner UX readability, CLI target authority, and end-to-end integration. Three real session transcripts exercised planner-first behavior before closeout.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:80:| F003 | P0 | Template-contract failures hidden as advisories | FIXED — promoted to planner blockers |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:98:- transcripts and planner-output artifacts under `scratch/transcripts-snapshot/`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:133:| Preserve research as the decision bridge | The planner-first design only makes sense with the trim-targeted verdict in view |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:134:| Ship planner-first default + explicit full-auto fallback | Non-mutating default is reviewable; full-auto remains available for automation that depends on it |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:140:| Promote template-contract failures to planner blockers | Hidden advisories let malformed saves through |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:153:| Implementation carry-over | PASS — packet preserves planner-first default, explicit fallback, follow-up APIs, and 43 completed tasks |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:168:1. **`hybrid` is reserved**. `SPECKIT_SAVE_PLANNER_MODE=hybrid` is accepted and currently behaves like `plan-only`. A future packet may define mixed-flow behavior; `hybrid` stays reserved until then.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-024.md:12:- **Description:** `memory_save` decides whether to advertise `runEnrichmentBackfill` before post-insert enrichment runs. That means the only save path with a typed recovery action is the already-known planner-first defer case. If `post-insert.ts:96-208` later collapses a partial runtime miss into `executionStatus.status = 'ran'` plus warning-only side channels, the final save response has no structured retry/backfill action even though the backfill API exists.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-024.md:13:- **Evidence:** `buildAtomicPlannerFollowUpActions()` only appends the `enrich` action when `!isPostInsertEnrichmentEnabled()` (`handlers/memory-save.ts:1666-1675`). The actual enrichment result is produced much later by `runPostInsertEnrichmentIfEnabled(...)` (`handlers/memory-save.ts:2362-2384`), after which `response-builder.ts:315-322,569-573` can only add `"Partial enrichment: ... failed"` or the deferred hint. The direct deferred suite locks in the one actionable branch (`tests/post-insert-deferred.vitest.ts:11-47,50-81`), while the save-handler suite only stubs all-green `status: 'ran'` post-insert results (`tests/handler-memory-save.vitest.ts:2592-2606`) and the follow-up API suite covers `runEnrichmentBackfill()` only when invoked manually (`tests/follow-up-api.vitest.ts:102-149`).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-024.md:25:- The remaining Domain 2 risk is now mostly **control-plane asymmetry**. Deferred planner-first saves get a typed recovery action, but comparable runtime degradation branches only get warning strings; cached resume scope is trusted enough to choose a packet, but not trusted enough to propagate the same packet into transport metadata.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-mcp-runtime-stress-remediation/001-search-intelligence-stress-playbook/001-search-scenario-design/scripts/prompts/S1.md:1:Find the spec for the /memory:save planner-first contract. Return the exact spec folder path and cite at least one anchor or filename from the canonical spec.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/prompts/iteration-001.md:17:- `004-memory-save-rewrite/` — `/memory:save` planner-first default (`SPECKIT_MEMORY_SAVE_EXECUTE` opt-in)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/prompts/iteration-001.md:27:- Q2 /memory:save planner-first routing table (code vs docs drift)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/prompts/iteration-001.md:54:   - `rg -n "planner-first|SPECKIT_MEMORY_SAVE_EXECUTE" --type md --type ts --type js --type json` — 004 surface
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/graph-metadata.json:18:      "memory save planner first",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/graph-metadata.json:19:      "planner-first memory save",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/graph-metadata.json:21:      "speckit_save_planner_mode",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/graph-metadata.json:34:      "planner",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/graph-metadata.json:36:      "planner-first",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/graph-metadata.json:200:    "causal_summary": "This packet delivers the end state implied by that analysis. `/memory:save` is planner-first by default: the handler computes the same route and legality data as before but stops short of mutation and returns structured planner output instead. `full-auto` is preserved as an explicit fallback via `SPECKIT_SAVE_PLANNER_MODE=full-auto`, with canonical atomic mutation, `POST_SAVE_FINGERPRINT` safety parity, same-path identity, and rollback intact. The legacy `[spec]/memory/*.md` write path is retired. Four previously default-on behaviors become explicit opt-in: `SPECKIT_ROUTER_TIER3_ENABLED`, `SPECKIT_QUALITY_AUTO_FIX`, `SPECKIT_RECONSOLIDATION_ENABLED`, `SPECKIT_POST_INSERT_ENRICHMENT_ENABLED`. Freshness becomes follow-up work via three new APIs: `refreshGraphMetadata`, `reindexSpecDocs`, `runEnrichmentBackfill`. `hybrid` is documented as reserved and currently behaves like `plan-only`. The content-router category contract is preserved with one honest, scoped exception: a Tier 3 default-disable and manual-review guard inside `content-router.ts`. 43 implementation tasks shipped under v3.4.1.0. A deep-review pass flagged 3 P0, 5 P1, and 1 P2 findings on router honesty, fallback safety parity, blocker classification, deferred-helper coverage, and changelog accuracy; all 9 were resolved before closeout.",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-mcp-runtime-stress-remediation/001-search-intelligence-stress-playbook/001-search-scenario-design/scripts/prompts/S3.md:1:Find decisions in 026/003/004 about SPECKIT_SAVE_PLANNER_MODE. Return the decision rationale and cite the source anchor.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/prompts/iteration-002.md:29:> **Q1 — Advisory-lock, sentinel-file, and generation-bumping paths in the continuity runtime (deep-research lock, cache-warning hooks, /memory:save): where can two concurrent writers or an interrupted writer + resumer corrupt or silently drop state?**
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/prompts/iteration-002.md:39:3. **Read the /memory:save atomic-index-memory + create-record path.** Read `.opencode/skills/system-spec-kit/mcp_server/handlers/save/atomic-index-memory.ts`, `handlers/save/create-record.ts`, `mcp_server/handlers/memory-save.ts`. Identify: is the "atomic" in the filename honored by the implementation? What happens if two concurrent saves race the same canonical spec doc (e.g. two resumers both appending to `implementation-summary.md` continuity frontmatter)? Is the fingerprint (POST_SAVE_FINGERPRINT) check a TOCTOU? Under what file-system semantics does it hold?
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-045.md:9:- **File:** `AGENTS.md`; `.claude/skills/sk-deep-review/manual_testing_playbook/01--entry-points-and-modes/002-confirm-mode-checkpointed-review.md`; `.opencode/commands/spec_kit/plan.md`; `.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-planner-first.vitest.ts`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-045.md:10:- **Lines:** `AGENTS.md:182-186`; `002-confirm-mode-checkpointed-review.md:26-32`; `plan.md:86-89`; `memory-save-planner-first.vitest.ts:12-214`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-045.md:13:- **Evidence:** `AGENTS.md` says Gate 3 fires on the literal trigger list `... configure, analyze, decompose, phase ...` before any analysis or tool calls. A shipped manual-testing scenario for `/spec_kit:deep-review:confirm` is purely read-only, yet its prompt asks the agent to confirm that approval gates exist at each `phase transition` and return a pass/fail verdict. `/spec_kit:plan` explicitly delegates trigger matching to `AGENTS.md`, while the nearby Vitest file exercises planner-response payload serialization only and never tests Gate 3 prompt classification.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/prompts/iteration-003.md:1:# Deep-Research Iteration 3 — /memory:save planner-first routing drift (Q2)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/prompts/iteration-003.md:10:- Next focus: Q2 — /memory:save planner-first routing table drift.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/prompts/iteration-003.md:24:> **Q2 — /memory:save planner-first rewrite: does the routing table in code match the documented behavior for every intent (decision, narrative_progress, narrative_delivery, handover_state, research_finding, task_update, metadata_only, drop)? Where is the specified-but-unimplemented gap or implemented-but-undocumented behavior?**
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/prompts/iteration-003.md:32:   - `.opencode/skills/system-spec-kit/references/` directory listing, then open any routing-contract or planner-first doc (grep for "planner-first", "routeAs", "narrative_progress|narrative_delivery|handover_state|research_finding|task_update|metadata_only|drop")
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/prompts/iteration-003.md:33:   - `.opencode/skills/system-spec-kit/mcp_server/ENV_REFERENCE.md` (sections relating to `SPECKIT_MEMORY_SAVE_*`, `SPECKIT_COMMUNITY_SEARCH_FALLBACK`, and planner/execute flags)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/prompts/iteration-003.md:36:   - `.opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts` (planner branching, envvar gates, default behavior)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/prompts/iteration-003.md:37:   - `.opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts` (planner response shape, follow-up actions)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/prompts/iteration-003.md:48:4. **Planner-first default + execute opt-in.** Does `SPECKIT_MEMORY_SAVE_EXECUTE` behave as documented? Default is planner-only (no mutation); opt-in enables mutation. Grep for the env var, trace its guard in code, and check: are all mutation sites actually guarded? Are there any mutations that leak under planner-only mode? Are there documented guarded mutations that are NOT gated in code?
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/prompts/iteration-003.md:50:5. **Fallback path parity.** The planner returns structured planner response; fallback (when planner cannot decide) invokes generate-context.js. Are the fallback outcomes consistent with the planner's advertised routes? Look at `post-save-review` to see if reviewer assumptions align with planner output.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/prompts/iteration-003.md:54:7. **(If budget remains)** Check `SaveRoute` / `SaveMode` enum vs documented enum in the planner-first spec. Any enum drift (values added/renamed/deleted in code but not propagated to docs)?
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/prompts/iteration-003.md:68:{"type":"iteration","iteration":3,"newInfoRatio":<0..1>,"status":"evidence","focus":"Q2 /memory:save routing drift","findingsCount":<int>,"timestamp":"<ISO-Z>","sessionId":"dr-002cmr-20260423-200456","generation":3,"graphEvents":[/* optional */]}
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-014.md:29:- **Evidence:** `runPostInsertEnrichment()` sets `enrichmentStatus.causalLinks = true` immediately after any non-throwing `processCausalLinks(...)` call (`post-insert.ts:97-100`), and only emits a log for unresolved references (`post-insert.ts:103-105`). The processor itself explicitly returns partial-failure state through `unresolved` and `errors` arrays (`handlers/causal-links-processor.ts:345-420`). The response layer only warns when a status flag is `false` (`handlers/save/response-builder.ts:315-321`). The helper tests prove unresolved and mixed-result paths exist (`tests/handler-helpers.vitest.ts:680-710`), while the dedicated post-insert test only exercises planner-first deferral (`tests/post-insert-deferred.vitest.ts:11-48`).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/006-skill-advisor/002-skill-graph-daemon-native-advisor-tools/implementation-summary.md:126:**Status:** Complete (2026-04-20, SHA `a61547796`). Shipped Python shim routing: `skill_advisor.py` now probes native advisor MCP status via `daemon-probe.ts`, delegates to `advisor_recommend` when available, falls back to Python scorer with `--force-local` bypass or `--force-native` hard-require flags. OpenCode plugin bridge (`spec-kit-skill-advisor-bridge.mjs`) mirrors native delegation. Gate 7 carry-over closed: Python scorer now routes `/spec_kit:plan` to `command-spec-kit` (kind:command) and `/memory:save this context` to `command-memory-save` (kind:command). Regression suite: 52/52 PASS. `daemon-probe.ts` maps freshness live/stale→available, absent/unavailable→unavailable. Docs: skill-advisor-native-bootstrap install guide (`.opencode/skills/system-spec-kit/install_guide/`), manual testing playbook (NC-001 through NC-005 + H5 scenarios).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-054.md:71:1. `T-CNS-01 → T-W1-CNS-04` — Both edit `scripts/core/workflow.ts`; CNS-01 must remove the `ctxFileWritten = false` stub and add a `lastUpdated` writer at line 1259, then CNS-04 flips the `plannerMode === 'full-auto'` guard at line 1333 so both fixes land in one coherent commit without merge conflict on a 75-line span.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-054.md:142:- W1-CNS-04 lifts the `plannerMode === 'full-auto'` guard on `refreshGraphMetadata`; must follow CNS-01 because both touch `workflow.ts` in an overlapping span.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-054.md:188:- **T-CNS-01** + **T-W1-CNS-04** (merged PR) — `scripts/core/workflow.ts` fixes: remove dead `ctxFileWritten = false` stub, add real `lastUpdated` writer, lift `plannerMode === 'full-auto'` guard so refreshGraphMetadata runs on every save. *Why first:* everything in Cluster B is downstream of these two writers.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/deltas/iter-001.jsonl:5:{"type":"observation","iteration":1,"packet":"004","summary":"Packet 004 dominates the live runtime surface with 22 concrete files spanning the memory-save handler, save submodules, follow-up APIs, command/env docs, and planner-first regression suites.","timestamp":"2026-04-23T20:09:23Z"}
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/deltas/iter-001.jsonl:17:{"type":"finding","iteration":1,"severity":"P1","packet":"004","kind":"mcp-tool","filePath":".opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts","summary":"Primary /memory:save handler owns planner-first behavior, blocker routing, and fallback entry.","timestamp":"2026-04-23T20:09:23Z"}
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/deltas/iter-001.jsonl:18:{"type":"finding","iteration":1,"severity":"P1","packet":"004","kind":"shared-module","filePath":".opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts","summary":"Planner response semantics and follow-up action shaping live here.","timestamp":"2026-04-23T20:09:23Z"}
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/deltas/iter-001.jsonl:19:{"type":"finding","iteration":1,"severity":"P1","packet":"004","kind":"shared-module","filePath":".opencode/skills/system-spec-kit/mcp_server/handlers/save/validation-responses.ts","summary":"Converts validation failures into blockers versus advisories on the planner path.","timestamp":"2026-04-23T20:09:23Z"}
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/deltas/iter-001.jsonl:26:{"type":"finding","iteration":1,"severity":"P1","packet":"004","kind":"shared-module","filePath":".opencode/skills/system-spec-kit/mcp_server/lib/continuity/thin-continuity-record.ts","summary":"Thin continuity upsert/rehydration is reused across planner and fallback flows.","timestamp":"2026-04-23T20:09:23Z"}
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/deltas/iter-001.jsonl:28:{"type":"finding","iteration":1,"severity":"P1","packet":"004","kind":"script","filePath":".opencode/skills/system-spec-kit/mcp_server/tests/memory-save-planner-first.vitest.ts","summary":"Direct proof surface for the non-mutating planner default.","timestamp":"2026-04-23T20:09:23Z"}
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/deltas/iter-001.jsonl:30:{"type":"finding","iteration":1,"severity":"P1","packet":"004","kind":"script","filePath":".opencode/skills/system-spec-kit/mcp_server/tests/memory-save-pipeline-enforcement.vitest.ts","summary":"End-to-end enforcement test for planner, blockers, and follow-up execution semantics.","timestamp":"2026-04-23T20:09:23Z"}
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/deltas/iter-003.jsonl:1:{"type":"iteration","iteration":3,"newInfoRatio":0.58,"status":"evidence","focus":"Q2 /memory:save routing drift","findingsCount":6,"timestamp":"2026-04-23T20:39:12Z","sessionId":"dr-002cmr-20260423-200456","generation":3,"graphEvents":[]}
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/deltas/iter-003.jsonl:2:{"type":"finding","id":"FIND-iter003-planner-default-gated-by-hints","severity":"P1","label":"Planner-first is not the default in the live handler; planning only happens when routeAs, mergeModeHint, or targetAnchorId is already supplied.","iteration":3,"evidence":[".opencode/commands/memory/save.md:78-79",".opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:2637-2638",".opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:2969-2978"],"questionTag":"Q2"}
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/deltas/iter-003.jsonl:3:{"type":"finding","id":"FIND-iter003-generate-context-fallback-doc-only","severity":"P1","label":"The planner rewrite docs still center generate-context.js, but the live planner/apply path never invokes it and only offers in-handler full-auto and maintenance follow-ups.","iteration":3,"evidence":[".opencode/commands/memory/save.md:77-79",".opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:1684-1739",".opencode/skills/system-spec-kit/mcp_server/handlers/memory-save.ts:2937-2967",".opencode/skills/system-spec-kit/mcp_server/handlers/save/response-builder.ts:446-485"],"questionTag":"Q2"}
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/deltas/iter-003.jsonl:9:{"type":"invariant","iteration":3,"label":"buildTarget() in content-router.ts is the route-table source of truth, while shouldPlanCanonicalSave in memory-save.ts is the real planner-vs-mutate gate; docs must match both surfaces, not just the route enum.","questionTag":"Q2"}
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-mcp-runtime-stress-remediation/001-search-intelligence-stress-playbook/001-search-scenario-design/implementation-summary.md:63:| I1 | Intelligence | Simple | 003/004 (planner-first) |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-044.md:25:- **File:** `.opencode/commands/spec_kit/assets/spec_kit_plan_auto.yaml`; `.opencode/commands/spec_kit/assets/spec_kit_plan_confirm.yaml`; `.opencode/skills/system-spec-kit/mcp_server/tests/transcript-planner-export.vitest.ts`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-044.md:26:- **Lines:** `spec_kit_plan_auto.yaml:375-392`; `spec_kit_plan_confirm.yaml:400-417`; `transcript-planner-export.vitest.ts:146-217`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-044.md:29:- **Evidence:** The auto and confirm assets both define `step_0.6_intake_only_gate` with `bound_variable: intake_only`, then branch on `when: "intake_only == TRUE"` and `when: "intake_only == FALSE"` (`spec_kit_plan_auto.yaml:375-392`; `spec_kit_plan_confirm.yaml:400-417`). The adjacent planner export test exercises transcript save/planner output and full-auto routing summaries only; it never invokes or asserts the intake-only halt path (`transcript-planner-export.vitest.ts:146-217`).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/research/deep-research-state.jsonl:11:{"type":"iteration","iteration":3,"newInfoRatio":0.58,"status":"evidence","focus":"Q2 /memory:save routing drift","findingsCount":6,"timestamp":"2026-04-23T20:39:12Z","sessionId":"dr-002cmr-20260423-200456","generation":3,"graphEvents":[]}
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-011.md:45:- **Evidence:** `generateAndStoreSummary(...)` is called and `enrichmentStatus.summaries = true` is set unconditionally after the await, without checking `summaryResult.stored` (`post-insert.ts:136-147`). Likewise, `onIndex(...)` can return `skipped: true`, but `post-insert.ts` still sets `enrichmentStatus.graphLifecycle = true` after the call (`post-insert.ts:187-200`). `response-builder.ts:315-321` only warns when an enrichment flag is `false`. The helper test suites prove the ignored no-op states exist: `tests/memory-summaries.vitest.ts:371-382` expects `stored=false` for empty content, and `tests/graph-lifecycle.vitest.ts:658-668` expects `skipped=true` when graph refresh does not actually run. The post-insert coverage does not exercise those branches; `tests/post-insert-deferred.vitest.ts:11-48` only locks in planner-first deferral.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-mcp-runtime-stress-remediation/001-search-intelligence-stress-playbook/002-search-scenario-execution/runs/S1/cli-codex-1/output.txt:14:Find the spec for the /memory:save planner-first contract. Return the exact spec folder path and cite at least one anchor or filename from the canonical spec.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-mcp-runtime-stress-remediation/001-search-intelligence-stress-playbook/002-search-scenario-execution/runs/S1/cli-codex-1/output.txt:90:Any agent writing authored spec folder docs (`spec.md`, `plan.md`, `tasks.md`, `checklist.md`, `implementation-summary.md`, `decision-record.md`, `handover.md`, `review-report.md`, `debug-delegation.md`, `resource-map.md` (optional)) MUST use templates from .opencode/skills/system-spec-kit/templates/level_N/ for level-owned docs and the root cross-cutting templates where applicable, run `bash .opencode/skills/system-spec-kit/scripts/spec/validate.sh [spec_folder] --strict` after each file write, and route continuity updates through /memory:save. Deep-research workflow-owned packet markdown (`research/iterations/*.md`, `research/deep-research-*.md`, and progressive `research/research.md` loop updates) is exempt from that generic per-write rule; `/spec_kit:deep-research` must instead run targeted strict validation after every `spec.md` mutation it performs. @deep-research retains exclusive write access for `research/research.md`; @debug retains exclusive write access for `debug-delegation.md`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-mcp-runtime-stress-remediation/001-search-intelligence-stress-playbook/002-search-scenario-execution/runs/S1/cli-codex-1/output.txt:92:- `handover.md` stays in the canonical recovery ladder and is maintained through `/memory:save` handover_state routing using `.opencode/skills/system-spec-kit/templates/handover.md` for initial creation.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-mcp-runtime-stress-remediation/001-search-intelligence-stress-playbook/002-search-scenario-execution/runs/S1/cli-codex-1/output.txt:100:| `handover.md`         | "handover", "next session", "continue later", "pass context", "ending session", "save state", "multi-session", "for next AI"  | Suggest `/memory:save` handover maintenance |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-mcp-runtime-stress-remediation/001-search-intelligence-stress-playbook/002-search-scenario-execution/runs/S1/cli-codex-1/output.txt:210:/bin/zsh -lc 'rg -n "/memory:save|planner-first|planner first|planner" specs .opencode -S' in /Users/michelkerkmeester/MEGA/Development/Code_Environment/Public
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-025.md:12:- **Description:** The deferred-enrichment branch is no longer just a source-local boolean collapse; the repo now treats that success-shaped state as the expected contract. When planner-first mode skips enrichment, `post-insert.ts` returns all five `enrichmentStatus` booleans as `true`, even though no enrichment work ran. `response-builder.ts` only emits a warning when any boolean is `false`, so the deferred path becomes observationally identical to a fully successful run unless a caller separately inspects `executionStatus`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-mcp-runtime-stress-remediation/001-search-intelligence-stress-playbook/002-search-scenario-execution/runs/S1/cli-codex-1/prompt.md:1:Find the spec for the /memory:save planner-first contract. Return the exact spec folder path and cite at least one anchor or filename from the canonical spec.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-057.md:39:Next command: `/memory:save` or `/spec_kit:plan phase-017-deep-review-p1-remediation`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-014/real-pre.sha:24649:780801f7f77b6c9326386449fe818c427b20391eadeec5a507b6be32c799ff8c  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-1x/system-spec-kit--01/scripts/tests/deep-loop-wave-planner.vitest.ts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-014/real-pre.sha:24650:780801f7f77b6c9326386449fe818c427b20391eadeec5a507b6be32c799ff8c  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-2x/system-spec-kit--01/scripts/tests/deep-loop-wave-planner.vitest.ts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-014/real-pre.sha:24651:780801f7f77b6c9326386449fe818c427b20391eadeec5a507b6be32c799ff8c  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-2x/system-spec-kit--02/scripts/tests/deep-loop-wave-planner.vitest.ts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-014/real-pre.sha:24652:780801f7f77b6c9326386449fe818c427b20391eadeec5a507b6be32c799ff8c  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--01/scripts/tests/deep-loop-wave-planner.vitest.ts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-014/real-pre.sha:24653:780801f7f77b6c9326386449fe818c427b20391eadeec5a507b6be32c799ff8c  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--02/scripts/tests/deep-loop-wave-planner.vitest.ts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-014/real-pre.sha:24654:780801f7f77b6c9326386449fe818c427b20391eadeec5a507b6be32c799ff8c  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--03/scripts/tests/deep-loop-wave-planner.vitest.ts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-014/real-pre.sha:24655:780801f7f77b6c9326386449fe818c427b20391eadeec5a507b6be32c799ff8c  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--04/scripts/tests/deep-loop-wave-planner.vitest.ts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-014/real-pre.sha:24656:780801f7f77b6c9326386449fe818c427b20391eadeec5a507b6be32c799ff8c  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--05/scripts/tests/deep-loop-wave-planner.vitest.ts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-014/real-pre.sha:36686:ab34a1b833fa988474d3a34b173e55499591864a96b57a4b91ebcd7b48ca051d  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-1x/system-spec-kit--01/scripts/lib/wave-segment-planner.cjs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-014/real-pre.sha:36687:ab34a1b833fa988474d3a34b173e55499591864a96b57a4b91ebcd7b48ca051d  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-2x/system-spec-kit--01/scripts/lib/wave-segment-planner.cjs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-014/real-pre.sha:36688:ab34a1b833fa988474d3a34b173e55499591864a96b57a4b91ebcd7b48ca051d  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-2x/system-spec-kit--02/scripts/lib/wave-segment-planner.cjs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-014/real-pre.sha:36689:ab34a1b833fa988474d3a34b173e55499591864a96b57a4b91ebcd7b48ca051d  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--01/scripts/lib/wave-segment-planner.cjs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-014/real-pre.sha:36690:ab34a1b833fa988474d3a34b173e55499591864a96b57a4b91ebcd7b48ca051d  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--02/scripts/lib/wave-segment-planner.cjs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-014/real-pre.sha:36691:ab34a1b833fa988474d3a34b173e55499591864a96b57a4b91ebcd7b48ca051d  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--03/scripts/lib/wave-segment-planner.cjs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-014/real-pre.sha:36692:ab34a1b833fa988474d3a34b173e55499591864a96b57a4b91ebcd7b48ca051d  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--04/scripts/lib/wave-segment-planner.cjs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-014/real-pre.sha:36693:ab34a1b833fa988474d3a34b173e55499591864a96b57a4b91ebcd7b48ca051d  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--05/scripts/lib/wave-segment-planner.cjs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-006.md:4:I audited the save-time reconsolidation bridge, with emphasis on the assistive lane that sits beside the canonical `memory_save` write path. The goal was to verify whether the public "assistive reconsolidation" contract is actually reachable and behaviorally consistent in planner-first runtime mode.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-006.md:12:- **Description:** The file documents assistive reconsolidation as a separate, default-on advisory feature, but the runtime gates it behind the same planner/full-auto switch used for save-time reconsolidation. In the default planner-first runtime, assistive review never executes unless the caller explicitly enables full-auto mode or the opt-in save-time reconsolidation flag.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-006.md:13:- **Evidence:** `isAssistiveReconsolidationEnabled()` is presented as default ON at `72-73`, and the assistive block claims it "Runs independently of the TM-06 flag" at `446-449`. But the actual guard at `453` requires `allowSaveTimeReconsolidation`, which is derived at `254-255` from `plannerMode === 'full-auto' || isSaveReconsolidationEnabled()`. The surrounding runtime defaults make that guard false by default: `resolveSavePlannerMode()` returns `'plan-only'` (`lib/search/search-flags.ts:123-145`), and `isSaveReconsolidationEnabled()` is opt-in false (`lib/search/search-flags.ts:139-145`). The tests codify this mismatch: `tests/reconsolidation-bridge.vitest.ts:116-168` expects the default path to skip both `reconsolidate` and `vectorSearch`, while `tests/assistive-reconsolidation.vitest.ts:22-50` only proves the helper flag/classifier defaults, not the live save path.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-006.md:25:This seam is weaker than the public surface suggests in two different ways. First, the assistive lane is not actually independent of TM-06/planner mode; the planner-first default disables it before similarity search even runs. Second, even when the lane does run, its highest-severity tier is advisory-only, so the system advertises an "auto-merge" outcome that never materializes in live write behavior.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-006.md:28:Stay on the save pipeline and inspect `handlers/save/post-insert.ts` plus its consumers to determine whether deferred enrichment/backfill reporting is similarly success-shaped by default, especially where planner-first flows promise follow-up work without a guaranteed executor.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/006-skill-advisor/002-skill-graph-daemon-native-advisor-tools/research/iterations/iteration-002.md:30:- `.opencode/commands/memory/save.md:125`-`.opencode/commands/memory/save.md:127` → `/memory:save` outputs canonical spec-doc continuity plus refreshed `graph-metadata.json` derived fields in the spec folder, using `generate-context.js`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-049.md:12:- **Description:** `AGENTS.md` now governs write intent through two unsynchronized string classifiers. Gate 3 says *any* file modification must be intercepted up front by the trigger-word list, but that list does not include `save`; the same document later introduces a separate hard-block `MEMORY SAVE RULE` keyed on `"save context"`, `"save memory"`, and `/memory:save`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-049.md:13:- **Evidence:** The Gate 3 trigger list is the literal prose set `rename, move, delete, create, add, remove, update, change, modify, edit, fix, refactor, implement, build, write, generate, configure, analyze, decompose, phase` (`AGENTS.md:182-186`). The same file separately documents `/memory:save` as a context-writing workflow (`AGENTS.md:142-144`) and then adds a second trigger surface - `Trigger: "save context", "save memory", /memory:save, continuity update` - under `MEMORY SAVE RULE` (`AGENTS.md:201-204`). Nearby automated coverage exercises memory-save handler behavior and planner/export payloads (`.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-save.vitest.ts:1-84`; `.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-planner-first.vitest.ts:12-214`; `.opencode/skills/system-spec-kit/mcp_server/tests/transcript-planner-export.vitest.ts:146-217`), but none of those suites reconcile Gate 3 classification with the later memory-save trigger surface.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-049.md:21:- **Evidence:** Earlier control gates use `when:` as an expression DSL - `folder_state != populated`, `folder_state == populated`, `intake_only == TRUE`, and `intake_only == FALSE` (`spec_kit_plan_auto.yaml:354,372,380,391`). The same key later carries the prose sentence `Immediately after the canonical spec document is refreshed on disk` (`spec_kit_plan_auto.yaml:555`). Existing nearby tests validate memory-save planner/export behavior instead of command-asset interpretation (`.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-planner-first.vitest.ts:12-214`; `.opencode/skills/system-spec-kit/mcp_server/tests/transcript-planner-export.vitest.ts:146-217`), so there is no automated contract pinning what `when:` means in this asset.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-048.md:12:- **Description:** Gate 3's file-modification trigger list has a concrete false-negative for the repository's own memory-save workflow. The hard-block trigger words omit `save context`, `save memory`, and `/memory:save`, even though the same instruction file treats `/memory:save` as a first-class write workflow and later gives it its own hard-block save rule. Other runtime surfaces already model the same phrases mechanically, so the pre-flight gate is the outlier.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-048.md:13:- **Evidence:** `AGENTS.md` says Gate 3 fires on the literal list `rename, move, delete, create, add, remove, update, change, modify, edit, fix, refactor, implement, build, write, generate, configure, analyze, decompose, phase` (`AGENTS.md:182-185`), but the same file separately documents `Save context` / `End session` as `/memory:save` workflows and then declares a hard-block `MEMORY SAVE RULE` triggered by `"save context", "save memory", "/memory:save"` (`AGENTS.md:138-145,201-204`). The advisor command bridge also treats `/memory:save` as an explicit command and boosts natural-language memory-save phrases through a dedicated `memory` intent bucket (`skill_advisor.py:980-988,1112-1115`). The MCP server test suite likewise treats `save context` / `save memory` as exact trigger phrases with routing consequences (`query-classifier.vitest.ts:24-37,45,170-175,479-489`; `query-router.vitest.ts:68-74,290-295`).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-048.md:14:- **Downstream Impact:** A first-turn request like `save context` or `/memory:save` is a real file-mutating workflow, but Gate 3's published trigger list does not mechanically identify it as one. Different runtimes can therefore diverge on whether they must stop for the spec-folder question before touching canonical continuity files, even though later layers in the same repository already recognize the request as a memory-save operation.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-048.md:17:- **File:** `.opencode/commands/spec_kit/assets/spec_kit_plan_auto.yaml`; `.opencode/commands/spec_kit/assets/spec_kit_plan_confirm.yaml`; `.opencode/commands/spec_kit/assets/spec_kit_complete_auto.yaml`; `.opencode/skills/system-spec-kit/mcp_server/tests/transcript-planner-export.vitest.ts`; `.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-planner-first.vitest.ts`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-048.md:18:- **Lines:** `spec_kit_plan_auto.yaml:354-391,548-555`; `spec_kit_plan_confirm.yaml:372-416,606-612`; `spec_kit_complete_auto.yaml:465-483,1008-1012`; `transcript-planner-export.vitest.ts:146-217`; `memory-save-planner-first.vitest.ts:1-40`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-048.md:21:- **Evidence:** In `spec_kit_plan_auto.yaml`, `when:` is used for executable conditions like `folder_state != populated`, `folder_state == populated`, `intake_only == TRUE`, and `intake_only == FALSE` (`spec_kit_plan_auto.yaml:354-391`), but the same asset later uses `when: "Immediately after the canonical spec document is refreshed on disk"` as a scheduling note under `post_save_indexing` (`spec_kit_plan_auto.yaml:548-555`). The same overload appears in `spec_kit_plan_confirm.yaml` and `spec_kit_complete_auto.yaml`, where predicate-style `when:` clauses coexist with prose-only timing strings like `Immediately after the generated continuity artifact is written to disk` and `Immediately after the canonical spec document is refreshed on disk` (`spec_kit_plan_confirm.yaml:372-416,606-612`; `spec_kit_complete_auto.yaml:465-483,1008-1012`). The nearby automated coverage exercises save/planner behavior and response shaping, not the YAML asset grammar: `transcript-planner-export.vitest.ts` drives `atomicSaveMemory()` end-to-end, and `memory-save-planner-first.vitest.ts` tests response-builder serialization (`transcript-planner-export.vitest.ts:146-217`; `memory-save-planner-first.vitest.ts:1-40`). A repo search on 2026-04-16 found no direct test references to `spec_kit_plan_auto.yaml`, `spec_kit_plan_confirm.yaml`, `spec_kit_complete_auto.yaml`, or `intake_triggered` / `intake_completed` payload evaluation under `.opencode/skills/system-spec-kit/mcp_server/tests`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-039.md:21:- **Evidence:** `readStoredScope()` performs a standalone point lookup by candidate id (`reconsolidation-bridge.ts:203-217`). `candidateMatchesRequestedScope()` calls that lookup whenever governed scope is present and rejects the candidate if the row is missing or the scope no longer matches (`reconsolidation-bridge.ts:219-237`). The main reconsolidation path then does `vectorIndex.vectorSearch(...)` followed by `results.filter((r) => candidateMatchesRequestedScope(database, r, requestedScope)).slice(...)` before mapping the surviving candidates into the planner input (`reconsolidation-bridge.ts:282-306`). The only targeted regression here uses one mocked candidate and one static `database.prepare().get()` response (`mcp_server/tests/reconsolidation-bridge.vitest.ts:255-330`); it does not exercise multiple candidates or a scope row that changes between successive lookups inside the same filter loop.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-039.md:26:- Save-time reconsolidation has a second read-coordination seam beyond "search before transaction": even the governed scope filter itself is assembled from per-candidate live reads, so one planner pass can reason over a candidate universe that was never consistent at any instant.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-039.md:29:The last Domain 3 pass should turn these into adversarial harness gaps: one autosave-enabled stop-hook replay that forces `sessionSummary` or `lastSpecFolder` to disappear before `runContextAutosave()` reads state, and one reconsolidation-bridge test with multiple candidates whose governed scope changes between successive `readStoredScope()` calls so the planner's mixed-snapshot behavior becomes directly observable.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-043.md:17:- **File:** `.opencode/commands/spec_kit/assets/spec_kit_plan_auto.yaml`; `.opencode/commands/spec_kit/plan.md`; `.opencode/skills/system-spec-kit/mcp_server/tests/transcript-planner-export.vitest.ts`; `.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-planner-first.vitest.ts`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-043.md:18:- **Lines:** `spec_kit_plan_auto.yaml:343-372,375-392`; `plan.md:93-99`; `transcript-planner-export.vitest.ts:146-217`; `memory-save-planner-first.vitest.ts:12-214`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-043.md:21:- **Evidence:** The asset's intake gate and intake-only stop gate are raw string predicates: `when: "folder_state != populated"`, `when: "folder_state == populated"`, `when: "intake_only == TRUE"`, and `when: "intake_only == FALSE"` (`spec_kit_plan_auto.yaml:353-372,375-392`). The operator-facing `/spec_kit:plan` contract mirrors the same branch logic in prose (`plan.md:93-99`), so the workflow behavior still depends on all runtimes interpreting those string expressions the same way. The adjacent planner export suite exercises memory-save transcript routing and asserts only summary/status outputs (`transcript-planner-export.vitest.ts:146-217`), while the planner-first response suite is a response-builder contract test for follow-up actions and hints (`memory-save-planner-first.vitest.ts:12-214`). Neither suite evaluates the YAML branch predicates, the `TRUE`/`FALSE` literal handling, or the Step 0 `folder_state` comparisons.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/interim-synthesis-44-iterations.md:197:- `transcript-planner-export.vitest.ts:146-217` — no `populated` vs `populated-folder` token divergence case for Step 0.5 branch (R41-001).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/interim-synthesis-44-iterations.md:198:- `memory-save-planner-first.vitest.ts:12-214` — covers response shaping only; no Gate 3 trigger-classification verification (R41-002).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/interim-synthesis-44-iterations.md:202:- `transcript-planner-export.vitest.ts` never exercises or validates `spec_kit_plan_auto.yaml` / `spec_kit_plan_confirm.yaml` `when:` predicate evaluation, `TRUE`/`FALSE` literal handling, or the `folder_state` comparisons in Step 0 (R42-001, R43-002, R44-003).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/interim-synthesis-44-iterations.md:397:| Add test coverage to `transcript-planner-export.vitest.ts` or a new asset-predicate suite that exercises Step 0 `folder_state` and `intake_only` branch predicates directly | **Medium** | R42-001, R43-002, R44-003 |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/interim-synthesis-44-iterations.md:445:- `tests/transcript-planner-export.vitest.ts` (or new `spec_kit_plan_asset.vitest.ts`) — add: branch-predicate evaluation tests for `folder_state == populated` / `folder_state == populated-folder` divergence and `intake_only == TRUE` / `intake_only == FALSE` literal handling in both `spec_kit_plan_auto.yaml` and `spec_kit_plan_confirm.yaml`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/interim-synthesis-44-iterations.md:546:R42-001 | spec_kit_plan_auto.yaml:375-392; spec_kit_plan_confirm.yaml:400-416; plan.md:96-98; transcript-planner-export.vitest.ts:146-217 | P2 | intake_only == TRUE/FALSE is an unsigned string DSL with no pinned interpreter contract; no test exercises the predicate
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/interim-synthesis-44-iterations.md:550:R43-002 | spec_kit_plan_auto.yaml:343-372,375-392; plan.md:93-99; transcript-planner-export.vitest.ts:146-217; memory-save-planner-first.vitest.ts:12-214 | P2 | /spec_kit:plan Step 0 folder_state and intake_only branches are untyped string predicates with no automated coverage of the predicate evaluation itself
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/interim-synthesis-44-iterations.md:553:R44-003 | spec_kit_plan_auto.yaml:375-392; spec_kit_plan_confirm.yaml:400-417; transcript-planner-export.vitest.ts:146-217 | P2 | both plan workflow assets use "intake_only == TRUE"/"intake_only == FALSE" as string conditions; no shared boolean grammar definition; no test validates predicate semantics
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/interim-synthesis-44-iterations.md:581:**Cross-domain dependency note:** Domain 4 P1 fixes (A2, C3) are independent of Domain 3 P1 fixes. Domain 3 fixes all involve TypeScript runtime changes to `session-stop.ts`, `hook-state.ts`, and `reconsolidation.ts`. Domain 4 fixes involve Python (`skill_advisor.py`, `skill_graph_compiler.py`) and TypeScript in a separate test-and-governance stack. A team can parallelize Domain 3 and Domain 4 work without conflict, with the exception of B3 (test suite additions to `transcript-planner-export.vitest.ts`) which shares the same test file as a Domain 3 test target (R41-001 regression). B3 should be coordinated to avoid merge conflicts in that file.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-037.md:28:- **Description:** A single save request can observe two different unlocked candidate snapshots before the writer transaction begins. The TM-06 reconsolidation planner does one `vectorSearch` + scope-filter pass, and if it falls through, the assistive reconsolidation block later does a second `vectorSearch` + scope-filter pass. No transaction, lock, or snapshot token ties those two reads together.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-037.md:30:- **Downstream Impact:** A concurrent insert/update can make the main planner miss a candidate that the later assistive pass does see, so the same request can persist as a normal complement while also returning a late review recommendation against a newer candidate universe. That weakens the auditability of save responses and makes stale duplicate creation harder to distinguish from intentional keep-separate behavior.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/research.md:3:description: "This document is the canonical narrative synthesis of the 50-iteration research run. It is intended for future consumers (Phase 017 planners, remediation engineers, cross-phase ..."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/research.md:33:This document is the canonical narrative synthesis of the 50-iteration research run. It is intended for future consumers (Phase 017 planners, remediation engineers, cross-phase auditors) who want the full reasoning without reading all 50 iteration files. For the terse action-oriented version, read `FINAL-synthesis-and-review.md`. For structured data, read `findings-registry.json`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/research.md:182:- The deferred planner-first save path DOES have a typed `runEnrichmentBackfill` recovery action. Other runtime-degradation branches are structurally inferior to this one case; the deferred path is the design model.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/research.md:310:| `transcript-planner-export.vitest.ts:146-217` | Response summaries only | YAML `when:` predicate evaluation | S7 |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/research.md:330:- `save context` / `save memory` / `/memory:save` prompts DO trigger Gate 3 (R48-001, R49-001, S5)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/research.md:355:**Iteration 6 -- Reconsolidation-bridge governance gates.** Found that assistive reconsolidation is gated by planner/full-auto switch and defaults OFF despite docs claiming "default ON." Also found `ASSISTIVE_AUTO_MERGE_THRESHOLD` promises auto-merge, but runtime only logs and falls through.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/research.md:447:**Iteration 48 -- Gate 3 false-negatives for memory-save.** Gate 3's file-modification trigger list omits `save context`, `save memory`, `/memory:save` even though same file declares `MEMORY SAVE RULE` keyed on these phrases. `when:` field overloaded as both executable predicate and prose timing note within same asset.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/research.md:983:**Downstream consumers.** Claude `session-prime.ts`, Gemini `session-prime.ts`, `session-resume.ts`, `startup-brief.ts`, `runContextAutosave`, spec-folder detection pipeline, transcript-planner-export, token analytics.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/interim-synthesis-47-iterations.md:198:- `transcript-planner-export.vitest.ts:146-217` — no `populated` vs `populated-folder` token divergence case (R41-001).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/interim-synthesis-47-iterations.md:199:- `memory-save-planner-first.vitest.ts:12-214` — covers response shaping only; no Gate 3 trigger-classification verification (R41-002).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/interim-synthesis-47-iterations.md:201:- `transcript-planner-export.vitest.ts` — never exercises YAML `when:` predicate evaluation (R42-001, R43-002, R44-003).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/interim-synthesis-47-iterations.md:366:**Watch candidate — Domain 4 routing misdirection chain (updated):** R46-001 strengthens this watch candidate in a concrete direction. The original watch candidate (R43-001 + R44-001 + R42-002 + R41-003) asked whether incorrect routing could chain into file-modifying outcomes. R46-001 now identifies a specific mechanism: an explicit `/spec_kit:deep-research` invocation routes to `command-spec-kit` at 0.95 confidence rather than `sk-deep-research` at 0.70 confidence. `command-spec-kit` is a planner bridge that can invoke file-modifying spec-folder workflows. If an operator's intent is autonomous research (no file modification), but the routed skill is the spec-folder planner, Gate 3 may be invoked and spec folder creation may proceed. Whether this chain is currently completable depends on whether `command-spec-kit` enforces Gate 3 independently of skill routing; that question remains open. The chain is now more concrete and the mechanism is identified; recommend upgrade to watch-priority-1 (one confirmed step away from P0).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/interim-synthesis-47-iterations.md:389:| R46-001 | P1 | `skill_advisor.py` | all `/spec_kit:*` subcommands collapse to `command-spec-kit` via prefix bridge; explicit `/spec_kit:deep-research` routes to planner not researcher | A2-bridge |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/interim-synthesis-47-iterations.md:392:| R45-001 | P2 | `AGENTS.md`, `002-confirm-mode-checkpointed-review.md`, `memory-save-planner-first.vitest.ts` | Gate 3 overbroad trigger list misclassifies read-only deep-review prompts as file-modifying; `analyze`/`phase` overlap with research vocabulary | B4 |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/interim-synthesis-47-iterations.md:467:- `tests/transcript-planner-export.vitest.ts` or equivalent — add: (a) `intake_triggered` event payload contains both `folderState` and `startState` fields with distinct values for `no-spec` / `empty-folder` states (R47-002); (b) `startState` uses `populated-folder` token, not `populated`, for the "skip intake" branch (R41-001, R47-002 combined).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/interim-synthesis-47-iterations.md:557:          memory-save-planner-first.vitest.ts:12-214 | P2
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/interim-synthesis-47-iterations.md:657:- **New P0 escalation:** none from iterations 45-47; P0-candidate watch for Domain 4 routing misdirection is upgraded to watch-priority-1 following R46-001 (concrete mechanism identified: `/spec_kit:deep-research` → planner bridge at 0.95).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-042.md:9:- **File:** `.opencode/commands/spec_kit/assets/spec_kit_plan_auto.yaml`; `.opencode/commands/spec_kit/assets/spec_kit_plan_confirm.yaml`; `.opencode/commands/spec_kit/plan.md`; `.opencode/skills/system-spec-kit/mcp_server/tests/transcript-planner-export.vitest.ts`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-042.md:10:- **Lines:** `spec_kit_plan_auto.yaml:375-392`; `spec_kit_plan_confirm.yaml:400-416`; `plan.md:96-98`; `transcript-planner-export.vitest.ts:146-217`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-042.md:13:- **Evidence:** `spec_kit_plan_auto.yaml` and `spec_kit_plan_confirm.yaml` both treat the halt/continue decision as quoted string expressions rather than typed booleans. The operator-facing `plan.md` mirrors the same contract in prose (`folder_state == populated-folder` plus `intake_only == TRUE/FALSE`). The nearby regression coverage in `transcript-planner-export.vitest.ts` exercises `atomicSaveMemory()` planner exports, not the command-asset `when:` interpreter that would actually decide whether `--intake-only` halts before planning.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/deltas/iter-056.jsonl:7:{"type":"finding","id":"R56-P1-upgrade-001","severity":"P1-upgrade","title":"Default-path canonical save is a metadata-freshness no-op","composedOf":["R51-P1-001","R51-P1-002","R4-P1-002"],"filesCited":[".opencode/skills/system-spec-kit/scripts/core/workflow.ts:1259",".opencode/skills/system-spec-kit/scripts/core/workflow.ts:1333",".opencode/skills/system-spec-kit/scripts/memory/generate-context.ts:415"],"confidence":0.93,"iteration":56,"blastRadius":"every default /memory:save produces zero metadata writes"}
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-056.md:30:1. User runs `/memory:save` (or `generate-context.js --json …`) with default `plannerMode = 'plan-only'` (`generate-context.ts:415`).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-056.md:32:3. `workflow.ts:1333` gates `refreshGraphMetadata` on `options.plannerMode === 'full-auto'`; default path logs "Deferred graph metadata refresh to explicit follow-up" (line 1352) and returns.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-056.md:114:**Confirmed attack chain**: Default `/memory:save` → plan-only mode → workflow.ts:1259 `ctxFileWritten = false` (description block unreachable) → workflow.ts:1333 plan-only skips refreshGraphMetadata → returns with zero metadata writes.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-056.md:115:**Prerequisites**: User invokes `/memory:save` or `generate-context.js --json` without `--full-auto`. This IS the documented default.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-056.md:116:**Evidence**: `scripts/core/workflow.ts:1259` (`const ctxFileWritten = false`), `1333` (`shouldRunExplicitSaveFollowUps = options.plannerMode === 'full-auto'`), `1352` (logs "Deferred graph metadata refresh"). `scripts/memory/generate-context.ts:415` (`let plannerMode: ... = 'plan-only'`).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-007.md:4:I traced the planner-first save follow-up path for deferred enrichment: `memory-save.ts` -> `api/indexing.ts` -> `memory-index.ts` -> `post-insert.ts`, then cross-checked the entity-extraction and entity-linking substeps to see whether the runtime truthfully replays deferred work and surfaces soft failures.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-007.md:28:Trace the remaining planner follow-up actions (`reindexSpecDocs`, `refreshGraphMetadata`, reconsolidation follow-ups) against their actual execution paths, with special attention to other places where “replay” actions may silently short-circuit on cached mtime/state or where skipped substeps are reported as successful completion.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/deltas/iter-051.jsonl:3:{"type":"finding","id":"R51-P1-002","severity":"P1","cluster":"B","extends":"R3-P2-001,R5-P1-001","file":"scripts/core/workflow.ts:1333,scripts/memory/generate-context.ts:415","title":"Default planner-mode plan-only skips refreshGraphMetadata entirely; derived.last_save_at/status/source_docs never refresh under default save path","confidence":0.93,"dimension":"root-cause","evidence":"workflow.ts:1333 guards refreshGraphMetadata on shouldRunExplicitSaveFollowUps=options.plannerMode==='full-auto'. generate-context.ts:415 declares default plannerMode='plan-only'. /memory:save and generate-context.js --json both use plan-only by default. Refresh fires only on explicit --full-auto.","iteration":51}
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/deltas/iter-051.jsonl:8:{"type":"ruled_out","direction":"dist/memory/generate-context.js differs from .ts source in a way that hides lastUpdated writer","reason":"Line counts differ (647 src / 571 dist) but plannerMode='plan-only' default and shouldRunExplicitSaveFollowUps guard are preserved identically. Description-update code lives in workflow.ts/.js not generate-context.","iteration":51}
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-014/real-post.sha:24649:780801f7f77b6c9326386449fe818c427b20391eadeec5a507b6be32c799ff8c  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-1x/system-spec-kit--01/scripts/tests/deep-loop-wave-planner.vitest.ts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-014/real-post.sha:24650:780801f7f77b6c9326386449fe818c427b20391eadeec5a507b6be32c799ff8c  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-2x/system-spec-kit--01/scripts/tests/deep-loop-wave-planner.vitest.ts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-014/real-post.sha:24651:780801f7f77b6c9326386449fe818c427b20391eadeec5a507b6be32c799ff8c  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-2x/system-spec-kit--02/scripts/tests/deep-loop-wave-planner.vitest.ts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-014/real-post.sha:24652:780801f7f77b6c9326386449fe818c427b20391eadeec5a507b6be32c799ff8c  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--01/scripts/tests/deep-loop-wave-planner.vitest.ts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-014/real-post.sha:24653:780801f7f77b6c9326386449fe818c427b20391eadeec5a507b6be32c799ff8c  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--02/scripts/tests/deep-loop-wave-planner.vitest.ts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-014/real-post.sha:24654:780801f7f77b6c9326386449fe818c427b20391eadeec5a507b6be32c799ff8c  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--03/scripts/tests/deep-loop-wave-planner.vitest.ts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-014/real-post.sha:24655:780801f7f77b6c9326386449fe818c427b20391eadeec5a507b6be32c799ff8c  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--04/scripts/tests/deep-loop-wave-planner.vitest.ts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-014/real-post.sha:24656:780801f7f77b6c9326386449fe818c427b20391eadeec5a507b6be32c799ff8c  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--05/scripts/tests/deep-loop-wave-planner.vitest.ts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-014/real-post.sha:36686:ab34a1b833fa988474d3a34b173e55499591864a96b57a4b91ebcd7b48ca051d  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-1x/system-spec-kit--01/scripts/lib/wave-segment-planner.cjs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-014/real-post.sha:36687:ab34a1b833fa988474d3a34b173e55499591864a96b57a4b91ebcd7b48ca051d  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-2x/system-spec-kit--01/scripts/lib/wave-segment-planner.cjs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-014/real-post.sha:36688:ab34a1b833fa988474d3a34b173e55499591864a96b57a4b91ebcd7b48ca051d  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-2x/system-spec-kit--02/scripts/lib/wave-segment-planner.cjs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-014/real-post.sha:36689:ab34a1b833fa988474d3a34b173e55499591864a96b57a4b91ebcd7b48ca051d  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--01/scripts/lib/wave-segment-planner.cjs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-014/real-post.sha:36690:ab34a1b833fa988474d3a34b173e55499591864a96b57a4b91ebcd7b48ca051d  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--02/scripts/lib/wave-segment-planner.cjs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-014/real-post.sha:36691:ab34a1b833fa988474d3a34b173e55499591864a96b57a4b91ebcd7b48ca051d  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--03/scripts/lib/wave-segment-planner.cjs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-014/real-post.sha:36692:ab34a1b833fa988474d3a34b173e55499591864a96b57a4b91ebcd7b48ca051d  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--04/scripts/lib/wave-segment-planner.cjs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-manual-testing-playbook-coverage-and-run/scratch/cli-playbook-results/cli-copilot/evidence/CP-014/real-post.sha:36693:ab34a1b833fa988474d3a34b173e55499591864a96b57a4b91ebcd7b48ca051d  /Users/michelkerkmeester/.copilot/session-state/4effcf42-e24c-4d22-8c9c-997806323deb/files/iter41-watch-bench/dataset-5x/system-spec-kit--05/scripts/lib/wave-segment-planner.cjs
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-046.md:14:- **Downstream Impact:** Operators can explicitly request a more specific `/spec_kit` command and still get a generic planner-oriented routing result. Because the contract is just prefix matching on raw strings, adding or renaming subcommands can silently change routing priority without any schema failure or test break.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/interim-synthesis-32-iterations.md:138:3. **Control-plane asymmetry.** Deferred planner-first saves get a typed `runEnrichmentBackfill` recovery action, but comparable runtime degradation branches get only warning strings (R24-001). Cached resume scope is trusted to choose a packet but not propagated into `opencodeTransport.specFolder` (R24-002).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/interim-synthesis-32-iterations.md:499:R6-001  | mcp_server/handlers/save/reconsolidation-bridge.ts:66-73,243-255,446-454 | P1 | assistive reconsolidation gated behind planner/full-auto switch; default OFF despite docs "default ON"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:972:      "summary": "Gate 3's trigger list does NOT include 'save context', 'save memory', '/memory:save', or 'resume' even though these are real write-producing flows"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:1302:      "description": "The file documents assistive reconsolidation as a separate, default-on advisory feature, but the runtime gates it behind the same planner/full-auto switch used for save-time reconsolidation. In the default planner-first runtime, assistive review never executes unless the caller explicitly enables full-auto mode or the opt-in save-time reconsolidation flag.",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:1303:      "evidence": "`isAssistiveReconsolidationEnabled()` is presented as default ON at `72-73`, and the assistive block claims it \"Runs independently of the TM-06 flag\" at `446-449`. But the actual guard at `453` requires `allowSaveTimeReconsolidation`, which is derived at `254-255` from `plannerMode === 'full-auto' || isSaveReconsolidationEnabled()`. The surrounding runtime defaults make that guard false by default: `resolveSavePlannerMode()` returns `'plan-only'` (`lib/search/search-flags.ts:123-145`), and `isSaveReconsolidationEnabled()` is opt-in false (`lib/search/search-flags.ts:139-145`). The tests codify this mismatch: `tests/reconsolidation-bridge.vitest.ts:116-168` expects the default path to skip both `reconsolidate` and `vectorSearch`, while `tests/assistive-reconsolidation.vitest.ts:22-50` only proves the helper flag/classifier defaults, not the live save path.",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:1342:      "description": "`EnrichmentStatus` is documented as tracking which enrichment steps succeeded, but the implementation uses `true` for four different outcomes: actual success, feature-disabled skip, \"nothing to do\" skip, and full planner-first deferral. Because the save response only warns when some status flag is `false`, a save where no enrichment ran is serialized as fully healthy.",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:1343:      "evidence": "`post-insert.ts:86-92` initializes every step flag to `false`, but the non-run branches flip them to `true` at `110-113`, `130-133`, `152-155`, `178-181`, and `205-208`. The deferred wrapper returns all-`true` enrichment status again at `223-238` even though `executionStatus.status` is `'deferred'`. Downstream, `response-builder.ts:315-322` only emits a partial-enrichment warning when a flag remains `false`, and the direct regression test codifies the misleading contract by expecting all five booleans to be `true` in planner-first defer mode (`tests/post-insert-deferred.vitest.ts:11-47`).",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:1344:      "downstream_impact": "`handlers/memory-save.ts:2362-2383` forwards this status into the indexed save result, so planner-first saves and feature-disabled saves can look fully enriched even though causal links, summaries, entity linking, and graph lifecycle never ran. That suppresses the runtime's only generic warning surface for skipped freshness work and makes deferred saves observationally similar to completed saves."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:1353:      "evidence": "`post-insert.ts:116-129` wraps extraction and auto-entity refresh in a try/catch and leaves the pipeline alive after failure. The later entity-linking branch at `159-177` checks only `isEntityLinkingEnabled() && isAutoEntitiesEnabled()`, not whether extraction actually succeeded. The refresh helper is the step that deletes and replaces existing auto-entities for the memory (`lib/extraction/entity-extractor.ts:198-224`), while `runEntityLinkingForMemory()` immediately queries persisted entities for that memory and builds links from those matches (`lib/search/entity-linker.ts:1096-1133`). There is no direct regression test for the failure path; the dedicated post-insert suite only covers planner-first deferral (`tests/post-insert-deferred.vitest.ts:11-47`).",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:1443:      "evidence": "`generateAndStoreSummary(...)` is called and `enrichmentStatus.summaries = true` is set unconditionally after the await, without checking `summaryResult.stored` (`post-insert.ts:136-147`). Likewise, `onIndex(...)` can return `skipped: true`, but `post-insert.ts` still sets `enrichmentStatus.graphLifecycle = true` after the call (`post-insert.ts:187-200`). `response-builder.ts:315-321` only warns when an enrichment flag is `false`. The helper test suites prove the ignored no-op states exist: `tests/memory-summaries.vitest.ts:371-382` expects `stored=false` for empty content, and `tests/graph-lifecycle.vitest.ts:658-668` expects `skipped=true` when graph refresh does not actually run. The post-insert coverage does not exercise those branches; `tests/post-insert-deferred.vitest.ts:11-48` only locks in planner-first deferral.",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:1573:      "evidence": "`runPostInsertEnrichment()` sets `enrichmentStatus.causalLinks = true` immediately after any non-throwing `processCausalLinks(...)` call (`post-insert.ts:97-100`), and only emits a log for unresolved references (`post-insert.ts:103-105`). The processor itself explicitly returns partial-failure state through `unresolved` and `errors` arrays (`handlers/causal-links-processor.ts:345-420`). The response layer only warns when a status flag is `false` (`handlers/save/response-builder.ts:315-321`). The helper tests prove unresolved and mixed-result paths exist (`tests/handler-helpers.vitest.ts:680-710`), while the dedicated post-insert test only exercises planner-first deferral (`tests/post-insert-deferred.vitest.ts:11-48`).",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:1812:      "description": "`memory_save` decides whether to advertise `runEnrichmentBackfill` before post-insert enrichment runs. That means the only save path with a typed recovery action is the already-known planner-first defer case. If `post-insert.ts:96-208` later collapses a partial runtime miss into `executionStatus.status = 'ran'` plus warning-only side channels, the final save response has no structured retry/backfill action even though the backfill API exists.",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:1813:      "evidence": "`buildAtomicPlannerFollowUpActions()` only appends the `enrich` action when `!isPostInsertEnrichmentEnabled()` (`handlers/memory-save.ts:1666-1675`). The actual enrichment result is produced much later by `runPostInsertEnrichmentIfEnabled(...)` (`handlers/memory-save.ts:2362-2384`), after which `response-builder.ts:315-322,569-573` can only add `\"Partial enrichment: ... failed\"` or the deferred hint. The direct deferred suite locks in the one actionable branch (`tests/post-insert-deferred.vitest.ts:11-47,50-81`), while the save-handler suite only stubs all-green `status: 'ran'` post-insert results (`tests/handler-memory-save.vitest.ts:2592-2606`) and the follow-up API suite covers `runEnrichmentBackfill()` only when invoked manually (`tests/follow-up-api.vitest.ts:102-149`).",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:1832:      "description": "The deferred-enrichment branch is no longer just a source-local boolean collapse; the repo now treats that success-shaped state as the expected contract. When planner-first mode skips enrichment, `post-insert.ts` returns all five `enrichmentStatus` booleans as `true`, even though no enrichment work ran. `response-builder.ts` only emits a warning when any boolean is `false`, so the deferred path becomes observationally identical to a fully successful run unless a caller separately inspects `executionStatus`.",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:2202:      "description": "A single save request can observe two different unlocked candidate snapshots before the writer transaction begins. The TM-06 reconsolidation planner does one `vectorSearch` + scope-filter pass, and if it falls through, the assistive reconsolidation block later does a second `vectorSearch` + scope-filter pass. No transaction, lock, or snapshot token ties those two reads together.",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:2204:      "downstream_impact": "A concurrent insert/update can make the main planner miss a candidate that the later assistive pass does see, so the same request can persist as a normal complement while also returning a late review recommendation against a newer candidate universe. That weakens the auditability of save responses and makes stale duplicate creation harder to distinguish from intentional keep-separate behavior."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:2243:      "evidence": "`readStoredScope()` performs a standalone point lookup by candidate id (`reconsolidation-bridge.ts:203-217`). `candidateMatchesRequestedScope()` calls that lookup whenever governed scope is present and rejects the candidate if the row is missing or the scope no longer matches (`reconsolidation-bridge.ts:219-237`). The main reconsolidation path then does `vectorIndex.vectorSearch(...)` followed by `results.filter((r) => candidateMatchesRequestedScope(database, r, requestedScope)).slice(...)` before mapping the surviving candidates into the planner input (`reconsolidation-bridge.ts:282-306`). The only targeted regression here uses one mocked candidate and one static `database.prepare().get()` response (`mcp_server/tests/reconsolidation-bridge.vitest.ts:255-330`); it does not exercise multiple candidates or a scope row that changes between successive lookups inside the same filter loop.",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:2269:      "file": ".opencode/commands/spec_kit/assets/spec_kit_plan_auto.yaml; .opencode/commands/spec_kit/plan.md; .opencode/skills/system-spec-kit/references/intake-contract.md; .opencode/skills/system-spec-kit/mcp_server/tests/transcript-planner-export.vitest.ts",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:2270:      "lines": "spec_kit_plan_auto.yaml:338-355,371-372; plan.md:93-99; intake-contract.md:66-77,217-222; transcript-planner-export.vitest.ts:146-217",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:2273:      "evidence": "`spec_kit_plan_auto.yaml` classifies `folder_state` as `no-spec | partial-folder | repair-mode | placeholder-upgrade | populated`, then gates `on_skip.when: \"folder_state == populated\"` while only mapping `start_state` to `populated-folder` (`spec_kit_plan_auto.yaml:338-355,371-372`). The operator-facing plan contract and canonical intake reference both define the healthy state as `populated-folder` and say that state should skip or no-op the intake block (`plan.md:93-99`; `intake-contract.md:66-77,217-222`). The nearby planner export suite only asserts downstream `planned`/`blocked` response summaries and never exercises these Step 0.5 string conditions (`transcript-planner-export.vitest.ts:146-217`).",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:2279:      "file": "AGENTS.md; .opencode/commands/spec_kit/plan.md; .opencode/commands/spec_kit/complete.md; .opencode/skills/system-spec-kit/mcp_server/tests/memory-save-planner-first.vitest.ts",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:2280:      "lines": "AGENTS.md:182-186; plan.md:86-89; complete.md:74-77; memory-save-planner-first.vitest.ts:12-214",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:2283:      "evidence": "`AGENTS.md` says Gate 3 fires on the literal trigger list `rename, move, delete, create, add, remove, update, change, modify, edit, fix, refactor, implement, build, write, generate, configure, analyze, decompose, phase` (`AGENTS.md:182-186`). Both planning and completion docs then state `Gate 1 trigger matching handled at agent level (AGENTS.md)` instead of defining a local or shared classifier (`plan.md:86-89`; `complete.md:74-77`). The nearby planner-first response suite covers response shaping only; it does not verify Gate 3 trigger classification at all (`memory-save-planner-first.vitest.ts:12-214`).",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:2309:      "file": ".opencode/commands/spec_kit/assets/spec_kit_plan_auto.yaml; .opencode/commands/spec_kit/assets/spec_kit_plan_confirm.yaml; .opencode/commands/spec_kit/plan.md; .opencode/skills/system-spec-kit/mcp_server/tests/transcript-planner-export.vitest.ts",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:2310:      "lines": "spec_kit_plan_auto.yaml:375-392; spec_kit_plan_confirm.yaml:400-416; plan.md:96-98; transcript-planner-export.vitest.ts:146-217",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:2313:      "evidence": "`spec_kit_plan_auto.yaml` and `spec_kit_plan_confirm.yaml` both treat the halt/continue decision as quoted string expressions rather than typed booleans. The operator-facing `plan.md` mirrors the same contract in prose (`folder_state == populated-folder` plus `intake_only == TRUE/FALSE`). The nearby regression coverage in `transcript-planner-export.vitest.ts` exercises `atomicSaveMemory()` planner exports, not the command-asset `when:` interpreter that would actually decide whether `--intake-only` halts before planning.",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:2349:      "file": ".opencode/commands/spec_kit/assets/spec_kit_plan_auto.yaml; .opencode/commands/spec_kit/plan.md; .opencode/skills/system-spec-kit/mcp_server/tests/transcript-planner-export.vitest.ts; .opencode/skills/system-spec-kit/mcp_server/tests/memory-save-planner-first.vitest.ts",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:2350:      "lines": "spec_kit_plan_auto.yaml:343-372,375-392; plan.md:93-99; transcript-planner-export.vitest.ts:146-217; memory-save-planner-first.vitest.ts:12-214",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:2353:      "evidence": "The asset's intake gate and intake-only stop gate are raw string predicates: `when: \"folder_state != populated\"`, `when: \"folder_state == populated\"`, `when: \"intake_only == TRUE\"`, and `when: \"intake_only == FALSE\"` (`spec_kit_plan_auto.yaml:353-372,375-392`). The operator-facing `/spec_kit:plan` contract mirrors the same branch logic in prose (`plan.md:93-99`), so the workflow behavior still depends on all runtimes interpreting those string expressions the same way. The adjacent planner export suite exercises memory-save transcript routing and asserts only summary/status outputs (`transcript-planner-export.vitest.ts:146-217`), while the planner-first response suite is a response-builder contract test for follow-up actions and hints (`memory-save-planner-first.vitest.ts:12-214`). Neither suite evaluates the YAML branch predicates, the `TRUE`/`FALSE` literal handling, or the Step 0 `folder_state` comparisons.",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:2379:      "file": ".opencode/commands/spec_kit/assets/spec_kit_plan_auto.yaml; .opencode/commands/spec_kit/assets/spec_kit_plan_confirm.yaml; .opencode/skills/system-spec-kit/mcp_server/tests/transcript-planner-export.vitest.ts",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:2380:      "lines": "spec_kit_plan_auto.yaml:375-392; spec_kit_plan_confirm.yaml:400-417; transcript-planner-export.vitest.ts:146-217",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:2383:      "evidence": "The auto and confirm assets both define `step_0.6_intake_only_gate` with `bound_variable: intake_only`, then branch on `when: \"intake_only == TRUE\"` and `when: \"intake_only == FALSE\"` (`spec_kit_plan_auto.yaml:375-392`; `spec_kit_plan_confirm.yaml:400-417`). The adjacent planner export test exercises transcript save/planner output and full-auto routing summaries only; it never invokes or asserts the intake-only halt path (`transcript-planner-export.vitest.ts:146-217`).",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:2389:      "file": "AGENTS.md; .claude/skills/sk-deep-review/manual_testing_playbook/01--entry-points-and-modes/002-confirm-mode-checkpointed-review.md; .opencode/commands/spec_kit/plan.md; .opencode/skills/system-spec-kit/mcp_server/tests/memory-save-planner-first.vitest.ts",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:2390:      "lines": "AGENTS.md:182-186; 002-confirm-mode-checkpointed-review.md:26-32; plan.md:86-89; memory-save-planner-first.vitest.ts:12-214",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:2393:      "evidence": "`AGENTS.md` says Gate 3 fires on the literal trigger list `... configure, analyze, decompose, phase ...` before any analysis or tool calls. A shipped manual-testing scenario for `/spec_kit:deep-review:confirm` is purely read-only, yet its prompt asks the agent to confirm that approval gates exist at each `phase transition` and return a pass/fail verdict. `/spec_kit:plan` explicitly delegates trigger matching to `AGENTS.md`, while the nearby Vitest file exercises planner-response payload serialization only and never tests Gate 3 prompt classification.",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:2434:      "downstream_impact": "Operators can explicitly request a more specific `/spec_kit` command and still get a generic planner-oriented routing result. Because the contract is just prefix matching on raw strings, adding or renaming subcommands can silently change routing priority without any schema failure or test break."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:2482:      "description": "Gate 3's file-modification trigger list has a concrete false-negative for the repository's own memory-save workflow. The hard-block trigger words omit `save context`, `save memory`, and `/memory:save`, even though the same instruction file treats `/memory:save` as a first-class write workflow and later gives it its own hard-block save rule. Other runtime surfaces already model the same phrases mechanically, so the pre-flight gate is the outlier.",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:2483:      "evidence": "`AGENTS.md` says Gate 3 fires on the literal list `rename, move, delete, create, add, remove, update, change, modify, edit, fix, refactor, implement, build, write, generate, configure, analyze, decompose, phase` (`AGENTS.md:182-185`), but the same file separately documents `Save context` / `End session` as `/memory:save` workflows and then declares a hard-block `MEMORY SAVE RULE` triggered by `\"save context\", \"save memory\", \"/memory:save\"` (`AGENTS.md:138-145,201-204`). The advisor command bridge also treats `/memory:save` as an explicit command and boosts natural-language memory-save phrases through a dedicated `memory` intent bucket (`skill_advisor.py:980-988,1112-1115`). The MCP server test suite likewise treats `save context` / `save memory` as exact trigger phrases with routing consequences (`query-classifier.vitest.ts:24-37,45,170-175,479-489`; `query-router.vitest.ts:68-74,290-295`).",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:2484:      "downstream_impact": "A first-turn request like `save context` or `/memory:save` is a real file-mutating workflow, but Gate 3's published trigger list does not mechanically identify it as one. Different runtimes can therefore diverge on whether they must stop for the spec-folder question before touching canonical continuity files, even though later layers in the same repository already recognize the request as a memory-save operation."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:2489:      "file": ".opencode/commands/spec_kit/assets/spec_kit_plan_auto.yaml; .opencode/commands/spec_kit/assets/spec_kit_plan_confirm.yaml; .opencode/commands/spec_kit/assets/spec_kit_complete_auto.yaml; .opencode/skills/system-spec-kit/mcp_server/tests/transcript-planner-export.vitest.ts; .opencode/skills/system-spec-kit/mcp_server/tests/memory-save-planner-first.vitest.ts",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:2490:      "lines": "spec_kit_plan_auto.yaml:354-391,548-555; spec_kit_plan_confirm.yaml:372-416,606-612; spec_kit_complete_auto.yaml:465-483,1008-1012; transcript-planner-export.vitest.ts:146-217; memory-save-planner-first.vitest.ts:1-40",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:2493:      "evidence": "In `spec_kit_plan_auto.yaml`, `when:` is used for executable conditions like `folder_state != populated`, `folder_state == populated`, `intake_only == TRUE`, and `intake_only == FALSE` (`spec_kit_plan_auto.yaml:354-391`), but the same asset later uses `when: \"Immediately after the canonical spec document is refreshed on disk\"` as a scheduling note under `post_save_indexing` (`spec_kit_plan_auto.yaml:548-555`). The same overload appears in `spec_kit_plan_confirm.yaml` and `spec_kit_complete_auto.yaml`, where predicate-style `when:` clauses coexist with prose-only timing strings like `Immediately after the generated continuity artifact is written to disk` and `Immediately after the canonical spec document is refreshed on disk` (`spec_kit_plan_confirm.yaml:372-416,606-612`; `spec_kit_complete_auto.yaml:465-483,1008-1012`). The nearby automated coverage exercises save/planner behavior and response shaping, not the YAML asset grammar: `transcript-planner-export.vitest.ts` drives `atomicSaveMemory()` end-to-end, and `memory-save-planner-first.vitest.ts` tests response-builder serialization (`transcript-planner-export.vitest.ts:146-217`; `memory-save-planner-first.vitest.ts:1-40`). A repo search on 2026-04-16 found no direct test references to `spec_kit_plan_auto.yaml`, `spec_kit_plan_confirm.yaml`, `spec_kit_complete_auto.yaml`, or `intake_triggered` / `intake_completed` payload evaluation under `.opencode/skills/system-spec-kit/mcp_server/tests`.",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:2502:      "description": "`AGENTS.md` now governs write intent through two unsynchronized string classifiers. Gate 3 says *any* file modification must be intercepted up front by the trigger-word list, but that list does not include `save`; the same document later introduces a separate hard-block `MEMORY SAVE RULE` keyed on `\"save context\"`, `\"save memory\"`, and `/memory:save`.",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:2503:      "evidence": "The Gate 3 trigger list is the literal prose set `rename, move, delete, create, add, remove, update, change, modify, edit, fix, refactor, implement, build, write, generate, configure, analyze, decompose, phase` (`AGENTS.md:182-186`). The same file separately documents `/memory:save` as a context-writing workflow (`AGENTS.md:142-144`) and then adds a second trigger surface - `Trigger: \"save context\", \"save memory\", /memory:save, continuity update` - under `MEMORY SAVE RULE` (`AGENTS.md:201-204`). Nearby automated coverage exercises memory-save handler behavior and planner/export payloads (`.opencode/skills/system-spec-kit/mcp_server/tests/handler-memory-save.vitest.ts:1-84`; `.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-planner-first.vitest.ts:12-214`; `.opencode/skills/system-spec-kit/mcp_server/tests/transcript-planner-export.vitest.ts:146-217`), but none of those suites reconcile Gate 3 classification with the later memory-save trigger surface.",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/findings-registry.json:2513:      "evidence": "Earlier control gates use `when:` as an expression DSL - `folder_state != populated`, `folder_state == populated`, `intake_only == TRUE`, and `intake_only == FALSE` (`spec_kit_plan_auto.yaml:354,372,380,391`). The same key later carries the prose sentence `Immediately after the canonical spec document is refreshed on disk` (`spec_kit_plan_auto.yaml:555`). Existing nearby tests validate memory-save planner/export behavior instead of command-asset interpretation (`.opencode/skills/system-spec-kit/mcp_server/tests/memory-save-planner-first.vitest.ts:12-214`; `.opencode/skills/system-spec-kit/mcp_server/tests/transcript-planner-export.vitest.ts:146-217`), so there is no automated contract pinning what `when:` means in this asset.",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/FINAL-synthesis-and-review.md:38:A fifth candidate — **Domain-4 routing misdirection chain** — is currently **watch-priority-1** (one confirmed step away from P0) after R46-001 identified a concrete routing path from `/spec_kit:deep-research` to the planner bridge at 0.95 confidence.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/FINAL-synthesis-and-review.md:117:| R6-001 | `reconsolidation-bridge.ts:66-73,243-255,446-454` | P1 | Assistive reconsolidation gated by planner/full-auto switch; default OFF despite docs "default ON" | Advertised default behavior differs from runtime default |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/FINAL-synthesis-and-review.md:246:| R45-001 | `AGENTS.md:182-186`; `002-confirm-mode-checkpointed-review.md:26-32`; `plan.md:86-89`; `memory-save-planner-first.vitest.ts:12-214` | P2 | Gate 3 trigger list includes `analyze`, `decompose`, `phase`; read-only deep-review/deep-research prompts reuse these tokens | False positives: read-only review can trigger unnecessary spec-folder setup |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/FINAL-synthesis-and-review.md:255:| R48-001 | `AGENTS.md:138-145,182-204`; `skill_advisor.py:980-988,1112-1115`; `query-classifier.vitest.ts:24-37,45,170-175,479-489`; `query-router.vitest.ts:68-74,290-295` | P2 | Gate 3's file-modification trigger list omits `save context`, `save memory`, `/memory:save` even though same file declares `MEMORY SAVE RULE` keyed on these phrases | Gate 3 false-negative for repository's own memory-save workflow |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/FINAL-synthesis-and-review.md:649:- The deferred planner-first save path DOES have a typed `runEnrichmentBackfill` recovery action. The other runtime-degradation branches are structurally inferior to this one case; the deferred path is the design model.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/FINAL-synthesis-and-review.md:734:- **False negative confirmed for memory-save and deep-research resume.** (R48-001, R49-001, R50-001.) Prior iterations established Gate 3 false positives; iterations 48–50 confirmed the opposite failure: Gate 3's trigger list does NOT include `save context`, `save memory`, `/memory:save`, or `resume` — even though all three are real write-producing flows. `resume deep research` can produce `iteration-NNN.md` + JSONL writes without matching any Gate 3 trigger word.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/FINAL-synthesis-and-review.md:1017:| `transcript-planner-export.vitest.ts:146-217` | Response summaries only | YAML `when:` predicate evaluation | S7 |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/FINAL-synthesis-and-review.md:1036:| `transcript-planner-export.vitest.ts` | ~100 | Low–medium (YAML predicate cases) | S7 |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/FINAL-synthesis-and-review.md:1122:- `save context` / `save memory` / `/memory:save` prompts DO trigger Gate 3 (R48-001, R49-001, S5)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/FINAL-synthesis-and-review.md:1181:- **S7:** New asset-predicate test suite; `transcript-planner-export.vitest.ts` additions.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/FINAL-synthesis-and-review.md:1183:- **M13:** `post-insert-deferred.vitest.ts`, `handler-memory-save.vitest.ts`, `memory-save-planner-first.vitest.ts`, `response-builder.vitest.ts`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/deep-research-dashboard.md:110:| 48 | D4 | 2 | 132 | Gate 3 false negative confirmed for `save context`/`save memory`/`/memory:save` |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/006-skill-advisor/003-smart-remediation-opencode-plugin/implementation-summary.md:77:- Documentation, Git, prompt-improvement, and system-spec-kit skills: added concrete artifact names and workflow commands (`README`, manual testing playbook, feature catalog, git worktree, experiment branch, prompt package, `/memory:save`, `/spec_kit:resume`, `implementation-summary`, `tasks.md`).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/interim-synthesis-41-iterations.md:219:- `transcript-planner-export.vitest.ts:146-217` asserts only downstream response summaries; never exercises `spec_kit_plan_auto.yaml` `folder_state` string conditions (R41-001).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/interim-synthesis-41-iterations.md:220:- `memory-save-planner-first.vitest.ts:12-214` covers response shaping only; no Gate 3 trigger-classification verification (R41-002).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/interim-synthesis-41-iterations.md:395:- `tests/transcript-planner-export.vitest.ts` — add `populated` vs `populated-folder` token divergence case for `spec_kit_plan_auto.yaml` Step 0.5 branch.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/interim-synthesis-38-iterations.md:146:3. **Control-plane asymmetry.** Deferred planner-first saves get a typed `runEnrichmentBackfill` recovery action, but comparable runtime degradation branches get only warning strings (R24-001). Cached resume scope is trusted to choose a packet but not propagated into `opencodeTransport.specFolder` (R24-002).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/interim-synthesis-38-iterations.md:416:| **[NEW since 32]** Share the TM-06 planner's vector-search snapshot with the assistive block (pass the same `searchResults` array into both decision paths) rather than running a second `vectorSearch` | Small | R37-003 |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/interim-synthesis-38-iterations.md:601:R6-001  | mcp_server/handlers/save/reconsolidation-bridge.ts:66-73,243-255,446-454 | P1 | assistive reconsolidation gated behind planner/full-auto switch; default OFF despite docs "default ON"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/interim-synthesis-38-iterations.md:691:R37-003 | mcp_server/handlers/save/reconsolidation-bridge.ts:261-306,453-500 | P2 | [NEW] TM-06 planner and assistive review each run independent vectorSearch+scope-filter; single request reasons about two candidate universes
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/006-skill-advisor/005-advisor-setup-command/review/iterations/iteration-003.md:5:The confirm workflow has all four required approval gates, each gate includes `trigger`, `prompt`, and `accepted_responses`, the post-verify gate includes a `/memory:save` option, `rules.ALWAYS` includes `wait_for_user_approval_at_each_gate`, and shared `mutation_boundaries` / `scoring_sources` are in parity with the auto workflow. However, parity also carries forward the auto workflow's graph-metadata field mismatch from F-CORR-005, and confirm-mode-specific approval semantics are under-specified around per-lane filtering, post-verify rollback execution, build-failure gating, and per-skill edit handling.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-008.md:4:I shifted from the hook/code-graph startup seam into the save-time enrichment controller in `.opencode/skills/system-spec-kit/mcp_server/handlers/save/post-insert.ts`, then traced how its status object is consumed by `memory-save` result building and what the direct post-insert tests currently lock in. The focus was whether planner-first and degraded enrichment states stay truthful once they leave the pipeline.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-008.md:12:- **Description:** `EnrichmentStatus` is documented as tracking which enrichment steps succeeded, but the implementation uses `true` for four different outcomes: actual success, feature-disabled skip, "nothing to do" skip, and full planner-first deferral. Because the save response only warns when some status flag is `false`, a save where no enrichment ran is serialized as fully healthy.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-008.md:13:- **Evidence:** `post-insert.ts:86-92` initializes every step flag to `false`, but the non-run branches flip them to `true` at `110-113`, `130-133`, `152-155`, `178-181`, and `205-208`. The deferred wrapper returns all-`true` enrichment status again at `223-238` even though `executionStatus.status` is `'deferred'`. Downstream, `response-builder.ts:315-322` only emits a partial-enrichment warning when a flag remains `false`, and the direct regression test codifies the misleading contract by expecting all five booleans to be `true` in planner-first defer mode (`tests/post-insert-deferred.vitest.ts:11-47`).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-008.md:14:- **Downstream Impact:** `handlers/memory-save.ts:2362-2383` forwards this status into the indexed save result, so planner-first saves and feature-disabled saves can look fully enriched even though causal links, summaries, entity linking, and graph lifecycle never ran. That suppresses the runtime's only generic warning surface for skipped freshness work and makes deferred saves observationally similar to completed saves.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-008.md:21:- **Evidence:** `post-insert.ts:116-129` wraps extraction and auto-entity refresh in a try/catch and leaves the pipeline alive after failure. The later entity-linking branch at `159-177` checks only `isEntityLinkingEnabled() && isAutoEntitiesEnabled()`, not whether extraction actually succeeded. The refresh helper is the step that deletes and replaces existing auto-entities for the memory (`lib/extraction/entity-extractor.ts:198-224`), while `runEntityLinkingForMemory()` immediately queries persisted entities for that memory and builds links from those matches (`lib/search/entity-linker.ts:1096-1133`). There is no direct regression test for the failure path; the dedicated post-insert suite only covers planner-first deferral (`tests/post-insert-deferred.vitest.ts:11-47`).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/iterations/iteration-008.md:25:Phase 015 already found that planner follow-up payloads advertise `runEnrichmentBackfill` as if it were an invocable tool (`review/015-deep-review-and-remediation/iterations/iteration-029.md:53-58`), but this pass found a deeper problem one layer earlier: the post-insert controller itself collapses "ran," "skipped," and "deferred" into success-shaped status. The direct tests are not just missing the issue; `tests/post-insert-deferred.vitest.ts` currently locks the all-`true` deferred contract in place.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/segment-2-synthesis.md:15:The headline discovery is **H-56-1**: the default `/memory:save` canonical-save path is a **metadata-freshness no-op** under the documented `plannerMode = 'plan-only'` default. Composed from R51-P1-001 (workflow.ts:1259 `const ctxFileWritten = false` dead-code guard making the `savePerFolderDescription` block unreachable), R51-P1-002 (workflow.ts:1333 gates `refreshGraphMetadata` behind `plannerMode === 'full-auto'`), and R4-P1-002 (no auto-repair job compensates), H-56-1 reframes the review's "drift over time" narrative to the sharper "every default save writes zero metadata." The "16/16 sibling folders stale" symptom in R5-P1-001 is not a drift artifact — it is the structural outcome of a default path that never writes.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/segment-2-synthesis.md:28:| R51-P1-002 | Default `plan-only` planner mode skips `refreshGraphMetadata` | `scripts/core/workflow.ts:1333`, `scripts/memory/generate-context.ts:415` | 0.93 | R3-P2-001, R5-P1-001 |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/segment-2-synthesis.md:82:- **R51-P1-002** — `scripts/core/workflow.ts:1333` gates `refreshGraphMetadata` on `options.plannerMode === 'full-auto'`; default at `generate-context.ts:415` is `'plan-only'`. The happy path never refreshes graph-metadata.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/segment-2-synthesis.md:84:- **R56-P1-upgrade-001 / H-56-1 (headline)** — The composition of R51-P1-001 + R51-P1-002 + R4-P1-002 confirms a structural-severity upgrade: **every default `/memory:save` is a metadata-freshness no-op**. Not "eventually stale" — "always stale after each save." The 16/16 sibling-folder staleness is the predictable symptom of a default path that writes zero metadata.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/segment-2-synthesis.md:156:Justification: (a) CNS-01 is the only task that removes `ctxFileWritten = false` stub and installs real `lastUpdated` writer — every Cluster B surface blocks on it. (b) W1-CNS-04 lifts `plannerMode === 'full-auto'` guard, same file same commit as CNS-01. (c) CNS-02 backfills rely on writers live. (d) CGC-01 extracts shared `lib/code-graph/readiness-contract.ts`; W1-CGC-03 then sweeps 5 siblings consuming that module. (e) W1-CNS-05 adds continuity-freshness validator. (f) CNS-03 is the terminal 16-folder tree-sweep.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/segment-2-synthesis.md:189:| T-W1-CNS-04 | P1 | M | R51-P1-002 | `refreshGraphMetadata` runs on plan-only default; `graph-metadata.json.derived.*` fresh after every `/memory:save` |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/segment-2-synthesis.md:232:- Wave A carries H-56-1 fix (default `/memory:save` metadata no-op), which is the headline finding — without it, no downstream Cluster B consumer behavior changes observably.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/segment-2-synthesis.md:274:- `.opencode/skills/system-spec-kit/scripts/memory/generate-context.ts:402-415` (`plannerMode = 'plan-only'` default)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/segment-2-synthesis.md:329:| Save continuity for this research session | `/memory:save 026-graph-and-context-optimization/016-foundational-runtime/001-initial-research` |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/deep-research-state.jsonl:42:{"event": "iteration_complete", "iteration": 41, "timestamp": "2026-04-16T18:28:20Z", "dispatcher": "cli-copilot/gpt-5.4/high", "domain": "D4 Stringly Typed Governance", "findings_added": 4, "cumulative_findings": 113, "files_touched": [".opencode/commands/spec_kit/assets/spec_kit_plan_auto.yaml", ".opencode/commands/spec_kit/complete.md", ".opencode/commands/spec_kit/plan.md", ".opencode/skills/skill-advisor/manual_testing_playbook/manual_testing_playbook.md", ".opencode/skills/skill-advisor/scripts/skill_advisor.py", ".opencode/skills/skill-advisor/scripts/skill_graph_compiler.py", ".opencode/skills/system-spec-kit/mcp_server/tests/memory-save-planner-first.vitest.ts", ".opencode/skills/system-spec-kit/mcp_server/tests/skill-graph-schema.vitest.ts", ".opencode/skills/system-spec-kit/mcp_server/tests/transcript-planner-export.vitest.ts", ".opencode/skills/system-spec-kit/references/intake-contract.md", ".opencode/skills/system-spec-kit/scripts/tests/manual-playbook-runner.ts", "AGENTS.md", "README.md"], "status": "complete"}
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/deep-research-state.jsonl:43:{"event": "iteration_complete", "iteration": 42, "timestamp": "2026-04-16T18:36:58Z", "dispatcher": "cli-copilot/gpt-5.4/high", "domain": "D4 Stringly Typed Governance", "findings_added": 3, "cumulative_findings": 116, "files_touched": [".opencode/commands/spec_kit/assets/spec_kit_plan_auto.yaml", ".opencode/commands/spec_kit/assets/spec_kit_plan_confirm.yaml", ".opencode/commands/spec_kit/plan.md", ".opencode/skills/skill-advisor/feature_catalog/04--testing/02-health-check.md", ".opencode/skills/skill-advisor/graph-metadata.json", ".opencode/skills/skill-advisor/scripts/skill_advisor.py", ".opencode/skills/skill-advisor/scripts/skill_advisor_runtime.py", ".opencode/skills/skill-advisor/tests/test_skill_advisor.py", ".opencode/skills/system-spec-kit/mcp_server/tests/transcript-planner-export.vitest.ts", ".opencode/skills/system-spec-kit/scripts/tests/manual-playbook-runner.ts"], "status": "complete"}
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/deep-research-state.jsonl:44:{"event": "iteration_complete", "iteration": 43, "timestamp": "2026-04-16T18:38:47Z", "dispatcher": "cli-copilot/gpt-5.4/high", "domain": "D4 Stringly Typed Governance", "findings_added": 2, "cumulative_findings": 118, "files_touched": [".opencode/commands/spec_kit/assets/spec_kit_plan_auto.yaml", ".opencode/commands/spec_kit/plan.md", ".opencode/skills/mcp-coco-index/graph-metadata.json", ".opencode/skills/skill-advisor/manual_testing_playbook/01--routing-accuracy/008-semantic-search-routing.md", ".opencode/skills/skill-advisor/scripts/skill_advisor.py", ".opencode/skills/skill-advisor/scripts/skill_advisor_runtime.py", ".opencode/skills/system-spec-kit/mcp_server/tests/memory-save-planner-first.vitest.ts", ".opencode/skills/system-spec-kit/mcp_server/tests/skill-graph-schema.vitest.ts", ".opencode/skills/system-spec-kit/mcp_server/tests/transcript-planner-export.vitest.ts"], "status": "complete"}
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/deep-research-state.jsonl:45:{"event": "iteration_complete", "iteration": 44, "timestamp": "2026-04-16T18:37:47Z", "dispatcher": "cli-copilot/gpt-5.4/high", "domain": "D4 Stringly Typed Governance", "findings_added": 3, "cumulative_findings": 121, "files_touched": [".opencode/commands/spec_kit/assets/spec_kit_plan_auto.yaml", ".opencode/commands/spec_kit/assets/spec_kit_plan_confirm.yaml", ".opencode/skills/sk-deep-research/SKILL.md", ".opencode/skills/skill-advisor/graph-metadata.json", ".opencode/skills/skill-advisor/scripts/skill_advisor.py", ".opencode/skills/skill-advisor/scripts/skill_advisor_runtime.py", ".opencode/skills/skill-advisor/scripts/skill_graph_compiler.py", ".opencode/skills/skill-advisor/tests/test_skill_advisor.py", ".opencode/skills/system-spec-kit/SKILL.md", ".opencode/skills/system-spec-kit/mcp_server/tests/transcript-planner-export.vitest.ts"], "status": "complete"}
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/deep-research-state.jsonl:46:{"event": "iteration_complete", "iteration": 45, "timestamp": "2026-04-16T18:50:11Z", "dispatcher": "cli-copilot/gpt-5.4/high", "domain": "D4 Stringly Typed Governance", "findings_added": 4, "cumulative_findings": 125, "files_touched": [".claude/skills/sk-deep-review/manual_testing_playbook/01--entry-points-and-modes/002-confirm-mode-checkpointed-review.md", ".opencode/commands/spec_kit/plan.md", ".opencode/skills/skill-advisor/scripts/skill_advisor.py", ".opencode/skills/skill-advisor/scripts/skill_graph_compiler.py", ".opencode/skills/skill-advisor/tests/test_skill_advisor.py", ".opencode/skills/system-spec-kit/manual_testing_playbook/manual_testing_playbook.md", ".opencode/skills/system-spec-kit/mcp_server/tests/memory-save-planner-first.vitest.ts", ".opencode/skills/system-spec-kit/scripts/tests/manual-playbook-runner.ts", ".opencode/specs/system-spec-kit/026-graph-and-context-optimization/009-playbook-and-remediation/002-full-playbook-execution/spec.md", "AGENTS.md"], "status": "complete"}
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/research/deep-research-state.jsonl:49:{"event": "iteration_complete", "iteration": 48, "timestamp": "2026-04-16T18:58:22Z", "dispatcher": "cli-copilot/gpt-5.4/high", "domain": "D4 Stringly Typed Governance", "findings_added": 2, "cumulative_findings": 132, "files_touched": [".opencode/commands/spec_kit/assets/spec_kit_complete_auto.yaml", ".opencode/commands/spec_kit/assets/spec_kit_plan_auto.yaml", ".opencode/commands/spec_kit/assets/spec_kit_plan_confirm.yaml", ".opencode/skills/skill-advisor/scripts/skill_advisor.py", ".opencode/skills/system-spec-kit/mcp_server/tests/memory-save-planner-first.vitest.ts", ".opencode/skills/system-spec-kit/mcp_server/tests/query-classifier.vitest.ts", ".opencode/skills/system-spec-kit/mcp_server/tests/query-router.vitest.ts", ".opencode/skills/system-spec-kit/mcp_server/tests/transcript-planner-export.vitest.ts", "AGENTS.md"], "status": "complete"}
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/000-release-cleanup/001-release-cleanup-playbooks/review/008-cleanup-and-audit-pt-01/v5/iterations/iteration-009.md:8:- **F014**: `/memory:save` and `/spec_kit:handover` still mix hard-coded `/tmp/save-context-data.json` examples with the normalized `${TMPDIR:-/tmp}` form, leaving stale temp-path guidance in the remediated doc slice. [SOURCE: .opencode/commands/memory/save.md:121] [SOURCE: .opencode/commands/memory/save.md:352] [SOURCE: .opencode/commands/memory/save.md:362] [SOURCE: .opencode/commands/spec_kit/handover.md:214] [SOURCE: .opencode/commands/spec_kit/handover.md:318]
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/006-skill-advisor/002-advisor-phrase-booster-tuning/research/iterations/iteration-002.md:27:| P0-CMD-003 | P0 | /memory:save this context | command-memory-save | - | save this context | command `command-memory-save` + explicit variant + phrase + single-token intent + multi-token + name + corpus | low | Fixture L11; explicit command bridge plus existing `save this context` PHRASE entry dominate. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/006-skill-advisor/005-advisor-setup-command/review/review-report.md:261:| Refresh continuity | `/memory:save` | Index this report so future search picks it up |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/006-skill-advisor/005-advisor-setup-command/review-followup/closure-report.md:148:| Refresh search support to index this report | `/memory:save .opencode/specs/.../005-advisor-setup-command/` |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/006-skill-advisor/004-advisor-hook-surface-integration/review-archive-r02-codex-copilot/deep-review-strategy.md:60:- 2 pre-existing non-020 test failures (transcript-planner-export, deep-loop/prompt-pack)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/006-skill-advisor/004-advisor-hook-surface-integration/implementation-summary.md:116:- `transcript-planner-export.vitest.ts`: missing fixture file in 026/015 scratch folder
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/006-skill-advisor/004-advisor-hook-surface-integration/implementation-summary.md:219:4. **Pre-existing non-020 test failures** (`transcript-planner-export.vitest.ts`, `deep-loop/prompt-pack.vitest.ts`) will need follow-up in their respective packets (015, deep-loop). Confirmed unrelated to Phase 020 via stash-test.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/006-skill-advisor/004-advisor-hook-surface-integration/review/deep-review-strategy.md:65:**Test baseline**: 8 focused files / 65 tests PASS (Phase 025 suite). Full suite has pre-existing legacy failures (transcript-planner-export, deep-loop/prompt-pack, context-server-error-envelope) — DO NOT re-flag as regressions.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/006-skill-advisor/004-advisor-hook-surface-integration/review/deep-review-strategy.md:72:- 2-3 pre-existing non-020 test failures (transcript-planner-export, deep-loop/prompt-pack)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/001-research-and-baseline/research/prompts/synthesis.md:99:## 15. Recommendations for the Downstream Planner
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/001-research-and-baseline/research/prompts/synthesis.md:100:[3-5 bullet recommendations for the next planner / implementer to pick up. Each starts with an imperative verb, names an artifact, and gives expected convergence gain.]
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/001-research-and-baseline/research/research.md:62:| P1 | 27 | Important corrections that change planner trust, sequencing, or evidence integrity but do not alone invalidate the packet. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/001-research-and-baseline/research/research.md:221:## 15. Recommendations for the Downstream Planner
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/006-skill-advisor/004-advisor-hook-surface-integration/review-archive-r01-copilot/deep-review-strategy.md:60:- 2 pre-existing non-020 test failures (transcript-planner-export, deep-loop/prompt-pack)

codex
The broad search is noisy, but it already points at the memory command and a likely packet under `.opencode/specs/system-spec-kit/...`. I’m narrowing on “planner-first” inside canonical spec docs now.
exec
/bin/zsh -lc "sed -n '1,220p' .opencode/commands/memory/save.md" in /Users/michelkerkmeester/MEGA/Development/Code_Environment/Public
 succeeded in 0ms:
---
description: Save current conversation context into canonical spec-doc continuity surfaces with semantic indexing
argument-hint: "<spec-folder>"
allowed-tools: Read, Edit, Bash, Task, spec_kit_memory_memory_save, spec_kit_memory_memory_index_scan, spec_kit_memory_memory_stats, spec_kit_memory_memory_update
---

# MANDATORY FIRST ACTION - SPEC FOLDER RESOLUTION

**BEFORE READING ANYTHING ELSE IN THIS FILE, resolve `target_folder`:**

```text
IF $ARGUMENTS contains a spec folder path:
    → Validate folder exists
    → Store as target_folder
    → Continue reading this file

IF $ARGUMENTS is empty, undefined, or contains only whitespace:
    → Run AUTO-DETECTION (Tier 1 → Tier 2 → Tier 3):

    TIER 1: Gate 3 Carry-Over (highest confidence - no confirmation needed)
    - Check if a spec folder was established via Gate 3 earlier in this conversation
    - If yes → use it directly as target_folder (per CLAUDE.md Memory Save Rule)
    - Announce: "Using active spec folder from this session: [folder]"

    TIER 2: Conversation Signal Analysis (high confidence - confirm)
    - Scan files modified/read during this conversation
    - Map file paths to spec folders:
      * Files under specs/NNN-name/ or its children
      * Files referenced in a spec folder's description.json
      * Supporting docs (feature_catalog, manual_testing_playbook) linked via symlinks to a spec tree
    - If ALL modified files map to a single spec folder (or one parent and its children):
      → Propose: "Based on this session's work, the target folder is [folder]. Saving there. [Y/n]"
      → If user confirms or does not object → store as target_folder
    - If modified files span multiple unrelated spec folders → proceed to Tier 3

    TIER 3: Guided Selection (fallback - must ask)
    - List the spec folders touched in this conversation, ranked by file-edit count
    - ASK: "Multiple spec folders were touched. Which one should this context be saved to?"
    - If no spec folders detected at all → list recent/related spec folders and ask
    - WAIT for user response → store as target_folder
```

**CRITICAL RULES:**
- Tier 1 (Gate 3 carry-over) proceeds without confirmation per CLAUDE.md Memory Save Rule
- Tier 2 proposals MUST show the detected folder and ask for brief confirmation
- Tier 3 MUST wait for explicit user response before proceeding
- When ambiguous (files in multiple unrelated spec folders), ALWAYS ask - do not guess

---

# /memory:save

> Save current conversation context into the packet's canonical continuity surfaces with semantic indexing.

---

## 1. INSTRUCTIONS

Resolve the target spec folder first, build structured JSON from the session evidence, then run the save workflow below. Prefer canonical packet docs and `_memory.continuity` over any legacy supporting artifacts.

---

## 2. PURPOSE

Save the current conversation context, including session summary, key decisions, modified files, and trigger phrases, into the packet's canonical continuity surfaces so `/spec_kit:resume` and `/memory:search` read the same source of truth.

**Key difference from `/memory:learn`:**
- `/memory:save` = Session context routed into canonical packet docs and `_memory.continuity`
- `/memory:learn` = Constitutional rules saved to `constitutional/` (always-surface tier)

### Canonical Routing Model

- `handover.md` remains the top recovery document for active-session state and pending work.
- `_memory.continuity` stores the compact continuity block used by `/spec_kit:resume`.
- AI may directly edit `_memory.continuity` frontmatter blocks in `implementation-summary.md` when only those doc-local continuity hints need updating.
- Canonical spec docs such as `implementation-summary.md` and `decision-record.md` receive the durable narrative content when the route applies.
- `generate-context.js` remains the primary save mechanism when the workflow also needs DB indexing, embedding generation, `description.json` refresh, `graph-metadata.json` refresh, or anchor-managed compatibility output.
- Canonical save requests now default to **planner-first** behavior: return the routed target, proposed edit summary, blockers, advisories, and follow-up actions before any mutation-first apply path is requested.
- Explicit fallback remains available with `plannerMode: "full-auto"` or CLI `--full-auto` when an operator wants the legacy atomic writer behavior.
- Standalone spec-doc markdown is not the primary operator-facing destination for this command.

### Handover Document Maintenance

`/memory:save` is the canonical maintainer for `handover.md` through `handover_state` routing. When a packet does not already contain `handover.md`, create it from `.opencode/skills/system-spec-kit/templates/handover.md`, then merge subsequent stop-state updates into `handover.md::session-log` while keeping `_memory.continuity` aligned for `/spec_kit:resume`.

### Routed Save Categories

The canonical save router works with 8 categories:

| Category | Typical target | Notes |
| -------- | -------------- | ----- |
| `narrative_progress` | `implementation-summary.md::what-built` | What changed in the system or packet |
| `narrative_delivery` | `implementation-summary.md::how-delivered` | Sequencing, gating, rollout, and verification story |
| `decision` | `decision-record.md::adr-NNN` on L3/L3+ or `implementation-summary.md::decisions` on L1/L2 | Choice, tradeoff, rationale |
| `handover_state` | `handover.md::session-log` | Stop-state, blockers, recent action, next safe action. Use `.opencode/skills/system-spec-kit/templates/handover.md` for initial creation when `handover.md` does not exist. |
| `research_finding` | `research/research.md::findings` | Evidence, investigation result, cited upstream behavior |
| `task_update` | `tasks.md::<phase-anchor>` | Checklist/task status mutation |
| `metadata_only` | `_memory.continuity` in frontmatter | Machine-owned continuity payloads |
| `drop` | `scratch/pending-route-<hash>.json` via refusal | Non-canonical transcript/tooling noise; never auto-merged |

Routing tiers:

- Tier 1 handles structured routes and strong heuristics.
- Tier 2 uses prototype similarity against the frozen routing library.
- Tier 3 is part of the live save handler by default. When `LLM_REFORMULATION_ENDPOINT` is reachable and returns a usable decision, it participates automatically; if that endpoint is unavailable or unusable, the save path falls back to Tier 2 with a confidence penalty when safe, otherwise it refuses the merge.

Boundary rules:

- Delivery cues are now stronger when the chunk mentions sequencing, gating, rollout, or verification.
- Handover keeps state-first stop/resume notes even if they mention soft operational commands like `git diff`, `list spec-doc records`, or `force re-index`.
- Hard transcript, telemetry, and wrapper scaffolding still route to `drop`.

Override and context rules:

- `routeAs` can force any of the 8 categories. The router preserves the natural decision for audit and warns if an override is accepted against a natural `drop`.
- Router context passes `packet_kind` derived from spec metadata first (`type`, `title`, `description`), with parent-phase fallback only when the metadata is silent.

---

## 3. CONTRACT

| Field   | Value                                                                                        |
| ------- | -------------------------------------------------------------------------------------------- |
| Input   | Spec folder path (from Gate 3 or `$ARGUMENTS`) + AI-composed JSON data                       |
| Output  | Canonical spec-doc continuity updates + indexed continuity data. Also refreshes `graph-metadata.json` derived fields in the spec folder: `trigger_phrases` are deduplicated and capped at 12, `key_files` are sanitized before storage, `entities` are deduplicated with canonical-path preference, and `status` is checklist-aware and normalized to lowercase. |
| Script  | `node .opencode/skills/system-spec-kit/scripts/dist/memory/generate-context.js`               |
| Primary | **JSON mode:** `generate-context.js <json-data-path>` (e.g. a path under `$TMPDIR` or `/tmp/save-context-data-<session-id>.json`) or `--json '<data>'` |
| Trigger | "save context", "save memory", `/memory:save`                                                |

Planner behavior:
- Default: `plan-only` for canonical save requests, with explicit follow-up actions such as `apply`, `refresh-graph`, and `reindex`
- Fallback: `full-auto` restores the legacy mutation-first canonical writer
- Deferred freshness actions: graph refresh and spec-doc reindex are surfaced as follow-ups instead of assumed default side effects

---

## 4. QUICK REFERENCE

| Usage                                                  | Behavior                                                |
| ------------------------------------------------------ | ------------------------------------------------------- |
| `/memory:save`                                         | Auto-detect the active packet, confirm if needed, then route into canonical continuity targets |
| `/memory:save 011-memory`                              | Save to a specific spec folder                          |
| `/memory:save specs/006-semantic-memory/003-debugging` | Save to a nested spec folder                            |
| `node .../generate-context.js --full-auto ...`         | Opt back into the legacy full-auto canonical apply path |

---

## 5. VALIDATION

### Pre-Flight Checks (Phase 0)

Execute BEFORE folder validation to prevent data quality issues. All checks must pass.

#### Check 1: Anchor Format Validation

- Scan conversation for existing canonical spec-doc references
- If any canonical spec documents (`decision-record.md`, `implementation-summary.md`, `handover.md`, `resource-map.md`) were read during the session, verify they contain BOTH opening AND closing ANCHOR tags
- Pattern: `<!-- ANCHOR:id --> ... <!-- /ANCHOR:id -->`
- If missing closing tags → WARN user before proceeding
- Why: Broken anchors break section-specific retrieval (93% token waste)

#### Check 2: Token Budget Validation

- Estimate conversation size: `message_count * avg_tokens_per_message`
- If estimated > 50,000 tokens:
  - WARN: "Large conversation detected"
  - OPTIONS: `[C]ontinue anyway | [S]plit save | [E]dit scope`
  - WAIT for response

#### Check 3: Spec Folder Existence

- If `$ARGUMENTS` contains folder → validate exists, store as `pending_folder`
- If `$ARGUMENTS` empty → defer to Phase 1

#### Check 4: Stop Hook Awareness

- Confirm whether recent hook-driven context preservation evidence exists for this session
- Current limitation: no dedicated `pendingStopSave` field is shipped in the hook state, so `/memory:save` must not claim a guaranteed auto-save merge marker
- If no recent hook-save evidence can be established: PASSED (proceed normally)

**Phase 0 Output:**
```text
anchor_validation: PASSED | WARNED
token_budget:      PASSED | SPLIT_REQUESTED
folder_existence:  PASSED
stop_hook_check:   PASSED
```

### Spec Folder Validation (Phase 1)

```text
IF target_folder already set (from $ARGUMENTS or Tier 1/2 auto-detection):
  → Validate folder exists → Proceed to Content Alignment Check
IF target_folder not yet set (Tier 3 pending):
  → WAIT for user response → Validate → Proceed
IF folder invalid:
  → Show available folders → ASK user → WAIT
```

**HARD STOP:** Do NOT proceed to save workflow until `target_folder` is set and validated.

#### Content Alignment Check

After Phase 1, validate the conversation topic matches the target folder:

- Extract conversation topic (subject, files modified, problem being solved)
- Compare to `target_folder` name
- If clear match → PASS
- If mismatch → WARN with alternatives:
  - Show: "Conversation topic: [topic]" / "Selected folder: [target_folder]"
  - Suggest top 3 alternative folders
  - ASK: `[C]ontinue | [1][2][3] alternatives | [N]ew folder`

---

## 6. WORKFLOW

### Step 1: Folder Detection

Use the `target_folder` value from Phase 1.

exec
/bin/zsh -lc "rg -n \"planner-first|planner first|memory-save-planner-first|plannerMode|plan-only\" .opencode/specs/system-spec-kit -S --glob 'spec.md' --glob 'plan.md' --glob 'tasks.md' --glob 'implementation-summary.md' --glob 'decision-record.md' --glob 'description.json'" in /Users/michelkerkmeester/MEGA/Development/Code_Environment/Public
 succeeded in 0ms:
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/spec.md:126:| `implemented` | Shipped substrate exists and should not be treated as missing prerequisite work. | Shared trust axes and readiness primitives, planner-first memory-save substrate, Codex hook injection, search-routing measurement scaffolding |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/005-memory-search-runtime-bugs/plan.md:153:| Sibling packet `004-memory-save-rewrite` (planner-first contract) | Internal | Green (complete) | None — already landed |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/005-memory-search-runtime-bugs/tasks.md:165:  - `../004-memory-save-rewrite/` — planner-first save contract
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/decision-record.md:3:description: "ADR ledger for the planner-first /memory:save contract: the trim-targeted verdict, planner-first default output, reconsolidation opt-in, enrichment deferral, router category contract, hard-blocker preservation, and the scoped content-router.ts exception."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/decision-record.md:6:  - "memory save planner first adr"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/decision-record.md:7:  - "planner-first save"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/decision-record.md:17:    recent_action: "Rewrote ADR ledger as cohesive planner-first decision sequence"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/decision-record.md:25:      fingerprint: "sha256:014-planner-first-adr-2026-04-15"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/decision-record.md:26:      session_id: "014-planner-first-adr-2026-04-15"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/decision-record.md:27:      parent_session_id: "014-planner-first-seed"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/decision-record.md:31:      - "All ADRs reframed under the planner-first delivery arc."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/decision-record.md:107:**We chose**: Make planner-first output the default `/memory:save` contract and preserve `full-auto` as explicit fallback.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:3:description: "Make /memory:save planner-first (non-mutating) by default while preserving full-auto as an explicit fallback, retire the legacy [spec]/memory/*.md write path, and decouple freshness (graph-metadata refresh, spec-doc reindex, enrichment) from the hot save path via explicit follow-up APIs."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:7:  - "memory save planner first"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:8:  - "planner-first memory save"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:23:    recent_action: "Folder renamed; spec rewritten under planner-first framing"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:37:      fingerprint: "sha256:014-planner-first-default-2026-04-15"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:38:      session_id: "014-planner-first-default-2026-04-15"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:39:      parent_session_id: "014-planner-first-default-closeout"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:45:      - "Implementation shipped planner-first default with explicit full-auto fallback; freshness work moved to explicit follow-up APIs."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:60:This packet delivers the end state implied by that analysis. `/memory:save` is planner-first by default: the handler computes the same route and legality data as before but stops short of mutation and returns structured planner output instead. `full-auto` is preserved as an explicit fallback via `SPECKIT_SAVE_PLANNER_MODE=full-auto`, with canonical atomic mutation, `POST_SAVE_FINGERPRINT` safety parity, same-path identity, and rollback intact. The legacy `[spec]/memory/*.md` write path is retired. Four previously default-on behaviors become explicit opt-in: `SPECKIT_ROUTER_TIER3_ENABLED`, `SPECKIT_QUALITY_AUTO_FIX`, `SPECKIT_RECONSOLIDATION_ENABLED`, `SPECKIT_POST_INSERT_ENRICHMENT_ENABLED`. Freshness becomes follow-up work via three new APIs: `refreshGraphMetadata`, `reindexSpecDocs`, `runEnrichmentBackfill`. `hybrid` is documented as reserved and currently behaves like `plan-only`. The content-router category contract is preserved with one honest, scoped exception: a Tier 3 default-disable and manual-review guard inside `content-router.ts`. 43 implementation tasks shipped under v3.4.1.0. A deep-review pass flagged 3 P0, 5 P1, and 1 P2 findings on router honesty, fallback safety parity, blocker classification, deferred-helper coverage, and changelog accuracy; all 9 were resolved before closeout.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:95:Ship a `/memory:save` contract that matches the evidence: planner-first by default so operators see the plan before anything changes, full-auto preserved as an explicit fallback for the cases that still need it, and freshness work moved to callable follow-up APIs so every save doesn't pay for work it doesn't need. Retire the legacy `[spec]/memory/*.md` write path end-to-end. Make four previously default-on behaviors opt-in via per-subsystem env flags, preserve `hybrid` as a reserved value, and record the scoped router exception honestly so docs match the code.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:105:- Make `/memory:save` planner-first by default: the default path computes route + legality data, returns structured planner output, does not mutate files.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:112:- Reserve `hybrid` as a valid value for `SPECKIT_SAVE_PLANNER_MODE` that currently behaves like `plan-only`; document it as reserved honestly.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:118:- Validate planner-first behavior against three real session transcripts before closeout.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:133:| Planner contract core | `memory-save.ts`, `types.ts`, `response-builder.ts`, `validation-responses.ts`, `generate-context.ts` | Modify | Introduce planner-first default + shared types + blocker/advisory separation |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:139:| Command docs | `../../../../command/memory/save.md`, `../../../../command/memory/manage.md` | Modify | Document planner-first default, fallback, and follow-up freshness actions |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:149:The packet carries packet-local snapshots of the audit report, research synthesis, deep-review report, and planner-first transcript prototypes so a reader can inspect the most important artifacts without leaving the folder. Those snapshots live under `research/013-audit-snapshot/`, `research/014-research-snapshot/`, `review/015-deep-review-snapshot/`, and `scratch/transcripts-snapshot/` inside this flattened `004-memory-save-rewrite` packet.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:161:| REQ-001 | The default `/memory:save` path must be planner-first and non-mutating. | Default invocation returns structured planner output (route, legality, blockers, advisories, follow-up actions) and mutates no files on disk. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:173:| REQ-013 | `hybrid` must be documented as reserved. | `SPECKIT_SAVE_PLANNER_MODE=hybrid` is recognized; current behavior matches `plan-only`; docs and env reference describe it as reserved for future behavior. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:174:| REQ-014 | Shipped documentation must match the runtime contract. | `/memory:save` docs, `ENV_REFERENCE.md`, release notes, and templates describe planner-first default, explicit fallback, follow-up APIs, reserved `hybrid`, and the scoped router exception honestly. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:184:| REQ-019 | `/spec_kit:resume` recovery ladder must stay intact. | Recovery ladder tests show no regression when the save path is planner-first. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:216:- **SC-009**: `hybrid` is recognized as reserved for `SPECKIT_SAVE_PLANNER_MODE`; documented as currently behaving like `plan-only`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:226:- **SC-019**: Three real session transcripts validate planner-first behavior with no wrong-anchor or unsafe-target outcomes.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:287:- **NFR-U02**: Operator docs must describe planner-first default, explicit fallback, and follow-up APIs in consistent language.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:313:- `SPECKIT_SAVE_PLANNER_MODE=hybrid` → behaves like `plan-only`; documented as reserved.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:318:- A reader assumes "planner-first" means `full-auto` was deleted → docs must be explicit that `full-auto` remains available as fallback.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:320:- A reader assumes `hybrid` is a live mixed-flow mode → docs must describe it as reserved with current `plan-only` behavior.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:384:1. Given `SPECKIT_SAVE_PLANNER_MODE=hybrid`, when the handler runs, then behavior matches `plan-only`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:385:2. Given I read `ENV_REFERENCE.md`, when I look up `hybrid`, then the doc describes it as reserved with current `plan-only` behavior.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:439:- [x] Implementation truth preserved: planner-first default + explicit fallback + follow-up APIs.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:458:| AI orchestrators | Session continuity readers | High | Need the planner-first contract documented end-to-end |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:466:- Shipped planner-first default for `/memory:save` with explicit `full-auto` fallback.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:470:- Documented `hybrid` as reserved with current `plan-only` behavior.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:500:**Then** they see `plan-only` as default, `full-auto` as explicit fallback, and `hybrid` as reserved.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:541:| Research | Could the save system be redesigned without replacing the core writer? | Yes. The research recommended a planner-first wrapper around the existing canonical prep and fallback writer. | `research/014-research-snapshot/research.md`, `research/014-research-snapshot/iterations/iteration-020.md` |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:551:| Release | What does `hybrid` mean after remediation? | It remains reserved and currently behaves like `plan-only`. | `review/015-deep-review-snapshot/review-report.md`, `../../../../changelog/01--system-spec-kit/v3.4.1.0.md` |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:3:description: "Milestoned delivery (M1-M10) for the planner-first /memory:save contract: audit + retirement of the legacy [spec]/memory/*.md write path, 20-iteration relevance research, planner contract + fallback implementation, routing/quality/reconsolidation/enrichment trim, follow-up API extraction, verification, release alignment, and deep-review remediation."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:6:  - "memory save planner first"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:7:  - "planner-first memory save plan"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:9:  - "retirement audit to planner-first"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:17:    recent_action: "Folder renamed; plan rewritten as M1-M10 planner-first delivery"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:28:      fingerprint: "sha256:014-planner-first-plan-2026-04-15"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:29:      session_id: "014-planner-first-plan-2026-04-15"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:30:      parent_session_id: "014-planner-first-seed"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:34:      - "The planner-first default + explicit fallback architecture preserves the canonical writer while eliminating the default-path overreach."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:60:The plan delivers a planner-first default for `/memory:save` while preserving the canonical atomic writer as an explicit fallback. It retires the legacy `[spec]/memory/*.md` write path end-to-end, gates four previously default-on save-path behaviors behind explicit env flags, and extracts freshness into three explicit follow-up APIs. Delivery runs through 10 sequential milestones: audit surface + classification, retirement cutover, relevance research, planner contract build-out, routing + quality trim, verification + transcript prototypes, release alignment, and deep-review remediation.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:92:- [x] Packet canonical docs exist and agree on the planner-first contract.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:132:    |-- default or plan-only or hybrid(reserved) -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:193:After the retirement cutover, open relevance research with Q1-Q10 covering load-bearing core, planner-first feasibility, quality-check classification, reindex vs freshness, graph-metadata refresh, entity extraction, reconsolidation cost, router classifier overfitting, trigger harmonization, and continuity ownership. Evidence: `research/014-research-snapshot/primary-docs/spec.md`, `research/014-research-snapshot/deep-research-strategy.md`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:201:Build the planner-first default, CLI defaults, docs, and type surfaces:
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:204:- [x] T006-T008 Make `generate-context.ts` request planner-first behavior by default; update `/memory:save` docs; make `memory-save.ts` return planner output by default with explicit fallback.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:205:- [x] T009-T012 Update aggregate and handler tests for planner-default behavior; focused planner-first regression coverage.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:218:Prove the planner-first model holds up against real session evidence:
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:221:- [x] T038 Prototype planner-first behavior against three real session transcripts. Evidence: `scratch/transcripts-snapshot/`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:237:- **F005 [P2]**: `hybrid` assumed live → resolved by marking reserved and documenting `plan-only`-equivalent behavior.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:329:Because the canonical atomic writer is preserved, rollback means reverting the planner-first wrapper + env-flag gates + follow-up API exports. Fallback behavior continues to work with full atomic semantics intact.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:469:4. **Ship the planner-first default + full-auto fallback** — critical because it is the operator-facing contract.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:6:  - "memory save planner first"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:7:  - "planner-first tasks"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:19:    recent_action: "Rewrote task ledger as cohesive planner-first delivery sequence"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:28:      fingerprint: "sha256:014-planner-first-tasks-2026-04-15"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:29:      session_id: "014-planner-first-tasks-2026-04-15"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:30:      parent_session_id: "014-planner-first-seed"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:95:- [x] **P014-Q2** Resolve whether planner-first `/memory:save` can replace default-path automation. Evidence: `research/014-research-snapshot/findings-registry.json`, `research/014-research-snapshot/research.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:153:- [x] **P015-T006** Make `generate-context.ts` request planner-first behavior by default. Evidence: `review/015-deep-review-snapshot/primary-docs/tasks.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:154:- [x] **P015-T007** Update `/memory:save` docs for planner-first default and fallback. Evidence: `review/015-deep-review-snapshot/primary-docs/tasks.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:159:- [x] **P015-T012** Create focused planner-first regression coverage. Evidence: `review/015-deep-review-snapshot/primary-docs/tasks.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:185:- [x] **P015-T038** Prototype planner-first behavior against three real session transcripts. Evidence: `review/015-deep-review-snapshot/primary-docs/tasks.md`, `scratch/transcripts-snapshot/`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:208:- [x] **P015-R005** Mark `hybrid` as reserved and document that it still behaves like `plan-only`. Evidence: `review/015-deep-review-snapshot/review-report.md`, `../../../../changelog/01--system-spec-kit/v3.4.1.0.md`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/tasks.md:240:- [x] Three real session transcripts prototype planner-first behavior without unexpected drops or wrong-anchor outcomes
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-mcp-runtime-stress-remediation/001-search-intelligence-stress-playbook/001-search-scenario-design/spec.md:136:- **Prompt**: `Find the spec for the /memory:save planner-first contract.`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-mcp-runtime-stress-remediation/001-search-intelligence-stress-playbook/001-search-scenario-design/spec.md:138:- **Target tools**: `memory_search`, `memory_match_triggers` (trigger phrase "planner-first" should hit)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-mcp-runtime-stress-remediation/001-search-intelligence-stress-playbook/001-search-scenario-design/spec.md:179:- **Expected outcome**: Routes to `/memory:save` with planner-first default; returns structured planner output (no file mutation per 004)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-mcp-runtime-stress-remediation/001-search-intelligence-stress-playbook/001-search-scenario-design/spec.md:181:- **Success indicators**: Recognizes save intent; uses planner-first contract; no surprise mutations
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-mcp-runtime-stress-remediation/001-search-intelligence-stress-playbook/001-search-scenario-design/spec.md:182:- **Cross-ref**: 003/004 (planner-first contract)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/spec.md:71:2. `scripts/core/workflow.ts:1333` gates `refreshGraphMetadata` on `plannerMode === 'full-auto'`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/spec.md:72:3. `scripts/memory/generate-context.ts:415` defaults to `plannerMode = 'plan-only'`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/spec.md:107:- Cluster B extensions: T-W1-CNS-04 (plan-only default flip), T-W1-CNS-05 (continuity-freshness validator)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/spec.md:152:- **FC-1**: Every `/memory:save` invocation (any `plannerMode`) writes `description.json.lastUpdated` and refreshes `graph-metadata.json.derived.*` on the target spec folder.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/description.json:4:    "memory save planner-first default",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/description.json:5:    "planner-first save contract",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/description.json:39:    "planner-first",
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/plan.md:150:3. Lift the `plannerMode === 'full-auto'` gate at workflow.ts:1333 — `refreshGraphMetadata` now runs on every canonical save regardless of plannerMode.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:3:description: "Packet closeout for the /memory:save planner-first default: audit + retirement, relevance research, planner + trim implementation, transcript-grounded verification, and deep-review remediation all documented in one surface."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:7:  - "memory save planner first closeout"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:8:  - "planner-first save closeout"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:9:  - "save flow planner first delivery"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:17:    recent_action: "Folder renamed; impl-summary rewritten under planner-first framing"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:26:      fingerprint: "sha256:014-planner-first-closeout-2026-04-15"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:27:      session_id: "014-planner-first-closeout-2026-04-15"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:28:      parent_session_id: "014-planner-first-seed"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:32:      - "Packet is complete; shipped contract is planner-first default with explicit full-auto fallback."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:58:`/memory:save` is planner-first by default. Invoking it now returns a structured planner response — routes, legality blockers, advisories, follow-up actions — and mutates no files on disk. Operators who still need automatic mutation can opt in by setting `SPECKIT_SAVE_PLANNER_MODE=full-auto`, which runs the canonical atomic writer with `POST_SAVE_FINGERPRINT` safety parity, same-path identity, promotion, and rollback intact. `hybrid` is reserved and currently behaves like `plan-only`. The legacy `[spec]/memory/*.md` write path is retired runtime-wide. Four previously default-on save-path behaviors are now explicit opt-in: Tier 3 routing (`SPECKIT_ROUTER_TIER3_ENABLED`), quality-loop auto-fix (`SPECKIT_QUALITY_AUTO_FIX`), reconsolidation-on-save (`SPECKIT_RECONSOLIDATION_ENABLED`), and post-insert enrichment (`SPECKIT_POST_INSERT_ENRICHMENT_ENABLED`). Freshness is callable via three new follow-up APIs: `refreshGraphMetadata`, `reindexSpecDocs`, `runEnrichmentBackfill`. Docs, env reference, and release notes all agree on the same default/opt-in/reserved/fallback vocabulary.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:66:20 iterations of research resolved Q1 through Q10 and classified the 15 remaining subsystems. Four stayed load-bearing (canonical atomic writer, routed record identity, content-router core, thin continuity validation). Four became trim targets (Tier 3 routing, reconsolidation-on-save, heavy quality-loop auto-fix, post-insert enrichment). Seven were deferred or follow-up. The synthesis produced the `trim-targeted` top-line recommendation that made planner-first the right shape for the default contract.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:70:43 of 43 tasks completed under v3.4.1.0. The planner-first contract + flag plumbing (M1) landed before the trim work (M2-M4) so the schema was stable by the time routing, quality, reconsolidation, and enrichment moved behind env gates. Follow-up APIs (`refreshGraphMetadata`, `reindexSpecDocs`, `runEnrichmentBackfill`) expose freshness as callable work instead of baked-in side effects. Targeted tests covered planner-default behavior, fallback parity, router deterministic default, quality advisory output, structural blocker preservation, reconsolidation opt-in, enrichment deferral, continuity upsert parity, planner UX readability, CLI target authority, and end-to-end integration. Three real session transcripts exercised planner-first behavior before closeout.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:82:| F005 | P2 | `hybrid` assumed live | FIXED — marked reserved with `plan-only`-equivalent behavior |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:133:| Preserve research as the decision bridge | The planner-first design only makes sense with the trim-targeted verdict in view |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:134:| Ship planner-first default + explicit full-auto fallback | Non-mutating default is reviewable; full-auto remains available for automation that depends on it |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:153:| Implementation carry-over | PASS — packet preserves planner-first default, explicit fallback, follow-up APIs, and 43 completed tasks |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:168:1. **`hybrid` is reserved**. `SPECKIT_SAVE_PLANNER_MODE=hybrid` is accepted and currently behaves like `plan-only`. A future packet may define mixed-flow behavior; `hybrid` stays reserved until then.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/implementation-summary.md:65:- **`004-memory-save-rewrite/`**: `/memory:save` is planner-first by default. Invoking it now returns a structured planner response — routes, legality blockers, advisories, follow-up actions — and mutates no files on disk. Operators who still need automatic mutation can opt in by setting `S...
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/011-mcp-runtime-stress-remediation/001-search-intelligence-stress-playbook/001-search-scenario-design/implementation-summary.md:63:| I1 | Intelligence | Simple | 003/004 (planner-first) |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/tasks.md:70:### T-W1-CNS-04 — [x] Lift plan-only gate on refreshGraphMetadata [EVIDENCE: aaf0f49a8]
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/tasks.md:77:1. Remove `plannerMode === 'full-auto'` gate at workflow.ts:1333.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/tasks.md:78:2. `refreshGraphMetadata` runs on every canonical save regardless of plannerMode.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/tasks.md:83:- Verified: Manual test: plan-only mode (default) now refreshes metadata [EVIDENCE: aaf0f49a8]
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/tasks.md:84:- Verified: Vitest covers both plan-only and full-auto modes [EVIDENCE: aaf0f49a8]
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/implementation-summary.md:81:**Primitive 1 — Canonical save writes metadata.** `scripts/core/workflow.ts:1259` no longer hardcodes `ctxFileWritten = false`. The 70-LOC description.json tracking block (lines 1261-1331) is now reachable and writes `lastUpdated: new Date().toISOString()` on every canonical save. `workflow.ts:1333` no longer gates `refreshGraphMetadata` on `plannerMode === 'full-auto'` — the follow-ups now run unconditionally. Net effect: every `/memory:save` invocation refreshes `description.json.lastUpdated` + `graph-metadata.json.derived.*`. Atomic-shipped in commit `aaf0f49a8` (T-CNS-01 + T-W1-CNS-04).
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/implementation-summary.md:312:**H-56-1 confirmed (segment-2):** Default `/memory:save` was structural metadata-freshness no-op: `workflow.ts:1259 const ctxFileWritten = false` dead code + `workflow.ts:1333 plannerMode === 'full-auto'` gate with default `'plan-only'`. Fix shipped in `002-infrastructure-primitives`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/004-runtime-executor-hardening/001-foundational-runtime/implementation-summary.md:322:**T-CNS-01 + T-W1-CNS-04 (H-56-1 fix, commit `aaf0f49a8`):** `workflow.ts:1259` — `const ctxFileWritten = false` replaced with `true`. `workflow.ts:1333` — `shouldRunExplicitSaveFollowUps = options.plannerMode === 'full-auto'` changed to `true` (unconditional). 38-folder `lastUpdated` cascade proven as side-effect. Test: `workflow-canonical-save-metadata.vitest.ts` (4/4 + 1 skipped).

exec
/bin/zsh -lc 'rg -n "ANCHOR|REQ-001|planner-first|# " .opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md .opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md .opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md' in /Users/michelkerkmeester/MEGA/Development/Code_Environment/Public
 succeeded in 0ms:
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:3:description: "Packet closeout for the /memory:save planner-first default: audit + retirement, relevance research, planner + trim implementation, transcript-grounded verification, and deep-review remediation all documented in one surface."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:8:  - "planner-first save closeout"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:17:    recent_action: "Folder renamed; impl-summary rewritten under planner-first framing"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:26:      fingerprint: "sha256:014-planner-first-closeout-2026-04-15"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:27:      session_id: "014-planner-first-closeout-2026-04-15"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:28:      parent_session_id: "014-planner-first-seed"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:32:      - "Packet is complete; shipped contract is planner-first default with explicit full-auto fallback."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:35:# Implementation Summary
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:42:<!-- ANCHOR:metadata -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:43:## Metadata
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:54:<!-- /ANCHOR:metadata -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:55:<!-- ANCHOR:what-built -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:56:## What Was Built
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:58:`/memory:save` is planner-first by default. Invoking it now returns a structured planner response — routes, legality blockers, advisories, follow-up actions — and mutates no files on disk. Operators who still need automatic mutation can opt in by setting `SPECKIT_SAVE_PLANNER_MODE=full-auto`, which runs the canonical atomic writer with `POST_SAVE_FINGERPRINT` safety parity, same-path identity, promotion, and rollback intact. `hybrid` is reserved and currently behaves like `plan-only`. The legacy `[spec]/memory/*.md` write path is retired runtime-wide. Four previously default-on save-path behaviors are now explicit opt-in: Tier 3 routing (`SPECKIT_ROUTER_TIER3_ENABLED`), quality-loop auto-fix (`SPECKIT_QUALITY_AUTO_FIX`), reconsolidation-on-save (`SPECKIT_RECONSOLIDATION_ENABLED`), and post-insert enrichment (`SPECKIT_POST_INSERT_ENRICHMENT_ENABLED`). Freshness is callable via three new follow-up APIs: `refreshGraphMetadata`, `reindexSpecDocs`, `runEnrichmentBackfill`. Docs, env reference, and release notes all agree on the same default/opt-in/reserved/fallback vocabulary.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:60:### Audit and Retirement
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:64:### Relevance Research as the Decision Bridge
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:66:20 iterations of research resolved Q1 through Q10 and classified the 15 remaining subsystems. Four stayed load-bearing (canonical atomic writer, routed record identity, content-router core, thin continuity validation). Four became trim targets (Tier 3 routing, reconsolidation-on-save, heavy quality-loop auto-fix, post-insert enrichment). Seven were deferred or follow-up. The synthesis produced the `trim-targeted` top-line recommendation that made planner-first the right shape for the default contract.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:68:### Shipped Implementation
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:70:43 of 43 tasks completed under v3.4.1.0. The planner-first contract + flag plumbing (M1) landed before the trim work (M2-M4) so the schema was stable by the time routing, quality, reconsolidation, and enrichment moved behind env gates. Follow-up APIs (`refreshGraphMetadata`, `reindexSpecDocs`, `runEnrichmentBackfill`) expose freshness as callable work instead of baked-in side effects. Targeted tests covered planner-default behavior, fallback parity, router deterministic default, quality advisory output, structural blocker preservation, reconsolidation opt-in, enrichment deferral, continuity upsert parity, planner UX readability, CLI target authority, and end-to-end integration. Three real session transcripts exercised planner-first behavior before closeout.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:72:### Deep-Review Remediation
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:90:### Snapshot Evidence Inside the Packet
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:102:<!-- /ANCHOR:what-built -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:103:<!-- ANCHOR:how-delivered -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:104:## How It Was Delivered
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:108:### Runtime Split
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:116:### Historical Validation Story
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:120:### Why the Runtime Split Matters
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:126:<!-- /ANCHOR:how-delivered -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:127:<!-- ANCHOR:decisions -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:128:## Key Decisions
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:133:| Preserve research as the decision bridge | The planner-first design only makes sense with the trim-targeted verdict in view |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:134:| Ship planner-first default + explicit full-auto fallback | Non-mutating default is reviewable; full-auto remains available for automation that depends on it |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:145:<!-- /ANCHOR:decisions -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:146:<!-- ANCHOR:verification -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:147:## Verification
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:153:| Implementation carry-over | PASS — packet preserves planner-first default, explicit fallback, follow-up APIs, and 43 completed tasks |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:164:<!-- /ANCHOR:verification -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:165:<!-- ANCHOR:limitations -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:166:## Known Limitations
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:172:<!-- /ANCHOR:limitations -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:3:description: "Milestoned delivery (M1-M10) for the planner-first /memory:save contract: audit + retirement of the legacy [spec]/memory/*.md write path, 20-iteration relevance research, planner contract + fallback implementation, routing/quality/reconsolidation/enrichment trim, follow-up API extraction, verification, release alignment, and deep-review remediation."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:7:  - "planner-first memory save plan"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:9:  - "retirement audit to planner-first"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:17:    recent_action: "Folder renamed; plan rewritten as M1-M10 planner-first delivery"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:28:      fingerprint: "sha256:014-planner-first-plan-2026-04-15"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:29:      session_id: "014-planner-first-plan-2026-04-15"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:30:      parent_session_id: "014-planner-first-seed"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:34:      - "The planner-first default + explicit fallback architecture preserves the canonical writer while eliminating the default-path overreach."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:38:# Implementation Plan: /memory:save Planner-First Default
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:45:<!-- ANCHOR:summary -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:46:## 1. SUMMARY
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:48:### Technical Context
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:58:### Overview
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:60:The plan delivers a planner-first default for `/memory:save` while preserving the canonical atomic writer as an explicit fallback. It retires the legacy `[spec]/memory/*.md` write path end-to-end, gates four previously default-on save-path behaviors behind explicit env flags, and extracts freshness into three explicit follow-up APIs. Delivery runs through 10 sequential milestones: audit surface + classification, retirement cutover, relevance research, planner contract build-out, routing + quality trim, verification + transcript prototypes, release alignment, and deep-review remediation.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:62:### Full Delivery Summary
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:79:<!-- /ANCHOR:summary -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:80:<!-- ANCHOR:quality-gates -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:81:## 2. QUALITY GATES
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:83:### Definition of Ready
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:90:### Definition of Done
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:92:- [x] Packet canonical docs exist and agree on the planner-first contract.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:105:<!-- /ANCHOR:quality-gates -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:106:<!-- ANCHOR:architecture -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:107:## 3. ARCHITECTURE
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:109:### Pattern
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:113:### Key Components
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:124:### Data Flow
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:144:### File-Level Change Map
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:148:### Runtime Surface Summary
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:160:<!-- /ANCHOR:architecture -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:161:<!-- ANCHOR:phases -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:162:## 4. IMPLEMENTATION PHASES
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:164:### Milestone Flow
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:179:### M1 — Audit kickoff
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:183:### M2 — Audit convergence
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:187:### M3 — Retirement closure
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:191:### M4 — Research kickoff
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:193:After the retirement cutover, open relevance research with Q1-Q10 covering load-bearing core, planner-first feasibility, quality-check classification, reindex vs freshness, graph-metadata refresh, entity extraction, reconsolidation cost, router classifier overfitting, trigger harmonization, and continuity ownership. Evidence: `research/014-research-snapshot/primary-docs/spec.md`, `research/014-research-snapshot/deep-research-strategy.md`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:195:### M5 — Research convergence
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:199:### M6 — Planner contract
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:201:Build the planner-first default, CLI defaults, docs, and type surfaces:
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:204:- [x] T006-T008 Make `generate-context.ts` request planner-first behavior by default; update `/memory:save` docs; make `memory-save.ts` return planner output by default with explicit fallback.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:205:- [x] T009-T012 Update aggregate and handler tests for planner-default behavior; focused planner-first regression coverage.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:207:### M7 — Routing and quality trim
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:216:### M8 — Verification and transcripts
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:218:Prove the planner-first model holds up against real session evidence:
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:221:- [x] T038 Prototype planner-first behavior against three real session transcripts. Evidence: `scratch/transcripts-snapshot/`.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:225:### M9 — Release alignment
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:229:### M10 — Deep-review remediation
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:245:<!-- /ANCHOR:phases -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:246:<!-- ANCHOR:testing -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:247:## 5. TESTING STRATEGY
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:259:### Audit Approach (M1-M3)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:266:### Research Approach (M4-M5)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:273:### Implementation Approach (M6-M8)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:280:### Remediation Approach (M10)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:288:<!-- /ANCHOR:testing -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:289:<!-- ANCHOR:dependencies -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:290:## 6. DEPENDENCIES
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:308:<!-- /ANCHOR:dependencies -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:309:<!-- ANCHOR:rollback -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:310:## 7. ROLLBACK PLAN
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:316:### Per-Milestone Rollback
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:327:### Consolidated Rollback Note
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:329:Because the canonical atomic writer is preserved, rollback means reverting the planner-first wrapper + env-flag gates + follow-up API exports. Fallback behavior continues to work with full atomic semantics intact.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:333:<!-- /ANCHOR:rollback -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:334:## L2: PHASE DEPENDENCIES
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:364:## L2: EFFORT ESTIMATION
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:377:### Historical Effort Context
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:387:## L2: ENHANCED ROLLBACK
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:389:### Pre-release Checks
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:397:### Rollback Procedure
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:404:### Data Reversal
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:411:## L3: DEPENDENCY GRAPH
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:449:### Dependency Matrix
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:464:## L3: CRITICAL PATH
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:469:4. **Ship the planner-first default + full-auto fallback** — critical because it is the operator-facing contract.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:479:## L3: MILESTONES
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:496:### Architecture Decision Record Summary
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:510:## L3+: AI EXECUTION FRAMEWORK
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:512:### Pre-Task Checklist
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:518:### Task Execution Rules
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:526:### Status Reporting Format
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:530:### Blocked Task Protocol
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:534:### Tier 1: Runtime Core
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:545:### Tier 2: Docs + Release
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:553:### Tier 3: Validation
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:567:## L3+: WORKSTREAM COORDINATION
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:578:### Sync Points
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:590:## L3+: COMMUNICATION PLAN
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:592:### Checkpoints
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:602:### Escalation Path
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:608:### Governance Notes
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:616:### Governance and Compliance Notes
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:618:### Governance Sign-Off Targets
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/plan.md:627:### Compliance Notes
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:3:description: "Make /memory:save planner-first (non-mutating) by default while preserving full-auto as an explicit fallback, retire the legacy [spec]/memory/*.md write path, and decouple freshness (graph-metadata refresh, spec-doc reindex, enrichment) from the hot save path via explicit follow-up APIs."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:8:  - "planner-first memory save"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:23:    recent_action: "Folder renamed; spec rewritten under planner-first framing"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:37:      fingerprint: "sha256:014-planner-first-default-2026-04-15"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:38:      session_id: "014-planner-first-default-2026-04-15"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:39:      parent_session_id: "014-planner-first-default-closeout"
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:45:      - "Implementation shipped planner-first default with explicit full-auto fallback; freshness work moved to explicit follow-up APIs."
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:49:# Feature Specification: /memory:save Planner-First Default
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:56:## EXECUTIVE SUMMARY
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:60:This packet delivers the end state implied by that analysis. `/memory:save` is planner-first by default: the handler computes the same route and legality data as before but stops short of mutation and returns structured planner output instead. `full-auto` is preserved as an explicit fallback via `SPECKIT_SAVE_PLANNER_MODE=full-auto`, with canonical atomic mutation, `POST_SAVE_FINGERPRINT` safety parity, same-path identity, and rollback intact. The legacy `[spec]/memory/*.md` write path is retired. Four previously default-on behaviors become explicit opt-in: `SPECKIT_ROUTER_TIER3_ENABLED`, `SPECKIT_QUALITY_AUTO_FIX`, `SPECKIT_RECONSOLIDATION_ENABLED`, `SPECKIT_POST_INSERT_ENRICHMENT_ENABLED`. Freshness becomes follow-up work via three new APIs: `refreshGraphMetadata`, `reindexSpecDocs`, `runEnrichmentBackfill`. `hybrid` is documented as reserved and currently behaves like `plan-only`. The content-router category contract is preserved with one honest, scoped exception: a Tier 3 default-disable and manual-review guard inside `content-router.ts`. 43 implementation tasks shipped under v3.4.1.0. A deep-review pass flagged 3 P0, 5 P1, and 1 P2 findings on router honesty, fallback safety parity, blocker classification, deferred-helper coverage, and changelog accuracy; all 9 were resolved before closeout.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:64:<!-- ANCHOR:metadata -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:65:## 1. METADATA
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:85:<!-- /ANCHOR:metadata -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:86:<!-- ANCHOR:problem -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:87:## 2. PROBLEM & PURPOSE
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:89:### Problem Statement
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:93:### Purpose
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:95:Ship a `/memory:save` contract that matches the evidence: planner-first by default so operators see the plan before anything changes, full-auto preserved as an explicit fallback for the cases that still need it, and freshness work moved to callable follow-up APIs so every save doesn't pay for work it doesn't need. Retire the legacy `[spec]/memory/*.md` write path end-to-end. Make four previously default-on behaviors opt-in via per-subsystem env flags, preserve `hybrid` as a reserved value, and record the scoped router exception honestly so docs match the code.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:99:<!-- /ANCHOR:problem -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:100:<!-- ANCHOR:scope -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:101:## 3. SCOPE
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:103:### In Scope
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:105:- Make `/memory:save` planner-first by default: the default path computes route + legality data, returns structured planner output, does not mutate files.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:118:- Validate planner-first behavior against three real session transcripts before closeout.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:120:### Out of Scope
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:128:### Files to Change
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:133:| Planner contract core | `memory-save.ts`, `types.ts`, `response-builder.ts`, `validation-responses.ts`, `generate-context.ts` | Modify | Introduce planner-first default + shared types + blocker/advisory separation |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:139:| Command docs | `../../../../command/memory/save.md`, `../../../../command/memory/manage.md` | Modify | Document planner-first default, fallback, and follow-up freshness actions |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:147:### Research and Review Evidence
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:149:The packet carries packet-local snapshots of the audit report, research synthesis, deep-review report, and planner-first transcript prototypes so a reader can inspect the most important artifacts without leaving the folder. Those snapshots live under `research/013-audit-snapshot/`, `research/014-research-snapshot/`, `review/015-deep-review-snapshot/`, and `scratch/transcripts-snapshot/` inside this flattened `004-memory-save-rewrite` packet.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:153:<!-- /ANCHOR:scope -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:154:<!-- ANCHOR:requirements -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:155:## 4. REQUIREMENTS
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:157:### P0 — Blockers
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:161:| REQ-001 | The default `/memory:save` path must be planner-first and non-mutating. | Default invocation returns structured planner output (route, legality, blockers, advisories, follow-up actions) and mutates no files on disk. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:174:| REQ-014 | Shipped documentation must match the runtime contract. | `/memory:save` docs, `ENV_REFERENCE.md`, release notes, and templates describe planner-first default, explicit fallback, follow-up APIs, reserved `hybrid`, and the scoped router exception honestly. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:177:### P1 — Required
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:184:| REQ-019 | `/spec_kit:resume` recovery ladder must stay intact. | Recovery ladder tests show no regression when the save path is planner-first. |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:192:### P2 — Nice to Have
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:204:<!-- /ANCHOR:requirements -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:205:<!-- ANCHOR:success-criteria -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:206:## 5. SUCCESS CRITERIA
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:226:- **SC-019**: Three real session transcripts validate planner-first behavior with no wrong-anchor or unsafe-target outcomes.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:230:<!-- /ANCHOR:success-criteria -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:231:<!-- ANCHOR:risks -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:232:## 6. RISKS & DEPENDENCIES
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:252:## 7. NON-FUNCTIONAL REQUIREMENTS
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:254:### Correctness
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:260:### Safety
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:266:### Traceability
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:272:### Maintainability
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:278:### Governance
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:284:### Usability
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:287:- **NFR-U02**: Operator docs must describe planner-first default, explicit fallback, and follow-up APIs in consistent language.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:290:### Reliability
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:296:### Transcript Snapshot Hygiene
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:303:## 8. EDGE CASES
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:305:### Runtime Edge Cases
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:316:### Documentation Edge Cases
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:318:- A reader assumes "planner-first" means `full-auto` was deleted → docs must be explicit that `full-auto` remains available as fallback.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:325:## 9. COMPLEXITY ASSESSMENT
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:338:## 10. RISK MATRIX
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:353:## 11. USER STORIES
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:355:### US-001: Planner-first default
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:363:### US-002: Full-auto fallback
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:371:### US-003: Explicit freshness follow-up
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:379:### US-004: Reserved `hybrid`
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:387:### US-005: Honest router scope
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:395:### US-006: Blocker classification
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:403:### US-007: Deferred status honesty
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:413:## 12. APPROVAL WORKFLOW
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:426:## 13. COMPLIANCE CHECKPOINTS
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:428:### Documentation Governance
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:435:### Accuracy Governance
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:439:- [x] Implementation truth preserved: planner-first default + explicit fallback + follow-up APIs.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:442:### Tooling Governance
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:450:## 14. STAKEHOLDER MATRIX
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:458:| AI orchestrators | Session continuity readers | High | Need the planner-first contract documented end-to-end |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:462:## 15. CHANGE LOG
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:464:### v1.0 (2026-04-15)
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:466:- Shipped planner-first default for `/memory:save` with explicit `full-auto` fallback.
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:476:### Acceptance Scenarios
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:478:### Scenario 1: Planner-first default is the shipped contract
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:484:### Scenario 2: Full-auto fallback remains available
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:490:### Scenario 3: Deferred enrichment is not removal
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:496:### Scenario 4: `SPECKIT_SAVE_PLANNER_MODE` is the primary planner flag
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:502:### Scenario 5: `SPECKIT_ROUTER_TIER3_ENABLED` stays opt-in
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:508:### Scenario 6: `SPECKIT_QUALITY_AUTO_FIX` stays opt-in
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:514:### Scenario 7: `SPECKIT_RECONSOLIDATION_ENABLED` stays opt-in
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:520:### Scenario 8: `SPECKIT_POST_INSERT_ENRICHMENT_ENABLED` stays opt-in
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:528:<!-- /ANCHOR:risks -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:529:<!-- ANCHOR:questions -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:530:### Questions
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:541:| Research | Could the save system be redesigned without replacing the core writer? | Yes. The research recommended a planner-first wrapper around the existing canonical prep and fallback writer. | `research/014-research-snapshot/research.md`, `research/014-research-snapshot/iterations/iteration-020.md` |
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:555:## 16. OPEN QUESTIONS
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:561:<!-- /ANCHOR:questions -->
.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:562:## RELATED DOCUMENTS

exec
/bin/zsh -lc "sed -n '1,190p' .opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md" in /Users/michelkerkmeester/MEGA/Development/Code_Environment/Public
 succeeded in 0ms:
---
title: "Feature [system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec]"
description: "Make /memory:save planner-first (non-mutating) by default while preserving full-auto as an explicit fallback, retire the legacy [spec]/memory/*.md write path, and decouple freshness (graph-metadata refresh, spec-doc reindex, enrichment) from the hot save path via explicit follow-up APIs."
trigger_phrases:
  - "004-memory-save-rewrite"
  - "014-memory-save-rewrite"
  - "memory save planner first"
  - "planner-first memory save"
  - "full-auto fallback"
  - "speckit_save_planner_mode"
  - "memory folder retirement"
  - "content-router scoped exception"
  - "refreshgraphmetadata reindexspecdocs runenrichmentbackfill"
  - "v3.4.1.0 save flow"
  - "026-graph-and-context-optimization"
importance_tier: "important"
contextType: "implementation"
_memory:
  continuity:
    packet_pointer: "system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite"
    last_updated_at: "2026-04-15T10:00:01Z"
    last_updated_by: "cli-copilot"
    recent_action: "Folder renamed; spec rewritten under planner-first framing"
    next_safe_action: "Packet complete"
    blockers: []
    key_files:
      - "spec.md"
      - "plan.md"
      - "tasks.md"
      - "checklist.md"
      - "decision-record.md"
      - "implementation-summary.md"
      - "research/013-audit-snapshot/review-report.md"
      - "research/014-research-snapshot/research.md"
      - "review/015-deep-review-snapshot/review-report.md"
    session_dedup:
      fingerprint: "sha256:014-planner-first-default-2026-04-15"
      session_id: "014-planner-first-default-2026-04-15"
      parent_session_id: "014-planner-first-default-closeout"
    completion_pct: 100
    open_questions: []
    answered_questions:
      - "The runtime was half-migrated: the legacy [spec]/memory/*.md write path was still live even after v3.4.0.0 docs claimed retirement."
      - "Research classified 15 save-flow subsystems and concluded that the writer core earns its cost while Tier 3 routing, reconsolidation, heavy quality automation, and enrichment do not."
      - "Implementation shipped planner-first default with explicit full-auto fallback; freshness work moved to explicit follow-up APIs."
      - "Deep review found 9 issues (3 P0, 5 P1, 1 P2); all resolved."
template_source_hint: "<!-- SPECKIT_TEMPLATE_SOURCE: spec-core + level2-verify + level3-arch + level3plus-gov | v2.2 -->"
---
# Feature Specification: /memory:save Planner-First Default

<!-- SPECKIT_LEVEL: 3+ -->
<!-- SPECKIT_TEMPLATE_SOURCE: spec-core + level2-verify + level3-arch + level3plus-gov | v2.2 -->

---

## EXECUTIVE SUMMARY

`/memory:save` was doing too much on every invocation. The runtime still created, wrote, indexed, and read `[spec]/memory/*.md` even though v3.4.0.0 docs claimed that artifact was retired; on top of that legacy write path, every save triggered Tier 3 routing, a heavy quality-loop auto-fix, reconsolidation-on-save, post-insert enrichment, unconditional graph-metadata refresh, and unconditional spec-doc reindex — regardless of whether the caller actually wanted mutation. Auditing the code proved the system was half-migrated, turning vague drift into 25 concrete findings. Classifying the remaining 15 save-flow subsystems proved which ones still earned runtime cost (the canonical atomic writer, routed record identity, the content-router category contract, and thin continuity validation) and which ones did not belong on the default path.

This packet delivers the end state implied by that analysis. `/memory:save` is planner-first by default: the handler computes the same route and legality data as before but stops short of mutation and returns structured planner output instead. `full-auto` is preserved as an explicit fallback via `SPECKIT_SAVE_PLANNER_MODE=full-auto`, with canonical atomic mutation, `POST_SAVE_FINGERPRINT` safety parity, same-path identity, and rollback intact. The legacy `[spec]/memory/*.md` write path is retired. Four previously default-on behaviors become explicit opt-in: `SPECKIT_ROUTER_TIER3_ENABLED`, `SPECKIT_QUALITY_AUTO_FIX`, `SPECKIT_RECONSOLIDATION_ENABLED`, `SPECKIT_POST_INSERT_ENRICHMENT_ENABLED`. Freshness becomes follow-up work via three new APIs: `refreshGraphMetadata`, `reindexSpecDocs`, `runEnrichmentBackfill`. `hybrid` is documented as reserved and currently behaves like `plan-only`. The content-router category contract is preserved with one honest, scoped exception: a Tier 3 default-disable and manual-review guard inside `content-router.ts`. 43 implementation tasks shipped under v3.4.1.0. A deep-review pass flagged 3 P0, 5 P1, and 1 P2 findings on router honesty, fallback safety parity, blocker classification, deferred-helper coverage, and changelog accuracy; all 9 were resolved before closeout.

---

<!-- ANCHOR:metadata -->
## 1. METADATA

| Field | Value |
|-------|-------|
| **Level** | 3+ |
| **Priority** | P1 |
| **Status** | Complete |
| **Created** | 2026-04-14 |
| **Completed** | 2026-04-15 |
| **Branch** | `026-014-memory-save-rewrite` |
| **Phase Folder** | `004-memory-save-rewrite` (historical alias: `014-memory-save-rewrite`) |
| **Parent Packet** | `026-graph-and-context-optimization` |
| **Release Context** | `v3.4.1.0` |

---

| **Parent Spec** | ../spec.md |
| **Parent Plan** | ../plan.md |
| **Predecessor** | ../003-continuity-refactor-gates/spec.md |
| **Successor** | None |
<!-- /ANCHOR:metadata -->
<!-- ANCHOR:problem -->
## 2. PROBLEM & PURPOSE

### Problem Statement

`/memory:save` mutated by default, did work that had nothing to do with the caller's intent, and still honored an artifact family that had supposedly been retired. The audit produced 25 concrete findings across runtime write path, runtime read path, indexing, documentation contradictions, template drift, test drift, and a phantom save-side dedup contract. Relevance research then classified the remaining 15 save-flow subsystems and showed that four core pieces earned their cost (canonical atomic writer, routed record identity, content-router category contract, thin continuity validation) while four others (Tier 3 routing, reconsolidation-on-save, heavy quality-loop auto-fix, post-insert enrichment) did not belong on the default path. That combined picture made the default contract untenable: operators got mutation they didn't ask for, freshness work they didn't need, and an artifact surface docs claimed was gone.

### Purpose

Ship a `/memory:save` contract that matches the evidence: planner-first by default so operators see the plan before anything changes, full-auto preserved as an explicit fallback for the cases that still need it, and freshness work moved to callable follow-up APIs so every save doesn't pay for work it doesn't need. Retire the legacy `[spec]/memory/*.md` write path end-to-end. Make four previously default-on behaviors opt-in via per-subsystem env flags, preserve `hybrid` as a reserved value, and record the scoped router exception honestly so docs match the code.

---

<!-- /ANCHOR:problem -->
<!-- ANCHOR:scope -->
## 3. SCOPE

### In Scope

- Make `/memory:save` planner-first by default: the default path computes route + legality data, returns structured planner output, does not mutate files.
- Preserve the `full-auto` writer path as an explicit fallback activated via `SPECKIT_SAVE_PLANNER_MODE=full-auto` with canonical atomic mutation, promotion, rollback, and same-path identity intact.
- Retire the legacy `[spec]/memory/*.md` write and read path runtime-wide: remove the write path, update dedup and causal-link behavior to use canonical docs + the routed record, stop indexing `memory/*.md` into the vector DB.
- Introduce three explicit follow-up APIs for freshness: `refreshGraphMetadata`, `reindexSpecDocs`, `runEnrichmentBackfill`. Remove their unconditional participation in every save.
- Gate four previously default-on save-path behaviors behind explicit env flags: `SPECKIT_ROUTER_TIER3_ENABLED` (default OFF), `SPECKIT_QUALITY_AUTO_FIX` (default OFF), `SPECKIT_RECONSOLIDATION_ENABLED` (default OFF), `SPECKIT_POST_INSERT_ENRICHMENT_ENABLED` (default OFF).
- Preserve the content-router eight-category contract. Record the single scoped exception inside `content-router.ts`: Tier 3 default-disable + manual-review return behavior.
- Preserve hard legality checks and structural blockers in the save-quality gate; remove default-path quality-loop auto-fix retries while keeping advisory output.
- Reserve `hybrid` as a valid value for `SPECKIT_SAVE_PLANNER_MODE` that currently behaves like `plan-only`; document it as reserved honestly.
- Restore `POST_SAVE_FINGERPRINT` parity on the full-auto path.
- Promote template-contract failures from advisories to planner blockers.
- Make deferred helpers return explicit deferred status when skipped (no success-shaped status when nothing ran).
- Update packet docs, `ENV_REFERENCE.md`, release notes, and test fixtures so the documented contract matches the shipped behavior (router scope, hybrid reserved state, follow-up tool names, freshness as explicit follow-up).
- Update tests across `memory-save`, `content-router`, `quality-loop`, `save-quality-gate`, reconsolidation-bridge, reconsolidation, assistive-reconsolidation, chunking, graph-refresh, thin-continuity, planner UX, CLI target authority, and memory-save integration to prove planner-default + fallback end-to-end behavior.
- Validate planner-first behavior against three real session transcripts before closeout.

### Out of Scope

- Changes to the canonical atomic writer internals; reuse as-is.
- Changes to the eight-category router contract; reuse as-is.
- Replacing the save system with a new planner service; the existing handler owns the contract.
- Changes to embedding backends, vector-DB schemas, or checkpoint/restore internals.
- Packet 012's canonical intake work or packet 013's advisor phrase-booster work — unrelated scope.

### Files to Change

| Surface | File Path | Change Type | Why It Matters |
|---------|-----------|-------------|----------------|
| Legacy write path retirement | `workflow.ts`, `file-writer.ts`, `memory-indexer.ts`, `memory-metadata.ts`, `directory-setup.ts` | Retire | Audit proved the runtime still created, wrote, indexed, and read `[spec]/memory/*.md` in contradiction to v3.4.0.0 retirement claim |
| Planner contract core | `memory-save.ts`, `types.ts`, `response-builder.ts`, `validation-responses.ts`, `generate-context.ts` | Modify | Introduce planner-first default + shared types + blocker/advisory separation |
| Canonical writer reuse | `create-record.ts`, `atomic-index-memory.ts`, `thin-continuity-record.ts`, `post-insert.ts` | Reuse/preserve | Core writer earns its cost; fallback path depends on stable interfaces |
| Content router | `content-router.ts` | Modify (scoped) | Preserve eight-category contract; add Tier 3 default-disable + manual-review guard |
| Quality gate | `quality-loop.ts`, `save-quality-gate.ts` | Modify | Preserve hard blockers; retire default-path auto-fix retries; keep advisory output |
| Reconsolidation | `reconsolidation-bridge.ts` | Gate | Move behind explicit opt-in or fallback |
| Freshness API | `api/indexing.ts`, `graph-metadata-parser.ts` | Create/expose | Follow-up APIs: `refreshGraphMetadata`, `reindexSpecDocs`, `runEnrichmentBackfill` |
| Command docs | `../../../../command/memory/save.md`, `../../../../command/memory/manage.md` | Modify | Document planner-first default, fallback, and follow-up freshness actions |
| Reference docs | `../../../../skill/system-spec-kit/references/memory/save_workflow.md`, `../../../../skill/system-spec-kit/references/memory/memory_system.md`, templates | Modify | Align operator-facing references with shipped contract |
| Env reference | `../../../../skill/system-spec-kit/mcp_server/ENV_REFERENCE.md` | Modify | Document `SPECKIT_SAVE_PLANNER_MODE`, per-subsystem flags, reserved `hybrid` honestly |
| Release notes | `../../../../changelog/01--system-spec-kit/v3.4.1.0.md` | Author | Record shipped contract, router scoped exception, reserved `hybrid`, follow-up APIs |
| Test surfaces | See tasks.md §Testing — broad vitest + transcript prototype sweep | Modify | Prove planner-default, fallback parity, gate behavior, continuity upserts |
| Packet metadata | `description.json`, `graph-metadata.json`, packet-local changelog | Generate | Packet discovery + graph visibility |
| Packet docs | `spec.md`, `plan.md`, `tasks.md`, `checklist.md`, `decision-record.md`, `implementation-summary.md` | Create | Tell the complete story end-to-end |

### Research and Review Evidence

The packet carries packet-local snapshots of the audit report, research synthesis, deep-review report, and planner-first transcript prototypes so a reader can inspect the most important artifacts without leaving the folder. Those snapshots live under `research/013-audit-snapshot/`, `research/014-research-snapshot/`, `review/015-deep-review-snapshot/`, and `scratch/transcripts-snapshot/` inside this flattened `004-memory-save-rewrite` packet.

---

<!-- /ANCHOR:scope -->
<!-- ANCHOR:requirements -->
## 4. REQUIREMENTS

### P0 — Blockers

| ID | Requirement | Acceptance Criteria |
|----|-------------|---------------------|
| REQ-001 | The default `/memory:save` path must be planner-first and non-mutating. | Default invocation returns structured planner output (route, legality, blockers, advisories, follow-up actions) and mutates no files on disk. |
| REQ-002 | Explicit `full-auto` must remain available as fallback. | Setting `SPECKIT_SAVE_PLANNER_MODE=full-auto` runs the canonical atomic writer with promotion, rollback, and same-path identity intact. |
| REQ-003 | The legacy `[spec]/memory/*.md` write path must be retired. | `workflow.ts`, `file-writer.ts`, `memory-indexer.ts`, `memory-metadata.ts`, and `directory-setup.ts` no longer create, write, index, or read that surface. |
| REQ-004 | Tier 3 routing must be default-off with a scoped, auditable exception. | `SPECKIT_ROUTER_TIER3_ENABLED=false` is default; `content-router.ts` contains the scoped default-disable + manual-review guard; the eight-category contract is otherwise unchanged. |
| REQ-005 | Quality-loop auto-fix must leave the default path while hard blockers remain. | Default path emits advisory output only; structural/legality blockers still fail the save; `SPECKIT_QUALITY_AUTO_FIX=false` is default. |
| REQ-006 | Reconsolidation-on-save must be explicit opt-in. | Default path never triggers reconsolidation; `SPECKIT_RECONSOLIDATION_ENABLED=false` is default; opt-in via env flag or fallback execution. |
| REQ-007 | Post-insert enrichment must leave the default save path. | Default path emits no enrichment calls; `SPECKIT_POST_INSERT_ENRICHMENT_ENABLED=false` is default; opt-in via env flag or follow-up API. |
| REQ-008 | Unconditional graph refresh and spec-doc reindex must leave planner-default saves. | Planner-default saves no longer trigger these; explicit follow-up APIs handle the work when wanted. |
| REQ-009 | `refreshGraphMetadata`, `reindexSpecDocs`, `runEnrichmentBackfill` must exist as explicit follow-up APIs. | All three are callable independently of the save path; each has execution-level test coverage. |
| REQ-010 | Fallback safety parity must be preserved. | `POST_SAVE_FINGERPRINT` parity is restored on the full-auto path; fallback tests prove atomic mutation + rollback semantics match the pre-packet writer. |
| REQ-011 | Template-contract failures must be planner blockers. | Template-contract misses surface as `blocker` entries in planner output, not as advisories. |
| REQ-012 | Deferred helpers must return explicit deferred status. | When default-path skips reconsolidation, enrichment, Tier 3 routing, or quality auto-fix, the planner response records `deferred` rather than success-shaped output. |
| REQ-013 | `hybrid` must be documented as reserved. | `SPECKIT_SAVE_PLANNER_MODE=hybrid` is recognized; current behavior matches `plan-only`; docs and env reference describe it as reserved for future behavior. |
| REQ-014 | Shipped documentation must match the runtime contract. | `/memory:save` docs, `ENV_REFERENCE.md`, release notes, and templates describe planner-first default, explicit fallback, follow-up APIs, reserved `hybrid`, and the scoped router exception honestly. |
| REQ-015 | Canonical atomic writer, routed record identity, content-router category contract, and thin continuity validation must remain intact. | Fallback path plus continuity upserts still run through the preserved core; tests prove no behavior regression outside the documented gated flags. |

### P1 — Required

| ID | Requirement | Acceptance Criteria |
|----|-------------|---------------------|
| REQ-016 | Planner output must preserve blocker/advisory separation. | Types and helpers distinguish `blocker` entries (must fix) from `advisory` entries (informational) in all code paths and tests. |
| REQ-017 | CLI target authority must stay deterministic. | Planner-default CLI tests prove the same target selection as full-auto for identical inputs. |
| REQ-018 | Same-path identity must remain deterministic after the refactor. | Record identity tests confirm identical path semantics for the same-target save case across planner and full-auto paths. |
| REQ-019 | `/spec_kit:resume` recovery ladder must stay intact. | Recovery ladder tests show no regression when the save path is planner-first. |
| REQ-020 | Transcript prototypes must ground planner behavior. | Three real session transcripts are exercised; no unexpected drops, wrong-anchor outcomes, or unsafe target exposures are produced. |
| REQ-021 | Planner output must not expose unsafe file targets. | Target authority tests verify the planner emits only caller-authorized paths. |
| REQ-022 | Fallback flags must not silently widen mutation scope. | Env-flag documentation + tests prove that enabling any single opt-in flag does not cascade other opt-ins. |
| REQ-023 | Continuity upserts must still use validated helpers. | Thin continuity + upsert tests pass unchanged expectations. |
| REQ-024 | Follow-up APIs must be execution-level test-covered. | `refreshGraphMetadata`, `reindexSpecDocs`, `runEnrichmentBackfill` have vitest suites covering at least happy-path + one failure branch each. |
| REQ-025 | Four trim targets must stay aligned across packet docs. | Tier 3 routing, quality-loop auto-fix, reconsolidation-on-save, and post-insert enrichment are each documented consistently as default-off + opt-in. |

codex
Found it.

Exact spec folder:

`/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite`

Canonical anchors/files:

- [spec.md](/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:154) has `<!-- ANCHOR:requirements -->`
- `REQ-001` states the default `/memory:save` path is planner-first and non-mutating.
- [implementation-summary.md](/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:55) has `<!-- ANCHOR:what-built -->`, confirming the shipped planner-first default.
hook: Stop
hook: Stop Completed
2026-04-26T18:08:48.351699Z ERROR codex_core::session: failed to record rollout items: thread 019dcafa-32ef-71d3-be07-d5102ffb6b4b not found
tokens used
72,088
Found it.

Exact spec folder:

`/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite`

Canonical anchors/files:

- [spec.md](/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/spec.md:154) has `<!-- ANCHOR:requirements -->`
- `REQ-001` states the default `/memory:save` path is planner-first and non-mutating.
- [implementation-summary.md](/Users/michelkerkmeester/MEGA/Development/Code_Environment/Public/.opencode/specs/system-spec-kit/026-graph-and-context-optimization/003-continuity-memory-runtime/004-memory-save-rewrite/implementation-summary.md:55) has `<!-- ANCHOR:what-built -->`, confirming the shipped planner-first default.
