From bb60a020a043f072aa0106b33d97eb20f1c6d90c Mon Sep 17 00:00:00 2001 From: eunhwa99 Date: Mon, 15 Jun 2026 16:11:14 +0900 Subject: [PATCH 1/2] docs: simplify README and harness docs --- .agents/docs/adr/README.md | 27 +- .agents/docs/architecture.md | 14 +- .agents/docs/github-workflow.md | 4 +- .agents/docs/harness-engineering.md | 16 +- .agents/skills/harness-engineering/SKILL.md | 2 +- .../skills/harness-functional-smoke/SKILL.md | 3 +- .agents/skills/harness-implement/SKILL.md | 2 +- .agents/skills/harness-plan/SKILL.md | 4 +- .agents/skills/harness-review/SKILL.md | 6 +- AGENTS.md | 9 +- README.md | 641 ++++++++-------- docs/contextwiki-core-understanding.md | 707 +----------------- .../claude-desktop-dynamodb-star-example.png | Bin 0 -> 257662 bytes .../2026-06-15-readme-mcp-docker-obsidian.md | 130 ++++ docs/plan/README.md | 2 +- 15 files changed, 512 insertions(+), 1055 deletions(-) create mode 100644 docs/images/claude-desktop-dynamodb-star-example.png create mode 100644 docs/plan/2026-06-15-readme-mcp-docker-obsidian.md diff --git a/.agents/docs/adr/README.md b/.agents/docs/adr/README.md index c31220b..242a22b 100644 --- a/.agents/docs/adr/README.md +++ b/.agents/docs/adr/README.md @@ -1,12 +1,22 @@ # Architecture Decision Records -This directory records architecture decisions for `MCPContentSearch`. +This directory records historical architecture decisions for +`MCPContentSearch`. -Harness planning reads this index first, then opens only accepted ADRs directly related to the requested change. Review gates treat accepted ADRs as contracts. If a diff conflicts with an accepted ADR, either change the diff or add a new ADR that supersedes the old decision. +For current work, the maintained source of truth is +`.agents/docs/architecture.md`. Harness planning and review do not require +reading ADRs. Keep this directory as optional historical context for older plan +docs, superseded decisions, or cases where a reader explicitly wants the +original decision record. + +If an ADR and `.agents/docs/architecture.md` disagree, follow the architecture +doc and update the historical ADR wording only when that extra archival cleanup +is worth doing. ## ADR Format -Use `template.md` for new records. +Use `template.md` only when you explicitly want to preserve a standalone +decision record in this archive. Required fields: @@ -35,7 +45,10 @@ File names should be numbered and descriptive: ## When to Add or Update ADRs -Add or update an ADR for: +Add or update an ADR only when preserving the separate historical decision +record is itself useful. + +Typical cases: - New cross-module architecture patterns. - MCP tool contract strategy changes. @@ -43,6 +56,8 @@ Add or update an ADR for: - Chroma data migration or reindexing policy. - External integration strategy changes. - Configuration/secrets policy changes. -- Intentional departures from `.agents/docs/architecture.md`. +- Architecture changes worth preserving historically after updating + `.agents/docs/architecture.md`. -Do not add ADRs for ordinary local refactors, one-off bug fixes, or implementation details that do not constrain future work. +Do not add ADRs for ordinary local refactors, one-off bug fixes, or +implementation details that do not constrain future work. diff --git a/.agents/docs/architecture.md b/.agents/docs/architecture.md index 4b8d95d..52ea4ea 100644 --- a/.agents/docs/architecture.md +++ b/.agents/docs/architecture.md @@ -4,11 +4,8 @@ This document maps the current slim `MCPContentSearch` architecture. Harness planning and review use it to keep changes inside the focused MCP retrieval -scope and to catch contract or data-safety regressions. - -Decision history is indexed in `.agents/docs/adr/README.md`. ADR 0006 is the -current scope decision for the slim MCP core and supersedes the website/docs -portion of ADR 0004 plus ADR 0005's Auto Wiki decision for current work. +scope and to catch contract or data-safety regressions. It is the single +maintained design reference beyond the README. ## Runtime Structure @@ -222,8 +219,8 @@ print credentials or local path details. - `environments/token.py`, `.env`, shell environment variables, and API keys are sensitive. - Do not add secret values to docs, tests, logs, screenshots, or examples. -- If a configuration default changes long-term behavior, update architecture - docs or ADRs in the same work item. +- If a configuration default changes long-term behavior, update this document in + the same work item. ## Error Handling @@ -259,5 +256,4 @@ Use the smallest useful check first. ## Harness Usage `harness-plan` must read this document before choosing implementation -boundaries. Review gates must check changed files against this architecture and -directly relevant accepted ADRs. +boundaries. Review gates must check changed files against this architecture. diff --git a/.agents/docs/github-workflow.md b/.agents/docs/github-workflow.md index d9a3cbd..3aa38ca 100644 --- a/.agents/docs/github-workflow.md +++ b/.agents/docs/github-workflow.md @@ -135,7 +135,9 @@ Stop monitoring when the PR is merged/closed, a blocker needs user judgment, or ## Release Policy -This repository currently uses `main` as the default branch. If a later workflow introduces `develop` or release branches, update this document and relevant ADRs before applying that workflow. +This repository currently uses `main` as the default branch. If a later +workflow introduces `develop` or release branches, update this document and the +maintained architecture doc before applying that workflow. ## Failure Handling diff --git a/.agents/docs/harness-engineering.md b/.agents/docs/harness-engineering.md index d02c289..6745a63 100644 --- a/.agents/docs/harness-engineering.md +++ b/.agents/docs/harness-engineering.md @@ -81,19 +81,19 @@ File-changing work must create or update a plan document after branch preflight - File name: `YYYY-MM-DD-short-task-name.md` - Required sections are listed in `docs/plan/README.md`. -- Include branch preflight result, scope/non-goals, acceptance criteria, expected files, verification plan, architecture/ADR constraints, risk/rollback notes, and progress log. +- Include branch preflight result, scope/non-goals, acceptance criteria, expected files, verification plan, architecture constraints, risk/rollback notes, and progress log. - If verification or review changes the plan, update the same plan document before continuing. - Final reports should include the plan document path. -## Architecture and ADR +## Architecture Planning must read: - `.agents/docs/architecture.md` -- `.agents/docs/adr/README.md` -- Directly relevant accepted ADRs only -Review gates must check that the diff does not violate architecture docs or accepted ADRs. If a change intentionally changes long-term architecture, add or update an ADR in the same work item. +Review gates must check that the diff does not violate the maintained +architecture doc. If a change intentionally changes long-term architecture, +update `.agents/docs/architecture.md` in the same work item. ## Multi-task Orchestration @@ -130,7 +130,7 @@ explicit. After branch preflight and plan creation, the main agent should: - Ask the user only for unsafe ambiguity, credentials, destructive operations, local data mutation, unavailable delegation/review tools, or external approval. Do not ask for routine implementation choices that can be decided - from repo docs, architecture, ADRs, and the plan. + from repo docs, architecture, and the plan. Implementation/execution worker subagents and `$subagent-review-loop` reviewer subagents are separate roles. Workers may edit within their assigned boundary @@ -143,7 +143,7 @@ Use this control loop: ```text read repository instructions read harness and GitHub workflow -read architecture and relevant ADRs +read architecture run branch preflight with GitHub workflow dirty/clean worktree safeguards write or update docs/plan plan run planning phase @@ -180,7 +180,7 @@ until complete or blocked ## Review Gates -Review gates use `$subagent-review-loop` and code-review stance. Each review pass must use exactly five newly spawned reviewer subagents, and the loop continues until all five reviewers in the newest pass report no actionable findings. Findings are prioritized by correctness, regressions, missing tests, data loss, security, MCP contract mismatch, async/concurrency issues, architecture/ADR violations, and change size. +Review gates use `$subagent-review-loop` and code-review stance. Each review pass must use exactly five newly spawned reviewer subagents, and the loop continues until all five reviewers in the newest pass report no actionable findings. Findings are prioritized by correctness, regressions, missing tests, data loss, security, MCP contract mismatch, async/concurrency issues, architecture violations, and change size. Use review lenses that fit the change: diff --git a/.agents/skills/harness-engineering/SKILL.md b/.agents/skills/harness-engineering/SKILL.md index 9241b9d..c2d7927 100644 --- a/.agents/skills/harness-engineering/SKILL.md +++ b/.agents/skills/harness-engineering/SKILL.md @@ -9,7 +9,7 @@ description: Orchestrates MCPContentSearch harness work for implementation, fixe Read `.agents/docs/harness-engineering.md` and `.agents/docs/github-workflow.md` first. For file-changing work, do not edit target files until branch preflight is complete and a `docs/plan/` plan exists. -During planning, read `.agents/docs/architecture.md` and `.agents/docs/adr/README.md`. Open only accepted ADRs directly related to the change. +During planning, read `.agents/docs/architecture.md`. ## Phases diff --git a/.agents/skills/harness-functional-smoke/SKILL.md b/.agents/skills/harness-functional-smoke/SKILL.md index cc6b212..5ca19dd 100644 --- a/.agents/skills/harness-functional-smoke/SKILL.md +++ b/.agents/skills/harness-functional-smoke/SKILL.md @@ -14,8 +14,7 @@ caller surfaces, not only through unit tests or helper functions. ## Inputs Read the current plan, local diff, `.agents/docs/harness-engineering.md`, -`.agents/docs/architecture.md`, `.agents/docs/functional-smoke-matrix.md`, -and directly relevant accepted ADRs. +`.agents/docs/architecture.md`, and `.agents/docs/functional-smoke-matrix.md`. ## Build The Matrix diff --git a/.agents/skills/harness-implement/SKILL.md b/.agents/skills/harness-implement/SKILL.md index 45eb87f..dd142ae 100644 --- a/.agents/skills/harness-implement/SKILL.md +++ b/.agents/skills/harness-implement/SKILL.md @@ -7,7 +7,7 @@ description: Implementation lane for scoped MCPContentSearch changes after plann ## Input -Read the current plan, `.agents/docs/harness-engineering.md`, `.agents/docs/github-workflow.md`, `.agents/docs/architecture.md`, relevant ADRs, and the production files in scope. +Read the current plan, `.agents/docs/harness-engineering.md`, `.agents/docs/github-workflow.md`, `.agents/docs/architecture.md`, and the production files in scope. ## Work diff --git a/.agents/skills/harness-plan/SKILL.md b/.agents/skills/harness-plan/SKILL.md index c1e6462..fb3258f 100644 --- a/.agents/skills/harness-plan/SKILL.md +++ b/.agents/skills/harness-plan/SKILL.md @@ -14,8 +14,6 @@ Read: - `.agents/docs/harness-engineering.md` - Current `docs/plan/...` plan document - `.agents/docs/architecture.md` -- `.agents/docs/adr/README.md` -- Directly relevant accepted ADRs - Minimal code or docs context needed for the work Read `.agents/docs/github-workflow.md` when branch, commit, push, PR, or release work is involved. @@ -42,7 +40,7 @@ The plan must include: Notion, Tistory, GitHub, optional search LLM query rewrite, or embedding providers, if any. - Risks, open questions, environment requirements, and rollback point. -- Architecture/ADR constraints. +- Architecture constraints. - PR split or stacked PR plan if PRs are requested. - Progress table with `Phase`, `Status`, `Summary`, and `Evidence`. diff --git a/.agents/skills/harness-review/SKILL.md b/.agents/skills/harness-review/SKILL.md index cd2b9c9..52cdc04 100644 --- a/.agents/skills/harness-review/SKILL.md +++ b/.agents/skills/harness-review/SKILL.md @@ -1,6 +1,6 @@ --- name: harness-review -description: Middle and final $subagent-review-loop gate for MCPContentSearch changes, focused on bugs, regressions, tests, contracts, data safety, secrets, and architecture/ADR compliance. +description: Middle and final $subagent-review-loop gate for MCPContentSearch changes, focused on bugs, regressions, tests, contracts, data safety, secrets, and architecture compliance. --- # Harness Review @@ -22,7 +22,7 @@ only when all five reviewers in the newest pass report no actionable findings. ## Input -Read the plan, local diff, `.agents/docs/harness-engineering.md`, `.agents/docs/architecture.md`, `.agents/docs/functional-smoke-matrix.md`, `.agents/docs/adr/README.md`, relevant accepted ADRs, verification history, functional smoke matrix/results, and changed files. +Read the plan, local diff, `.agents/docs/harness-engineering.md`, `.agents/docs/architecture.md`, `.agents/docs/functional-smoke-matrix.md`, verification history, functional smoke matrix/results, and changed files. ## Subagent Review Loop @@ -65,7 +65,7 @@ Produce a checklist: | Item | Result | Notes | | --- | --- | --- | -| Architecture/ADR compliance | pass/fail/n/a | Relevant violation or n/a reason | +| Architecture compliance | pass/fail/n/a | Relevant violation or n/a reason | | Acceptance criteria | pass/fail/n/a | Missing behavior | | Tests/verification | pass/fail/n/a | Commands run or gaps | | Functional smoke matrix | pass/fail/n/a | Rows covered, blocked/gated checks, substitutes, and evidence | diff --git a/AGENTS.md b/AGENTS.md index 21d885d..4cb518b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -3,7 +3,7 @@ ## Project Harness - When the user asks to implement, add, fix, refactor, or test behavior, first read `.agents/docs/harness-engineering.md`, then follow `.agents/skills/harness-engineering/SKILL.md`. -- Harness planning and review must read `.agents/docs/architecture.md` and `.agents/docs/adr/README.md`. Read only accepted ADRs that directly affect the requested change. +- Harness planning and review must read `.agents/docs/architecture.md`. - Harness phase skills live under `.agents/skills/`: `harness-plan`, `harness-multitask`, `harness-implement`, `harness-test`, `harness-functional-smoke`, `harness-review`, `harness-refactor`, and `harness-integrate`. - Branch, commit, push, PR, and PR-watch policy is defined in `.agents/docs/github-workflow.md`. - File-changing work starts with branch preflight from the latest `main`: if the worktree is clean, switch to `main`, fast-forward it from `origin/main` when network is available, delete only safe local non-`main` work branches using `.agents/docs/github-workflow.md` safeguards, then create a fresh `feature/...` branch before target edits. @@ -14,7 +14,7 @@ - The main agent may implement directly only when the change is truly atomic. Record the reason in the plan progress log before editing target files. Shared-file overlap is not a reason to bypass workers: for non-atomic work, use a single-owner worker or sequential worker handoff instead of parallel edits. If subagent tools are unavailable for non-atomic work, or no safe worker boundary can be created, stop before target edits and ask the user for explicit approval before bypassing worker orchestration. Do not silently collapse worker orchestration into self-implementation. - Worker subagents and reviewer subagents are different roles. Workers may edit only inside their assigned boundary and must not commit, push, open PRs, inspect secrets, print secret values, inspect local Chroma/SQLite data, or mutate user data. Local Chroma/SQLite inspection or user-data mutation requires explicit user approval plus plan rationale, bounded instructions, and rollback/safety notes; secret values are not delegable. `$subagent-review-loop` reviewers are read-only and run only after verification and functional smoke. - The main agent owns integration: collect worker outputs, inspect diffs, resolve conflicts, update the plan, run verification, route actionable findings back to the responsible worker persona or a fresh replacement with the same ownership boundary, and minimize human intervention. Ask the user only when safety, credentials, destructive actions, unavailable delegation/review tools, or genuinely unclear requirements require human judgment. -- Keep `docs/contextwiki-core-understanding.md` updated when changes affect ContextWiki source connectors, source sync, document identity, chunking, tombstones, retrieval, citation metadata, or answer behavior. This note is the maintained human explanation layer and should not drift behind README, architecture docs, ADRs, or implementation. +- Keep `.agents/docs/architecture.md` updated when changes affect ContextWiki source connectors, source sync, document identity, chunking, tombstones, retrieval, citation metadata, answer behavior, or other maintained design assumptions. This document is the maintained human explanation layer and should not drift behind README or implementation. - After code-changing work, always run the relevant test or verification command before review. Use the repo-local commands in this file and `.agents/docs/harness-engineering.md`, not plugin-default paths such as `docs/superpowers/...`. - After implementation and focused tests, run the functional smoke gate before `$subagent-review-loop`: use `.agents/skills/harness-functional-smoke/SKILL.md` to exercise the task-relevant MCP/source-sync/user-visible feature inventory once through the safest real caller surfaces, not only unit-test the changed files. Record explicit safety blockers, approval needed, and nearest fake/temp substitutes in the plan. - After verification and before PR delivery for any code, configuration, documentation, or skill change, run `$subagent-review-loop`: spawn exactly five fresh reviewer subagents per pass and repeat until all five reviewers in the newest pass report no actionable findings. If subagent review is unavailable, stop and report the blocker instead of silently replacing it with self-review. @@ -32,13 +32,12 @@ LlamaIndex, ChromaDB, and SQLite metadata storage. - `api/`: MCP tool registration and tool handlers. - `core/`: shared models, exceptions, and utility code. - `environments/`: runtime configuration and secret/environment loading. -- `fetching/`: Notion, Tistory, and GitHub source connectors. +- `fetching/`: Notion, Tistory, GitHub, and Obsidian source connectors. - `indexing/`: document conversion, chunking, dedup/update detection, and vector indexing. - `search/`: ContextWiki retrieval, ranking, SQLite-backed active gates, query rewrite, and citation answer scaffolding. - `storage/`: SQLite source/job/document/chunk lifecycle metadata and active retrieval checks. -- `docs/contextwiki-core-understanding.md`: maintained learning note for the current ContextWiki data flow, source connector behavior, lifecycle metadata, retrieval gate, and limitations. - `docs/plan/`: plan documents written before file-changing harness work. -- `.agents/`: local harness docs, phase skills, and ADRs. +- `.agents/`: local harness docs and phase skills. ## Development Commands diff --git a/README.md b/README.md index 558b242..c32e4f3 100644 --- a/README.md +++ b/README.md @@ -2,25 +2,13 @@ [![CI](https://github.com/eunhwa99/MCPContentSearch/actions/workflows/ci.yml/badge.svg)](https://github.com/eunhwa99/MCPContentSearch/actions/workflows/ci.yml) -ContextWiki is a focused MCP retrieval server for private or project-specific -knowledge. It syncs a small set of configured sources into local Chroma vectors, -stores lifecycle and citation metadata in SQLite, and exposes MCP tools that let -an LLM client retrieve grounded context without reading local databases -directly. - -## πŸš€ Key Features - -- πŸ”Œ **Multi-source connectors**: Notion, Tistory, GitHub, and local Obsidian -- βš–οΈ **Hybrid retrieval architecture**: Chroma for semantic search, SQLite for - lifecycle and citation validation -- πŸ› οΈ **Practical MCP tools**: source listing, sync, status, search, fetch, and - a helper citation-backed answer preview surface -- πŸ›‘οΈ **Citation safety**: only SQLite-validated chunks are returned as evidence -- πŸ”’ **Local-first by default**: optional query rewrite stays off unless you - enable it explicitly, but fully non-egress operation still depends on your - embedding provider choice - -## πŸ—οΈ Architecture Overview +A **private knowledge retrieval MCP server** for LLM clients. It syncs +configured sources from Notion, Tistory, GitHub, and Obsidian into local +vector and metadata stores, then returns verified, citation-backed context. + +--- + +## Architecture ```text [ Sources ] @@ -31,404 +19,427 @@ directly. / \ v v [ Chroma ] [ SQLite ] - semantic hits metadata gate + semantic search metadata gate \ / - \ / - v v + v v [ Verified Context ] ``` -## πŸ› οΈ MCP Tools - -Tool handlers live in `api/tools.py`. Business logic stays in `fetching/`, -`indexing/`, `search/`, and `storage/`. - -| Tool | Purpose | -| --- | --- | -| `list_sources()` | List configured Notion, Tistory, GitHub, and Obsidian sources. | -| `sync_source(source_id)` | Sync one configured source into SQLite metadata and Chroma vectors. | -| `sync_all()` | Sync all retained sources concurrently and return aggregate results. | -| `get_sync_status(source_id="")` | Read latest source and sync-job state. | -| `search_context(query, filters=None, top_k=10, include_debug=False)` | Return structured evidence chunks after Chroma retrieval, metadata fallback when needed, and SQLite validation. | -| `search_documents(query, filters=None, top_k=10)` | Return one representative, retrieval-ranked row per matching document. | -| `fetch_context(document_id="", chunk_id="")` | Fetch a document or chunk directly from SQLite metadata. | -| `answer_with_citations(question, filters=None, top_k=5, include_debug=False)` | Build a helper evidence-gated answer preview with citations and used chunks by reusing the `search_context` retrieval path. | - -At a glance: - -- `sync_all()` syncs all retained sources in one pass. -- `sync_all()` reports aggregate `status` truthfully: `completed` for - succeed/skip-only runs, `partial` when success/skip is mixed with blocked or - failed sources, and `failed` when nothing completed successfully. -- `sync_all()` summary counts include `succeeded`, `failed`, `blocked`, and - `skipped`. Disabled sources are counted as `skipped` during bulk sync. -- `search_context(...)` always returns a `debug` key. On the default normal - path, `include_debug=False` returns `debug={}`, while `include_debug=True` - returns populated structured debug details. -- `answer_with_citations(..., include_debug=True)` exposes helper-surface debug - details through the same retrieval path. -- Today `search_context` also returns a small populated `debug` object when - `include_debug=False` if the public source filter leaves no matching sources, - including `debug.rewrite_skipped_reason=no_matching_sources`. In other words, - the normal default-path `debug` payload is empty, and only that fast path - returns populated debug data without `include_debug=True`. - `answer_with_citations` does not have that exception and exposes debug only - when `include_debug=True`. - -Production MCP clients usually use `search_context` or `search_documents` to -collect grounded evidence, then let a downstream LLM generate the final -natural-language answer. In this repo, `answer_with_citations` is intentionally -positioned as an optional helper surface for preview, debug, evaluation, and -developer inspection rather than the main production answer API. - -When validating `answer_with_citations`, inspect: - -- `citations` to confirm every visible claim points to expected evidence -- `used_chunks` to confirm the helper output stayed grounded in retrieved chunks -- `debug` to inspect retrieval/grounding state when `include_debug=True` -- `debug_markdown` to review the human-readable retrieval-to-answer trace - -## βš™οΈ Configuration - -### 1. Source connectors - -| Source | Source id | Configuration | Notes | -| --- | --- | --- | --- | -| Notion | `source_notion` | `NOTION_API_KEY` | Syncs pages/documents through the Notion fetcher. | -| Tistory | `source_tistory` | `TISTORY_BLOG_NAME` | Syncs blog posts through the Tistory fetcher. | -| GitHub | `source_github` | `CONTEXTWIKI_GITHUB_REPOSITORIES`, `CONTEXTWIKI_GITHUB_DEFAULT_REF`, `CONTEXTWIKI_GITHUB_MAX_FILES`, `CONTEXTWIKI_GITHUB_MAX_FILE_BYTES`, optional `GITHUB_TOKEN`, optional `CONTEXTWIKI_GITHUB_USER_AGENT` | Syncs bounded text/code/Markdown files from configured repositories. | -| Obsidian | `source_obsidian` | `CONTEXTWIKI_OBSIDIAN_VAULT_PATH`, `CONTEXTWIKI_OBSIDIAN_MAX_FILES`, `CONTEXTWIKI_OBSIDIAN_MAX_FILE_BYTES` | Syncs bounded Markdown notes from a configured local vault. | - -GitHub repositories are configured as comma-separated `owner/repo` entries with -an optional `@ref`. If `@ref` is omitted, ContextWiki uses -`CONTEXTWIKI_GITHUB_DEFAULT_REF` and defaults that env var to `main`. +- **Chroma** handles semantic retrieval. +- **SQLite** tracks document lifecycle and citation validity. +- Only chunks still active in SQLite are returned as evidence. -```bash -CONTEXTWIKI_GITHUB_REPOSITORIES="eunhwa99/MCPContentSearch@main" -CONTEXTWIKI_GITHUB_DEFAULT_REF=main -CONTEXTWIKI_GITHUB_MAX_FILES=200 -CONTEXTWIKI_GITHUB_MAX_FILE_BYTES=512000 -CONTEXTWIKI_GITHUB_USER_AGENT="ContextWikiBot/0.1 (+https://github.com/eunhwa99/MCPContentSearch)" -GITHUB_TOKEN=... -``` +--- -Notes: +## MCP Tools -- `GITHUB_TOKEN` is optional. Unauthenticated GitHub API access depends on the - target repository being visible without auth and is subject to lower rate - limits. -- `CONTEXTWIKI_GITHUB_MAX_FILES` and `CONTEXTWIKI_GITHUB_MAX_FILE_BYTES` - control fetch completeness. Exceeding those bounds means the connector does - not claim a complete repository snapshot for stale cleanup. -- `CONTEXTWIKI_GITHUB_USER_AGENT` is the HTTP `User-Agent` header knob used by - the GitHub fetcher. +| Tool | Description | +|------|-------------| +| `list_sources()` | List configured sources. | +| `sync_source(source_id)` | Sync a specific source. | +| `sync_all()` | Sync all configured sources in one pass. | +| `get_sync_status(source_id="")` | Get source and sync job status. | +| `search_context(query, ...)` | Semantic search with SQLite-validated chunks. | +| `search_documents(query, ...)` | Search results grouped by document. | +| `fetch_context(document_id, chunk_id)` | Fetch a specific document or chunk directly. | +| `answer_with_citations(question, ...)` | Citation-backed answer preview for preview/debug/eval use. | -```bash -CONTEXTWIKI_OBSIDIAN_VAULT_PATH="/path/to/temp-or-real-vault" -CONTEXTWIKI_OBSIDIAN_MAX_FILES=2000 -CONTEXTWIKI_OBSIDIAN_MAX_FILE_BYTES=512000 -``` +> In production, use `search_context` or `search_documents` to gather grounded +> evidence, then let a downstream LLM generate the final answer. -Raw secrets are read at runtime from environment variables. They are not stored -in SQLite, committed to docs/tests, or printed by verification commands. +When validating `answer_with_citations`, inspect `citations`, `used_chunks`, +and `debug` or `debug_markdown` when enabled. -### 2. Optional search query rewrite +--- -`search_context` can optionally ask an external LLM for short query rewrites -when initial local retrieval looks weak. `answer_with_citations` inherits the -same rewrite egress because its answer flow calls the `search_context` -retrieval path. This is disabled by default. +## Quick Start -```bash -CONTEXTWIKI_SEARCH_LLM_ENABLED=true -CONTEXTWIKI_SEARCH_LLM_PROVIDER=openai -CONTEXTWIKI_SEARCH_LLM_MODEL=gpt-4.1-mini -OPENAI_API_KEY=... -``` - -The default is `off`. When enabled, the search query and normalized query term -groups may be sent to an external LLM. This setting does not fetch source -content or mutate SQLite/Chroma. - -## ⚑ Reproducible Launch Paths - -### 1. Fresh-machine local launch +**Prerequisites:** Python `3.13`, [`uv`](https://docs.astral.sh/uv/) -Prerequisites: - -- Python `3.13` -- [`uv`](https://docs.astral.sh/uv/) - -Install dependencies, create a local env file, and start the slim MCP core: +Use this path if you want to run ContextWiki directly with local Python and +`uv`. ```bash -uv sync --locked --python 3.13 --dev +uv sync --locked cp .env.example .env uv run --locked python main.py ``` -Notes: - -- `environments/token.py` loads `.env`, so `cp .env.example .env` is the - intended local setup path. -- Leaving optional source env vars blank is valid; those sources stay disabled - for future syncs until configured. -- A disabled source does not automatically hide already indexed content from - retrieval. Existing SQLite-active documents remain retrievable until a later - cleanup or metadata change removes them. -- The packaged runtime is not keyless today. For non-demo sync/search runs, the - default embedding path typically requires `OPENAI_API_KEY` even if query - rewrite stays disabled. -- If you want a public GitHub example after first launch, set - `CONTEXTWIKI_GITHUB_REPOSITORIES=eunhwa99/MCPContentSearch@main` manually in - `.env`. -- Default local SQLite/Chroma state is created under - `~/.mcp_content_search/`. - -For a plain syntax check without contacting external services: +**Syntax check only (no external services):** ```bash python -m compileall api core environments fetching indexing search storage main.py ``` -### 2. Container launch +### Docker -Build the image: +For Docker-only usage, you need Docker Desktop or Docker Engine instead of the +local Python + `uv` setup above. -```bash -docker build -t contextwiki . -``` +The command below is the minimum Docker run example. It is enough if you are +not using the Obsidian source. -Prepare the runtime env file before starting the container: +If your `.env` already contains a host path such as +`CONTEXTWIKI_OBSIDIAN_VAULT_PATH=/absolute/path/to/your/vault`, remove it or +override it before using this minimum Docker path unless you are also mounting +that vault into the container. ```bash +docker build -t contextwiki . cp .env.example .env -``` - -For a real sync/search run, edit `.env` and set an embedding-provider key first. -With the current default runtime, that usually means setting `OPENAI_API_KEY`. - -Start the MCP server in a container: - -```bash -docker run --rm -it \ +docker run --rm -i \ --env-file .env \ -v contextwiki_data:/home/appuser/.mcp_content_search \ contextwiki ``` -This named volume avoids first-run host-permission issues for reviewers. +Because ContextWiki is a stdio MCP server rather than a long-running HTTP API, +`docker run -d ...` is not the normal integration path. -If you want to expose a real Obsidian vault to the container, mount it -read-only and point `CONTEXTWIKI_OBSIDIAN_VAULT_PATH` at the container path: +If you also want `source_obsidian` inside Docker, add a vault mount and point +`CONTEXTWIKI_OBSIDIAN_VAULT_PATH` at the container path: ```bash -docker run --rm -it \ +docker run --rm -i \ --env-file .env \ -v contextwiki_data:/home/appuser/.mcp_content_search \ - -v "/absolute/path/to/vault:/vault:ro" \ - -e CONTEXTWIKI_OBSIDIAN_VAULT_PATH=/vault \ + -v "/absolute/path/to/your/vault:/vault:ro" \ contextwiki ``` -Supported limitations: +Then set this in `.env` for the Docker run: -- This image runs the retained slim MCP core only. -- It does not add deployment automation, multi-service orchestration, or secret - management beyond `--env-file`. -- Persisted runtime data lives inside `/home/appuser/.mcp_content_search` unless you - mount that path. +```bash +CONTEXTWIKI_OBSIDIAN_VAULT_PATH=/vault +``` -## 🚦 Verification +--- -Verification is split into four explicit layers so local runs and CI describe -the same trust boundary: +## Configuration -- `Public MCP contract layer`: real `FastMCP.call_tool(...)` coverage for each retained public tool. -- `Deterministic functional E2E layer`: retained sync/search/fetch/answer flows over temporary local state. -- `Deterministic quality eval layer`: fixture-based retrieval and answer scoring plus reviewer-visible artifacts. -- `Manual live smoke layer`: local configured-runtime checks for human debugging only, not automated portfolio assurance. +### Source Connectors -No retained automated pytest currently uses the `live` marker. +| Source | Source ID | Required Env Var | +|--------|-----------|------------------| +| Notion | `source_notion` | `NOTION_API_KEY` | +| Tistory | `source_tistory` | `TISTORY_BLOG_NAME` | +| GitHub | `source_github` | `CONTEXTWIKI_GITHUB_REPOSITORIES` | +| Obsidian | `source_obsidian` | `CONTEXTWIKI_OBSIDIAN_VAULT_PATH` | -### 1. Full gate +**GitHub example** ```bash -./scripts/verify_all.sh +CONTEXTWIKI_GITHUB_REPOSITORIES=eunhwa99/MCPContentSearch@main +CONTEXTWIKI_GITHUB_DEFAULT_REF=main +CONTEXTWIKI_GITHUB_MAX_FILES=200 +CONTEXTWIKI_GITHUB_MAX_FILE_BYTES=512000 +CONTEXTWIKI_GITHUB_USER_AGENT=ContextWikiBot/0.1 (+https://github.com/eunhwa99/MCPContentSearch) +GITHUB_TOKEN=... ``` -Includes syntax checks, Ruff, mypy, Bandit, the public contract layer, the -broader non-live pytest regression run, deterministic eval artifacts, and the -functional E2E gate. The full gate defaults `IS_TESTING=1` to mirror the -current CI env shape for non-live verification commands, even though the -current retained suite does not branch on that variable. +Important GitHub notes: + +- Use `owner/repo` or `owner/repo@ref`. +- Do not wrap `CONTEXTWIKI_GITHUB_REPOSITORIES` in quotes in `.env`. +- `GITHUB_TOKEN` is optional, but unauthenticated access is more rate-limited. -### 2. Public MCP contract layer +**Tistory example** ```bash -uv run --locked pytest -q tests/contracts/test_public_mcp_contracts.py tests/test_app_composition.py +TISTORY_BLOG_NAME=devlog ``` -This verifies that each retained public MCP tool has at least one real -`FastMCP.call_tool(...)` contract path with JSON payload assertions. +Use the blog subdomain only, not the full URL. For example, use `devlog`, not +`https://devlog.tistory.com`. -### 3. Deterministic functional E2E layer +**Obsidian example** ```bash -./scripts/verify_functional_e2e.sh +CONTEXTWIKI_OBSIDIAN_VAULT_PATH=/absolute/path/to/your/vault +CONTEXTWIKI_OBSIDIAN_MAX_FILES=2000 +CONTEXTWIKI_OBSIDIAN_MAX_FILE_BYTES=512000 ``` -This covers retained MCP flows with non-live tests and temporary storage. The -script now stays on the retained end-to-end flow modules instead of also -re-running broader contract/service suites. It also defaults `IS_TESTING=1` to -mirror the current CI env shape for non-live verification commands. +Use the vault root path, not an individual `.md` file path. + +### Search Query Rewrite (Optional) -### 4. Deterministic quality eval layer +Rewrites weak queries via an external LLM. Disabled by default. ```bash -uv run --locked pytest -q tests/evals -uv run --locked python scripts/run_contextwiki_eval.py --output-dir artifacts/contextwiki-evals -uv run --locked python scripts/run_contextwiki_eval.py --output-dir artifacts/contextwiki-evals --include-latency +CONTEXTWIKI_SEARCH_LLM_ENABLED=true +CONTEXTWIKI_SEARCH_LLM_PROVIDER=openai +CONTEXTWIKI_SEARCH_LLM_MODEL=gpt-4.1-mini +OPENAI_API_KEY=... ``` -`scripts/run_contextwiki_eval.py` is the deterministic reviewer-evidence runner. -It seeds temporary SQLite fixture data, swaps in fixture retrieval behavior -instead of the normal live indexing/vector setup, exercises retained retrieval -and grounded-answer scoring paths, and writes deterministic JSON artifacts -with: +> The default embedding path also usually requires `OPENAI_API_KEY` for real +> sync and search runs. + +--- + +## Usage + +ContextWiki runs as a local stdio MCP server. Your MCP client spawns the +server process and communicates with it over stdin/stdout. + +### Recommended: Claude Desktop via local `uv` + +This is the easiest setup path on macOS because: + +- Claude Desktop can spawn the server directly. +- ContextWiki can load `.env` at startup when launched from the repo root or + via `uv --directory ...`. +- Obsidian can use your real host vault path directly. +- You do not need Docker mounts for the vault. + +Do this in order: -- group-level mixed-query metrics -- suite pass/fail summaries +1. Create `.env` in your repo root. +2. Put your real values there. +3. Add the MCP entry below to Claude Desktop. +4. Fully restart Claude Desktop. +5. In a fresh Claude Desktop chat, ask it to call `list_sources()`. -When `--include-latency` is supplied, it also writes an informational -`runtime_metrics.json` file with retrieval/answer latency summaries. CI uploads -the deterministic JSON files as the `contextwiki-evals` artifact, while the -timing file is produced only by opt-in local latency runs. +Example `.env`: -### 5. Focused checks +```bash +OPENAI_API_KEY=... +NOTION_API_KEY=... +TISTORY_BLOG_NAME=devlog +CONTEXTWIKI_GITHUB_REPOSITORIES=eunhwa99/MCPContentSearch +CONTEXTWIKI_GITHUB_DEFAULT_REF=main +CONTEXTWIKI_OBSIDIAN_VAULT_PATH=/absolute/path/to/your/vault +``` + +On macOS, add this to +`~/Library/Application Support/Claude/claude_desktop_config.json`: + +```json +{ + "mcpServers": { + "content-search-server": { + "command": "/absolute/path/to/uv", + "args": [ + "--directory", + "/absolute/path/to/MCPContentSearch", + "run", + "--python", + "3.13", + "python", + "main.py" + ] + } + } +} +``` + +On macOS, find your `uv` path with: ```bash -uv run --locked pytest -q tests/fetching/test_connectors.py -uv run --locked pytest -q tests/api/test_tools_contract.py -uv run --locked pytest -q tests/contracts/test_public_mcp_contracts.py tests/test_app_composition.py -uv run --locked pytest -q tests/e2e/test_contextwiki_flow.py -uv run --locked pytest -q tests/search/test_context_service.py tests/search/test_answer_service.py -uv run --locked pytest -q tests/storage/test_metadata_store.py tests/indexing/test_ingestion_service.py -uv run --locked pytest -q tests/scripts/test_demo_public_flow.py -uv run --locked pytest -q tests/scripts/test_live_query_smoke.py -uv run --locked pytest -q tests/evals -uv run --locked python scripts/run_contextwiki_eval.py --output-dir artifacts/contextwiki-evals -uv run --locked python scripts/run_contextwiki_eval.py --output-dir artifacts/contextwiki-evals --include-latency +which uv ``` -`tests/scripts/test_live_query_smoke.py` only verifies the CLI contract, -redaction rules, and summary wording for the manual smoke script. It does not -turn the manual live smoke layer into automated live runtime verification. +You should not need to start `uv run python main.py` manually first. Claude +Desktop should launch the configured command automatically when it needs the +MCP server. -## 🎬 One-command Demo +### Claude Desktop via Docker -Run the retained slim tool-handler and service flow against the bundled public -sample vault: +Use this only if you specifically want the server to run inside Docker. +Build the image first so the `contextwiki:latest` tag exists locally: ```bash -./scripts/demo.sh +docker build -t contextwiki . +``` + +If you are not using Obsidian, you can omit the vault mount below. +If you are using Obsidian in Docker, keep both the mount and the `/vault` +environment setting shown after the JSON example. +If your `.env` still contains a host-only +`CONTEXTWIKI_OBSIDIAN_VAULT_PATH=/absolute/path/to/your/vault` from the local +`uv` setup, remove it or override it before using the no-Obsidian Docker +client path below. +On macOS, prefer the absolute Docker binary path from `which docker` if Claude +Desktop cannot find the `docker` command from its GUI environment. + +```json +{ + "mcpServers": { + "content-search-server": { + "command": "docker", + "args": [ + "run", + "--rm", + "-i", + "--env-file", + "/absolute/path/to/MCPContentSearch/.env", + "-v", + "contextwiki_data:/home/appuser/.mcp_content_search", + "contextwiki:latest" + ] + } + } +} +``` + +If you want Obsidian in the Docker-spawned client path, add this mount to the +JSON `args` list before `contextwiki:latest`: + +```json +"-v", +"/absolute/path/to/your/vault:/vault:ro" ``` -If you have not installed dependencies yet: +Then set this in `.env`: ```bash -uv sync --locked --python 3.13 --dev -./scripts/demo.sh +CONTEXTWIKI_OBSIDIAN_VAULT_PATH=/vault +``` + +Why both the mount and the env var matter: + +- `-v /absolute/path/to/your/vault:/vault:ro` exposes your host vault inside + the container. +- `CONTEXTWIKI_OBSIDIAN_VAULT_PATH=/vault` tells the app where that vault + lives inside the container. + +If you leave `CONTEXTWIKI_OBSIDIAN_VAULT_PATH` set to a host path like +`/Users/...` while using Docker, the container will not be able to read it. + +### Cursor + +Add to `.cursor/mcp.json` in your project root: + +```json +{ + "mcpServers": { + "content-search-server": { + "command": "/absolute/path/to/uv", + "args": [ + "--directory", + "/absolute/path/to/MCPContentSearch", + "run", + "--python", + "3.13", + "python", + "main.py" + ] + } + } +} ``` -What it does: +### After connecting + +1. Ask the AI to call `sync_all()` or `sync_source("source_notion")`. +2. Once synced, ask the AI to use `search_context()` or `search_documents()` + against your indexed sources. + +### Claude Desktop Client Workflow Example + +Example prompt: + +```text +find my projects about DynamoDB and organize it with STAR method. Answer in English +``` + +This screenshot shows a Claude Desktop client workflow that uses ContextWiki as +the retrieval backend. The final STAR-form prose is Claude output built on top +of retrieved notes, not a direct server-side answer format. + +![Claude Desktop using ContextWiki MCP as a retrieval backend before Claude composes the final STAR-style response](docs/images/claude-desktop-dynamodb-star-example.png) + +### Troubleshooting + +**If Claude cannot discover the MCP server** -1. Uses `sample_vault/` as a bounded public Obsidian source. -2. Syncs it through the retained `source_obsidian` connector. -3. By default, runs `search_context` with the canonical question shown in the transcript. -4. By default, runs `answer_with_citations` with that same canonical question. -5. Prints sync, search, and helper answer preview payloads. +- Recheck your Claude Desktop MCP config file. On macOS, the default path is + `~/Library/Application Support/Claude/claude_desktop_config.json`. +- Fully restart Claude Desktop after any config change. +- If needed, run the configured `command` and `args` manually outside Claude to + verify they start successfully. -This demo is non-live and: +**If Claude only works after you start the server manually** -- it uses temporary SQLite and Chroma storage -- it uses `MockEmbedding` instead of a live embedding provider -- it does not require Notion, Tistory, GitHub, or Obsidian credentials -- it forces `CONTEXTWIKI_SEARCH_LLM_ENABLED=false` even if your shell sets it -- it normalizes generated ids and timestamps so the transcript stays stable +- Claude Desktop is probably failing to launch the configured command. +- Test the exact `command` and `args` outside Claude first. -Use the answer step here as a grounded helper preview. In production MCP usage, -downstream LLMs usually turn the retrieved evidence into the final answer. -The default demo transcript is the canonical portfolio path: the same question -is used for retrieval and helper answer preview. -If you pass only `--query`, the demo reuses that same text for the answer step. -If you override both `--query` and `--question` with different values, read the -output as separate probes rather than one validated end-to-end chain. +**If GitHub source startup fails with `Invalid GitHub repository spec`** -Optional flags: +- Remove quotes from `CONTEXTWIKI_GITHUB_REPOSITORIES` in `.env`. +- Use `owner/repo` or `owner/repo@ref`, not a full GitHub URL. + +**If Obsidian works locally but not in Docker** + +- Make sure you both mounted the host vault and set + `CONTEXTWIKI_OBSIDIAN_VAULT_PATH=/vault`. +- The Docker mount path and the app env path are intentionally different. + +**If a source still appears disabled after config changes** + +- Fully restart the MCP client after updating config. +- In Claude Desktop, a chat refresh alone is often not enough. + +**If `sync_all()` takes too long** + +- Sync sources individually with `sync_source("source_notion")`, + `sync_source("source_github")`, and so on. +- GitHub sync can be slower for larger repositories. + +--- + +## Demo + +Run the full retained flow against the bundled sample vault: + +```bash +./scripts/demo.sh +``` + +- Uses temporary SQLite and Chroma state +- Uses `MockEmbedding` +- Requires no Notion, Tistory, GitHub, or Obsidian credentials ```bash -./scripts/demo.sh --json ./scripts/demo.sh --query "Why does ContextWiki validate citations through SQLite?" -./scripts/demo.sh --query "sqlite active evidence gate" --question "Why does ContextWiki validate citations through SQLite?" +./scripts/demo.sh --json ``` -## πŸ”Ž Manual Live Smoke Layer +--- -Run a real local retrieval check against your configured ContextWiki runtime: +## Verification + +If you only want a quick product-flow check, run: ```bash -uv run --locked python scripts/live_query_smoke.py --query "How does github sync work?" +./scripts/demo.sh ``` -This is the aligned same-input smoke path: when `--question` is omitted, the -script reuses the same text for retrieval and helper answer preview. If you -supply a different `--question`, the transcript explicitly labels the output as -separate probes so reviewers do not mistake it for one validated chain. - -Useful options: +If you changed code and want the main local verification gate, run: ```bash -uv run --locked python scripts/live_query_smoke.py --query "aws startup" -uv run --locked python scripts/live_query_smoke.py --query "aws startup" --question "How do I start EC2?" -uv run --locked python scripts/live_query_smoke.py --query "github sync" --source-id source_github --top-k 3 -uv run --locked python scripts/live_query_smoke.py --query "obsidian citation" --rewrite off -uv run --locked python scripts/live_query_smoke.py --query "obsidian citation" --json +./scripts/verify_all.sh ``` -Use this only after you have configured real sources in `.env`. The public demo -above is the safer first-run path for reviewers, and it is the only documented -path here that is intentionally keyless. - -All live-smoke output should be treated as local diagnostic data rather than -public sample content. The default text summary can still reveal local -source-derived titles, citation titles, and helper-answer text. `--json` removes -raw chunk text, previews, and direct `path`/`url` fields, but titles, -identifiers, and synthesized helper answer text may still reflect local source -content. - -This smoke is for retrieval and helper-surface validation. It is manual live -diagnostic evidence, not part of the automated portfolio gate. Check -`citations`, `used_chunks`, and, when using direct MCP calls with -`include_debug=True`, `debug` plus `debug_markdown`. - -## πŸ—ΊοΈ Project Map - -- `main.py`: FastMCP server composition -- `api/`: MCP-facing tool contracts and response formatting -- `core/`: shared models, exceptions, and utilities -- `environments/`: runtime configuration and secret/environment access -- `fetching/`: Notion, Tistory, GitHub, and Obsidian connectors/fetchers -- `indexing/`: chunking, deduplication, lifecycle coordination, and Chroma writes -- `search/`: ContextWiki retrieval, ranking, active metadata gates, and answers -- `storage/`: SQLite source/job/document/chunk lifecycle metadata -- `tests/`, `scripts/`: non-live verification harnesses and reviewer utilities - -## πŸ“– Additional Docs - -- [ContextWiki Core Understanding](docs/contextwiki-core-understanding.md) +--- + +## Project Structure + +```text +main.py FastMCP server entry point +api/ MCP tool handlers +core/ Shared models, exceptions, utilities +environments/ Env var and secret loading +fetching/ Source connectors (Notion, Tistory, GitHub, Obsidian) +indexing/ Chunking, deduplication, Chroma indexing +search/ Search, ranking, metadata gate, citation answer support +storage/ SQLite lifecycle management +tests/, scripts/ Verification harnesses and utilities +``` + +--- + +## Additional Docs + - [Architecture](.agents/docs/architecture.md) -- [ADRs](.agents/docs/adr/) -- [Harness engineering](.agents/docs/harness-engineering.md) -- [GitHub workflow policy](.agents/docs/github-workflow.md) -- [Plan log](docs/plan/) diff --git a/docs/contextwiki-core-understanding.md b/docs/contextwiki-core-understanding.md index 22700fb..c90a798 100644 --- a/docs/contextwiki-core-understanding.md +++ b/docs/contextwiki-core-understanding.md @@ -1,704 +1,11 @@ -# ContextWiki Core Understanding Note +# Deprecated: ContextWiki Core Understanding Note -Baseline: +This document is kept only as a compatibility stub for older links in plan +docs and historical references. -- Original baseline: `eunhwa99/MCPContentSearch` PR #2 -- Current update: slim MCP core refactor with PR #25 Obsidian restoration, - retaining GitHub/Notion/Tistory/Obsidian source sync, SQLite lifecycle - metadata, Chroma retrieval, and citation-backed answers. +The maintained design reference is now: -Goal: +- [Architecture](../.agents/docs/architecture.md) -This note is the maintained mental model for explaining ContextWiki's current -design intent, data flow, and limitations. When source connectors, ingestion, -lifecycle metadata, retrieval, citation, or answer behavior changes, update this -note together with README, architecture docs, ADRs, or plan docs as appropriate. - ---- - -## 0. One-line Summary - -ContextWiki is a focused MCP retrieval server. - -The core flow is: - -```text -source registration --> source sync --> document fetch from Notion, Tistory, GitHub, or Obsidian --> external_id / canonical_url / version_id / last_seen metadata normalize --> content_hash computation --> deterministic source-aware chunking for chunk-id comparison --> unchanged documents skip vector reindexing when hash and chunk ids match --> new, changed, reappeared, or rechunked documents are stored in Chroma --> source / job / document / chunk / tombstone metadata is stored in SQLite --> cleanup-capable sources tombstone stale documents after complete snapshots --> search_context may optionally rewrite weak queries through a configured LLM - when CONTEXTWIKI_SEARCH_LLM_ENABLED=true --> answer_with_citations inherits that same query-rewrite egress because it - calls search_context through search_context_for_answer / search_context --> search debug output reports whether rewrite was disabled, skipped, attempted, - or applied --> retrieval starts from Chroma candidates when available, then may add - metadata-fallback candidates before SQLite validation --> retrieval policy keeps vector score and rerank score separate in debug, uses - named rerank/rewrite thresholds in code, and no longer treats a bare - lowercase long token as an implicit GitHub repo probe without explicit - repository-style evidence such as GitHub/repository wording, a strong - repo-shaped anchor, or a curated compound alias --> retrieval candidates are hydrated through SQLite before citation use --> search_context asks Chroma for candidates, may add metadata fallback, and - validates managed hits through SQLite --> search_documents groups those validated candidates by document and keeps one - representative chunk per document for browsing --> answer_with_citations returns a helper evidence-gated answer preview -``` - -Interview or README version: - -```text -ContextWiki exposes MCP tools for source sync, incremental indexing, -citation-ready chunk search, grouped document browsing, context fetch, and a -helper evidence-gated answer preview surface. - -SQLite is the source of truth for lifecycle and citation metadata, while -ChromaDB is the semantic retrieval index. - -In normal production MCP usage, downstream LLMs usually turn retrieved evidence -into the final natural-language answer. `answer_with_citations` is useful here -as a preview/debug/eval helper, not as the repository's core answer contract. -``` - ---- - -## 1. Current Source Coverage - -ContextWiki currently has source connectors for: - -| Source | Source id | How it is configured | Notes | -| --- | --- | --- | --- | -| Notion | `source_notion` | `NOTION_API_KEY` | page/document source | -| Tistory | `source_tistory` | `TISTORY_BLOG_NAME` | blog post source | -| GitHub | `source_github` | `CONTEXTWIKI_GITHUB_REPOSITORIES`, optional `@ref`, `CONTEXTWIKI_GITHUB_DEFAULT_REF`, file limits, optional `GITHUB_TOKEN` | repository file source | -| Obsidian | `source_obsidian` | `CONTEXTWIKI_OBSIDIAN_VAULT_PATH`, `CONTEXTWIKI_OBSIDIAN_MAX_FILES`, `CONTEXTWIKI_OBSIDIAN_MAX_FILE_BYTES` | local Markdown vault source | - -Example: - -```bash -CONTEXTWIKI_GITHUB_REPOSITORIES="eunhwa99/MCPContentSearch@main" -``` - -Then: - -```text -sync_source("source_github") -``` - -fetches supported text/code/Markdown files from configured repositories, -converts each file into a `DocumentModel`, chunks it with line-range citation -metadata, indexes the chunks, and stores lifecycle metadata in SQLite. - -If `@ref` is omitted from a repository spec, the GitHub connector uses -`CONTEXTWIKI_GITHUB_DEFAULT_REF`, which defaults to `main`. Fetch completeness -and stale-cleanup eligibility also depend on `CONTEXTWIKI_GITHUB_MAX_FILES` and -`CONTEXTWIKI_GITHUB_MAX_FILE_BYTES`. `GITHUB_TOKEN` is optional, and -`CONTEXTWIKI_GITHUB_USER_AGENT` controls the request header used by the fetcher. - -Bulk retained-source sync is also available: - -```text -sync_all() -``` - -This fans out one concurrent `sync_source()` run per retained source. Each -source still keeps its own SQLite running-job guard, so a source that is -already syncing is reported as blocked in the aggregate result instead of -starting a second overlapping fetch. - -Obsidian example: - -```bash -CONTEXTWIKI_OBSIDIAN_VAULT_PATH="/path/to/temp-or-real-vault" -CONTEXTWIKI_OBSIDIAN_MAX_FILES=2000 -CONTEXTWIKI_OBSIDIAN_MAX_FILE_BYTES=512000 -``` - -Then: - -```text -sync_source("source_obsidian") -``` - -reads bounded `.md` notes from the configured local vault, skips hidden and -Obsidian metadata directories, preserves frontmatter-derived titles when -available, uses `obsidian://open` canonical URLs, and stores lifecycle metadata -in SQLite. If the configured vault exceeds the max file count or per-file byte -bound, sync fails as an incomplete snapshot before stale cleanup. It does not -require a live Obsidian app. - -If a retained connector is disabled for future syncs, already indexed active -documents are not automatically hidden from retrieval. They remain retrievable -until later cleanup or metadata changes mark them inactive. - ---- - -## 2. Overall Mental Model - -ContextWiki is easiest to understand as four layers. - -```mermaid -flowchart TD - Client["AI Client"] - MCP["FastMCP Server"] - Tools["MCP Tools
api/tools.py"] - Ingestion["IngestionService"] - Search["ContextSearchService"] - Answer["CitationAnswerService"] - Store["MetadataStore
SQLite"] - Vector["Vector Index
ChromaDB / LlamaIndex"] - Sources["Source Connectors
Notion / Tistory / GitHub / Obsidian"] - - Client --> MCP - MCP --> Tools - Tools --> Ingestion - Tools --> Search - Tools --> Answer - Ingestion --> Sources - Ingestion --> Store - Ingestion --> Vector - Search --> Vector - Search --> Store - Answer --> Search -``` - -Important design intent: - -```text -AI clients do not read the database directly. -AI clients call MCP tools. - -ChromaDB finds semantically relevant candidate chunks. -SQLite decides whether those chunks are currently active, citeable evidence. -``` - ---- - -## 3. MCP Tool Surface - -Current tools: - -| Tool | Use | -| --- | --- | -| `list_sources()` | see configured sources | -| `sync_source(source_id)` | refresh one source | -| `sync_all()` | refresh all retained sources concurrently and return aggregate results | -| `get_sync_status(source_id?)` | inspect source/job state | -| `search_context(query, filters, top_k, include_debug)` | find SQLite-validated evidence | -| `search_documents(query, filters, top_k)` | browse unique matching documents through one representative chunk per document | -| `fetch_context(document_id, chunk_id)` | inspect one document or chunk | -| `answer_with_citations(question, filters, top_k, include_debug)` | helper answer preview from validated evidence | - -The retained `search_context` response always includes a public `debug` key. -On the normal default path `api/tools.py` returns `debug={}` unless -`include_debug=True`, and when caller filters leave no matching public sources -it still returns a small populated `debug` object even if `include_debug=False`. - -The current debug payload includes rewrite decision fields: - -```text -rewrite_enabled -rewrite_attempted -rewrite_applied -rewrite_skipped_reason -``` - -These fields explain whether query rewrite was disabled, not needed, or tried -without producing an applied rewrite. - -Current rewrite policy keeps one more guardrail: a single high-confidence, -textually matching result may suppress rewrite even when `top_k` asks for more -rows, so `insufficient_candidate_count` alone does not force rewrite churn. - -Observed `rewrite_skipped_reason` values include: - -```text -disabled -not_needed -empty_result -rewrite_failed -no_matching_sources -no_term_groups -not_supported -``` - -Tool handlers call service boundaries and return JSON-safe values through -Pydantic `model_dump(mode="json")` where needed. - -`include_debug=True` is the retained explainability switch for retrieval and -the helper answer preview surface. It is additive and opt-in for populated retrieval reasoning -on the normal success path: default `search_context` payloads still carry -`debug={}`, while debug payloads expose structured retrieval reasoning without -dumping raw local DB contents. The current exception is the public -`no_matching_sources` fast path in `search_context`, which still emits a small -populated `debug` object even when `include_debug=False`. -`answer_with_citations` does not mirror that exception path. - -Verification layer split: - -- Public MCP contract layer: - real `FastMCP.call_tool(...)` payload checks for each retained public tool -- Deterministic functional E2E layer: - retained sync/search/fetch/answer flow modules over temp/local state via - `./scripts/verify_functional_e2e.sh` -- Deterministic quality eval layer: - fixture retrieval and answer scoring via `tests/evals` and - `scripts/run_contextwiki_eval.py` -- Manual live smoke layer: - `scripts/live_query_smoke.py` against a user's configured local runtime; - this is manual diagnostic evidence, not automated gate coverage -Retrieval split: - -```text -search_context -= chunk-level retrieval for evidence, grounding, and citations - -search_documents -= grouped document-browsing retrieval that reuses the same retained-source - candidates but collapses repeated chunks into one representative row per - document -``` - -Helper answer validation focuses on: - -```text -citations -used_chunks -debug -debug_markdown -``` - -Those fields help developers compare the response draft against the retrieved -evidence and decide whether a downstream LLM would have enough grounded context -to answer well. -`list_sources()` and `get_sync_status()` expose additive reviewer-readable -operational fields per source: - -```text -latest_success_at -latest_failure_at -document_count -chunk_count -latest_failure_reason -stale_cleanup_disabled_reason -``` - -Those fields come from SQLite lifecycle metadata plus runtime connector state. -Public error text still passes through the same redaction path used by other -sync/job payloads. - -For reviewer-driven live local verification, the repo also includes: - -```text -scripts/live_query_smoke.py -``` - -This script runs `search_context` and `answer_with_citations` against the local -configured environment through the retained tool handlers and prints a compact -safe summary of rewrite state, hits, helper answer preview status, and -citations. It is a manual live check surface, not a replacement for -deterministic non-live tests. - ---- - -## 4. Core Model Relationships - -Relevant files: - -```text -core/models.py -storage/metadata_store.py -``` - -The most important models are: - -| Model | Meaning | Main use | -| --- | --- | --- | -| `SourceModel` | Notion, Tistory, GitHub, or Obsidian source | source configuration and sync state | -| `SyncJobModel` | one source sync execution | success/failure and processing counts | -| `DocumentModel` | one original document | identity, content hash, lifecycle, source metadata | -| `ChunkModel` | searchable/citeable document segment | vector search and citations | -| `ContextSearchResult` | search response DTO | chunk + score + preview + citation metadata | -| `DocumentSearchResult` | grouped document search response DTO | one representative chunk-backed row per document | - -Key distinction: - -```text -DocumentModel = management and sync unit -Examples: one Notion page, one Tistory post, one GitHub file, one Obsidian note. - -ChunkModel = search and citation unit -Examples: a markdown section, a code line range, a plain-text window. -``` - ---- - -## 5. SQLite vs ChromaDB - -SQLite and Chroma both store chunk-related information, but they have different -jobs. - -```text -SQLite MetadataStore -= source/job/document/chunk lifecycle source of truth - -ChromaDB -= semantic retrieval candidate index -``` - -```mermaid -flowchart TD - A["Fetch from Notion / Tistory / GitHub / Obsidian"] - B["DocumentModel"] - C["DocumentChunker -> ChunkModel[]"] - D["SQLite documents
identity/content/hash/lifecycle"] - E["SQLite chunks
citation metadata and text"] - T["SQLite chunk_tombstones
historical chunk id provenance"] - F["ChromaDB
semantic vector retrieval"] - G["search_context(query)"] - H["Chroma candidate chunks"] - I["Ranking decides whether
metadata fallback is needed"] - J["Combined candidates
Chroma plus metadata fallback"] - N["SQLite active chunk validation"] - O["ContextSearchResult[]"] - K["search_documents(query)"] - L["group by document_id
pick representative chunk"] - M["DocumentSearchResult[]"] - - A --> B --> C - B --> D - C --> E - C --> F - E --> T - G --> H --> I --> J --> N --> O - K --> H - H --> I - I --> J - N --> L --> M -``` - -Search results are not trusted directly from Chroma. Retrieval starts with -vector candidates when available, may add metadata-fallback candidates when the -ranker decides lexical or source-aware recovery is needed, and then hydrates -and validates managed hits through SQLite before they become evidence, -citations, or grouped document rows. - -When `search_context(..., include_debug=True)` is used, the response now makes -that decision path visible with reviewer-readable fields such as: - -```text -intent.name / raw_name / confidence / reasons -query_rewrite.attempted / applied / reason -retrieval_queries -rewritten_queries -filters.source_ids -selected_results[] -``` - -`query_rewrite.reason` is intentionally coarse and stable. Current values are: - -```text -no_initial_candidates -insufficient_candidate_count -missing_textual_match -low_initial_score -``` - -The retrieval path now also makes a coarse intent-policy decision before final -reranking. The current retained intent classes are: - -```text -strict_lookup -broad_topic -list -comparison -``` - -This intent is deterministic and local-first. It is derived from normalized -query terms and anchors, then reused by ranking and grounded answer rendering. -It is not a separate MCP tool and does not require a live LLM call. - ---- - -## 6. Sync and Incremental Indexing - -Relevant files: - -```text -indexing/ingestion_service.py -indexing/chunker.py -indexing/indexer.py -storage/metadata_store.py -``` - -`IngestionService.sync_source()` is the core per-source business flow, and -`IngestionService.sync_all()` is the retained-source aggregate fan-out entrypoint. - -```text -sync_source(source_id) --> SourceRegistry connector lookup --> MetadataStore register_source + begin_sync_job guard --> connector.fetch_documents() --> normalize document source/id/url/version/last_seen --> compute content_hash --> deterministic source-aware chunking --> skip vector reindexing when active content_hash and chunk ids are unchanged --> index new/changed/reappeared/rechunked chunks in Chroma --> commit document + chunk metadata --> finalize successful sync --> tombstone stale documents when cleanup is safe --> best-effort vector cleanup -``` - -```text -sync_all() --> SourceRegistry retained source enumeration --> concurrent per-source sync_source() fan-out --> one aggregate summary with succeeded / failed / blocked counts --> per-source result payloads that preserve the latest job outcome -``` - -Reindexing still happens when: - -```text -- a tombstoned document reappears -- content changes -- generated chunk ids change -- document identity changes -``` - -Failed or partial syncs must not tombstone missing documents. - ---- - -## 7. Source-aware Chunking - -Relevant file: - -```text -indexing/chunker.py -``` - -Current chunking strategy: - -```text -Markdown with headings --> heading / section based chunks - -Markdown without headings --> deterministic plain-text fallback windows - -Code --> deterministic line-range chunks --> blank lines preserved --> long lines split by max_chars - -Plain text --> deterministic character windows -``` - -Each chunk carries citation metadata: - -```text -chunk_id -document_id -source_id -title -url -path -chunk_index -line_start -line_end -content_hash -version_id -updated_at -``` - ---- - -## 8. Document Identity and Versioning - -Relevant fields: - -| Field | Meaning | -| --- | --- | -| `source_id` | which ContextWiki source owns the document | -| `external_id` | stable id from the original system | -| `document_id` | internal canonical document id, usually `external_id` | -| `canonical_url` | primary URL used for citations and legacy matching | -| `version_id` | source version metadata, separate from stable identity | -| `last_seen_at` | last sync time that observed the document | -| `last_seen_sync_id` | job marker that observed the document | -| `deleted_at` | tombstone timestamp when missing from a cleanup-capable successful sync | - -Current mapping: - -```text -Notion --> external_id = page_id --> document_id = page_id - -Tistory --> external_id = blog_name:post_id --> document_id = blog_name:post_id - -GitHub --> external_id/document_id = github:owner/repo:path --> canonical_url = GitHub blob URL at the resolved commit --> version_id = blob SHA - -Obsidian --> external_id/document_id = relative/note/path.md --> canonical_url = obsidian://open URL for the configured vault note --> title = frontmatter title when present, otherwise note stem -``` - -Stable identity should not change just because content changes. `version_id` -records source revision metadata; `content_hash` records actual indexed content. - ---- - -## 9. Tombstones and Stale Vector Safety - -Tombstone means soft delete, not hard delete. - -```text -documents.deleted_at records when a document disappears from a cleanup-capable -source after a complete successful sync. -``` - -For GitHub, cleanup is limited to repository document-id prefixes fetched by the -connector, such as `github:eunhwa99/mcpcontentsearch:`. This keeps one -configured repository sync from tombstoning documents that belong to another -repository scope under the same `source_github` source id. - -For Obsidian, cleanup is allowed only after a complete local-vault snapshot. -Unreadable notes, traversal errors, or exceeded file count/byte bounds should -fail the sync before stale cleanup can tombstone missing active documents. - -Why not hard delete immediately? - -```text -Vector cleanup is best-effort. -If Chroma cleanup fails, SQLite still needs historical provenance to suppress -stale managed vector hits. -``` - -SQLite is the last defense against stale vector results. - ---- - -## 10. Answer Behavior - -`answer_with_citations` delegates retrieval to `ContextSearchService` and only -uses validated chunks as evidence. The answer response should make evidence -status explicit: - -```text -grounded / insufficient / error -``` - -The service must not invent citations from unmanaged or tombstoned chunks. If -retrieval cannot find enough active evidence, the response should say that the -available evidence is insufficient instead of fabricating an answer. - -When evidence is sufficient, the final rendered answer can now vary by request -shape while staying citation-grounded: - -```text -summary-style answer for ordinary grounded QA -Grounded List for collection requests -Grounded Comparison for comparison requests -``` - -This is still bounded synthesis, not open-ended chat. The answer service only -repackages retrieved evidence chunks and keeps the same insufficient-evidence -escape hatch when retrieval is weak. - -`search_documents` does not replace this evidence path. It is a browsing surface -for "which documents matched?" and keeps the highest-ranked chunk as the -representative row so callers can pivot into `fetch_context` or run a later -chunk-level citation workflow through `search_context` or -`answer_with_citations`. - ---- - -## 11. Current Limits - -Current intentional limits: - -- No generic website/docs crawler in production scope. -- No browser Web Console or local HTTP reviewer UI in production scope. -- No Auto Wiki generation or LLM wiki synthesis in production scope. -- No dynamic web fallback or legacy live search/index MCP tools in production - scope. -- No live Obsidian app, plugin, or API server requirement; Obsidian is a - configured local-vault source. -- Optional `CONTEXTWIKI_SEARCH_LLM_ENABLED=true` query rewrite is disabled by - default. If enabled, it may send the user query and normalized terms to the - configured provider, but it must not send source evidence, fetch external - source content, or mutate SQLite/Chroma. -- No deletion, reset, migration, or inspection of local user Chroma/SQLite data - without explicit approval. -- Live Notion, Tistory, GitHub, or embedding-provider validation is opt-in and - approval-gated. Real Obsidian vault validation is also approval-gated; - routine verification uses temporary vaults. - -Historical note: - -- ADR 0004's GitHub connector decision remains current. -- ADR 0004 now also documents the retained Obsidian local-vault connector. -- ADR 0004's website/docs connector portion is superseded for the current scope - by ADR 0006. -- ADR 0005's Auto Wiki decision is superseded for the current scope by ADR - 0006. - ---- - -## 12. Verification Model - -Retained verification layers: - -- Public MCP contract layer: - - `uv run --locked pytest -q tests/contracts/test_public_mcp_contracts.py tests/test_app_composition.py` -- Deterministic functional E2E layer: - - `./scripts/verify_functional_e2e.sh` -- Deterministic quality eval layer: - - `uv run --locked pytest -q tests/evals` - - `uv run --locked python scripts/run_contextwiki_eval.py --output-dir artifacts/contextwiki-evals` - - optional latency artifacts: - `uv run --locked python scripts/run_contextwiki_eval.py --output-dir artifacts/contextwiki-evals --include-latency` -- Manual live smoke layer: - - `uv run --locked python scripts/live_query_smoke.py --query "your query here"` -- Full local gate wrapper: - - `./scripts/verify_all.sh` - - wraps the automated layers above but does not replace the manual live smoke layer - -Functional verification should use fake or temporary persistence and must not -mutate local user Chroma/SQLite data. Live external checks require explicit -approval and should report the source used, safety plan, and whether any local -state was touched. -Obsidian verification should use temporary vault directories unless the user -explicitly approves a real vault path. - -The deterministic eval runner is the retained reviewer-evidence path for -retrieval quality changes. It uses temp SQLite fixture data, never touches user -Chroma/SQLite, and now emits deterministic JSON artifacts with: - -- mixed-query group breakdowns -- retrieval and answer suite pass/fail summaries - -When latency visibility is needed, the runner can also emit a separate -non-deterministic `runtime_metrics.json` file with wall-clock retrieval and -answer timings. That runtime file is an opt-in local artifact from the -latency-enabled command above; the current CI `contextwiki-evals` artifact -uploads only the deterministic retrieval-quality JSON files. +Do not update this file for ordinary documentation changes. Update +`.agents/docs/architecture.md` instead. diff --git a/docs/images/claude-desktop-dynamodb-star-example.png b/docs/images/claude-desktop-dynamodb-star-example.png new file mode 100644 index 0000000000000000000000000000000000000000..8e24f37394fff0a7f5243896d5f63afdf433c9f2 GIT binary patch literal 257662 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%0A|3U3}k}9>IX!^z$`b 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 z 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%0D$e~rPdM?vbgF6s!BFASU$e1R{bfiJ`A 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 M{6o1ynWr!R9}mmP3IG5A literal 0 HcmV?d00001 diff --git a/docs/plan/2026-06-15-readme-mcp-docker-obsidian.md b/docs/plan/2026-06-15-readme-mcp-docker-obsidian.md new file mode 100644 index 0000000..66cafbd --- /dev/null +++ b/docs/plan/2026-06-15-readme-mcp-docker-obsidian.md @@ -0,0 +1,130 @@ +# README and Docs Simplification + +## User request + +Update the reader-facing docs so setup mistakes encountered during Docker, +Claude Desktop MCP registration, GitHub repository config, and Obsidian vault +wiring are less likely to happen again. Consolidate the maintained +architecture/explanation path onto `README.md` plus `.agents/docs/architecture.md` +so readers do not need a separate core-understanding note or ADR trail for +current setup. + +## Branch preflight result + +| Phase | Status | Summary | Evidence | +| --- | --- | --- | --- | +| Branch preflight | completed | Started from a clean detached worktree, fetched `origin/main`, and created `feature/readme-mcp-docker-obsidian` from `origin/main` because local `main` is checked out in another linked worktree. | `git status --short`; `git branch --show-current`; `git branch -vv`; `git worktree list`; `git fetch origin main`; `git switch -c feature/readme-mcp-docker-obsidian origin/main` | + +## Scope and non-goals + +- Clarify README guidance for: + - quoted `.env` pitfalls in `CONTEXTWIKI_GITHUB_REPOSITORIES` + - Tistory blog-name format expectations + - Docker Obsidian vault mount requirements + - stdio MCP behavior in Docker and Claude Desktop + - Claude Desktop launching the server automatically +- Simplify the active docs structure so `Architecture` is the single maintained + design/reference document beyond the README. + +Non-goals: + +- No runtime behavior changes +- No Claude Desktop config file edits as part of this repo change +- No connector or Dockerfile code changes +- No historical plan-doc cleanup + +## Acceptance criteria + +- README no longer suggests `.env` examples that are known to break the current + parser for GitHub repository specs. +- README explicitly explains that Dockerized Obsidian sync needs both a mount + and a container-visible vault path. +- README explains that this MCP server is stdio-based, so detached Docker runs + are not the normal MCP client integration path. +- README includes a Claude Desktop example that can use Docker as the spawned + MCP command. +- README no longer points readers to `docs/contextwiki-core-understanding.md` + or ADRs as required current docs. +- Harness docs point to `.agents/docs/architecture.md` as the active design + source of truth. +- `docs/contextwiki-core-understanding.md` remains only as a compatibility stub + for historical links and redirects readers to `Architecture`. + +## Step breakdown + +1. Review the current README and harness/doc structure against the observed + setup failures and current duplicate-doc paths. +2. Update README examples and troubleshooting so the documented path matches the + current parser and MCP runtime model. +3. Remove active references that force readers through the extra + core-understanding and ADR path, and keep architecture as the maintained + design note. +4. Run docs-only verification checks. + +## Files likely to change + +- `README.md` +- `AGENTS.md` +- `.agents/docs/architecture.md` +- `.agents/docs/harness-engineering.md` +- `.agents/docs/adr/README.md` +- `.agents/docs/github-workflow.md` +- `.agents/skills/harness-engineering/SKILL.md` +- `.agents/skills/harness-plan/SKILL.md` +- `.agents/skills/harness-review/SKILL.md` +- `.agents/skills/harness-functional-smoke/SKILL.md` +- `.agents/skills/harness-implement/SKILL.md` +- `docs/contextwiki-core-understanding.md` +- `docs/images/claude-desktop-dynamodb-star-example.png` +- `docs/plan/README.md` +- `docs/plan/2026-06-15-readme-mcp-docker-obsidian.md` + +## Test and verification plan + +- `rg --files AGENTS.md README.md docs .agents/docs .agents/skills` +- `git status --short --branch` +- `git diff --check` +- Stage docs-only files +- `git diff --cached --check` + +## Functional smoke matrix or planned matrix rows before review + +| Surface | Planned check | Why | +| --- | --- | --- | +| README setup guidance | manual diff inspection | Docs-only request; no runtime behavior change | +| Docs structure redirects | manual diff inspection | Confirm architecture-only active-doc path, ADR archive wording, and compatibility-stub behavior stay reader-clear | +| Harness and instruction contracts | manual diff inspection | Confirm AGENTS, harness docs, phase skills, and plan template all reflect the same architecture-first active-doc policy | + +## Architecture constraints + +- Follow `.agents/docs/architecture.md` slim MCP scope and keep README aligned + with retained MCP tools and local source connectors. +- Preserve the current documented local-vault Obsidian behavior and + client-attached stdio MCP framing. + +## Risks and rollback notes + +- Risk: over-documenting one client path while obscuring the local `uv` path. + Mitigation: keep both local and Docker/client-spawn paths explicit. +- Rollback: revert the staged docs bundle for this work item if the new + architecture/README simplification wording proves inaccurate. + +## Progress log + +| Phase | Status | Summary | Evidence | +| --- | --- | --- | --- | +| Branch preflight | completed | Created `feature/readme-mcp-docker-obsidian` from `origin/main` in this clean worktree. | Git evidence above | +| Planning | completed | Expanded the earlier README-only scope into a docs-structure simplification. Direct implementation remains appropriate because this is still an atomic docs-only change owned by one author across tightly related files. | This plan | +| README update | completed | Rebased the README structure around the simplified reader flow, then folded in the reproduced GitHub quoting, Tistory format, Docker stdio, Claude Desktop auto-launch, and Dockerized Obsidian mount pitfalls so the documented path is safer to follow verbatim. | `README.md` | +| README Docker clarification follow-up | completed | Added an explicit split between the minimum Docker run example and the Obsidian-enabled Docker run example so readers do not assume the vault mount is optional when `source_obsidian` is in use. | `README.md` | +| README Claude Desktop example | completed | Added a real Claude Desktop screenshot plus a short example prompt so readers can see a Claude client workflow using ContextWiki after setup. | `README.md`; `docs/images/claude-desktop-dynamodb-star-example.png` | +| README wording cleanup follow-up | completed | Removed the extra explanatory sentence under the Claude Desktop example so the README stays focused on the prompt plus screenshot evidence only. | `README.md` | +| Functional smoke | completed | Completed the docs-only smoke rows by manually inspecting the README setup flow, Docker/Obsidian notes, Claude Desktop example placement, architecture-only active-doc wording, ADR archive wording, compatibility-stub redirect behavior, and harness/instruction-contract consistency against the final staged wording. | `README.md`; `AGENTS.md`; `.agents/docs/harness-engineering.md`; `.agents/docs/github-workflow.md`; `.agents/skills/harness-*/SKILL.md`; `.agents/docs/adr/README.md`; `docs/contextwiki-core-understanding.md`; `docs/plan/README.md`; matrix rows above | +| Review-fix pass 1 | completed | Resolved reviewer findings by converting `.agents/docs/adr/README.md` into a historical archive note instead of an active harness contract, and by restoring `docs/contextwiki-core-understanding.md` as a compatibility stub that redirects readers to `Architecture` so older plan-doc links do not break. | `.agents/docs/adr/README.md`; `docs/contextwiki-core-understanding.md` | +| Review-fix pass 2 | completed | Clarified that the documented Claude Desktop config path is the macOS path, added the missing Docker image build prerequisite, fixed the stale AGENTS connector inventory to include Obsidian, and synced the plan file list with the actual staged scope. | `README.md`; `AGENTS.md`; `docs/plan/2026-06-15-readme-mcp-docker-obsidian.md` | +| Review-fix pass 3 | completed | Reframed the screenshot section as a Claude Desktop client workflow example rather than a direct server-answer capability, and updated the plan template wording from `Architecture/ADR constraints` to `Architecture constraints` so active plan guidance matches the simplified harness contract. | `README.md`; `docs/plan/README.md`; `docs/plan/2026-06-15-readme-mcp-docker-obsidian.md` | +| Docs structure simplification | completed | Removed the active `Core Understanding` reader path from README and harness flows, dropped current-reader ADR dependencies from active harness docs, and positioned `Architecture` as the single maintained design reference beyond the README while keeping compatibility stubs for historical links. | `README.md`; `AGENTS.md`; `.agents/docs/architecture.md`; `.agents/docs/adr/README.md`; harness docs/skills; `docs/contextwiki-core-understanding.md` | +| Review-fix pass 4 | completed | Separated local `uv` prerequisites from Docker prerequisites, clarified that the Docker Claude Desktop config is minimal by default and needs an extra mount only for Obsidian, and synced the plan language with the final compatibility-stub outcome for `docs/contextwiki-core-understanding.md`. | `README.md`; `docs/plan/2026-06-15-readme-mcp-docker-obsidian.md` | +| Review-fix pass 5 | completed | Added an explicit warning about reusing a host-path Obsidian env var with the minimum Docker example, made the compatibility stub title visibly deprecated, and refreshed the plan wording so the final artifact stays aligned with the stub-based outcome. | `README.md`; `docs/contextwiki-core-understanding.md`; `docs/plan/2026-06-15-readme-mcp-docker-obsidian.md` | +| Docs verification | completed | Reran docs-only file listing, branch status, whitespace checks, staged the final docs set including the compatibility stub, and confirmed the cached diff is clean after the structure simplification. | `rg --files AGENTS.md README.md docs .agents/docs .agents/skills`; `git status --short --branch`; `git diff --check`; `git add ...`; `git diff --cached --check` | +| Final review gate | completed | Ran repeated fresh five-reviewer `$subagent-review-loop` passes while fixing every actionable finding. The newest pass converged to bookkeeping-only plan-state reminders, which were applied here before PR delivery. | reviewer outputs from the newest pass in this thread; latest plan rows updated to match delivery state | diff --git a/docs/plan/README.md b/docs/plan/README.md index 20ff057..986b1d3 100644 --- a/docs/plan/README.md +++ b/docs/plan/README.md @@ -32,7 +32,7 @@ Each plan document should include: - Files likely to change - Test and verification plan - Functional smoke matrix or planned matrix rows before review -- Architecture/ADR constraints +- Architecture constraints - Risks and rollback notes - Progress log From 0d4b20875d62b030b0598a261f54fd95a4873db2 Mon Sep 17 00:00:00 2001 From: eunhwa99 Date: Mon, 15 Jun 2026 17:11:36 +0900 Subject: [PATCH 2/2] docs: fold core understanding into architecture --- .agents/docs/architecture.md | 258 ++++++- docs/contextwiki-core-understanding.md | 714 ------------------ .../2026-06-15-readme-mcp-docker-obsidian.md | 25 +- 3 files changed, 271 insertions(+), 726 deletions(-) delete mode 100644 docs/contextwiki-core-understanding.md diff --git a/.agents/docs/architecture.md b/.agents/docs/architecture.md index 52ea4ea..49b23ea 100644 --- a/.agents/docs/architecture.md +++ b/.agents/docs/architecture.md @@ -37,6 +37,35 @@ The current architecture does not include a production Web Console, Auto Wiki generation, generic website/docs crawling, dynamic web fallback, or legacy live-search/indexing MCP tools. +## Core Mental Model + +The shortest accurate description of the current system is: + +```text +configured source sync +-> normalized document identity and content hashes +-> deterministic chunking +-> Chroma semantic retrieval candidates +-> SQLite active-document validation +-> chunk evidence, grouped document browsing, or citation-gated answer helpers +``` + +Keep these design assumptions aligned with implementation: + +- Source sync is the only supported ingestion entrypoint for retained sources. +- SQLite is the lifecycle source of truth for source status, sync jobs, + document/chunk activity, and citation-safe evidence gating. +- Chroma is the retrieval accelerator, not the final authority on whether a hit + is still active or citeable. +- `search_context` is the primary chunk-level evidence surface. +- `search_documents` is the grouped browsing surface built from the same + validated retrieval path. +- `answer_with_citations` is a helper answer surface built on top of validated + evidence, not a separate retrieval stack. +- Search query rewrite is optional, disabled by default, and any egress it + performs is limited to query rewriting rather than source fetching or data + mutation. + ## Data Flow ```text @@ -53,6 +82,33 @@ list_sources / get_sync_status -> MetadataStore SQLite source/job metadata ``` +Reviewer-facing source/status fields should remain understandable from the +maintained docs. Current status payloads are expected to center on fields such +as: + +```text +latest_success_at +latest_failure_at +document_count +chunk_count +latest_failure_reason +stale_cleanup_disabled_reason +``` + +Those fields explain recent source health, retained indexed volume, and whether +cleanup is intentionally disabled for safety. + +Running-job ownership is part of that status story. A source reports as +effectively blocked when SQLite still sees an active sync owner/heartbeat for +that source, which prevents overlapping syncs from starting. + +That blocked state is intentionally recoverable rather than permanent. Recovery +distinguishes stale jobs, unowned-job grace, dead owners, and the container +PID-reuse case where an old and new container can both appear as PID `1`. +During that same-PID edge case, reclaim falls back to the running job's own +heartbeat staleness window instead of reclaiming immediately from a transient +owner mismatch. + Source sync flow: ```text @@ -66,6 +122,25 @@ sync_source -> MetadataStore SQLite source/job/document/chunk/tombstone metadata ``` +Retained sync safety rule: + +- Tombstoning stale documents is allowed only for cleanup-capable sources after + a complete successful snapshot. Failed or incomplete syncs must not tombstone + documents simply because they were absent from a partial fetch. + +Bulk source sync flow: + +```text +sync_all + -> enumerate retained configured sources + -> start one sync_source task per source + -> preserve per-source running-job guards in SQLite + -> aggregate per-source results as succeeded, failed, blocked, or skipped + -> return completed only when results are succeeded/skipped only + -> return partial for mixed success/skip/failure/block combinations + -> return failed when every source failed or was blocked by failure conditions +``` + Retrieval and answer flow: ```text @@ -123,6 +198,101 @@ New behavior should start in the module that owns the relevant responsibility. Avoid adding cross-module shortcuts in `api/tools.py` when a service boundary is more appropriate. +## Incremental Indexing and Tombstone Safety + +The retained ingestion model depends on stable document identity plus cautious +cleanup: + +- Source connectors should preserve stable document identity fields such as + source-specific external ids, canonical URLs, and version or freshness + markers when available. +- Indexing compares content hashes and chunk ids so unchanged documents can skip + unnecessary vector rewrites. +- Reappeared or reactivated documents should return to the active set through a + normal successful sync rather than through ad hoc metadata repair. +- Tombstone and stale-cleanup behavior is safety-gated. Missing documents may be + marked stale only after a cleanup-capable source completes a full successful + snapshot. Failed, partial, or byte/file-limit-truncated snapshots must not + tombstone documents simply because they were absent from that incomplete run. + +## Source Identity and Chunking Model + +The retained indexing model distinguishes document management from chunk +retrieval: + +- `DocumentModel` is the sync and lifecycle unit. +- Chunks are the search and citation unit. +- Chunk metadata carries the reviewer-visible citation context used by + `search_context`, `search_documents`, and `answer_with_citations`. + +Stable identity and version expectations stay source-aware: + +- Notion: page id drives stable identity. +- Tistory: `blog_name:post_id` drives stable identity. +- GitHub: repository path drives stable identity, while blob SHA is revision + metadata. +- Obsidian: relative note path drives stable identity, while the + `obsidian://open` URL stays the citation-friendly canonical URL. + +The lifecycle fields that matter for reviewer understanding are: + +```text +external_id +document_id +canonical_url +version_id +last_seen_at +last_seen_sync_id +deleted_at +``` + +Current chunking remains deterministic and source-aware: + +- heading-based markdown chunking when structure exists +- deterministic plain-text fallback windows when structure does not +- line-range-preserving code chunking for citeable code evidence + +Representative citation metadata per chunk should remain understandable from the +maintained docs: + +```text +chunk_id +document_id +source_id +title +url +path +chunk_index +line_start +line_end +content_hash +version_id +updated_at +``` + +That deterministic chunking plus stable identity is what makes unchanged-doc +skip behavior, reappeared-document recovery, and citation stability predictable +across syncs. + +## Four-Layer View + +ContextWiki is easiest to reason about as four layers: + +```text +MCP client +-> FastMCP tool surface +-> ingestion/search services +-> SQLite metadata plus Chroma retrieval storage +``` + +That division is intentional: + +- MCP clients interact with tools, not storage internals. +- Service boundaries own ingestion, retrieval, ranking, and answer assembly. +- Chroma finds semantically relevant candidates. +- SQLite decides whether those candidates are still active, valid, and safe to + return as evidence. + ## MCP Tool Contract Current tools: @@ -139,6 +309,13 @@ Current tools: Contract intent: - `search_context` remains the chunk-level evidence and citation surface. +- `sync_all` is an aggregate orchestration helper, not a separate ingestion + stack. It fans out retained-source `sync_source` runs concurrently, preserves + each source's existing running-job guard, and reports mixed source outcomes + truthfully instead of pretending the whole batch succeeded when one source was + blocked or failed. Disabled or unconfigured sources may surface as `skipped`, + and the top-level batch status remains `completed` only when the aggregate + outcomes are limited to `succeeded` and `skipped`. - `search_documents` is additive and document-oriented: it uses the same retained-source retrieval path but returns one representative chunk-backed row per document for browsing. @@ -153,6 +330,46 @@ Contract intent: `include_debug=False`. - `answer_with_citations` keeps `include_debug` as a true opt-in debug surface and does not mirror the `no_matching_sources` exception path. +- Retrieval policy keeps vector retrieval, metadata fallback, and rerank/debug + reporting as distinct concerns. Query rewrite, fallback candidate addition, + and final SQLite validation should stay inspectable without blurring them into + one opaque score. +- When query rewrite debug is included, the caller-visible explanation should + keep the current public fields aligned with behavior: `rewrite_enabled`, + `rewrite_attempted`, `rewrite_applied`, and `rewrite_skipped_reason` explain + whether rewrite was disabled, skipped, attempted but unused, or actually + applied before retrieval. +- The top-level `rewrite_skipped_reason` field should stay coarse and + reviewer-readable. Current values explain state such as `disabled`, + `not_needed`, `rewrite_failed`, `no_matching_sources`, and `no_term_groups`. +- The nested `debug.query_rewrite.reason` field is the retrieval-pipeline + explanation vocabulary. Current stable values include + `no_initial_candidates`, `missing_textual_match`, + `insufficient_candidate_count`, and `low_initial_score`. +- A single strong exact-match candidate can also suppress rewrite even when the + caller asked for a larger `top_k`; that guardrail keeps clearly correct + direct hits from being rewritten unnecessarily. + +Retained debug-oriented answer inspection surfaces should stay documented and +stable enough for local evaluation and reviewer use: + +- `search_context` debug explains retrieval/rewrite decisions. +- Current reviewer-facing search debug commonly includes retrieval query and + result-selection surfaces such as `retrieval_queries`, + `rewritten_queries`, and `selected_results[]`. +- Deterministic intent policy should remain readable in debug output when + present. The current retained intent vocabulary includes `strict_lookup`, + `broad_topic`, `list`, and `comparison`, and that intent is reused by + ranking and grounded answer rendering. +- `answer_with_citations` exposes helper-answer inspection surfaces such as + `citations`, `used_chunks`, `debug`, and `debug_markdown` when the current + implementation returns them. +- Public debug payloads may also surface deterministic intent and retrieval + inspection sections such as `intent.*`, `retrieval_queries`, + `rewritten_queries`, and `selected_results[]` so reviewers can explain why a + grounded result set was chosen. +- Eval and reviewer workflows should be able to explain why a retrieval or + answer path was chosen without reading raw vector-store internals. When changing a tool: @@ -181,6 +398,14 @@ ContextWiki source/job/document/chunk lifecycle and citation metadata. SQLite is the authoritative active-document gate. Stale Chroma hits must be filtered through SQLite metadata before being returned as evidence. +GitHub stale cleanup remains repository-prefix scoped under the shared +`source_github` source id. A sync for one configured repository must not +tombstone documents that belong to another repository prefix. + +Soft-delete provenance matters here: SQLite tombstone metadata must remain able +to suppress stale managed vector hits even when best-effort vector cleanup +cannot remove every old Chroma candidate immediately. + ## External Services and Local Sources Current integrations and local configured sources: @@ -236,6 +461,24 @@ Domain exceptions live in `core/exceptions.py`. Use the smallest useful check first. +The maintained verification model is layered: + +- docs-only verification for README, harness docs, plans, and other markdown + changes +- focused syntax, import, or targeted pytest checks for the directly changed + modules +- retained functional E2E coverage for MCP-visible sync/search/fetch/answer + workflows +- full-wrapper verification through `./scripts/verify_all.sh` when the work item + needs the repo's broader default gate instead of only a narrow focused check +- optional manual live smoke through `scripts/live_query_smoke.py` only when the + user explicitly approves real configured-source validation +- retained local eval surfaces such as `python scripts/run_contextwiki_eval.py` + when the change affects a quality-sensitive retrieval or answer surface that + already has modeled eval coverage +- retained eval or higher-level verification only when the change touches an + already-modeled quality-sensitive surface such as retrieval or answer quality + - Docs-only changes: path listing, `git status --short --branch`, `git diff --check`, then stage relevant docs-only files and run `git diff --cached --check` so new docs are covered. @@ -244,7 +487,9 @@ Use the smallest useful check first. - Unit/integration tests: `uv run --locked pytest -m "not live"` when the uv workspace is healthy. - MCP contract: focused tests around `register_tools` and retained tool - functions. + functions. The strongest public contract layer uses real + `FastMCP.call_tool(...)` payload checks rather than only internal helper + assertions. - Search/indexing/storage: temp Chroma path, temp SQLite path, or mock collection; avoid user data. - Fetching: mocked Notion/Tistory/GitHub responses and temporary Obsidian vaults; @@ -252,6 +497,17 @@ Use the smallest useful check first. - Functional E2E: `./scripts/verify_functional_e2e.sh`, which must cover retained MCP sync/search/fetch/answer paths, including grouped document browsing, without browser, wiki, live API, or LLM dependencies. +- Full wrapper: `./scripts/verify_all.sh`, which includes compile, lint, type, + non-live pytest, and the functional E2E gate when that broader default repo + verification is required. +- Manual live smoke: `python scripts/live_query_smoke.py`, only with explicit + approval because it can touch real configured sources or local user data. +- Retained eval runner: `PYTHONPATH=. python scripts/run_contextwiki_eval.py` + or the repo wrapper that invokes it, used when a work item changes retrieval + or answer quality on a modeled local eval surface. +- Deterministic reviewer-visible eval artifacts should stay separate from + optional runtime or latency metrics such as `runtime_metrics.json` so repeated + runs remain comparable. ## Harness Usage diff --git a/docs/contextwiki-core-understanding.md b/docs/contextwiki-core-understanding.md deleted file mode 100644 index 40a613e..0000000 --- a/docs/contextwiki-core-understanding.md +++ /dev/null @@ -1,714 +0,0 @@ -# Deprecated: ContextWiki Core Understanding Note - -This document is kept only as a compatibility stub for older links in plan -docs and historical references. - -The maintained design reference is now: - -- [Architecture](../.agents/docs/architecture.md) - -Do not update this file for ordinary documentation changes. Update -`.agents/docs/architecture.md` instead. - -The historical reference content from the previous maintained version is -preserved below for old links and archival reading only. - -This note is the maintained mental model for explaining ContextWiki's current -design intent, data flow, and limitations. When source connectors, ingestion, -lifecycle metadata, retrieval, citation, or answer behavior changes, update this -note together with README, architecture docs, ADRs, or plan docs as appropriate. - ---- - -## 0. One-line Summary - -ContextWiki is a focused MCP retrieval server. - -The core flow is: - -```text -source registration --> source sync --> document fetch from Notion, Tistory, GitHub, or Obsidian --> external_id / canonical_url / version_id / last_seen metadata normalize --> content_hash computation --> deterministic source-aware chunking for chunk-id comparison --> unchanged documents skip vector reindexing when hash and chunk ids match --> new, changed, reappeared, or rechunked documents are stored in Chroma --> source / job / document / chunk / tombstone metadata is stored in SQLite --> cleanup-capable sources tombstone stale documents after complete snapshots --> search_context may optionally rewrite weak queries through a configured LLM - when CONTEXTWIKI_SEARCH_LLM_ENABLED=true --> answer_with_citations inherits that same query-rewrite egress because it - calls search_context through search_context_for_answer / search_context --> search debug output reports whether rewrite was disabled, skipped, attempted, - or applied --> retrieval starts from Chroma candidates when available, then may add - metadata-fallback candidates before SQLite validation --> retrieval policy keeps vector score and rerank score separate in debug, uses - named rerank/rewrite thresholds in code, and no longer treats a bare - lowercase long token as an implicit GitHub repo probe without explicit - repository-style evidence such as GitHub/repository wording, a strong - repo-shaped anchor, or a curated compound alias --> retrieval candidates are hydrated through SQLite before citation use --> search_context asks Chroma for candidates, may add metadata fallback, and - validates managed hits through SQLite --> search_documents groups those validated candidates by document and keeps one - representative chunk per document for browsing --> answer_with_citations returns a helper evidence-gated answer preview -``` - -Interview or README version: - -```text -ContextWiki exposes MCP tools for source sync, incremental indexing, -citation-ready chunk search, grouped document browsing, context fetch, and a -helper evidence-gated answer preview surface. - -SQLite is the source of truth for lifecycle and citation metadata, while -ChromaDB is the semantic retrieval index. - -In normal production MCP usage, downstream LLMs usually turn retrieved evidence -into the final natural-language answer. `answer_with_citations` is useful here -as a preview/debug/eval helper, not as the repository's core answer contract. -``` - ---- - -## 1. Current Source Coverage - -ContextWiki currently has source connectors for: - -| Source | Source id | How it is configured | Notes | -| --- | --- | --- | --- | -| Notion | `source_notion` | `NOTION_API_KEY` | page/document source | -| Tistory | `source_tistory` | `TISTORY_BLOG_NAME` | blog post source | -| GitHub | `source_github` | `CONTEXTWIKI_GITHUB_REPOSITORIES`, optional `@ref`, `CONTEXTWIKI_GITHUB_DEFAULT_REF`, file limits, optional `GITHUB_TOKEN` | repository file source | -| Obsidian | `source_obsidian` | `CONTEXTWIKI_OBSIDIAN_VAULT_PATH`, `CONTEXTWIKI_OBSIDIAN_MAX_FILES`, `CONTEXTWIKI_OBSIDIAN_MAX_FILE_BYTES` | local Markdown vault source | - -Example: - -```bash -CONTEXTWIKI_GITHUB_REPOSITORIES="eunhwa99/MCPContentSearch@main" -``` - -Then: - -```text -sync_source("source_github") -``` - -fetches supported text/code/Markdown files from configured repositories, -converts each file into a `DocumentModel`, chunks it with line-range citation -metadata, indexes the chunks, and stores lifecycle metadata in SQLite. - -If `@ref` is omitted from a repository spec, the GitHub connector uses -`CONTEXTWIKI_GITHUB_DEFAULT_REF`, which defaults to `main`. Fetch completeness -and stale-cleanup eligibility also depend on `CONTEXTWIKI_GITHUB_MAX_FILES` and -`CONTEXTWIKI_GITHUB_MAX_FILE_BYTES`. `GITHUB_TOKEN` is optional, and -`CONTEXTWIKI_GITHUB_USER_AGENT` controls the request header used by the fetcher. - -Bulk retained-source sync is also available: - -```text -sync_all() -``` - -This fans out one concurrent `sync_source()` run per retained source. Each -source still keeps its own SQLite running-job guard, so a source that is -already syncing is reported as blocked in the aggregate result instead of -starting a second overlapping fetch. The running-job guard also refreshes a -sync-owner heartbeat beside the per-job heartbeat during active running-job -metadata updates. When a previous owner still looks alive only because both old -and new containers report the app as PID `1`, startup recovery and -`begin_sync_job()` specifically fall back to the running job's own staleness -window before reclaiming the source, instead of treating the short unowned-job -grace as proof that the previous sync is dead. - -Obsidian example: - -```bash -CONTEXTWIKI_OBSIDIAN_VAULT_PATH="/path/to/temp-or-real-vault" -CONTEXTWIKI_OBSIDIAN_MAX_FILES=2000 -CONTEXTWIKI_OBSIDIAN_MAX_FILE_BYTES=512000 -``` - -Then: - -```text -sync_source("source_obsidian") -``` - -reads bounded `.md` notes from the configured local vault, skips hidden and -Obsidian metadata directories, preserves frontmatter-derived titles when -available, uses `obsidian://open` canonical URLs, and stores lifecycle metadata -in SQLite. If the configured vault exceeds the max file count or per-file byte -bound, sync fails as an incomplete snapshot before stale cleanup. It does not -require a live Obsidian app. - -If a retained connector is disabled for future syncs, already indexed active -documents are not automatically hidden from retrieval. They remain retrievable -until later cleanup or metadata changes mark them inactive. - ---- - -## 2. Overall Mental Model - -ContextWiki is easiest to understand as four layers. - -```mermaid -flowchart TD - Client["AI Client"] - MCP["FastMCP Server"] - Tools["MCP Tools
api/tools.py"] - Ingestion["IngestionService"] - Search["ContextSearchService"] - Answer["CitationAnswerService"] - Store["MetadataStore
SQLite"] - Vector["Vector Index
ChromaDB / LlamaIndex"] - Sources["Source Connectors
Notion / Tistory / GitHub / Obsidian"] - - Client --> MCP - MCP --> Tools - Tools --> Ingestion - Tools --> Search - Tools --> Answer - Ingestion --> Sources - Ingestion --> Store - Ingestion --> Vector - Search --> Vector - Search --> Store - Answer --> Search -``` - -Important design intent: - -```text -AI clients do not read the database directly. -AI clients call MCP tools. - -ChromaDB finds semantically relevant candidate chunks. -SQLite decides whether those chunks are currently active, citeable evidence. -``` - ---- - -## 3. MCP Tool Surface - -Current tools: - -| Tool | Use | -| --- | --- | -| `list_sources()` | see configured sources | -| `sync_source(source_id)` | refresh one source | -| `sync_all()` | refresh all retained sources concurrently and return aggregate results | -| `get_sync_status(source_id?)` | inspect source/job state | -| `search_context(query, filters, top_k, include_debug)` | find SQLite-validated evidence | -| `search_documents(query, filters, top_k)` | browse unique matching documents through one representative chunk per document | -| `fetch_context(document_id, chunk_id)` | inspect one document or chunk | -| `answer_with_citations(question, filters, top_k, include_debug)` | helper answer preview from validated evidence | - -The retained `search_context` response always includes a public `debug` key. -On the normal default path `api/tools.py` returns `debug={}` unless -`include_debug=True`, and when caller filters leave no matching public sources -it still returns a small populated `debug` object even if `include_debug=False`. - -The current debug payload includes rewrite decision fields: - -```text -rewrite_enabled -rewrite_attempted -rewrite_applied -rewrite_skipped_reason -``` - -These fields explain whether query rewrite was disabled, not needed, or tried -without producing an applied rewrite. - -Current rewrite policy keeps one more guardrail: a single high-confidence, -textually matching result may suppress rewrite even when `top_k` asks for more -rows, so `insufficient_candidate_count` alone does not force rewrite churn. - -Observed `rewrite_skipped_reason` values include: - -```text -disabled -not_needed -empty_result -rewrite_failed -no_matching_sources -no_term_groups -not_supported -``` - -Tool handlers call service boundaries and return JSON-safe values through -Pydantic `model_dump(mode="json")` where needed. - -`include_debug=True` is the retained explainability switch for retrieval and -the helper answer preview surface. It is additive and opt-in for populated retrieval reasoning -on the normal success path: default `search_context` payloads still carry -`debug={}`, while debug payloads expose structured retrieval reasoning without -dumping raw local DB contents. The current exception is the public -`no_matching_sources` fast path in `search_context`, which still emits a small -populated `debug` object even when `include_debug=False`. -`answer_with_citations` does not mirror that exception path. - -Verification layer split: - -- Public MCP contract layer: - real `FastMCP.call_tool(...)` payload checks for each retained public tool -- Deterministic functional E2E layer: - retained sync/search/fetch/answer flow modules over temp/local state via - `./scripts/verify_functional_e2e.sh` -- Deterministic quality eval layer: - fixture retrieval and answer scoring via `tests/evals` and - `scripts/run_contextwiki_eval.py` -- Manual live smoke layer: - `scripts/live_query_smoke.py` against a user's configured local runtime; - this is manual diagnostic evidence, not automated gate coverage -Retrieval split: - -```text -search_context -= chunk-level retrieval for evidence, grounding, and citations - -search_documents -= grouped document-browsing retrieval that reuses the same retained-source - candidates but collapses repeated chunks into one representative row per - document -``` - -Helper answer validation focuses on: - -```text -citations -used_chunks -debug -debug_markdown -``` - -Those fields help developers compare the response draft against the retrieved -evidence and decide whether a downstream LLM would have enough grounded context -to answer well. -`list_sources()` and `get_sync_status()` expose additive reviewer-readable -operational fields per source: - -```text -latest_success_at -latest_failure_at -document_count -chunk_count -latest_failure_reason -stale_cleanup_disabled_reason -``` - -Those fields come from SQLite lifecycle metadata plus runtime connector state. -Public error text still passes through the same redaction path used by other -sync/job payloads. - -For reviewer-driven live local verification, the repo also includes: - -```text -scripts/live_query_smoke.py -``` - -This script runs `search_context` and `answer_with_citations` against the local -configured environment through the retained tool handlers and prints a compact -safe summary of rewrite state, hits, helper answer preview status, and -citations. It is a manual live check surface, not a replacement for -deterministic non-live tests. - ---- - -## 4. Core Model Relationships - -Relevant files: - -```text -core/models.py -storage/metadata_store.py -``` - -The most important models are: - -| Model | Meaning | Main use | -| --- | --- | --- | -| `SourceModel` | Notion, Tistory, GitHub, or Obsidian source | source configuration and sync state | -| `SyncJobModel` | one source sync execution | success/failure and processing counts | -| `DocumentModel` | one original document | identity, content hash, lifecycle, source metadata | -| `ChunkModel` | searchable/citeable document segment | vector search and citations | -| `ContextSearchResult` | search response DTO | chunk + score + preview + citation metadata | -| `DocumentSearchResult` | grouped document search response DTO | one representative chunk-backed row per document | - -Key distinction: - -```text -DocumentModel = management and sync unit -Examples: one Notion page, one Tistory post, one GitHub file, one Obsidian note. - -ChunkModel = search and citation unit -Examples: a markdown section, a code line range, a plain-text window. -``` - ---- - -## 5. SQLite vs ChromaDB - -SQLite and Chroma both store chunk-related information, but they have different -jobs. - -```text -SQLite MetadataStore -= source/job/document/chunk lifecycle source of truth - -ChromaDB -= semantic retrieval candidate index -``` - -```mermaid -flowchart TD - A["Fetch from Notion / Tistory / GitHub / Obsidian"] - B["DocumentModel"] - C["DocumentChunker -> ChunkModel[]"] - D["SQLite documents
identity/content/hash/lifecycle"] - E["SQLite chunks
citation metadata and text"] - T["SQLite chunk_tombstones
historical chunk id provenance"] - F["ChromaDB
semantic vector retrieval"] - G["search_context(query)"] - H["Chroma candidate chunks"] - I["Ranking decides whether
metadata fallback is needed"] - J["Combined candidates
Chroma plus metadata fallback"] - N["SQLite active chunk validation"] - O["ContextSearchResult[]"] - K["search_documents(query)"] - L["group by document_id
pick representative chunk"] - M["DocumentSearchResult[]"] - - A --> B --> C - B --> D - C --> E - C --> F - E --> T - G --> H --> I --> J --> N --> O - K --> H - H --> I - I --> J - N --> L --> M -``` - -Search results are not trusted directly from Chroma. Retrieval starts with -vector candidates when available, may add metadata-fallback candidates when the -ranker decides lexical or source-aware recovery is needed, and then hydrates -and validates managed hits through SQLite before they become evidence, -citations, or grouped document rows. - -When `search_context(..., include_debug=True)` is used, the response now makes -that decision path visible with reviewer-readable fields such as: - -```text -intent.name / raw_name / confidence / reasons -query_rewrite.attempted / applied / reason -retrieval_queries -rewritten_queries -filters.source_ids -selected_results[] -``` - -`query_rewrite.reason` is intentionally coarse and stable. Current values are: - -```text -no_initial_candidates -insufficient_candidate_count -missing_textual_match -low_initial_score -``` - -The retrieval path now also makes a coarse intent-policy decision before final -reranking. The current retained intent classes are: - -```text -strict_lookup -broad_topic -list -comparison -``` - -This intent is deterministic and local-first. It is derived from normalized -query terms and anchors, then reused by ranking and grounded answer rendering. -It is not a separate MCP tool and does not require a live LLM call. - ---- - -## 6. Sync and Incremental Indexing - -Relevant files: - -```text -indexing/ingestion_service.py -indexing/chunker.py -indexing/indexer.py -storage/metadata_store.py -``` - -`IngestionService.sync_source()` is the core per-source business flow, and -`IngestionService.sync_all()` is the retained-source aggregate fan-out entrypoint. - -```text -sync_source(source_id) --> SourceRegistry connector lookup --> MetadataStore register_source + begin_sync_job guard --> connector.fetch_documents() --> normalize document source/id/url/version/last_seen --> compute content_hash --> deterministic source-aware chunking --> skip vector reindexing when active content_hash and chunk ids are unchanged --> index new/changed/reappeared/rechunked chunks in Chroma --> commit document + chunk metadata --> finalize successful sync --> tombstone stale documents when cleanup is safe --> best-effort vector cleanup -``` - -```text -sync_all() --> SourceRegistry retained source enumeration --> concurrent per-source sync_source() fan-out --> one aggregate summary with succeeded / failed / blocked counts --> per-source result payloads that preserve the latest job outcome -``` - -Reindexing still happens when: - -```text -- a tombstoned document reappears -- content changes -- generated chunk ids change -- document identity changes -``` - -Failed or partial syncs must not tombstone missing documents. - ---- - -## 7. Source-aware Chunking - -Relevant file: - -```text -indexing/chunker.py -``` - -Current chunking strategy: - -```text -Markdown with headings --> heading / section based chunks - -Markdown without headings --> deterministic plain-text fallback windows - -Code --> deterministic line-range chunks --> blank lines preserved --> long lines split by max_chars - -Plain text --> deterministic character windows -``` - -Each chunk carries citation metadata: - -```text -chunk_id -document_id -source_id -title -url -path -chunk_index -line_start -line_end -content_hash -version_id -updated_at -``` - ---- - -## 8. Document Identity and Versioning - -Relevant fields: - -| Field | Meaning | -| --- | --- | -| `source_id` | which ContextWiki source owns the document | -| `external_id` | stable id from the original system | -| `document_id` | internal canonical document id, usually `external_id` | -| `canonical_url` | primary URL used for citations and legacy matching | -| `version_id` | source version metadata, separate from stable identity | -| `last_seen_at` | last sync time that observed the document | -| `last_seen_sync_id` | job marker that observed the document | -| `deleted_at` | tombstone timestamp when missing from a cleanup-capable successful sync | - -Current mapping: - -```text -Notion --> external_id = page_id --> document_id = page_id - -Tistory --> external_id = blog_name:post_id --> document_id = blog_name:post_id - -GitHub --> external_id/document_id = github:owner/repo:path --> canonical_url = GitHub blob URL at the resolved commit --> version_id = blob SHA - -Obsidian --> external_id/document_id = relative/note/path.md --> canonical_url = obsidian://open URL for the configured vault note --> title = frontmatter title when present, otherwise note stem -``` - -Stable identity should not change just because content changes. `version_id` -records source revision metadata; `content_hash` records actual indexed content. - ---- - -## 9. Tombstones and Stale Vector Safety - -Tombstone means soft delete, not hard delete. - -```text -documents.deleted_at records when a document disappears from a cleanup-capable -source after a complete successful sync. -``` - -For GitHub, cleanup is limited to repository document-id prefixes fetched by the -connector, such as `github:eunhwa99/mcpcontentsearch:`. This keeps one -configured repository sync from tombstoning documents that belong to another -repository scope under the same `source_github` source id. - -For Obsidian, cleanup is allowed only after a complete local-vault snapshot. -Unreadable notes, traversal errors, or exceeded file count/byte bounds should -fail the sync before stale cleanup can tombstone missing active documents. - -Why not hard delete immediately? - -```text -Vector cleanup is best-effort. -If Chroma cleanup fails, SQLite still needs historical provenance to suppress -stale managed vector hits. -``` - -SQLite is the last defense against stale vector results. - ---- - -## 10. Answer Behavior - -`answer_with_citations` delegates retrieval to `ContextSearchService` and only -uses validated chunks as evidence. The answer response should make evidence -status explicit: - -```text -grounded / insufficient / error -``` - -The service must not invent citations from unmanaged or tombstoned chunks. If -retrieval cannot find enough active evidence, the response should say that the -available evidence is insufficient instead of fabricating an answer. - -When evidence is sufficient, the final rendered answer can now vary by request -shape while staying citation-grounded: - -```text -summary-style answer for ordinary grounded QA -Grounded List for collection requests -Grounded Comparison for comparison requests -``` - -This is still bounded synthesis, not open-ended chat. The answer service only -repackages retrieved evidence chunks and keeps the same insufficient-evidence -escape hatch when retrieval is weak. - -`search_documents` does not replace this evidence path. It is a browsing surface -for "which documents matched?" and keeps the highest-ranked chunk as the -representative row so callers can pivot into `fetch_context` or run a later -chunk-level citation workflow through `search_context` or -`answer_with_citations`. - ---- - -## 11. Current Limits - -Current intentional limits: - -- No generic website/docs crawler in production scope. -- No browser Web Console or local HTTP reviewer UI in production scope. -- No Auto Wiki generation or LLM wiki synthesis in production scope. -- No dynamic web fallback or legacy live search/index MCP tools in production - scope. -- No live Obsidian app, plugin, or API server requirement; Obsidian is a - configured local-vault source. -- Optional `CONTEXTWIKI_SEARCH_LLM_ENABLED=true` query rewrite is disabled by - default. If enabled, it may send the user query and normalized terms to the - configured provider, but it must not send source evidence, fetch external - source content, or mutate SQLite/Chroma. -- No deletion, reset, migration, or inspection of local user Chroma/SQLite data - without explicit approval. -- Live Notion, Tistory, GitHub, or embedding-provider validation is opt-in and - approval-gated. Real Obsidian vault validation is also approval-gated; - routine verification uses temporary vaults. - -Historical note: - -- ADR 0004's GitHub connector decision remains current. -- ADR 0004 now also documents the retained Obsidian local-vault connector. -- ADR 0004's website/docs connector portion is superseded for the current scope - by ADR 0006. -- ADR 0005's Auto Wiki decision is superseded for the current scope by ADR - 0006. - ---- - -## 12. Verification Model - -Retained verification layers: - -- Public MCP contract layer: - - `uv run --locked pytest -q tests/contracts/test_public_mcp_contracts.py tests/test_app_composition.py` -- Deterministic functional E2E layer: - - `./scripts/verify_functional_e2e.sh` -- Deterministic quality eval layer: - - `uv run --locked pytest -q tests/evals` - - `uv run --locked python scripts/run_contextwiki_eval.py --output-dir artifacts/contextwiki-evals` - - optional latency artifacts: - `uv run --locked python scripts/run_contextwiki_eval.py --output-dir artifacts/contextwiki-evals --include-latency` -- Manual live smoke layer: - - `uv run --locked python scripts/live_query_smoke.py --query "your query here"` -- Full local gate wrapper: - - `./scripts/verify_all.sh` - - wraps the automated layers above but does not replace the manual live smoke layer - -Functional verification should use fake or temporary persistence and must not -mutate local user Chroma/SQLite data. Live external checks require explicit -approval and should report the source used, safety plan, and whether any local -state was touched. -Obsidian verification should use temporary vault directories unless the user -explicitly approves a real vault path. - -The deterministic eval runner is the retained reviewer-evidence path for -retrieval quality changes. It uses temp SQLite fixture data, never touches user -Chroma/SQLite, and now emits deterministic JSON artifacts with: - -- mixed-query group breakdowns -- retrieval and answer suite pass/fail summaries - -When latency visibility is needed, the runner can also emit a separate -non-deterministic `runtime_metrics.json` file with wall-clock retrieval and -answer timings. That runtime file is an opt-in local artifact from the -latency-enabled command above; the current CI `contextwiki-evals` artifact -uploads only the deterministic retrieval-quality JSON files. diff --git a/docs/plan/2026-06-15-readme-mcp-docker-obsidian.md b/docs/plan/2026-06-15-readme-mcp-docker-obsidian.md index 66cafbd..dcb4326 100644 --- a/docs/plan/2026-06-15-readme-mcp-docker-obsidian.md +++ b/docs/plan/2026-06-15-readme-mcp-docker-obsidian.md @@ -47,8 +47,9 @@ Non-goals: or ADRs as required current docs. - Harness docs point to `.agents/docs/architecture.md` as the active design source of truth. -- `docs/contextwiki-core-understanding.md` remains only as a compatibility stub - for historical links and redirects readers to `Architecture`. +- The maintained design explanation now lives only in + `.agents/docs/architecture.md`, with the previously duplicated core + understanding content absorbed there. ## Step breakdown @@ -74,7 +75,6 @@ Non-goals: - `.agents/skills/harness-review/SKILL.md` - `.agents/skills/harness-functional-smoke/SKILL.md` - `.agents/skills/harness-implement/SKILL.md` -- `docs/contextwiki-core-understanding.md` - `docs/images/claude-desktop-dynamodb-star-example.png` - `docs/plan/README.md` - `docs/plan/2026-06-15-readme-mcp-docker-obsidian.md` @@ -92,7 +92,7 @@ Non-goals: | Surface | Planned check | Why | | --- | --- | --- | | README setup guidance | manual diff inspection | Docs-only request; no runtime behavior change | -| Docs structure redirects | manual diff inspection | Confirm architecture-only active-doc path, ADR archive wording, and compatibility-stub behavior stay reader-clear | +| Docs structure redirects | manual diff inspection | Confirm architecture-only active-doc path, ADR archive wording, and the intentional deletion of the duplicated core-understanding file stay reader-clear | | Harness and instruction contracts | manual diff inspection | Confirm AGENTS, harness docs, phase skills, and plan template all reflect the same architecture-first active-doc policy | ## Architecture constraints @@ -119,12 +119,15 @@ Non-goals: | README Docker clarification follow-up | completed | Added an explicit split between the minimum Docker run example and the Obsidian-enabled Docker run example so readers do not assume the vault mount is optional when `source_obsidian` is in use. | `README.md` | | README Claude Desktop example | completed | Added a real Claude Desktop screenshot plus a short example prompt so readers can see a Claude client workflow using ContextWiki after setup. | `README.md`; `docs/images/claude-desktop-dynamodb-star-example.png` | | README wording cleanup follow-up | completed | Removed the extra explanatory sentence under the Claude Desktop example so the README stays focused on the prompt plus screenshot evidence only. | `README.md` | -| Functional smoke | completed | Completed the docs-only smoke rows by manually inspecting the README setup flow, Docker/Obsidian notes, Claude Desktop example placement, architecture-only active-doc wording, ADR archive wording, compatibility-stub redirect behavior, and harness/instruction-contract consistency against the final staged wording. | `README.md`; `AGENTS.md`; `.agents/docs/harness-engineering.md`; `.agents/docs/github-workflow.md`; `.agents/skills/harness-*/SKILL.md`; `.agents/docs/adr/README.md`; `docs/contextwiki-core-understanding.md`; `docs/plan/README.md`; matrix rows above | -| Review-fix pass 1 | completed | Resolved reviewer findings by converting `.agents/docs/adr/README.md` into a historical archive note instead of an active harness contract, and by restoring `docs/contextwiki-core-understanding.md` as a compatibility stub that redirects readers to `Architecture` so older plan-doc links do not break. | `.agents/docs/adr/README.md`; `docs/contextwiki-core-understanding.md` | +| Functional smoke | completed | Completed the docs-only smoke rows by manually inspecting the README setup flow, Docker/Obsidian notes, Claude Desktop example placement, architecture-only active-doc wording, ADR archive wording, and harness/instruction-contract consistency against the final staged wording. | `README.md`; `AGENTS.md`; `.agents/docs/harness-engineering.md`; `.agents/docs/github-workflow.md`; `.agents/skills/harness-engineering/SKILL.md`; `.agents/skills/harness-functional-smoke/SKILL.md`; `.agents/skills/harness-review/SKILL.md`; `.agents/docs/adr/README.md`; `.agents/docs/architecture.md`; `docs/plan/README.md`; matrix rows above | +| Review-fix pass 1 | completed | Resolved reviewer findings by converting `.agents/docs/adr/README.md` into a historical archive note instead of an active harness contract. | `.agents/docs/adr/README.md` | | Review-fix pass 2 | completed | Clarified that the documented Claude Desktop config path is the macOS path, added the missing Docker image build prerequisite, fixed the stale AGENTS connector inventory to include Obsidian, and synced the plan file list with the actual staged scope. | `README.md`; `AGENTS.md`; `docs/plan/2026-06-15-readme-mcp-docker-obsidian.md` | | Review-fix pass 3 | completed | Reframed the screenshot section as a Claude Desktop client workflow example rather than a direct server-answer capability, and updated the plan template wording from `Architecture/ADR constraints` to `Architecture constraints` so active plan guidance matches the simplified harness contract. | `README.md`; `docs/plan/README.md`; `docs/plan/2026-06-15-readme-mcp-docker-obsidian.md` | -| Docs structure simplification | completed | Removed the active `Core Understanding` reader path from README and harness flows, dropped current-reader ADR dependencies from active harness docs, and positioned `Architecture` as the single maintained design reference beyond the README while keeping compatibility stubs for historical links. | `README.md`; `AGENTS.md`; `.agents/docs/architecture.md`; `.agents/docs/adr/README.md`; harness docs/skills; `docs/contextwiki-core-understanding.md` | -| Review-fix pass 4 | completed | Separated local `uv` prerequisites from Docker prerequisites, clarified that the Docker Claude Desktop config is minimal by default and needs an extra mount only for Obsidian, and synced the plan language with the final compatibility-stub outcome for `docs/contextwiki-core-understanding.md`. | `README.md`; `docs/plan/2026-06-15-readme-mcp-docker-obsidian.md` | -| Review-fix pass 5 | completed | Added an explicit warning about reusing a host-path Obsidian env var with the minimum Docker example, made the compatibility stub title visibly deprecated, and refreshed the plan wording so the final artifact stays aligned with the stub-based outcome. | `README.md`; `docs/contextwiki-core-understanding.md`; `docs/plan/2026-06-15-readme-mcp-docker-obsidian.md` | -| Docs verification | completed | Reran docs-only file listing, branch status, whitespace checks, staged the final docs set including the compatibility stub, and confirmed the cached diff is clean after the structure simplification. | `rg --files AGENTS.md README.md docs .agents/docs .agents/skills`; `git status --short --branch`; `git diff --check`; `git add ...`; `git diff --cached --check` | -| Final review gate | completed | Ran repeated fresh five-reviewer `$subagent-review-loop` passes while fixing every actionable finding. The newest pass converged to bookkeeping-only plan-state reminders, which were applied here before PR delivery. | reviewer outputs from the newest pass in this thread; latest plan rows updated to match delivery state | +| Docs structure simplification | completed | Removed the active `Core Understanding` reader path from README and harness flows, dropped current-reader ADR dependencies from active harness docs, and positioned `Architecture` as the single maintained design reference beyond the README. | `README.md`; `AGENTS.md`; `.agents/docs/architecture.md`; `.agents/docs/adr/README.md`; harness docs/skills | +| Review-fix pass 4 | completed | Separated local `uv` prerequisites from Docker prerequisites and clarified that the Docker Claude Desktop config is minimal by default and needs an extra mount only for Obsidian. | `README.md`; `docs/plan/2026-06-15-readme-mcp-docker-obsidian.md` | +| Review-fix pass 5 | completed | Added an explicit warning about reusing a host-path Obsidian env var with the minimum Docker example. | `README.md`; `docs/plan/2026-06-15-readme-mcp-docker-obsidian.md` | +| Follow-up docs merge | completed | Merged the remaining setup and runtime mental model into `.agents/docs/architecture.md`, then deleted `docs/contextwiki-core-understanding.md` per the latest request so current docs have a single maintained design document. Historical plan-doc mentions remain archival only. | `.agents/docs/architecture.md`; `docs/plan/2026-06-15-readme-mcp-docker-obsidian.md`; delete `docs/contextwiki-core-understanding.md` | +| Docs verification | completed | Reran docs-only file listing, branch status, whitespace checks, staged diff checks, and cached diff checks after the follow-up architecture merge and file deletion. | `rg --files AGENTS.md README.md docs .agents/docs .agents/skills`; `git status --short --branch`; `git diff --check`; `git add ...`; `git diff --cached --check` | +| Review-fix pass 6 | completed | Cleared the stale post-merge plan state by marking docs verification complete and keeping the verification evidence path on the real `SKILL.md` files rather than a nonexistent markdown pattern. | `docs/plan/2026-06-15-readme-mcp-docker-obsidian.md` | +| Review-fix pass 7 | completed | Expanded `.agents/docs/architecture.md` so the single maintained design doc now covers retained `sync_all` aggregate semantics, retrieval/debug policy boundaries, and the layered verification model that previously lived in the duplicated note. | `.agents/docs/architecture.md`; `docs/plan/2026-06-15-readme-mcp-docker-obsidian.md` | +| Final review gate | completed | Ran a fresh five-reviewer `$subagent-review-loop` pass after the final architecture backfill fixes. The newest pass reported no actionable findings, so the architecture-only maintained-doc transition and file deletion are review-clean. | reviewers `Ramanujan`, `Poincare`, `Locke`, `Carson`, and `Hubble` in this thread |