# CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this
repository. It is orientation only — implementation history, component details, and
operational procedures live in the [docs/implementation-status.md](docs/implementation-status.md)
index and its `docs/implementation-status/` leaf files (read on demand, e.g. before touching
a plugin or claiming something isn't built yet).

## What this repository is

`cc-os` is the user's **personal operating layer for Claude Code**: the family of always-on,
globally installed `os-*` plugins that run on every machine the user works from, plus the
research/evals that inform them. The founding piece is a **cross-project memory system** (for
a multi-client freelancer), but the scope is the whole operating layer — memory, decisions,
process/backlog management, status, notifications — and the long-term intent is that the
`os-*` plugins are **aware of each other and cooperate** (ADR-023). By contrast,
`~/dev/cc-plugins` holds optional, as-needed plugins; anything that should be ambient on
every machine belongs here. Everything is markdown-as-truth: specs,
ADRs, and the build plan in `docs/` are the source of truth for what is being built. When
asked to "build," work from the staged tasks in `docs/memory-system/04-build-plan.md`, not ad
hoc.

## Directory layout

Numbered files within a directory are not a required reading order — read the one whose
topic you need.

- **`docs/adr/`** — the ADR system (one file per decision + generated `README.md` index),
  managed via `/os-adr:*` skills. Migrated 2026-07-12 from the monolithic
  `docs/memory-system/03-architecture-decisions.md`, which is retained as the historical
  source (provenance: `migration_source` frontmatter) but is no longer where new decisions go.
- **`docs/memory-system/`** — the design of the memory system itself. `02-system-design.md`
  is the architecture, `03-architecture-decisions.md` is the historical ADR log (see
  `docs/adr/` above), `04-build-plan.md` the build outline with step status,
  `06-graphify-evaluation.md` justifies the Graphify pivot.
- **`docs/implementation-status.md`** — the status index: headline timeline + per-component
  one-liners. Full detail (per-plugin build history, eval-harness records) lives in leaf
  files under `docs/implementation-status/`, read on demand; plugin rename/cache-refresh
  runbooks are in `docs/implementation-status/operational-procedures.md`.
- **`docs/graphify/`** — verified handbook for the Graphify knowledge-graph tool. Skim
  `00-README.md` for the model; keep `09-best-practices-checklist.md` open when running it.
  Claims are provenance-tagged (`[github]` trustworthy; `[interview]` / `[unverified claim]`
  not).
- **`graphify-interview`, `memory-systems-compared060326`** (repo root) — raw source
  transcripts. Only open to trace a claim's origin; treat as *intent*, not *fact*.
- **`plugins/`** — source of the global plugins, symlinked into `~/.claude/plugins/`.
- **`openspec/`** — spec-driven change management (see workflow below).
- **`.claude/`, `.codex/`, `.pi/`** — **identical** copies of the OpenSpec skills for three
  AI assistants. Only open when changing a skill — and mirror any change across all three.

## The current design in one paragraph

This is a work in progress, not a frozen spec; **when a conversation changes the design,
update this paragraph (and the relevant `docs/memory-system/` files + an ADR) to match.**

Two memory types kept as **separate systems**: **episodic** ("what happened, when") handled
by **memsearch** (Milvus Lite, embedded, single global store for ALL clients by design —
ADR-015), and **semantic/knowledge** ("how do we…") handled by the existing
**`~/Documents/SecondBrain` Obsidian vault** as the single source of truth (ADR-012). Notes
keep `summary` + six flat namespaced facets
(`type/`/`client/`/`project/`/`domain/`/`tool/`/`convention/`) plus `scope/` (ADR-011);
hierarchy comes from hub notes, wikilinks, and Graphify graph edges — not nested tags
(Graphify is a structure extractor, not a topic clusterer; hubs are author-provided,
ADR-014). The vault is queried via a **Graphify knowledge graph** (local Ollama SLM for doc
extraction, tree-sitter AST for code); Graphify replaced the originally-planned Ruby/SQLite
tag-index CLI (2026-06-03 pivot). Retrieval is hook-injected + on-demand; freshness is lazy
(write-time hook + SessionStart reconcile, no daemon); the vault and memsearch store
auto-sync to private Forgejo repos via SessionEnd hooks. Ships as a global Claude Code
plugin (`os-vault`) with skills. Projects are onboarded one at a time; bulk vault migration
is deferred to last (ADR-013).

## Implemented components (inventory)

All build-plan steps required for the memory system are complete (2026-06-15).
[docs/implementation-status.md](docs/implementation-status.md) is the index; full detail per
item is in its leaf files under `docs/implementation-status/` — read the relevant leaf
before modifying any of these:

- **os-vault** (`plugins/os-vault/`) — vault write/query/reorganize/onboard-project/
  design-template skills, SessionStart/End hooks, memsearch + vault git sync. Write-behavior
  eval harness in `plugins/os-vault/eval/`.
- **os-context** (`plugins/os-context/`, renamed 2026-07-13 from os-orchestration) — a
  prompt-composer SessionStart plugin: concatenates `prompts/session-start/*.md`
  (orchestration/delegation rules, kickoff conventions, standing safety, decision-memo
  format) into
  one additionalContext block for all sessions; this repo carries no local override. Eval
  harness in `plugins/os-context/eval/`.
- **os-status** (`plugins/os-status/`) — aggregated deterministic SessionStart checks
  (subagent-model env override, ADR system present, vault hub note present). ADR-022.
- **os-doc-hygiene** (`plugins/os-doc-hygiene/`) — stale/bloated-doc monitoring;
  check/clean/status/sweep skills.
- **os-adr** (`plugins/os-adr/`) — ADR system: Ruby `lib/adr/` + CLIs, create/init/migrate/
  find skills; Eval A/B/C harnesses. cc-os retrofit done 2026-07-12 (promoted ahead of
  pilots — ADR-020 amendment / `docs/adr/0020`); remaining rollout: pilot projects one at a
  time, then wider.
- **os-backlog** (`plugins/os-backlog/`) — git-issues backlog surface (ADR-0042 retired
  Planka 2026-07-16): tracker routing (`forgejo:`/`github:`/`repo:` in `.cc-os/config`),
  `issue-create`/`issues` CLI, capture/list/route skills, ten-label taxonomy with
  human-only `next`; non-repo/ops work lives in the private `jared/ops` Forgejo repo.
- **Graphify** v0.8.31 (`~/.local/bin/graphify`; PyPI package is `graphifyy`, double-y) —
  vault graph at `~/Documents/SecondBrain/graphify-out/`, per-project graphs at
  `<project-root>/graphify-out/` (gitignored); both disposable/rebuildable.
- **memsearch** v0.4.6 (marketplace plugin) — `~/.memsearch/memory/YYYY-MM-DD.md` daily
  files + Milvus index; `/memory-recall`, `/memory-config`.

**Eval discipline (applies to every harness above):** scenario Task blocks are held-out —
never run them informally; reserve sets are never even read informally. Before designing or
running any autoresearch eval, Read
`~/Documents/SecondBrain/howto/running-autoresearch-skill-evals.md`. Wording loops for
os-adr Eval B, os-vault WS2, and os-orchestration WS4 are complete and shipped
(2026-07-04/07/08); their run-sets AND reserves are contaminated for future wording tuning —
next signal is production IRL session audits.

## Issue tracking

Issues (created via `/to-tickets`) live on self-hosted Forgejo (`jared/cc-os`), queried with
the `tea` CLI — not GitHub/`gh`. See `docs/issue-workflow.md`.

## OpenSpec workflow

Changes are managed spec-driven via OpenSpec. Use the matching skills rather than editing
spec files by hand: `openspec-explore`, `openspec-propose`, `openspec-apply-change`,
`openspec-verify-change`, `openspec-archive-change` (slash commands under `/opsx:*`). Live
changes in `openspec/changes/`, completed in `openspec/changes/archive/`, stable specs in
`openspec/specs/`. `openspec/config.yaml` uses `schema: spec-driven`; project context for
OpenSpec artifacts comes from `docs/` and this file.

## Conventions specific to this repo

- **Provenance discipline:** when writing about Graphify or anything sourced from the
  interview transcripts, keep the inline source tags and never promote an `[interview]` /
  `[unverified claim]` to fact without checking a primary source (the GitHub repo is the
  authority; anchored to Graphify v0.8.30).
- **Dates are absolute** (e.g. `2026-06-03`); design docs carry a `_Last updated:_` / status
  line — keep these current when editing.
- **Decisions live in ADRs** in `docs/adr/` (index: `docs/adr/README.md`). Don't silently
  reverse a locked decision; record the superseding decision via `/os-adr:create` with the
  reasoning. **When** a task involves an architecture-level choice, or changes/replaces an
  approach this codebase already uses (a library, a convention, a plugin structure) →
  **first** run `/os-adr:find` to check whether a recorded decision covers it, and **when**
  you make such a choice → record it with `/os-adr:create`. A task that reverses an Accepted
  ADR is not complete until the superseding ADR exists.
- **Keep records current:** when a build step completes, (a) mark it done in
  `docs/memory-system/04-build-plan.md`, (b) record it per the index+progressive-disclosure
  convention: a **one-line** headline entry in `docs/implementation-status.md` plus the
  detail in the relevant `docs/implementation-status/<component>.md` leaf file (create one
  if needed; don't restate what an ADR already records), and (c) update the design paragraph
  in THIS file only if the design itself changed. Never append status history to this file,
  and never let the index file regrow into a changelog — the os-doc-hygiene `file_length`
  signal (400 lines / ~4k tokens) enforces this.
- **Plugin and skill naming:** before naming ANY new cc-os plugin, skill, or slash command,
  Read `plugins/cc-architect/references/conventions/cc-os-naming.md` (canonical repo copy;
  the SecondBrain vault note of the same name now defers to it) and follow it. In
  brief: plugins are `os-[domain]`; skills are verb-first kebab-case, invoked as
  `/os-[domain]:[verb]`; no `commands/` dispatcher directories; **never set a `name:` field
  in SKILL.md frontmatter** (it collapses the slash command to a bare unnamespaced form).
- **After editing any plugin source** (SKILL.md, hooks, CLIs), run `bin/refresh-plugins` —
  source edits don't reach sessions until the cache is refreshed. Rename/move procedure and
  cache details: `docs/implementation-status/operational-procedures.md`.
