ccg-docs — Documentation Discovery
Separate DB-backed discovery from generated-file reads, then validate both the selected evidence and documentation quality.
Routing
| Task | Tool |
|---|---|
| Broad question about a module | MCP search, phrased as a question, then get_doc_content |
| Focused annotation or symbol keyword | ccg search or MCP search |
| Exact generated Markdown body | get_doc_content |
| Exact signature or relationship | get_node or query_graph |
| Regenerate Markdown and Wiki snapshot | ccg docs --out docs |
| Audit generated docs | ccg lint |
search is a DB-backed narrowing layer. A question is scored against recorded @intent/@domainRule reasons as well as names, and every hit carries a node_id; it does not read a separately generated retrieval index. Read a file's Markdown with get_doc_content, then use graph tools for exact symbols and relationships. Local MCP clients use ccg serve; self-hosted clients connect to ccg-server over Streamable HTTP.
Discovery Pipeline
Use the ccg skill's Freshness Boundary before relying on graph evidence. If
refresh is required, report the gap; do not invoke ccg-build unless the user
explicitly names it.
search can narrow candidates without generated Markdown:
search(query: "how does a caller get authenticated", limit: 5)
Generate files only when the task needs current Markdown, Wiki output, or
get_doc_content:
ccg docs --out docs # Markdown + wiki-index.json compatibility snapshot
ccg lint # Documentation quality checks; --strict exits 1 on actionable issues
Content-Root Contract
search returns DB-backed candidates with source file_path values; it
does not prove that a corresponding generated Markdown file exists in the
filesystem root used by get_doc_content.
- For the default namespace,
get_doc_contentresolvesfile_pathbeneath the MCP server's configuredrag.index_dir(default.ccg). - For a named namespace, it resolves beneath
{namespace_root}/{namespace}. ccg docs --out docswrites Markdown todocs, but it does not make those files readable beneath the default.ccgcontent root.- To support default-namespace MCP reads, either generate with
ccg docs --out .ccg/docs --rag-index-dir .ccg, configurerag.index_dirto a root that already containsdocs, or use a direct local file read. - For a named namespace, place generated docs beneath that namespace directory
before calling
get_doc_content.
Pass the selected result's relative generated-doc path to get_doc_content. If the read
fails, report the configured-root mismatch; do not guess paths outside the
allowed root.
Lint Categories
| Category | Meaning |
|---|---|
orphan |
Generated doc without matching code |
missing |
Code without generated doc |
stale |
Code changed but doc did not |
unannotated |
Missing required intent/domain annotation |
contradiction |
Doc contradicts the current signature |
dead-ref |
Broken @see reference |
incomplete |
Missing required parameter or return documentation |
drift |
Documentation structure diverged from code |
Quality Checkpoints
- Sparse results: add accurate
@intentor@indexannotations with theccg-annotateskill. - Stale generated docs: assess graph freshness with the
ccgskill. If graph refresh is required, report that the user must explicitly invokeccg-build; do not invoke it automatically. - Empty answers to a question-shaped
search: an empty answer usually means nobody recorded a reason in the area, not that the graph is stale. Confirm namespace statistics and refresh only when the graph is missing or stale. - Missing
get_doc_contentfile: compare the generated-doc path with the configured content root before regenerating. - Exact-answer needs: switch from documentation discovery to
get_node,query_graph, ortrace_flow.
Boundary
- Treat
searchas a narrowing layer, not a guaranteed Top-1 answer. - Confirm the selected generated-doc path is readable before treating its body as evidence.
- Do not hand-edit generator-managed Markdown when the source annotation or generator owns the content.
- Separate current lint results from pre-existing unrelated findings.
- Never infer that successful generation to an arbitrary
--outdirectory made the file MCP-readable.
Completion
Report generated Markdown and Wiki-index paths when generation was requested, the configured content root and selected generated-doc path for each document read, namespace and graph freshness, and the exact lint summary or why lint was not run. Record any discovery/read mismatch rather than claiming a candidate body was inspected.