diff --git a/.context/LEARNINGS.md b/.context/LEARNINGS.md
index a714e472d..bfe825ff1 100644
--- a/.context/LEARNINGS.md
+++ b/.context/LEARNINGS.md
@@ -17,6 +17,7 @@ DO NOT UPDATE FOR:
| Date | Learning |
|----|--------|
+| 2026-05-11 | Naive Markdown line-sweep corrupts multi-line code spans and YAML lists |
| 2026-05-11 | tsc cross-tree include resolves node_modules from source file, not tsconfig |
| 2026-05-10 | Go compile/tool version mismatch comes from the cached toolchain, not the system Go |
| 2026-05-10 | An ongoing user's concrete workaround tax is the strongest validation evidence |
@@ -141,6 +142,16 @@ DO NOT UPDATE FOR:
---
+## [2026-05-11-231025] Naive Markdown line-sweep corrupts multi-line code spans and YAML lists
+
+**Context**: Performed a programmatic typographic sweep across docs/*.md to wrap bare 'ctx' tokens in backticks (commit 61aab858). 81 source files, 236 lines changed. First pass corrupted two indented JSON snippets in MkDocs admonitions because the fence regex anchored to start-of-line and missed admonition-indented fences. After fixing the fence regex, two more corruptions surfaced (multi-line inline-code spans where the opening backtick is on line N and the closing on line N+1: the line-at-a-time transformer treated each line independently, leading to misjudged span boundaries on the second line). After post-sweep validation, a YAML parse error on docs/blog/2026-02-03-the-attention-budget.md surfaced one more breakage: a 'topics:' list-item like '- ctx primitives' got wrapped to '- `ctx` primitives', which is invalid YAML (a value starting with backtick is not a valid unquoted scalar). Total: 2 multi-line span corruptions + 1 YAML breakage, all detected only by post-sweep validation (make site + grep audit), not by the dry-run.
+
+**Lesson**: A naive line-at-a-time regex sweep across Markdown documents must respect a wider 'skip' set than the obvious cases. The full safe-skip list is: (1) triple-backtick fenced code blocks, BOTH root-level and indented inside MkDocs admonitions or list items (fence regex must allow leading whitespace, e.g. '^\\s*```'); (2) inline backtick spans on the same line; (3) multi-line inline-code spans crossing line boundaries (line-at-a-time logic cannot detect both ends, so either track fence-like 'odd-count' state across lines or treat any unclosed-on-line backtick as 'protect rest of line'); (4) the ENTIRE YAML frontmatter block (delimited by '---' at top and next '---'), not just specific keys like title/description/icon, because list-item values under topics/tags/keywords are also YAML and break on a leading backtick; (5) image alt-text '![alt]' (alt-text does not render in monotype); (6) link-reference definitions '[name]: url "title"'; (7) project copyright header comment blocks. Dry-run output never catches YAML or multi-line span breakage; validation MUST include a parser-level check (make site for YAML, post-grep for '``name`' double-backtick patterns near the wrapped token).
+
+**Application**: When designing any future programmatic sweep across docs/ (typography passes, internationalization, brand renames, em-dash replacement, link-text rewrites): (1) implement the full skip set above, not a subset; (2) for fence detection use '^\\s*```', not '^```'; (3) for the frontmatter, detect the entire block between '---' delimiters, not specific keys; (4) for multi-line inline-code, choose between cross-line backtick-pair tracking (complex but correct) or the simpler 'unclosed backtick protects rest of line' heuristic (corrupts ~1 per 100 files but recoverable manually); (5) ALWAYS validate post-sweep with 'make site' (zensical surfaces YAML errors) and a grep for '``\\w' double-backtick patterns near the wrapped token; (6) commit only after both validations are clean. For one-shot sweeps the script can be ad-hoc, but record the validation gate as part of the commit message so the next contributor knows what to check.
+
+---
+
## [2026-05-11-202124] tsc cross-tree include resolves node_modules from source file, not tsconfig
**Context**: Set up tsc --noEmit gate for the embedded OpenCode plugin. tsconfig lived in tools/typecheck/opencode/; include pointed at internal/assets/integrations/opencode/plugin/index.ts via relative path. First run failed with 'Cannot find module @opencode-ai/plugin' even though node_modules was correctly populated in tools/typecheck/opencode/.
diff --git a/.context/steering/product.md b/.context/steering/product.md
index f0f86d1a1..f9009ded9 100644
--- a/.context/steering/product.md
+++ b/.context/steering/product.md
@@ -4,47 +4,47 @@ description: Product context, goals, and target users
inclusion: always
priority: 10
---
-
# Product Context
-Describe the product, its goals, and target users.
+`ctx` is **persistent context for AI coding sessions**. It gives
+the AI memory across sessions by writing project state to
+git-versioned Markdown files in `.context/` and feeding that
+state back to the AI on every turn.
-- **What is this project?**
-- **Who uses it?**
-- **What problem does it solve?**
-- **What is explicitly out of scope?**
\ No newline at end of file
+## Target users
+
+Developers using AI coding tools (Claude Code, Cursor, OpenCode,
+Copilot CLI, Aider, Cline, Kiro, Codex) who want their AI to
+remember decisions, conventions, and learnings across sessions
+without re-explaining the project every time.
+
+## Load-bearing constraints
+
+These shape every design decision; treat them as invariants when
+proposing features:
+
+- **Local-first.** All state lives in the user's filesystem. No
+ hosted service, no cloud account, no network call required for
+ normal operation.
+- **Single statically-linked binary.** No runtime dependency
+ tree, no package manager, no install step beyond "drop the
+ binary on PATH."
+- **Git-friendly.** Context is plain Markdown with stable
+ ordering; diffs are human-readable. Designed so context
+ history lives in the same repo as the code it describes.
+- **Tool-agnostic.** ctx integrates with multiple AI tools as
+ symmetric peers. No tool is the "primary"; new tools land via
+ the same `ctx setup ` and `ctx steering sync` paths.
+- **No telemetry, no anonymous data collection.** Period.
+
+## Out of scope
+
+- Cloud-hosted state, SaaS sync, or any solution that requires a
+ network round-trip during normal use. If a proposal needs a
+ server, it's the wrong proposal for ctx.
+- Embedding an LLM into ctx. ctx is the persistence layer; the
+ LLM lives in the user's chosen AI tool.
+- AI-tool lock-in. Features must work across at least two of the
+ supported tool families (hook-based + native-rules), not be
+ Claude-Code-only or Cursor-only by design.
diff --git a/.context/steering/structure.md b/.context/steering/structure.md
index 25a014e5f..638b88050 100644
--- a/.context/steering/structure.md
+++ b/.context/steering/structure.md
@@ -4,46 +4,63 @@ description: Project structure and directory conventions
inclusion: always
priority: 10
---
-
# Project Structure
-Describe the project layout and directory conventions.
+## Top-level layout
-- **Top-level directories and their purpose**
-- **Where new files should go** (and where they should not)
-- **Naming conventions** for files, packages, modules
\ No newline at end of file
+| Path | What it is |
+|------|-----------|
+| `cmd/ctx/` | Cobra entry point. One main package; thin. |
+| `internal/` | Private Go packages (compiler-enforced no-external-import). |
+| `editors//` | Separately-published editor integrations (currently `editors/vscode/`). NOT embedded. |
+| `tools//` | Dev tooling for embedded assets, sitting outside the embed tree (currently `tools/typecheck/opencode/`). |
+| `docs/` | Source for the docs site at https://ctx.ist. |
+| `site/` | Built output of `docs/` via `make site` (zensical). Committed. |
+| `specs/` | Feature specs; every commit gets a `Spec: specs/.md` trailer. |
+| `.context/` | This project's own ctx context (CONSTITUTION, TASKS, DECISIONS, LEARNINGS, CONVENTIONS, steering, journal). |
+| `hack/` | Project shell scripts (release, lint helpers, detectors). |
+| `ideas/` | Drafts and unscoped exploration; not authoritative. |
+
+## Inside `internal/`
+
+- Organized by **domain**, one package per concern. The split is
+ read/write/config/err/cli/etc., not "by layer."
+- `internal/assets/` is the embed payload root. **Everything
+ under it is `//go:embed`-ed into the binary.** Read
+ `internal/assets/README.md` before adding files there: the
+ layout has a contract (embedded vs. separately-published) that
+ is easy to violate.
+- `internal/cli//` mirrors the Cobra command tree. New
+ commands land in their domain package, not as siblings of the
+ root.
+
+## Where new files go
+
+- **New Go domain logic** → existing `internal//` if it
+ exists. `ls internal/` and read the candidate's `doc.go`
+ before creating a new package; extending the existing package
+ is the default.
+- **New embedded asset** → under `internal/assets//`,
+ with a matching `//go:embed` directive added in
+ `internal/assets/embed.go`. Add a presence test in
+ `embed_test.go` at minimum.
+- **Dev tooling for an embedded asset** (linters, type-checkers,
+ package.json/tsconfig.json) → `tools/typecheck//` or
+ similar sibling. Never inside `internal/assets/` itself; the
+ embed contract forbids it.
+- **New separately-published deliverable** (e.g. a new editor
+ extension) → `editors//`, with its own pipeline. Not
+ under `internal/`.
+- **User-facing documentation** → `docs/`, then `make site`.
+ Each tool that warrants a guide gets `docs/home/.md`.
+
+## Where new files do NOT go
+
+- Not in the repo root unless they are project-wide config
+ (`Makefile`, `go.mod`, `zensical.toml`, etc.).
+- Not in `internal/assets/` if they are not actually embedded.
+ Foreign-language source belongs only when `embed.go` references
+ it; tooling about embedded assets belongs in `tools/`.
+- Not under `internal/` at all if they are deliverables to an
+ external channel (marketplace, npm registry, etc.).
diff --git a/.context/steering/tech.md b/.context/steering/tech.md
index acfe5736a..3281ee511 100644
--- a/.context/steering/tech.md
+++ b/.context/steering/tech.md
@@ -4,47 +4,60 @@ description: Technology stack, constraints, and dependencies
inclusion: always
priority: 10
---
-
# Technology Stack
-Describe the technology stack, constraints, and key dependencies.
+## Primary
-- **Languages and versions**
-- **Frameworks and key libraries**
-- **Runtime / deployment target**
-- **Hard constraints** (e.g. no CGO, no network at test time)
\ No newline at end of file
+- **Go 1.26+**, statically linked (`CGO_ENABLED=0`). The `ctx`
+ binary is the entire deliverable for the core; everything else
+ ships as embedded bytes inside it.
+- **Cobra** for the CLI command surface.
+- **`embed.FS`** for shipping foreign-language assets (TypeScript,
+ Bash, PowerShell, Markdown, JSON, YAML) inside the Go binary.
+ See `internal/assets/README.md` for the embed contract; the
+ hard `//go:embed` no-`../` rule shapes the directory layout.
+
+## Separately-published
+
+- **VS Code extension** at `editors/vscode/` ships as a `.vsix`
+ to the VS Code Marketplace under publisher `activememory`. It
+ is NOT embedded; it has its own `package.json`, `tsconfig.json`,
+ and CI guardrails (`vscode-extension` job).
+- The embedded **OpenCode plugin** at
+ `internal/assets/integrations/opencode/plugin/index.ts` has its
+ type-check tooling outside the embed tree at
+ `tools/typecheck/opencode/`.
+
+## Hard constraints
+
+- **No runtime dependencies.** No package manager, no network
+ fetch on install. If a feature needs a daemon or a service,
+ it's the wrong feature.
+- **No CGO.** Build must succeed with `CGO_ENABLED=0` on every
+ supported platform (Linux/macOS/Windows × amd64/arm64).
+- **No network calls during normal operation.** Tests included.
+ Operations that genuinely need network (e.g. GitHub release
+ download in the VS Code extension auto-bootstrap) are scoped
+ and opt-in.
+- **Foreign-language assets ship embedded, not at install time.**
+ TypeScript / Bash / PowerShell that integrates with external
+ tools is baked into the Go binary at compile time and written
+ out to the user's filesystem by `ctx setup `.
+
+## Companion tooling
+
+- **GitNexus** (`mcp__gitnexus__*`) — code intelligence MCP
+ server for impact analysis, route maps, and shape checks.
+- **Gemini Search** — preferred over built-in web search for
+ faster, more accurate results.
+
+## Build / test / lint
+
+- `make build`, `make test`, `make lint` are the canonical
+ entrypoints. CI runs the same.
+- `make site` rebuilds `site/` from `docs/` via zensical.
+- The TS type-check for embedded OpenCode plugin lives at
+ `tools/typecheck/opencode/`; `npx tsc --noEmit` is the gate.
+- The VS Code extension gate runs `npm ci && npm run build &&
+ npx tsc --noEmit -p tsconfig.ci.json` in CI.
diff --git a/.context/steering/workflow.md b/.context/steering/workflow.md
index 4b9b43a4d..fb668aa64 100644
--- a/.context/steering/workflow.md
+++ b/.context/steering/workflow.md
@@ -4,47 +4,67 @@ description: Development workflow and process rules
inclusion: always
priority: 10
---
-
# Development Workflow
-Describe the development workflow, branching strategy, and process rules.
+## Branch discipline
-- **Branch strategy** (main-only, trunk-based, feature branches)
-- **Commit conventions** (message format, signed-off-by)
-- **Pre-commit / pre-push checks**
-- **Review expectations**
\ No newline at end of file
+- **Branch off `main` BEFORE the first commit.** `main` is
+ off-limits for direct commits. Even one-line fixes branch.
+- When the user signals "stacking is intentional," stay on the
+ current feature branch — do NOT create a new one.
+- Branch names follow the conventional-commit shape:
+ `feat/`, `fix/`, `docs/`, `chore/`.
+
+## Never push, never merge
+
+- **Never run `git push`.** Never offer to. Stop at commit. The
+ human is the final authoritative decision maker before any
+ push to upstream (CONSTITUTION).
+- Same rule for `gh pr create` and `gh pr merge`. Don't.
+
+## DCO sign-off is required
+
+- Every commit needs `Signed-off-by: …` — use `git commit -s`.
+- CI's DCO workflow blocks PRs that lack the sign-off line. There
+ is no exception.
+
+## Every commit has a Spec trailer
+
+- `Spec: specs/.md` at the end of every commit message
+ (CONSTITUTION). No "non-trivial" qualifier; even one-liner
+ fixes get a spec for traceability.
+- Use `/ctx-commit` rather than raw `git commit` so decisions
+ and learnings get captured alongside the code.
+
+## Gates before every commit
+
+- `make lint` — must return zero issues.
+- `make test` — must pass.
+- Working tree must be clean of unrelated changes. Surface
+ pre-existing modifications before bundling them; never
+ silently fold them in.
+
+## Conventional commit subjects
+
+- Prefixes: `feat(scope):`, `fix(scope):`, `docs(scope):`,
+ `refactor(scope):`, `chore(scope):`, `deps:`, `test(scope):`.
+- Subject under 70 characters; details go in the body.
+- Co-Authored-By for Claude is omitted. The human signoff stays.
+
+## Error handling
+
+- Handle every error at the call site. No `_ =` discards. No
+ `value, _ :=`. No `panic`. Existing `_ =` and silent skips in
+ the codebase are tech debt, not authorization to copy.
+- Path construction uses stdlib (`filepath.Join`); never string
+ concatenation (security: prevents path traversal — CONSTITUTION).
+
+## Context capture cadence
+
+- After completing a task, making a non-obvious decision, or
+ hitting a gotcha: persist before continuing. Don't wait for
+ session end.
+- Use `/ctx-decision-add`, `/ctx-learning-add`,
+ `/ctx-convention-add`, `/ctx-task-add`. They auto-link to the
+ current session + branch + commit.
diff --git a/docs/blog/2026-01-27-building-ctx-using-ctx.md b/docs/blog/2026-01-27-building-ctx-using-ctx.md
index 74f531bc9..b7ee3c4bb 100644
--- a/docs/blog/2026-01-27-building-ctx-using-ctx.md
+++ b/docs/blog/2026-01-27-building-ctx-using-ctx.md
@@ -11,7 +11,7 @@ topics:
- architectural decisions
---
-# Building ctx Using ctx
+# Building `ctx` Using `ctx`
!!! note "Update (2026-02-11)"
As of `v0.4.0`, `ctx` consolidated sessions into the journal mechanism.
@@ -538,7 +538,7 @@ Because not everyone always lives in the terminal (*me included*).
## Conclusion
-Building `ctx` using ctx was a meta-experiment in AI-assisted development.
+Building `ctx` using `ctx` was a meta-experiment in AI-assisted development.
I learned that **memory isn't just convenient: It's transformative**:
diff --git a/docs/blog/2026-02-01-ctx-v0.2.0-the-archaeology-release.md b/docs/blog/2026-02-01-ctx-v0.2.0-the-archaeology-release.md
index 8ecbfd9f2..11f4043b1 100644
--- a/docs/blog/2026-02-01-ctx-v0.2.0-the-archaeology-release.md
+++ b/docs/blog/2026-02-01-ctx-v0.2.0-the-archaeology-release.md
@@ -263,10 +263,10 @@ The same structure serves two very different readers.
## The Configuration: `.contextrc`
-[Projects can now customize ctx behavior
+[Projects can now customize `ctx` behavior
via `.contextrc`](../cli/system.md#contextrc).
-This makes ctx usable in real teams, not just personal projects.
+This makes `ctx` usable in real teams, not just personal projects.
Priority order: CLI flags > environment variables > `.contextrc` >
sensible defaults
diff --git a/docs/blog/2026-02-08-not-everything-is-a-skill.md b/docs/blog/2026-02-08-not-everything-is-a-skill.md
index db9db7780..30a010823 100644
--- a/docs/blog/2026-02-08-not-everything-is-a-skill.md
+++ b/docs/blog/2026-02-08-not-everything-is-a-skill.md
@@ -14,7 +14,7 @@ topics:
# Not Everything Is a Skill
!!! note "Update (2026-02-11)"
- As of v0.4.0, ctx consolidated sessions into the journal mechanism.
+ As of v0.4.0, `ctx` consolidated sessions into the journal mechanism.
References to `/ctx-save`, `.context/sessions/`, and session auto-save
in this post reflect the architecture at the time of writing.
diff --git a/docs/blog/2026-02-15-ctx-v0.3.0-the-discipline-release.md b/docs/blog/2026-02-15-ctx-v0.3.0-the-discipline-release.md
index b84884eca..3c96be038 100644
--- a/docs/blog/2026-02-15-ctx-v0.3.0-the-discipline-release.md
+++ b/docs/blog/2026-02-15-ctx-v0.3.0-the-discipline-release.md
@@ -11,7 +11,7 @@ topics:
- E/A/R framework
---
-# ctx v0.3.0: The Discipline Release
+# `ctx` v0.3.0: The Discipline Release

diff --git a/docs/blog/2026-02-16-ctx-v0.6.0-the-integration-release.md b/docs/blog/2026-02-16-ctx-v0.6.0-the-integration-release.md
index 5b7f679e0..3dd65c676 100644
--- a/docs/blog/2026-02-16-ctx-v0.6.0-the-integration-release.md
+++ b/docs/blog/2026-02-16-ctx-v0.6.0-the-integration-release.md
@@ -11,7 +11,7 @@ topics:
- security hardening
---
-# ctx v0.6.0: The Integration Release
+# `ctx` v0.6.0: The Integration Release

diff --git a/docs/blog/2026-02-17-code-is-cheap-judgment-is-not.md b/docs/blog/2026-02-17-code-is-cheap-judgment-is-not.md
index 05ecc2347..b901d6e9d 100644
--- a/docs/blog/2026-02-17-code-is-cheap-judgment-is-not.md
+++ b/docs/blog/2026-02-17-code-is-cheap-judgment-is-not.md
@@ -116,7 +116,7 @@ accountable.
---
-## The Evidence from Building ctx
+## The Evidence from Building `ctx`
I did **not** arrive at this conclusion theoretically.
@@ -125,7 +125,7 @@ and watching **exactly where** a human touch mattered.
### YOLO Mode Proved Production Is Cheap
-In [Building ctx Using ctx][origin-post], I documented the YOLO
+In [Building `ctx` Using `ctx`][origin-post], I documented the YOLO
phase: auto-accept everything, let the AI ship features at full
speed. It produced 14 commands in a week. Impressive output.
@@ -324,7 +324,7 @@ the *replacement*:
This post is a retrospective. It synthesizes the thread running
through every previous entry in this blog:
-* [Building ctx Using ctx][origin-post] showed that production
+* [Building `ctx` Using `ctx`][origin-post] showed that production
without direction creates debt
* [Refactoring with Intent](2026-02-01-refactoring-with-intent.md)
showed that slowing down is not the opposite of progress
@@ -352,7 +352,7 @@ From **YOLO mode** to **defense in depth**, the pattern is the same:
*This post synthesizes the thread running through every previous
entry in this blog. The evidence is drawn from three weeks of
-building ctx with AI assistance, the decisions recorded in
+building `ctx` with AI assistance, the decisions recorded in
`DECISIONS.md`, the learnings captured in `LEARNINGS.md`, and the git
history that tracks where the human mattered and where the AI
ran unsupervised.*
diff --git a/docs/blog/2026-02-17-context-as-infrastructure.md b/docs/blog/2026-02-17-context-as-infrastructure.md
index 60212ba8b..fb41c1ca5 100644
--- a/docs/blog/2026-02-17-context-as-infrastructure.md
+++ b/docs/blog/2026-02-17-context-as-infrastructure.md
@@ -111,7 +111,7 @@ it is **maintained as persistent files** in a `.context/` directory:
This is not a novel idea. It is the same idea behind every piece of
infrastructure software engineers already use:
-| Traditional Infrastructure | ctx Equivalent |
+| Traditional Infrastructure | `ctx` Equivalent |
|----------------------------|-----------------------------|
| Database | `.context/*.md` files |
| Configuration files | `CONSTITUTION.md` |
@@ -434,7 +434,7 @@ And the practices that keep it all **honest**:
*This post synthesizes ideas from across the `ctx` blog series: the
attention budget primitive, the two-tier persistence model, the IDE
decision, and the progressive disclosure pattern. The principles are
-drawn from three weeks of building ctx and 70+ sessions of treating
+drawn from three weeks of building `ctx` and 70+ sessions of treating
context as infrastructure rather than conversation.*
*See also: [When a System Starts Explaining Itself](2026-02-17-when-a-system-starts-explaining-itself.md):
diff --git a/docs/blog/2026-02-17-parallel-agents-merge-debt-and-the-myth-of-overnight-progress.md b/docs/blog/2026-02-17-parallel-agents-merge-debt-and-the-myth-of-overnight-progress.md
index 9ad268b15..cf63c209f 100644
--- a/docs/blog/2026-02-17-parallel-agents-merge-debt-and-the-myth-of-overnight-progress.md
+++ b/docs/blog/2026-02-17-parallel-agents-merge-debt-and-the-myth-of-overnight-progress.md
@@ -398,7 +398,7 @@ Otherwise, you are **not** scaling cognition; you are scaling
[The `ctx` Manifesto](https://ctx.ist/)'s thesis holds:
-> **Without ctx, intelligence resets. With ctx, creation compounds.**
+> **Without `ctx`, intelligence resets. With `ctx`, creation compounds.**
Compounding requires *structure*.
diff --git a/docs/blog/2026-02-17-the-3-1-ratio.md b/docs/blog/2026-02-17-the-3-1-ratio.md
index e4d453897..4b85df139 100644
--- a/docs/blog/2026-02-17-the-3-1-ratio.md
+++ b/docs/blog/2026-02-17-the-3-1-ratio.md
@@ -349,7 +349,7 @@ already paid the compounding cost.
This post sits at a crossroads in the `ctx` story. Looking back:
-* [Building ctx Using ctx][origin-post] documented the YOLO sprint
+* [Building `ctx` Using `ctx`][origin-post] documented the YOLO sprint
that created the initial codebase
* [Refactoring with Intent][refactor-post] introduced the 3:1 ratio
as an observation from the first cleanup
@@ -373,7 +373,7 @@ The **ratio** is the **schedule** is the **discipline**.
---
-*This post was drafted from git log analysis of the ctx repository,
+*This post was drafted from git log analysis of the `ctx` repository,
mapping every commit from January 20 to February 7 into feature vs
consolidation categories. The patterns described are drawn from the
project's CONVENTIONS.md, LEARNINGS.md, and the `/audit` skill's
diff --git a/docs/blog/2026-02-17-when-a-system-starts-explaining-itself.md b/docs/blog/2026-02-17-when-a-system-starts-explaining-itself.md
index 7df93ce76..a00877cf6 100644
--- a/docs/blog/2026-02-17-when-a-system-starts-explaining-itself.md
+++ b/docs/blog/2026-02-17-when-a-system-starts-explaining-itself.md
@@ -322,7 +322,7 @@ Every previous post looked inward.
This one looks outward.
-* [Building ctx Using ctx][origin-post]: one mind, one repository
+* [Building `ctx` Using `ctx`][origin-post]: one mind, one repository
* [The Attention Budget][attention-post]: the constraint
* [Context as Infrastructure][infra-post]: the architecture
* [Code Is Cheap. Judgment Is Not.][judgment-post]: the bottleneck
diff --git a/docs/blog/2026-03-04-agent-memory-is-infrastructure.md b/docs/blog/2026-03-04-agent-memory-is-infrastructure.md
index d08fe90aa..ff9d6970a 100644
--- a/docs/blog/2026-03-04-agent-memory-is-infrastructure.md
+++ b/docs/blog/2026-03-04-agent-memory-is-infrastructure.md
@@ -391,7 +391,7 @@ Often they **don't**.
But the repository (*the place where the project actually lives*)
has nowhere for that knowledge to go.
-That missing layer is what [ctx][ctx-site] builds: a version-controlled,
+That missing layer is what [`ctx`][ctx-site] builds: a version-controlled,
structured knowledge layer that lives in `.context/` alongside your code and
travels wherever your repository travels.
diff --git a/docs/blog/2026-03-23-ctx-v0.8.0-the-architecture-release.md b/docs/blog/2026-03-23-ctx-v0.8.0-the-architecture-release.md
index 2c065be3f..8a5e9b038 100644
--- a/docs/blog/2026-03-23-ctx-v0.8.0-the-architecture-release.md
+++ b/docs/blog/2026-03-23-ctx-v0.8.0-the-architecture-release.md
@@ -17,7 +17,7 @@ topics:
- localization
---
-# ctx v0.8.0: The Architecture Release
+# `ctx` v0.8.0: The Architecture Release

@@ -197,7 +197,7 @@ The best measure of a refactoring isn't what you added. It's what
you removed.
* **`fatih/color`**: the sole third-party UI dependency. Replaced
- by Unicode symbols. ctx now has exactly two direct dependencies:
+ by Unicode symbols. `ctx` now has exactly two direct dependencies:
`spf13/cobra` and `gopkg.in/yaml.v3`.
* **`format.Pluralize()`**: a function that tried to pluralize
English words at runtime. Replaced by explicit singular/plural
@@ -360,7 +360,7 @@ protocol is standard. Now it's about what you build on top.
## The Arc
-This is the seventh post in the ctx blog series. The arc so far:
+This is the seventh post in the `ctx` blog series. The arc so far:
1. [The Attention Budget](2026-02-03-the-attention-budget.md):
why context windows are a scarce resource
diff --git a/docs/blog/2026-03-23-we-broke-the-3-1-rule.md b/docs/blog/2026-03-23-we-broke-the-3-1-rule.md
index 0b2ee023d..ef0c0ce20 100644
--- a/docs/blog/2026-03-23-we-broke-the-3-1-rule.md
+++ b/docs/blog/2026-03-23-we-broke-the-3-1-rule.md
@@ -260,7 +260,7 @@ practice:
## The Arc
-This is the eighth post in the ctx blog series:
+This is the eighth post in the `ctx` blog series:
1. [The Attention Budget](2026-02-03-the-attention-budget.md):
why context windows are a scarce resource
diff --git a/docs/blog/2026-04-06-the-watermelon-rind-anti-pattern.md b/docs/blog/2026-04-06-the-watermelon-rind-anti-pattern.md
index 6a911019b..1213264c4 100644
--- a/docs/blog/2026-04-06-the-watermelon-rind-anti-pattern.md
+++ b/docs/blog/2026-04-06-the-watermelon-rind-anti-pattern.md
@@ -42,7 +42,7 @@ dashboards passing, reality crumbling.
Both halves of this metaphor showed up in a single experiment. And
the result changed how we design architecture analysis in
-[ctx][ctx].
+[`ctx`][`ctx`].
[ctx]: https://ctx.ist
@@ -230,7 +230,7 @@ autocomplete.
---
-*This post is part of the [ctx field notes][blog] series,
+*This post is part of the [`ctx` field notes][blog] series,
documenting what we learn building persistent context
infrastructure for AI coding sessions.*
diff --git a/docs/blog/index.md b/docs/blog/index.md
index 6d71fc57a..a6206c25c 100644
--- a/docs/blog/index.md
+++ b/docs/blog/index.md
@@ -11,7 +11,7 @@ Stories, insights, and lessons learned from **building** and **using** `ctx`.
## Releases
-### [ctx v0.8.0: The Architecture Release](2026-03-23-ctx-v0.8.0-the-architecture-release.md)
+### [`ctx` v0.8.0: The Architecture Release](2026-03-23-ctx-v0.8.0-the-architecture-release.md)
*March 23, 2026*: 374 commits, 1,708 Go files touched, and a near-complete
architectural overhaul. Every CLI package restructured into `cmd/ + core/`
@@ -97,11 +97,11 @@ persistence, design philosophy
*February 3, 2026*: Every token you send to an AI consumes a finite
resource: the **attention budget**. Understanding this constraint shaped every
-design decision in ctx: hierarchical file structure, explicit budgets,
+design decision in `ctx`: hierarchical file structure, explicit budgets,
progressive disclosure, and filesystem-as-index.
**Topics**: attention mechanics, context engineering, progressive disclosure,
-ctx primitives, token budgets
+`ctx` primitives, token budgets
---
@@ -295,9 +295,9 @@ infrastructure decisions, context engineering
## Releases
-### [ctx v0.6.0: The Integration Release](2026-02-16-ctx-v0.6.0-the-integration-release.md)
+### [`ctx` v0.6.0: The Integration Release](2026-02-16-ctx-v0.6.0-the-integration-release.md)
-*February 16, 2026*: ctx is now a Claude Marketplace plugin. Two commands,
+*February 16, 2026*: `ctx` is now a Claude Marketplace plugin. Two commands,
no build step, no shell scripts. v0.6.0 replaces six Bash hook scripts with
compiled Go subcommands and ships 25+ Skills as a **plugin**.
@@ -306,7 +306,7 @@ security hardening
---
-### [ctx v0.3.0: The Discipline Release](2026-02-15-ctx-v0.3.0-the-discipline-release.md)
+### [`ctx` v0.3.0: The Discipline Release](2026-02-15-ctx-v0.3.0-the-discipline-release.md)
*February 15, 2026*: No new headline feature. Just 35+ documentation and
quality commits against ~15 feature commits. What a release looks like when
@@ -317,7 +317,7 @@ E/A/R framework
---
-### [ctx v0.2.0: The Archaeology Release](2026-02-01-ctx-v0.2.0-the-archaeology-release.md)
+### [`ctx` v0.2.0: The Archaeology Release](2026-02-01-ctx-v0.2.0-the-archaeology-release.md)
*February 1, 2026*: What if your AI could remember everything? Not just
the current session, but every session. `ctx` v0.2.0 introduces the recall
@@ -328,7 +328,7 @@ meta-tools
---
-### [Building ctx Using ctx: A Meta-Experiment in AI-Assisted Development](2026-01-27-building-ctx-using-ctx.md)
+### [Building `ctx` Using `ctx`: A Meta-Experiment in AI-Assisted Development](2026-01-27-building-ctx-using-ctx.md)
*January 27, 2026*: What happens when you build a tool designed to give AI
memory, using that very same tool to remember what you're building? This is
diff --git a/docs/cli/config.md b/docs/cli/config.md
index b60479add..80f3600b6 100644
--- a/docs/cli/config.md
+++ b/docs/cli/config.md
@@ -19,7 +19,7 @@ Manage runtime configuration profiles.
ctx config
```
-The ctx repo ships two `.ctxrc` source profiles (`.ctxrc.base` and
+The `ctx` repo ships two `.ctxrc` source profiles (`.ctxrc.base` and
`.ctxrc.dev`). The working copy (`.ctxrc`) is gitignored and switched
between them using subcommands below.
diff --git a/docs/cli/connection.md b/docs/cli/connection.md
index c56a8e6eb..76f6103ae 100644
--- a/docs/cli/connection.md
+++ b/docs/cli/connection.md
@@ -39,7 +39,7 @@ them.
### `ctx connection register`
-One-time registration with a ctx Hub. Requires the ctx Hub address and
+One-time registration with a `ctx` Hub. Requires the `ctx` Hub address and
admin token (printed by `ctx hub start` on first run).
**Examples**:
@@ -53,7 +53,7 @@ On success, stores an encrypted connection config in
### `ctx connection subscribe`
-Set which entry types to receive from the ctx Hub. Only matching types
+Set which entry types to receive from the `ctx` Hub. Only matching types
are returned by sync and listen.
**Examples**:
@@ -65,7 +65,7 @@ ctx connection subscribe decision learning convention
### `ctx connection sync`
-Pull matching entries from the ctx Hub and write them to
+Pull matching entries from the `ctx` Hub and write them to
`.context/hub/` as markdown files with origin tags and date
headers. Tracks last-seen sequence for incremental sync.
@@ -77,7 +77,7 @@ ctx connection sync
### `ctx connection publish`
-Push entries to the ctx Hub. Specify type and content as arguments.
+Push entries to the `ctx` Hub. Specify type and content as arguments.
**Examples**:
@@ -88,7 +88,7 @@ ctx connection publish learning "Go embed requires files in same package"
### `ctx connection listen`
-Stream new entries from the ctx Hub in real-time. Writes to
+Stream new entries from the `ctx` Hub in real-time. Writes to
`.context/hub/` as entries arrive. Press Ctrl-C to stop.
**Examples**:
@@ -99,7 +99,7 @@ ctx connection listen
### `ctx connection status`
-Show ctx Hub connection state and entry statistics.
+Show `ctx` Hub connection state and entry statistics.
**Examples**:
@@ -109,7 +109,7 @@ ctx connection status
## Automatic Sharing
-Use `--share` on `ctx add` to write locally AND publish to the ctx Hub:
+Use `--share` on `ctx add` to write locally AND publish to the `ctx` Hub:
```bash
ctx decision add "Use UTC" --share \
@@ -125,12 +125,12 @@ local context updates.
## Auto-Sync
Once registered, the `check-hub-sync` hook automatically syncs
-new entries from the ctx Hub at the start of each session (daily
+new entries from the `ctx` Hub at the start of each session (daily
throttled). No manual `ctx connection sync` needed.
## Shared Files
-Entries from the ctx Hub are stored in `.context/hub/`:
+Entries from the `ctx` Hub are stored in `.context/hub/`:
```
.context/hub/
diff --git a/docs/cli/guide.md b/docs/cli/guide.md
index e12cd6793..20ae50606 100644
--- a/docs/cli/guide.md
+++ b/docs/cli/guide.md
@@ -13,7 +13,7 @@ icon: lucide/book-open
## `ctx guide`
-Quick-reference cheat sheet for common ctx commands and skills.
+Quick-reference cheat sheet for common `ctx` commands and skills.
```bash
ctx guide [flags]
diff --git a/docs/cli/index.md b/docs/cli/index.md
index 24b820ea7..055306e77 100644
--- a/docs/cli/index.md
+++ b/docs/cli/index.md
@@ -25,7 +25,7 @@ All commands support these flags:
| `--version` | Show version |
| `--tool ` | Override active AI tool identifier (e.g. `kiro`, `cursor`) |
-**Tell ctx which `.context/` to use.** ctx does not search the
+**Tell `ctx` which `.context/` to use.** `ctx` does not search the
filesystem for `.context/`: you have to declare it. Three ways:
- `eval "$(ctx activate)"` (recommended): binds `CTX_DIR` for the
@@ -54,7 +54,7 @@ need a project: `ctx init`, `ctx activate`, `ctx deactivate`,
have been initialized by `ctx init` (otherwise commands return
`ctx: not initialized`).
-
+
## Getting Started
| Command | Description |
diff --git a/docs/cli/init-status.md b/docs/cli/init-status.md
index 8a19c7533..700db7681 100644
--- a/docs/cli/init-status.md
+++ b/docs/cli/init-status.md
@@ -30,7 +30,7 @@ ctx init [flags]
**Creates**:
- `.context/` directory with all template files
-- `.claude/settings.local.json` with pre-approved ctx permissions
+- `.claude/settings.local.json` with pre-approved `ctx` permissions
- `CLAUDE.md` with bootstrap instructions (or merges into existing)
Claude Code hooks and skills are provided by the **`ctx` plugin**
diff --git a/docs/cli/mcp.md b/docs/cli/mcp.md
index bb4843d39..0cd50efa0 100644
--- a/docs/cli/mcp.md
+++ b/docs/cli/mcp.md
@@ -13,12 +13,12 @@ icon: lucide/plug
## `ctx mcp`
-Run ctx as a [Model Context Protocol](https://modelcontextprotocol.io)
+Run `ctx` as a [Model Context Protocol](https://modelcontextprotocol.io)
(MCP) server. MCP is a standard protocol that lets AI tools discover
and consume context from external sources via JSON-RPC 2.0 over
stdin/stdout.
-This makes ctx accessible to **any MCP-compatible AI tool** without
+This makes `ctx` accessible to **any MCP-compatible AI tool** without
custom hooks or integrations:
- Claude Desktop
@@ -36,7 +36,7 @@ directly from a shell**. See [Configuration](#configuration) below
for how each host launches it.
**Flags:** None. The server uses the declared context directory
-from `CTX_DIR`. As with every other ctx command, that variable
+from `CTX_DIR`. As with every other `ctx` command, that variable
must be set: the server does not walk the filesystem.
**Examples**:
@@ -133,7 +133,7 @@ changes on disk.
## Tools
-Tools expose ctx commands as callable operations. Each tool accepts
+Tools expose `ctx` commands as callable operations. Each tool accepts
JSON arguments and returns text results.
### `ctx_status`
diff --git a/docs/cli/steering.md b/docs/cli/steering.md
index b41b8bfa5..7975ab173 100644
--- a/docs/cli/steering.md
+++ b/docs/cli/steering.md
@@ -185,7 +185,7 @@ additional context. This fires on every tool call; no
user action.
**2. On-demand MCP tool call (`ctx_steering_get`).** The
-ctx plugin ships a `.mcp.json` file that automatically
+`ctx` plugin ships a `.mcp.json` file that automatically
registers the `ctx` MCP server (`ctx mcp serve`) with
Claude Code on plugin install. Once registered, Claude
can invoke the `ctx_steering_get` tool mid-task to fetch
diff --git a/docs/cli/trigger.md b/docs/cli/trigger.md
index 44c0383dd..a631a8f59 100644
--- a/docs/cli/trigger.md
+++ b/docs/cli/trigger.md
@@ -189,7 +189,7 @@ ctx trigger disable inject-context
# Disabled .context/hooks/session-start/inject-context.sh
```
-### Three Hooking Concepts in ctx (Don't Confuse Them)
+### Three Hooking Concepts in `ctx` (Don't Confuse Them)
This is a common source of confusion. `ctx` has three
distinct hook-like layers, and they serve different purposes:
@@ -197,7 +197,7 @@ distinct hook-like layers, and they serve different purposes:
| Layer | Owned by | Where it runs | Configured via |
|-----------------------|-------------|--------------------------------------------|----------------------------------------|
| **`ctx trigger`** | You | `.context/hooks//*.sh` | `ctx trigger add/enable` |
-| **`ctx system` hooks**| ctx itself | built-in, called by ctx's own lifecycle | internal (see `ctx system --help`) |
+| **`ctx system` hooks**| `ctx` itself | built-in, called by `ctx`'s own lifecycle | internal (see `ctx system --help`) |
| **Claude Code hooks** | Claude Code | `.claude/settings.local.json` | edit JSON, or `/ctx-sanitize-permissions` |
Use `ctx trigger` when you want project-specific automation
diff --git a/docs/home/about.md b/docs/home/about.md
index 44b21e31d..d52798ff7 100644
--- a/docs/home/about.md
+++ b/docs/home/about.md
@@ -67,7 +67,7 @@ Without persistent memory, every session starts at zero.
`ctx` gives your AI a memory that persists across sessions:
-=== "Without ctx"
+=== "Without `ctx`"
```text
Session 12: Monday morning
@@ -86,7 +86,7 @@ Without persistent memory, every session starts at zero.
20 minutes spent restoring decisions that already exist.
```
-=== "With ctx"
+=== "With `ctx`"
```text
Session 12: Monday morning
diff --git a/docs/home/common-workflows.md b/docs/home/common-workflows.md
index d436ab554..9504843da 100644
--- a/docs/home/common-workflows.md
+++ b/docs/home/common-workflows.md
@@ -305,7 +305,7 @@ inside your coding assistant.
Commands and skills are **not interchangeable**: Each has a distinct role.
-| | ctx CLI command | ctx AI skill |
+| | `ctx` CLI command | `ctx` AI skill |
|----------------|------------------------------------|---------------------------------------------------|
| **Runs where** | Your terminal | Inside the AI assistant |
| **Speed** | Fast (*milliseconds*) | Slower (*LLM round-trip*) |
@@ -314,7 +314,7 @@ Commands and skills are **not interchangeable**: Each has a distinct role.
| **Best for** | Quick checks, scripting, CI | Deep analysis, generation, workflow orchestration |
-
+
### Paired Commands
@@ -386,7 +386,7 @@ These are infrastructure: used in scripts, CI, or one-time setup.
| `ctx decision` | List and filter decisions |
| `ctx learning` | List and filter learnings |
| `ctx task` | List tasks, manage archival and snapshots |
-| `ctx why` | Read the philosophy behind ctx |
+| `ctx why` | Read the philosophy behind `ctx` |
| `ctx guide` | Quick-reference cheat sheet |
| `ctx site` | Site management commands |
| `ctx config` | Manage runtime configuration profiles |
diff --git a/docs/home/configuration.md b/docs/home/configuration.md
index dce7adfb3..8f7db1891 100644
--- a/docs/home/configuration.md
+++ b/docs/home/configuration.md
@@ -13,7 +13,7 @@ icon: lucide/settings
## Configuration
-ctx uses three layers of configuration. Each layer overrides the one below it:
+`ctx` uses three layers of configuration. Each layer overrides the one below it:
1. **CLI flags**: Per-invocation overrides (*highest priority*)
2. **Environment variables**: Shell or CI/CD overrides
@@ -51,7 +51,7 @@ invocation. There is no global or user-level config file: configuration is
always per-project.
!!! note "Contributors: Dev Configuration Profile"
- The ctx repo ships two `.ctxrc` source profiles (`.ctxrc.base` and
+ The `ctx` repo ships two `.ctxrc` source profiles (`.ctxrc.base` and
`.ctxrc.dev`). The working copy is gitignored and swapped between them
via `ctx config switch dev` / `ctx config switch base`.
See [Contributing: Configuration Profiles](contributing.md#configuration-profiles).
@@ -197,7 +197,7 @@ CTX_TOKEN_BUDGET=16000 ctx agent
---
-
+
## CLI Global Flags
CLI flags have the highest priority and override both environment variables and
diff --git a/docs/home/contributing.md b/docs/home/contributing.md
index aa7609a70..3591ba2f1 100644
--- a/docs/home/contributing.md
+++ b/docs/home/contributing.md
@@ -147,7 +147,7 @@ never distributed to users.
| `/_ctx-command-audit` | Audit CLI surface after renames, moves, or deletions |
Six skills previously in this list have been promoted to bundled plugin skills
-and are now available to all ctx users: `/ctx-brainstorm`, `/ctx-link-check`,
+and are now available to all `ctx` users: `/ctx-brainstorm`, `/ctx-link-check`,
`/ctx-permission-sanitize`, `/ctx-skill-create`, `/ctx-spec`.
----
@@ -179,7 +179,7 @@ Pattern to follow: `internal/cli/pad/pad.go` (parent with subcommands) or
### Package Taxonomy
-ctx separates concerns into a strict package taxonomy. Knowing where
+`ctx` separates concerns into a strict package taxonomy. Knowing where
things go prevents code review friction and keeps the AST lint tests
happy.
@@ -334,7 +334,7 @@ is gitignored and swapped between them:
| `.ctxrc.dev` | Dev profile: notify events enabled, verbose logging |
| `.ctxrc` | Working copy (*gitignored*: copied from one of the above) |
-Use ctx commands to switch:
+Use `ctx` commands to switch:
```bash
ctx config switch dev # switch to dev profile
diff --git a/docs/home/faq.md b/docs/home/faq.md
index e0c98e7a6..21e64fe2e 100644
--- a/docs/home/faq.md
+++ b/docs/home/faq.md
@@ -21,7 +21,7 @@ context with `cat`, diff it with `git diff`, and review it in a PR.
## Does `ctx` Work Offline?
-Yes. ctx is completely local. It reads and writes files on disk,
+Yes. `ctx` is completely local. It reads and writes files on disk,
generates context packets from local state, and requires no network
access. The only feature that touches the network is the optional
[webhook notifications](../recipes/webhook-notifications.md) hook,
@@ -60,7 +60,7 @@ ctx agent --budget 4000
```
Higher budgets include more context but cost more tokens per request.
-Lower budgets force sharper prioritization: ctx drops lower-priority
+Lower budgets force sharper prioritization: `ctx` drops lower-priority
content first, so CONSTITUTION and TASKS always make the cut.
See [Configuration](configuration.md) for all available settings.
@@ -81,9 +81,9 @@ Yes. `ctx agent` outputs a context packet that any AI tool can
consume: paste it into ChatGPT, Cursor, Copilot, Aider, or anything
else that accepts text input.
-Claude Code gets first-class integration via the ctx plugin (hooks,
+Claude Code gets first-class integration via the `ctx` plugin (hooks,
skills, automatic context loading). VS Code Copilot Chat has a
-dedicated ctx extension. Other tools integrate via generated
+dedicated `ctx` extension. Other tools integrate via generated
instruction files or manual pasting.
See [Integrations](../operations/integrations.md) for tool-specific
@@ -97,7 +97,7 @@ you work. Context grows naturally; you don't need to backfill
everything on day one.
See [Getting Started](getting-started.md) for the full setup flow,
-or [Joining a ctx Project](joining-a-project.md) if someone else
+or [Joining a `ctx` Project](joining-a-project.md) if someone else
already initialized it.
## What Happens When Context Files Get Too Big?
diff --git a/docs/home/first-session.md b/docs/home/first-session.md
index 4420aebd0..0cd518e95 100644
--- a/docs/home/first-session.md
+++ b/docs/home/first-session.md
@@ -52,7 +52,7 @@ Next steps:
This created your `.context/` directory with template files.
-For Claude Code, [install the ctx plugin](getting-started.md#installation) to get automatic hooks and skills.
+For Claude Code, [install the `ctx` plugin](getting-started.md#installation) to get automatic hooks and skills.
## Step 2: Activate the Project
@@ -153,7 +153,7 @@ via hooks, but the explicit ceremony gives you a **readback** to verify.
!!! info "Using VS Code?"
With **VS Code Copilot Chat** (*and the
- [ctx extension](../operations/integrations.md#vs-code-chat-extension-ctx)*),
+ [`ctx` extension](../operations/integrations.md#vs-code-chat-extension-ctx)*),
type `@ctx /agent` in chat to load your context packet, or `@ctx /status`
to check your project context. Run `ctx setup copilot --write` once
to generate `.github/copilot-instructions.md` for automatic context loading.
diff --git a/docs/home/getting-started.md b/docs/home/getting-started.md
index cc15c58d7..6c0b1d00d 100644
--- a/docs/home/getting-started.md
+++ b/docs/home/getting-started.md
@@ -27,7 +27,7 @@ Also, several `ctx` features (*journal changelog, blog generation*) also use
Every setup starts with **the `ctx` binary**: the CLI tool itself.
-If you use **Claude Code**, you also install the **ctx plugin**, which
+If you use **Claude Code**, you also install the **`ctx` plugin**, which
adds hooks (context autoloading, persistence nudges) and 25+ `/ctx-*`
skills. For other AI tools, `ctx` integrates via generated instruction
files or manual context pasting: see
@@ -198,37 +198,59 @@ ctx init
This creates a `.context/` directory with template files and an
encryption key at `~/.ctx/` for the
[encrypted scratchpad](../reference/scratchpad.md).
-For Claude Code, install the [ctx plugin](../operations/integrations.md#claude-code-full-integration)
+For Claude Code, install the [`ctx` plugin](../operations/integrations.md#claude-code-full-integration)
for automatic hooks and skills.
-**`ctx init` also scaffolds four *foundation steering files*** in
-`.context/steering/`; these are behavioral-rule templates that
-tell your AI how to act on your project:
-
-| File | What it captures |
-|-----------------|-----------------------------------------------------|
-| `product.md` | Product context, goals, and target users |
-| `tech.md` | Technology stack, constraints, key dependencies |
-| `structure.md` | Project structure and directory conventions |
-| `workflow.md` | Development workflow and process rules |
-
-Each file starts with a self-documenting HTML comment
-explaining the three inclusion modes (`always` / `auto` /
-`manual`), priority, and tool scoping. The defaults are set
-to `inclusion: always` and `priority: 10`, so they fire on
-every AI tool call until you edit them.
-
-**You should open each of these files and replace the
-placeholder content with your project's actual rules.**
-Running `ctx init` again won't clobber your edits; existing
-files are left alone. To opt out entirely, use
-`ctx init --no-steering-init`.
-
-See [Writing Steering Files](../recipes/steering.md) for the
-full walkthrough, or [`ctx steering`](../cli/steering.md) for
-the command reference.
-
-### 2. Activate the Project
+`ctx init` also scaffolds four **foundation steering files** in
+`.context/steering/` — `product.md`, `tech.md`, `structure.md`,
+`workflow.md`. **They are placeholders until you customize
+them** (see the next step); skipping that step has consequences,
+so it is broken out as its own numbered beat rather than
+buried here.
+
+### 2. Customize Your Steering Files
+
+Steering files are **behavioral rules prepended to every AI
+prompt** — the layer that tells your AI *how to act* on this
+specific project. They are distinct from decisions (*what* was
+chosen) and conventions (*how* the codebase is written); see
+[`ctx` for Steering Files](../recipes/steering.md) for the full
+model.
+
+`ctx init` scaffolded four foundation files; open each and
+fill it in:
+
+| File | What to fill in |
+|-----------------|--------------------------------------------------------|
+| `product.md` | What the project is, who uses it, what's out of scope |
+| `tech.md` | Languages, frameworks, runtime, hard constraints |
+| `structure.md` | Directory layout, where new files go, naming rules |
+| `workflow.md` | Branch strategy, commit conventions, pre-commit checks |
+
+Each scaffolded file ships with a **tombstone marker** line
+(``).
+**As long as the marker is present, the file is silently
+skipped** on every load path: the agent context packet, MCP
+`ctx_steering_get`, and native-tool sync (Cursor / Cline /
+Kiro). The skip is deliberate — injecting unfilled placeholders
+into AI prompts is worse than no steering at all, because the
+AI tries to follow "Describe the product..." as if it were a
+rule.
+
+**Replace each file's body with real content, then delete the
+tombstone line.** When the line is gone, the file becomes
+active on the next AI tool call.
+
+Don't want steering at all? Pass `--no-steering-init` to
+`ctx init` to skip the scaffold entirely. Existing edits are
+never clobbered by re-running `ctx init`.
+
+Inclusion modes (`always` / `auto` / `manual`), priority, and
+tool scoping are covered in
+[Writing Steering Files](../recipes/steering.md) and
+[`ctx steering`](../cli/steering.md).
+
+### 3. Activate the Project
Tell `ctx` which `.context/` directory the rest of these commands
should use:
@@ -243,7 +265,7 @@ users can wire it into `.envrc` and forget about it. For more
options (multiple `.context/` directories, scripts, CI), see
[Activating a Context Directory](../recipes/activating-context.md).
-### 3. Check Status
+### 4. Check Status
```bash
ctx status
@@ -251,13 +273,13 @@ ctx status
Shows context summary: files present, token estimate, and recent activity.
-### 4. Start Using with AI
+### 5. Start Using with AI
With Claude Code (*and the `ctx` plugin installed*), context loads automatically
via hooks.
With **VS Code Copilot Chat**, install the
-[ctx extension](../operations/integrations.md#vs-code-chat-extension-ctx) and use
+[`ctx` extension](../operations/integrations.md#vs-code-chat-extension-ctx) and use
`@ctx /status`, `@ctx /agent`, and other slash commands directly in chat.
Run `ctx setup copilot --write` to generate `.github/copilot-instructions.md`
for automatic context loading.
@@ -268,7 +290,7 @@ For other tools, paste the output of:
ctx agent --budget 8000
```
-### 4B. Set Up for Your AI Tool
+### 5B. Set Up for Your AI Tool
If you use an MCP-compatible tool, generate the integration config
with `ctx setup`:
@@ -294,20 +316,20 @@ with `ctx setup`:
# Creates .vscode/mcp.json and syncs steering files
```
-This registers the ctx MCP server and syncs any
+This registers the `ctx` MCP server and syncs any
[steering files](../cli/steering.md) into the tool's
native format. Re-run after adding or changing steering files.
-### 5. Verify It Works
+### 6. Verify It Works
Ask your AI: **"Do you remember?"**
It should cite specific context: current tasks, recent decisions,
or previous session topics.
-### 6. Set Up Companion Tools (Highly Recommended)
+### 7. Set Up Companion Tools (Highly Recommended)
-ctx works on its own, but two companion MCP servers unlock significantly
+`ctx` works on its own, but two companion MCP servers unlock significantly
better agent behavior. The investment is small and the benefits compound
over sessions:
diff --git a/docs/home/index.md b/docs/home/index.md
index 2b23712d1..17c8c65f9 100644
--- a/docs/home/index.md
+++ b/docs/home/index.md
@@ -124,7 +124,7 @@ tool calls, inject standup notes, log file saves.
## Community
-### [#ctx](community.md)
+### [#`ctx`](community.md)
We are the builders who care about **durable** context.
Join the community. Hang out in IRC. Star `ctx` on GitHub.
diff --git a/docs/home/is-ctx-right.md b/docs/home/is-ctx-right.md
index 304db285f..8070f248c 100644
--- a/docs/home/is-ctx-right.md
+++ b/docs/home/is-ctx-right.md
@@ -51,7 +51,7 @@ when to skip it:
centralized context services, `ctx` may duplicate that layer.
For a deeper technical comparison with RAG, prompt management tools, and
-agent frameworks, see [ctx and Similar Tools](../reference/comparison.md).
+agent frameworks, see [`ctx` and Similar Tools](../reference/comparison.md).
---
diff --git a/docs/home/joining-a-project.md b/docs/home/joining-a-project.md
index a51acb443..7ccca44f4 100644
--- a/docs/home/joining-a-project.md
+++ b/docs/home/joining-a-project.md
@@ -81,7 +81,7 @@ ctx agent --budget 8000
```
This outputs a token-budgeted summary of the project context, ordered
-by priority. With Claude Code and the ctx plugin, context loads
+by priority. With Claude Code and the `ctx` plugin, context loads
automatically via hooks. You can also use the `/ctx-remember` skill
to get a structured readback of what the AI knows.
@@ -109,7 +109,7 @@ ctx convention add "All API handlers return structured errors"
```
You can also just tell the AI: "Record this as a learning" or
-"Add this decision to context." With the ctx plugin, context-update
+"Add this decision to context." With the `ctx` plugin, context-update
commands handle the file writes.
See the [Knowledge Capture recipe](../recipes/knowledge-capture.md) for
@@ -140,7 +140,7 @@ it with the team instead of working around the constraint.
(done) or `[-]` (skipped with a reason). The history matters for
session replay and audit.
-**Bypassing hooks.** If the project uses ctx hooks (pre-commit nudges,
+**Bypassing hooks.** If the project uses `ctx` hooks (pre-commit nudges,
context autoloading), don't disable them. They exist to keep context
fresh. If a hook is noisy or broken, fix it or file a task.
@@ -157,4 +157,4 @@ noise, not signal.
* [Knowledge Capture](../recipes/knowledge-capture.md): recording decisions,
learnings, and conventions
* [Session Lifecycle](../recipes/session-lifecycle.md): how a typical AI
- session flows with ctx
+ session flows with `ctx`
diff --git a/docs/home/opencode.md b/docs/home/opencode.md
index 11dbdd6f1..b75db475d 100644
--- a/docs/home/opencode.md
+++ b/docs/home/opencode.md
@@ -17,7 +17,7 @@ Every OpenCode session starts from zero. You re-explain your architecture,
the AI repeats mistakes it made yesterday, and decisions get rediscovered
instead of remembered.
-**Without ctx:**
+**Without `ctx`:**
```
> "Add the validation middleware we discussed"
@@ -26,7 +26,7 @@ I don't have context about previous discussions. Could you describe
what validation middleware you're referring to?
```
-**With ctx:**
+**With `ctx`:**
```
> "Add the validation middleware we discussed"
@@ -51,7 +51,7 @@ ctx setup opencode --write && ctx init && eval "$(ctx activate)"
This does three things:
1. **`ctx setup opencode --write`** — generates the project-local OpenCode plugin,
- skills, and `AGENTS.md`, then merges the ctx MCP server into OpenCode's
+ skills, and `AGENTS.md`, then merges the `ctx` MCP server into OpenCode's
global config (`~/.config/opencode/opencode.json` or
`$OPENCODE_HOME/opencode.json`). This writes outside the project root
because non-interactive shells (like MCP subprocesses) cannot discover
@@ -79,7 +79,7 @@ do anything — it just works.
| Event | What fires | What it does |
|-------|-----------|--------------|
-| New session | `session.created` | Warms ctx state in the background (bootstrap + agent packet) so MCP queries are fast on first use |
+| New session | `session.created` | Warms `ctx` state in the background (bootstrap + agent packet) so MCP queries are fast on first use |
| Agent idle | `session.idle` | Runs persistence and task-completion checks (silent — output is buffered, not surfaced to the TUI) |
| After `git commit` | `tool.execute.after` | Runs `ctx system post-commit` to capture context state |
| After file edit | `tool.execute.after` | Runs `ctx system check-task-completion` to detect silent task completions |
@@ -97,7 +97,7 @@ demand, even though the original messages are gone.
When your conversation exceeds the context window, OpenCode runs a
compaction pass (you can trigger one manually with `/compact`). The
compaction agent summarizes older messages and drops the originals. Without
-ctx, all accumulated knowledge disappears. With ctx, the plugin intercepts
+`ctx`, all accumulated knowledge disappears. With `ctx`, the plugin intercepts
the `experimental.session.compacting` event and appends `ctx system bootstrap`
output (context directory path and file inventory) into the compaction
context. The result: the compressed summary retains the breadcrumbs the
@@ -127,7 +127,7 @@ automatically. These are for when you want explicit control.
## MCP Tools
-The ctx MCP server exposes tools directly to the agent. These let the AI
+The `ctx` MCP server exposes tools directly to the agent. These let the AI
read and write your context files without shell commands:
| Tool | Purpose |
@@ -150,7 +150,7 @@ You don't invoke these yourself. The agent uses them as needed.
## Refreshing the Integration
-If you re-run `ctx setup opencode --write` (e.g., after updating ctx), the
+If you re-run `ctx setup opencode --write` (e.g., after updating `ctx`), the
plugin and skills are rewritten in place. **Restart OpenCode to pick up the
refreshed plugin** — OpenCode only loads plugins at launch, not mid-session.
diff --git a/docs/home/repeated-mistakes.md b/docs/home/repeated-mistakes.md
index 6632bdd8a..914c18624 100644
--- a/docs/home/repeated-mistakes.md
+++ b/docs/home/repeated-mistakes.md
@@ -134,5 +134,5 @@ ctx learning add "Vitest mock hoisting" \
for persisting decisions, learnings, and conventions
* [Context Files Reference](context-files.md): structure and format for
every file in `.context/`
-* [About ctx](about.md): the bigger picture - why persistent context
+* [About `ctx`](about.md): the bigger picture - why persistent context
changes how you work with AI
diff --git a/docs/home/steering.md b/docs/home/steering.md
index 74df431b2..85651cf1d 100644
--- a/docs/home/steering.md
+++ b/docs/home/steering.md
@@ -95,7 +95,7 @@ delivery channels:
with an **empty prompt**, so only `always` files match
and get injected automatically on every tool call.
2. **The `ctx_steering_get` MCP tool**, registered
- automatically when the ctx plugin is installed. Claude
+ automatically when the `ctx` plugin is installed. Claude
can call this tool mid-task to fetch `auto` or
`manual` files matching a specific prompt. Verify
with `claude mcp list`; look for `ctx: ✓ Connected`.
@@ -122,7 +122,7 @@ setup. The context budget cost is small; the alternative
## Two Families of AI Tools, Two Delivery Paths
-Not every AI tool consumes steering the same way. ctx
+Not every AI tool consumes steering the same way. `ctx`
handles two tool families differently, and it's worth
knowing which family your editor is in before you wonder
why a rule isn't firing.
@@ -131,13 +131,13 @@ why a rule isn't firing.
have a built-in rules primitive. They read a specific
directory (`.cursor/rules/`, `.clinerules/`,
`.kiro/steering/`) and apply the rules they find there.
-ctx handles these via `ctx steering sync`, which exports
+`ctx` handles these via `ctx steering sync`, which exports
your files into the tool-native format. Run `sync`
whenever you edit a steering file.
**Hook + MCP tools** (**Claude Code**, **Codex**) have
no native rules primitive, so `ctx steering sync` is a
-**no-op** for them. Instead, ctx delivers steering through
+**no-op** for them. Instead, `ctx` delivers steering through
two non-sync channels:
1. **Automatic injection via a `PreToolUse` hook**. The
@@ -148,7 +148,7 @@ two non-sync channels:
context packet it prints. Claude Code feeds that output
back into its context. Every tool call, automatically.
2. **On-demand via the `ctx_steering_get` MCP tool**. The
- ctx MCP server exposes a tool Claude can call mid-task
+ `ctx` MCP server exposes a tool Claude can call mid-task
to fetch matching steering files for a specific prompt.
Claude decides when to call it; it's not automatic.
@@ -167,7 +167,7 @@ works for Claude Code.
## Two Shapes of Automation: Rules and Scripts
-Steering is one of **two** hook-like layers ctx provides for
+Steering is one of **two** hook-like layers `ctx` provides for
customizing AI behavior. They're complementary:
- **Steering**: *persistent rules* that get prepended to
diff --git a/docs/home/triggers.md b/docs/home/triggers.md
index d4b973a9e..e906cbd69 100644
--- a/docs/home/triggers.md
+++ b/docs/home/triggers.md
@@ -52,7 +52,7 @@ type.
`ctx trigger enable ` after reviewing the contents.
That's not a suggestion; it's the security model.
-## Three Hook-like Layers in ctx
+## Three Hook-like Layers in `ctx`
Triggers are one of **three** distinct hook-like concepts in
ctx. The names are similar but the owners and use cases are
@@ -61,7 +61,7 @@ not:
| Layer | Owned by | Where they live | When to use |
|------------------------|-------------|-----------------------------------------|--------------------------------------------|
| **`ctx trigger`** | You | `.context/hooks//*.sh` | Project-specific automation, any AI tool |
-| **`ctx system` hooks** | ctx itself | built-in, wired into tool configs | Built-in nudges (you don't author these) |
+| **`ctx system` hooks** | `ctx` itself | built-in, wired into tool configs | Built-in nudges (you don't author these) |
| **Claude Code hooks** | Claude Code | `.claude/settings.local.json` | Claude-Code-only tool-specific integration |
This page is about the first category. The other two run
diff --git a/docs/home/vscode.md b/docs/home/vscode.md
index cbb4af0b4..f179f705a 100644
--- a/docs/home/vscode.md
+++ b/docs/home/vscode.md
@@ -18,7 +18,7 @@ what you were doing, the AI repeats yesterday's mistakes, and decisions
you spent an hour reasoning through last week get rediscovered instead
of remembered.
-**Without ctx:**
+**Without `ctx`:**
```
@workspace add the validation middleware we discussed
@@ -27,7 +27,7 @@ I don't have context about previous discussions. Could you describe
what validation middleware you're referring to?
```
-**With ctx:**
+**With `ctx`:**
```
@ctx Do you remember?
@@ -47,10 +47,10 @@ Install the extension and the `ctx` binary, then `ctx init` your project:
1. **Install the extension** from the
[VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=activememory.ctx-context)
- (publisher: `activememory`, display name: *ctx — Persistent Context
+ (publisher: `activememory`, display name: *`ctx` — Persistent Context
for AI*). Or build from source (see
[editors/vscode/README.md](https://github.com/ActiveMemory/ctx/blob/main/editors/vscode/README.md#development)).
-2. **Install the ctx CLI** if you haven't already
+2. **Install the `ctx` CLI** if you haven't already
([installation docs](getting-started.md#installation)). If you skip
this step, the extension will auto-download the right binary for
your platform on first use (see [Auto-Bootstrap](#auto-bootstrap)
@@ -164,7 +164,7 @@ short menu of likely matches.
## Auto-Bootstrap
-If the ctx CLI isn't on PATH (or at a path configured via
+If the `ctx` CLI isn't on PATH (or at a path configured via
`ctx.executablePath`), the extension auto-downloads the right binary:
1. Detects OS and architecture (darwin / linux / windows, amd64 / arm64).
@@ -180,23 +180,23 @@ set `ctx.executablePath` in your VS Code settings.
- **VS Code 1.93+**
- **[GitHub Copilot Chat](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot-chat)** extension
-- **ctx CLI** on PATH, or let the extension auto-download it
+- **`ctx` CLI** on PATH, or let the extension auto-download it
## Configuration
| Setting | Default | Description |
|---------|---------|-------------|
-| `ctx.executablePath` | `ctx` | Path to the ctx CLI binary. Set this if ctx isn't on PATH and you don't want auto-download. |
+| `ctx.executablePath` | `ctx` | Path to the `ctx` CLI binary. Set this if `ctx` isn't on PATH and you don't want auto-download. |
## Refreshing the Integration
The extension updates through the VS Code Marketplace like any other
extension; install new versions via the Extensions view. Updates to
-the **ctx CLI** are independent: bump it via your package manager, or
+the **`ctx` CLI** are independent: bump it via your package manager, or
let the auto-bootstrap fetch the latest release.
Unlike the OpenCode integration, there is **no `ctx setup` step** for
-VS Code. The extension carries its own runtime; ctx's role is only to
+VS Code. The extension carries its own runtime; `ctx`'s role is only to
provide the CLI it shells out to.
## Troubleshooting
@@ -204,7 +204,7 @@ provide the CLI it shells out to.
| Symptom | Cause | Fix |
|---------|-------|-----|
| `@ctx` participant doesn't appear in Copilot Chat | Copilot Chat not installed or not signed in | Install [GitHub Copilot Chat](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot-chat) and ensure you're signed in to a Copilot-eligible account |
-| `@ctx /status` says ctx not found | CLI not on PATH and auto-download disabled | Either add ctx to PATH (`brew install activememory/tap/ctx` or download from [Releases](https://github.com/ActiveMemory/ctx/releases)), or unset `ctx.executablePath` to let the extension auto-download |
+| `@ctx /status` says `ctx` not found | CLI not on PATH and auto-download disabled | Either add `ctx` to PATH (`brew install activememory/tap/ctx` or download from [Releases](https://github.com/ActiveMemory/ctx/releases)), or unset `ctx.executablePath` to let the extension auto-download |
| Status-bar reminder never updates | Heartbeat suppressed or `.context/` doesn't exist | Run `ctx init` from your project root; reload VS Code if the indicator still doesn't appear within 5 minutes |
| Commands run but nothing is captured to `.context/` | Workspace folder missing or `.context/` outside the open folder | Make sure your project root (the one with `.context/`) is the workspace root, not a subdirectory of it |
@@ -229,6 +229,6 @@ and recent session topics. If you instead see "I don't have memory" or
tracking context, checking health, and browsing history.
- [Context Files](context-files.md): what lives in `.context/` and how
each file is used.
-- [Setup across AI Tools](../recipes/multi-tool-setup.md): wiring ctx
+- [Setup across AI Tools](../recipes/multi-tool-setup.md): wiring `ctx`
for Claude Code, OpenCode, Cursor, Aider, Copilot, or Windsurf
alongside VS Code.
diff --git a/docs/operations/autonomous-loop.md b/docs/operations/autonomous-loop.md
index 1afc269c2..8e0c0717d 100644
--- a/docs/operations/autonomous-loop.md
+++ b/docs/operations/autonomous-loop.md
@@ -416,7 +416,7 @@ BEFORE any work:
## Further Reading
-- [Building ctx Using ctx](../blog/2026-01-27-building-ctx-using-ctx.md):
+- [Building `ctx` Using `ctx`](../blog/2026-01-27-building-ctx-using-ctx.md):
The dogfooding story: how autonomous loops built the tool that powers them
## Resources
diff --git a/docs/operations/hub.md b/docs/operations/hub.md
index cb160607f..f501d39da 100644
--- a/docs/operations/hub.md
+++ b/docs/operations/hub.md
@@ -13,7 +13,7 @@ icon: lucide/settings
# `ctx` Hub: Operations
-Running the ctx `ctx` Hub in production. This page is
+Running the `ctx` `ctx` Hub in production. This page is
for **operators**: people running a hub for themselves or a
team, not people writing to a hub someone else is running.
diff --git a/docs/operations/index.md b/docs/operations/index.md
index 0d5402be3..353567bdd 100644
--- a/docs/operations/index.md
+++ b/docs/operations/index.md
@@ -80,7 +80,7 @@ guidance on triaging the results.
| [Release checklist](runbooks/release-checklist.md) | Full pre-release sequence | Before every release |
| [Plugin release](runbooks/plugin-release.md) | Plugin-specific release steps | Plugin changes ship |
| [Breaking migration](runbooks/breaking-migration.md) | Guide users across breaking changes | Releases with renames |
-| [Hub deployment](runbooks/hub-deployment.md) | Set up a ctx Hub end-to-end | First-time hub setup |
+| [Hub deployment](runbooks/hub-deployment.md) | Set up a `ctx` Hub end-to-end | First-time hub setup |
| [New contributor](runbooks/new-contributor.md) | Onboarding: clone to first session | New contributors |
| [Codebase audit](runbooks/codebase-audit.md) | AST audits, magic strings, dead code, doc alignment | Before release, quarterly |
| [Docs semantic audit](runbooks/docs-semantic-audit.md) | Narrative gaps, weak pages, structural problems | Before release, after adding pages |
diff --git a/docs/operations/integrations.md b/docs/operations/integrations.md
index f5b0ae952..947fe8611 100644
--- a/docs/operations/integrations.md
+++ b/docs/operations/integrations.md
@@ -32,7 +32,7 @@ for popular AI coding assistants.
## Claude Code (Full Integration)
-Claude Code has the deepest integration via the **ctx plugin**.
+Claude Code has the deepest integration via the **`ctx` plugin**.
### Setup
@@ -95,8 +95,8 @@ graph TD
### Plugin Hooks
-
-The ctx plugin provides lifecycle hooks implemented as Go subcommands
+
+The `ctx` plugin provides lifecycle hooks implemented as Go subcommands
(`ctx system *`):
| Hook | Event | Purpose |
@@ -259,7 +259,7 @@ cat .context/TASKS.md
### Agent Skills
-The ctx plugin ships Agent Skills following the
+The `ctx` plugin ships Agent Skills following the
[agentskills.io specification](https://agentskills.io).
These are invoked in Claude Code with `/skill-name`.
@@ -320,7 +320,7 @@ These are invoked in Claude Code with `/skill-name`.
| Skill | Description |
|------------------------|------------------------------------------------------------|
-| `/ctx-doctor` | Troubleshoot ctx behavior with structural health checks |
+| `/ctx-doctor` | Troubleshoot `ctx` behavior with structural health checks |
| `/ctx-drift` | Detect and fix context drift (structural + semantic) |
| `/ctx-consolidate` | Merge redundant learnings or decisions into denser entries |
| `/ctx-alignment-audit` | Audit doc claims against playbook instructions |
@@ -474,22 +474,22 @@ to regenerate the instructions.
### VS Code Chat Extension (`@ctx`)
-The **ctx VS Code extension** adds a `@ctx` chat participant to
+The **`ctx` VS Code extension** adds a `@ctx` chat participant to
GitHub Copilot Chat, giving you direct access to 45 context commands
from within the editor, plus automatic hooks on file save / git commit /
`.context/` changes / dependency-file edits, and a reminder status-bar
indicator.
-!!! tip "Full guide: [ctx for VS Code](../home/vscode.md)"
+!!! tip "Full guide: [`ctx` for VS Code](../home/vscode.md)"
The home-page guide covers daily workflows, the full command list,
- natural-language routing, auto-bootstrap of the ctx CLI, troubleshooting,
+ natural-language routing, auto-bootstrap of the `ctx` CLI, troubleshooting,
and "Verify It Works." This subsection is the install-and-pointers
overview; the dedicated page is the authoritative reference.
#### Installation
The extension ships to the [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=activememory.ctx-context)
-under publisher `activememory` (display name: *ctx — Persistent Context
+under publisher `activememory` (display name: *`ctx` — Persistent Context
for AI*). Install via the Extensions view or `code --install-extension`.
To build from source instead (requires Node.js 20+):
@@ -516,17 +516,17 @@ files beyond `.context/` and the Copilot instructions are added.
#### How It Works
-- **Chat participant:** `@ctx` is registered with VS Code's Chat API; 45 slash commands route to dedicated handlers that shell out to the ctx CLI.
+- **Chat participant:** `@ctx` is registered with VS Code's Chat API; 45 slash commands route to dedicated handlers that shell out to the `ctx` CLI.
- **Automatic hooks:** file save → task-completion check; git commit → decision/learning prompt; `.context/` change → regenerate Copilot instructions; dependency-file change → `/map` prompt.
- **Status-bar reminder:** a `$(bell) ctx` indicator surfaces pending session reminders, refreshing every 5 minutes.
- **Natural language:** plain English after `@ctx` is routed to the nearest matching command.
-- **Auto-bootstrap:** if the ctx CLI isn't on PATH, the extension downloads the correct platform binary from GitHub Releases and caches it.
+- **Auto-bootstrap:** if the `ctx` CLI isn't on PATH, the extension downloads the correct platform binary from GitHub Releases and caches it.
#### Configuration
| Setting | Default | Description |
|----------------------|---------|------------------------------------------------------------------|
-| `ctx.executablePath` | `ctx` | Path to the ctx binary. Set this if `ctx` is not in your `PATH`. |
+| `ctx.executablePath` | `ctx` | Path to the `ctx` binary. Set this if `ctx` is not in your `PATH`. |
### Session Persistence
@@ -567,7 +567,7 @@ Paste output into Copilot Chat for context-aware responses.
## OpenCode
-OpenCode is a terminal-first AI coding agent. ctx integrates via
+OpenCode is a terminal-first AI coding agent. `ctx` integrates via
a thin lifecycle plugin, MCP server, and `AGENTS.md` instructions.
### Setup
@@ -588,13 +588,13 @@ eval "$(ctx activate)"
| `.opencode/plugins/ctx.ts` | Lifecycle plugin (hooks to `ctx system`) |
| `~/.config/opencode/opencode.json` | Global MCP server registration (or `$OPENCODE_HOME/opencode.json`) |
| `AGENTS.md` | Agent instructions (read natively) |
-| `.opencode/skills/ctx-*/SKILL.md` | ctx skills |
+| `.opencode/skills/ctx-*/SKILL.md` | `ctx` skills |
### How It Works
The plugin wires OpenCode lifecycle events to `ctx system`:
-- **`session.created`** — warms ctx state in the background (bootstrap + agent packet) so MCP queries are fast on first use
+- **`session.created`** — warms `ctx` state in the background (bootstrap + agent packet) so MCP queries are fast on first use
- **`tool.execute.after` (shell, on `git commit`)** — runs `ctx system post-commit`
- **`tool.execute.after` (edit/write)** — runs `ctx system check-task-completion`
- **`session.idle`** — runs persistence and task-completion checks (silent: output is buffered, not surfaced to the TUI)
diff --git a/docs/operations/migration.md b/docs/operations/migration.md
index c71a4fe14..efc6600dc 100644
--- a/docs/operations/migration.md
+++ b/docs/operations/migration.md
@@ -16,8 +16,8 @@ icon: lucide/package-plus
!!! tip "Claude Code User?"
You probably want the plugin instead of this page.
- Install ctx from the marketplace:
- (*`/plugin` → search "ctx" → Install*)
+ Install `ctx` from the marketplace:
+ (*`/plugin` → search "`ctx`" → Install*)
and you're done: hooks, skills, and updates are handled for you.
See [Getting Started](../home/getting-started.md) for the full walkthrough.
@@ -61,7 +61,7 @@ lose them.
### What `ctx init` Does
-When `ctx init` detects an existing `CLAUDE.md`, it checks for ctx markers
+When `ctx init` detects an existing `CLAUDE.md`, it checks for `ctx` markers
(`` ... ``):
| State | Default behavior | With `--merge` | With `--force` |
@@ -79,7 +79,7 @@ When `ctx init` detects an existing `CLAUDE.md`, it checks for ctx markers
3. **Inserts** the `ctx` block immediately after it;
4. **Preserves** everything else untouched.
-Your content before and after the ctx block remains exactly as it was.
+Your content before and after the `ctx` block remains exactly as it was.
### Before / After Example
@@ -180,8 +180,8 @@ git checkout CLAUDE.md
| | `.windsurfrules` |
| | Any other tool-specific config |
-Claude Code hooks and skills are provided by the **ctx plugin**,
-installed from the Claude Code marketplace (`/plugin` → search "ctx" → Install).
+Claude Code hooks and skills are provided by the **`ctx` plugin**,
+installed from the Claude Code marketplace (`/plugin` → search "`ctx`" → Install).
### Running `ctx` Alongside Other Tools
diff --git a/docs/operations/runbooks/architecture-exploration.md b/docs/operations/runbooks/architecture-exploration.md
index ebd8a9bc4..50f45ab9d 100644
--- a/docs/operations/runbooks/architecture-exploration.md
+++ b/docs/operations/runbooks/architecture-exploration.md
@@ -14,7 +14,7 @@ icon: lucide/map
# Architecture Exploration
Systematically build architecture documentation across one or
-more repositories using ctx skills. Each invocation does one
+more repositories using `ctx` skills. Each invocation does one
unit of work; a simple loop drives the agent through all phases.
**When to use**: When onboarding to a new codebase, performing
@@ -81,7 +81,7 @@ the next unit of work, executes it, updates tracking, and stops.
~~~
You are an autonomous architecture exploration agent. Your job is to
systematically build and evolve architecture documentation across all
-repositories in this workspace using ctx skills.
+repositories in this workspace using `ctx` skills.
## Execution Protocol
@@ -258,7 +258,7 @@ it, produce no further output. Execution is complete.
5. **Fail gracefully.** If a skill fails (missing GitNexus, broken repo,
etc.), log the failure with reason and advance to the next phase or
repo. Don't retry in the same invocation.
-6. **Respect ctx conventions.** Each repo gets its own `.context/`
+6. **Respect `ctx` conventions.** Each repo gets its own `.context/`
directory. Never write architecture artifacts outside `.context/`.
## Stopping Logic
diff --git a/docs/operations/runbooks/backup-strategy.md b/docs/operations/runbooks/backup-strategy.md
index 3dbe5adf2..114d9f44a 100644
--- a/docs/operations/runbooks/backup-strategy.md
+++ b/docs/operations/runbooks/backup-strategy.md
@@ -113,7 +113,7 @@ Use `restic` if you prefer S3-compatible targets.
For these, pick one strategy above and forget about it.
-## Why ctx No Longer Ships a Backup Command
+## Why `ctx` No Longer Ships a Backup Command
Backup is inherently environment-specific: SMB, NFS, S3, rsync,
Time Machine, Borg, restic. Every user has a different story. The
diff --git a/docs/operations/runbooks/breaking-migration.md b/docs/operations/runbooks/breaking-migration.md
index 59fcb3aa0..c105ce000 100644
--- a/docs/operations/runbooks/breaking-migration.md
+++ b/docs/operations/runbooks/breaking-migration.md
@@ -82,7 +82,7 @@ Replace with the new names per the changelog.
## Step 5: Update Hook Configs
If you have custom hooks in `.claude/settings.local.json` that
-reference ctx commands, update them:
+reference `ctx` commands, update them:
```bash
jq '.hooks' .claude/settings.local.json | grep "ctx "
diff --git a/docs/operations/runbooks/hub-deployment.md b/docs/operations/runbooks/hub-deployment.md
index 49776c59b..682b25ce6 100644
--- a/docs/operations/runbooks/hub-deployment.md
+++ b/docs/operations/runbooks/hub-deployment.md
@@ -13,7 +13,7 @@ icon: lucide/server
# Hub Deployment
-Linear runbook for setting up a ctx Hub for yourself or a team.
+Linear runbook for setting up a `ctx` Hub for yourself or a team.
Consolidates pieces currently scattered across hub recipes and
operations docs.
diff --git a/docs/operations/runbooks/new-contributor.md b/docs/operations/runbooks/new-contributor.md
index 65fbe0cae..f34e52bfb 100644
--- a/docs/operations/runbooks/new-contributor.md
+++ b/docs/operations/runbooks/new-contributor.md
@@ -96,7 +96,7 @@ Start a Claude Code session and check that hooks fire:
claude
```
-You should see ctx session hooks (ceremonies reminder, context
+You should see `ctx` session hooks (ceremonies reminder, context
loading) on session start. If not, check that the plugin is
installed correctly (Step 4).
diff --git a/docs/operations/runbooks/plugin-release.md b/docs/operations/runbooks/plugin-release.md
index 46b1d8f75..5c3751af6 100644
--- a/docs/operations/runbooks/plugin-release.md
+++ b/docs/operations/runbooks/plugin-release.md
@@ -81,7 +81,7 @@ Test the critical paths:
## Step 4: Test Against a Clean Project
Create a temporary project to verify the plugin works outside
-the ctx repo:
+the `ctx` repo:
```bash
mkdir /tmp/test-ctx-plugin && cd /tmp/test-ctx-plugin
diff --git a/docs/operations/upgrading.md b/docs/operations/upgrading.md
index b5ebfed49..04e6c1201 100644
--- a/docs/operations/upgrading.md
+++ b/docs/operations/upgrading.md
@@ -18,7 +18,7 @@ or plugin hooks and skills.
!!! tip "Claude Code User?"
The marketplace can update **skills, hooks, and prompts** independently:
- `/plugin` → select **ctx** → **Update now** (or enable auto-update).
+ `/plugin` → select **`ctx`** → **Update now** (or enable auto-update).
The `ctx` **binary** is separate:
[rebuild from source or download a new release](../home/getting-started.md#installation)
@@ -45,7 +45,7 @@ ctx init --reset --merge
| Category | Examples | Changes between versions? |
|--------------------|-------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------|
-| **Infrastructure** | `.claude/settings.local.json` (permissions), ctx-managed sections in `CLAUDE.md`, **ctx plugin** (hooks + skills) | Yes |
+| **Infrastructure** | `.claude/settings.local.json` (permissions), ctx-managed sections in `CLAUDE.md`, **`ctx` plugin** (hooks + skills) | Yes |
| **Knowledge** | `.context/TASKS.md`, `DECISIONS.md`, `LEARNINGS.md`, `CONVENTIONS.md`, `ARCHITECTURE.md`, `GLOSSARY.md`, `CONSTITUTION.md`, `AGENT_PLAYBOOK.md` | **No**: this is **your** data |
Infrastructure is regenerated by `ctx init` and plugin updates.
@@ -88,7 +88,7 @@ automatically**: `ctx init` only overwrites infrastructure, never your data.
If you use Claude Code, update the plugin to get new hooks and skills:
1. Open `/plugin` in Claude Code.
-2. Select **ctx**.
+2. Select **`ctx`**.
3. Click **Update now**.
Or enable **auto-update** so the plugin stays current without manual steps.
diff --git a/docs/recipes/activating-context.md b/docs/recipes/activating-context.md
index 55bff28a8..7e630cdf4 100644
--- a/docs/recipes/activating-context.md
+++ b/docs/recipes/activating-context.md
@@ -13,7 +13,7 @@ You ran a `ctx` command and got:
Error: no context directory specified for this project
```
-This means ctx doesn't know which `.context/` directory to operate
+This means `ctx` doesn't know which `.context/` directory to operate
on. It will not guess, and it will not walk up from your current
working directory looking for one; that behavior was removed
deliberately, because silent inference was the source of several
@@ -58,8 +58,8 @@ Error: no context directory specified; a likely candidate is at
/Users/you/repos/myproject/.context
```
-ctx found a single `.context/` on the way up from here but won't
-bind to it automatically. Run `eval "$(ctx activate)"` and ctx
+`ctx` found a single `.context/` on the way up from here but won't
+bind to it automatically. Run `eval "$(ctx activate)"` and `ctx`
will emit the `export` for the candidate. Or set `CTX_DIR` by hand.
### Multiple Candidates
@@ -158,9 +158,9 @@ ctx drift
## For Claude Code Users
-The ctx plugin's hooks are generated with
+The `ctx` plugin's hooks are generated with
`CTX_DIR="$CLAUDE_PROJECT_DIR/.context"` prefixed to each command,
-so hook-driven ctx invocations resolve correctly without any
+so hook-driven `ctx` invocations resolve correctly without any
per-session setup. You only need to activate manually when running
`ctx` yourself in a terminal.
@@ -183,8 +183,8 @@ The practical consequences:
where they belong.
- **The `CTX_DIR` you activate is implicitly a project-root
declaration.** Setting `CTX_DIR=/weird/place/.context` means
- you're telling ctx the project root is `/weird/place/`. That's
- your call to make; ctx does not police it.
+ you're telling `ctx` the project root is `/weird/place/`. That's
+ your call to make; `ctx` does not police it.
### Recommended Layout
@@ -201,7 +201,7 @@ The practical consequences:
```
`.context/` sits at the project root, next to `.git`. `ctx activate`
-binds to it; every ctx subsystem reads the project from its parent.
+binds to it; every `ctx` subsystem reads the project from its parent.
## Why Not Walk Up Automatically?
@@ -212,5 +212,5 @@ under the old walk-up model. See the
and [the analysis doc](https://github.com/ActiveMemory/ctx/blob/main/specs/context-resolution-analysis.md)
for the full reasoning.
-The short version: ctx decided to stop guessing and require the
+The short version: `ctx` decided to stop guessing and require the
caller to declare. Every other decision flows from there.
diff --git a/docs/recipes/autonomous-loops.md b/docs/recipes/autonomous-loops.md
index aa018760b..9cd249355 100644
--- a/docs/recipes/autonomous-loops.md
+++ b/docs/recipes/autonomous-loops.md
@@ -469,8 +469,8 @@ worktrees, and a full agent team.
## See Also
* [Autonomous Loops](../operations/autonomous-loop.md): loop pattern, prompt templates, troubleshooting
-* [CLI Reference: ctx loop](../cli/loop.md): flags and options
-* [CLI Reference: ctx watch](../cli/watch.md): watch mode details
-* [CLI Reference: ctx init](../cli/init-status.md#ctx-init): init flags
+* [CLI Reference: `ctx` loop](../cli/loop.md): flags and options
+* [CLI Reference: `ctx` watch](../cli/watch.md): watch mode details
+* [CLI Reference: `ctx` init](../cli/init-status.md#ctx-init): init flags
* [The Complete Session](session-lifecycle.md): interactive workflow
* [Tracking Work Across Sessions](task-management.md): structuring TASKS.md
diff --git a/docs/recipes/claude-code-permissions.md b/docs/recipes/claude-code-permissions.md
index 1ac9825be..dd9da7916 100644
--- a/docs/recipes/claude-code-permissions.md
+++ b/docs/recipes/claude-code-permissions.md
@@ -36,7 +36,7 @@ See [Recommended Defaults](#recommended-defaults) for the full list.
| Command/Skill | Role in this workflow |
|-----------------------------|--------------------------------------------------|
-| `ctx init` | Populates default ctx permissions |
+| `ctx init` | Populates default `ctx` permissions |
| `/ctx-drift` | Detects missing or stale permission entries |
| `/ctx-permission-sanitize` | Audits for dangerous patterns (security-focused) |
@@ -44,7 +44,7 @@ See [Recommended Defaults](#recommended-defaults) for the full list.
After running `ctx init`, your `settings.local.json` will have the `ctx`
defaults pre-populated. Here is an opinionated safe starting point for a Go
-project using ctx:
+project using `ctx`:
```json
{
@@ -141,7 +141,7 @@ commands (`git log`, `git status`) and destructive ones (`git reset --hard`,
`git clean -f`). Listing safe commands individually prevents accidentally
pre-approving dangerous ones.
-**Pre-approve all `ctx-` skills**: Skills shipped with ctx (`Skill(ctx-*)`) are
+**Pre-approve all `ctx-` skills**: Skills shipped with `ctx` (`Skill(ctx-*)`) are
safe to pre-approve. They are part of your project and you control their
content. This prevents the agent from prompting on every skill invocation.
@@ -192,17 +192,17 @@ The defaults block:
Deny rules handle prefix-based blocking natively. Hooks complement them by
catching patterns that require regex matching: Things deny rules can't express.
-The ctx plugin ships these blocking hooks:
+The `ctx` plugin ships these blocking hooks:
| Hook | What it blocks |
|-----------------------------------|----------------------------------|
-| `ctx system block-non-path-ctx` | Running ctx from wrong path |
+| `ctx system block-non-path-ctx` | Running `ctx` from wrong path |
Project-local hooks (not part of the plugin) catch regex edge cases:
| Hook | What it blocks |
|-------------------------------|-----------------------------------------------------------------------------------|
-| `block-dangerous-commands.sh` | Mid-command `sudo`/`git push` (after `&&`), copies to bin dirs, absolute-path ctx |
+| `block-dangerous-commands.sh` | Mid-command `sudo`/`git push` (after `&&`), copies to bin dirs, absolute-path `ctx` |
!!! warning "Pre-Approved + Hook-Blocked = Silent Block"
@@ -301,7 +301,7 @@ permission baselines for reproducible setups.
## See Also
-* [Setting Up ctx Across AI Tools](multi-tool-setup.md): full setup recipe
+* [Setting Up `ctx` Across AI Tools](multi-tool-setup.md): full setup recipe
including `settings.local.json` creation
* [Context Health](context-health.md): keeping `.context/` files accurate
* [Sanitize Permissions runbook](../operations/runbooks/sanitize-permissions.md):
diff --git a/docs/recipes/customizing-hook-messages.md b/docs/recipes/customizing-hook-messages.md
index e174e0156..c9edd15e2 100644
--- a/docs/recipes/customizing-hook-messages.md
+++ b/docs/recipes/customizing-hook-messages.md
@@ -59,7 +59,7 @@ decides to speak.
### Finding the Original Templates
-The default templates live in the ctx source tree at:
+The default templates live in the `ctx` source tree at:
```
internal/assets/hooks/messages/{hook}/{variant}.txt
@@ -209,7 +209,7 @@ from customization. These are the primary targets for override.
### ctx-Specific (10 Messages)
-Messages specific to ctx's own development workflow. You *can* customize
+Messages specific to `ctx`'s own development workflow. You *can* customize
them, but `edit` will warn you first.
| Hook | Variant | Description |
diff --git a/docs/recipes/external-context.md b/docs/recipes/external-context.md
index d052b03ef..ffd3e7a0a 100644
--- a/docs/recipes/external-context.md
+++ b/docs/recipes/external-context.md
@@ -54,7 +54,7 @@ shell rc, or source a per-project `.envrc` with direnv.
The single-source-anchor contract states that
`filepath.Dir(CTX_DIR)` is the project root. When the context
-lives outside the project tree, ctx still resolves correctly for
+lives outside the project tree, `ctx` still resolves correctly for
every operation that reads or writes inside `.context/`. But any
operation that scans the **codebase** scans the wrong tree, and
does so silently:
@@ -123,7 +123,7 @@ cd ~/repos/myproject-context
git init
```
-### Step 2: Initialize ctx Pointing at It
+### Step 2: Initialize `ctx` Pointing at It
From your project root, declare `CTX_DIR` pointing to the external
location, then initialize:
@@ -324,11 +324,11 @@ Agent: [reads CTX_DIR, loads context from the external dir]
## Next Up
**[The Complete Session →](session-lifecycle.md)**: Walk through a
-full ctx session from start to finish.
+full `ctx` session from start to finish.
## See Also
-* [Setting Up ctx Across AI Tools](multi-tool-setup.md): initial setup recipe
+* [Setting Up `ctx` Across AI Tools](multi-tool-setup.md): initial setup recipe
* [Syncing Scratchpad Notes Across Machines](scratchpad-sync.md): distribute
encryption keys when context is shared
* [CLI Reference](../cli/index.md): full command list and global options
diff --git a/docs/recipes/guide-your-agent.md b/docs/recipes/guide-your-agent.md
index 9a7c0eb33..8cea36205 100644
--- a/docs/recipes/guide-your-agent.md
+++ b/docs/recipes/guide-your-agent.md
@@ -45,7 +45,7 @@ showing these natural-language patterns.
## Next Up
-**[Setup Across AI Tools →](multi-tool-setup.md)**: Initialize ctx
+**[Setup Across AI Tools →](multi-tool-setup.md)**: Initialize `ctx`
and configure hooks for Claude Code, OpenCode, Cursor, Aider, Copilot, or
Windsurf.
diff --git a/docs/recipes/hook-sequence-diagrams.md b/docs/recipes/hook-sequence-diagrams.md
index 2dde1896a..a7bd8ef89 100644
--- a/docs/recipes/hook-sequence-diagrams.md
+++ b/docs/recipes/hook-sequence-diagrams.md
@@ -12,16 +12,16 @@ title: Hook Sequence Diagrams
## Hook Lifecycle
-This page documents the **ctx system hooks**: the built-in
+This page documents the **`ctx` system hooks**: the built-in
`ctx system *` subcommands that Claude Code invokes via
`.claude/hooks.json` at lifecycle events. These are owned by
-ctx itself, not authored by users.
+`ctx` itself, not authored by users.
!!! info "Not to Be Confused with `ctx trigger`"
`ctx` has **three distinct hook-like layers**:
- **`ctx system` hooks** (this page): built-in, owned
- by ctx, wired into Claude Code via
+ by `ctx`, wired into Claude Code via
`internal/assets/claude/hooks/hooks.json`.
- **`ctx trigger`**: user-authored shell scripts in
`.context/hooks//*.sh`. See
@@ -42,7 +42,7 @@ on stdout.
---
-
+
## PreToolUse Hooks
@@ -100,7 +100,7 @@ sequenceDiagram
Matcher: `Bash`
-Blocks `./ctx`, `go run ./cmd/ctx`, or absolute-path ctx
+Blocks `./ctx`, `go run ./cmd/ctx`, or absolute-path `ctx`
invocations. Constitutionally enforced.
```mermaid
@@ -178,7 +178,7 @@ sequenceDiagram
---
-
+
## PostToolUse Hooks
diff --git a/docs/recipes/hub-cluster.md b/docs/recipes/hub-cluster.md
index d22adeb01..491738ac3 100644
--- a/docs/recipes/hub-cluster.md
+++ b/docs/recipes/hub-cluster.md
@@ -24,7 +24,7 @@ cross-project brain on one workstation does not need three Raft
peers.
!!! warning "Raft-Lite"
- ctx uses Raft **only for leader election**, not for data
+ `ctx` uses Raft **only for leader election**, not for data
consensus. Entry replication happens via sequence-based gRPC
sync on the append-only JSONL store. This is simpler than full
Raft log replication and is possible because the store is
diff --git a/docs/recipes/hub-getting-started.md b/docs/recipes/hub-getting-started.md
index d695f5883..f2cd0521e 100644
--- a/docs/recipes/hub-getting-started.md
+++ b/docs/recipes/hub-getting-started.md
@@ -29,7 +29,7 @@ other, all in under five minutes.
By the end, you will have:
1. A local hub process running on port `9900`.
-2. Two project directories both registered with the ctx Hub.
+2. Two project directories both registered with the `ctx` Hub.
3. A decision published from project `alpha` that appears
automatically in project `beta`'s `.context/hub/` and in
`ctx agent --include-hub` output.
@@ -105,7 +105,7 @@ and `listen`.
## Step 4: Publish a Decision
-Either use `ctx add --share` to write locally *and* push to the ctx Hub:
+Either use `ctx add --share` to write locally *and* push to the `ctx` Hub:
```bash
ctx decision add "Use UTC timestamps everywhere" --share \
diff --git a/docs/recipes/hub-multi-machine.md b/docs/recipes/hub-multi-machine.md
index 9615b6965..4de66707f 100644
--- a/docs/recipes/hub-multi-machine.md
+++ b/docs/recipes/hub-multi-machine.md
@@ -128,7 +128,7 @@ ctx connection subscribe decision learning convention
Each registration exchanges the admin token for a **per-project
client token**. Only the client token is persisted in
`.context/.connect.enc`, encrypted with the same AES-256-GCM scheme
-ctx uses for notification credentials.
+`ctx` uses for notification credentials.
## Step 5: Verify
@@ -138,7 +138,7 @@ From either workstation:
ctx connection status
```
-You should see the ctx Hub address, role (`leader` for single-node),
+You should see the `ctx` Hub address, role (`leader` for single-node),
subscription filters, and the sequence number you're synced to.
## TLS (Recommended)
diff --git a/docs/recipes/hub-personal.md b/docs/recipes/hub-personal.md
index ed8e8e28e..2b9f759fc 100644
--- a/docs/recipes/hub-personal.md
+++ b/docs/recipes/hub-personal.md
@@ -102,14 +102,14 @@ The `--share` flag does two things:
1. Writes the learning to `api/.context/LEARNINGS.md`
locally (as a normal `ctx learning add` would).
-2. Publishes the same entry to the ctx Hub, which stores it
+2. Publishes the same entry to the `ctx` Hub, which stores it
in the append-only JSONL and fans it out to every
subscribed client.
Within seconds, `cli/.context/hub/learnings.md` and
`dotfiles/.context/hub/learnings.md` both contain a copy
of this learning (the `ctx connection listen` daemon picks
-it up from the ctx Hub's Listen stream).
+it up from the `ctx` Hub's Listen stream).
### 12:00 - You Switch to `cli`
diff --git a/docs/recipes/index.md b/docs/recipes/index.md
index 4ace33557..818c25167 100644
--- a/docs/recipes/index.md
+++ b/docs/recipes/index.md
@@ -185,7 +185,7 @@ Choose the right output pattern for your Claude Code hooks: `VERBATIM`
relay for user-facing reminders, **hard gates** for invariants, agent
directives for nudges, and five more patterns across the spectrum.
-**Uses**: ctx plugin hooks, `settings.local.json`
+**Uses**: `ctx` plugin hooks, `settings.local.json`
---
@@ -379,7 +379,7 @@ without losing context or intent.
worktrees, and a full agent team.
This recipe covers the file overlap test, when teams make things worse, and
-what ctx provides at each level.
+what `ctx` provides at each level.
**Uses**: `/ctx-worktree`, `/ctx-next`, `ctx status`
diff --git a/docs/recipes/memory-bridge.md b/docs/recipes/memory-bridge.md
index 6dcdb70de..0a634adab 100644
--- a/docs/recipes/memory-bridge.md
+++ b/docs/recipes/memory-bridge.md
@@ -18,9 +18,9 @@ Claude Code maintains per-project auto memory at
- **Outside the repo** - not version-controlled, not portable
- **Machine-specific** - tied to one `~/.claude/` directory
-- **Invisible to ctx** - context loading and hooks don't read it
+- **Invisible to `ctx`** - context loading and hooks don't read it
-Meanwhile, ctx maintains structured context files (DECISIONS.md,
+Meanwhile, `ctx` maintains structured context files (DECISIONS.md,
LEARNINGS.md, CONVENTIONS.md) that are git-tracked, portable, and
token-budgeted - but Claude Code doesn't automatically write to them.
@@ -150,7 +150,7 @@ ctx memory sync --dry-run
| Auto memory not active | `sync` exits 1 with message. `status` reports "not active". Hook skips silently. |
| First sync (no mirror) | Creates mirror without archiving. |
| MEMORY.md is empty | Syncs to empty mirror (valid). |
-| Not initialized | Init guard rejects (same as all ctx commands). |
+| Not initialized | Init guard rejects (same as all `ctx` commands). |
## Importing Entries
@@ -213,7 +213,7 @@ Published content is wrapped in markers:
**Rules:**
-- ctx owns everything **between** the markers
+- `ctx` owns everything **between** the markers
- Claude owns everything **outside** the markers
- `ctx memory import` reads only outside the markers
- `ctx memory publish` replaces only inside the markers
diff --git a/docs/recipes/multi-tool-setup.md b/docs/recipes/multi-tool-setup.md
index 107d3f3b1..32620b9e0 100644
--- a/docs/recipes/multi-tool-setup.md
+++ b/docs/recipes/multi-tool-setup.md
@@ -72,7 +72,7 @@ Then start your AI tool and ask: "**Do you remember?**"
### Step 1: Initialize `ctx`
Run `ctx init` in your project root. This creates the `.context/` directory
-with all template files and seeds ctx permissions in `settings.local.json`.
+with all template files and seeds `ctx` permissions in `settings.local.json`.
```bash
cd your-project
@@ -119,7 +119,7 @@ This produces the following structure:
and [Configuration](../home/configuration.md#environment-variables)
for the resolver details.
-For Claude Code, install the **ctx plugin** to get hooks and skills:
+For Claude Code, install the **`ctx` plugin** to get hooks and skills:
```bash
claude /plugin marketplace add ActiveMemory/ctx
@@ -177,8 +177,8 @@ ctx setup opencode --write && ctx init && eval "$(ctx activate)"
```
This deploys a lifecycle plugin, slash command skills, `AGENTS.md`, and
-registers the ctx MCP server globally. See
-[ctx for OpenCode](../home/opencode.md) for full details.
+registers the `ctx` MCP server globally. See
+[`ctx` for OpenCode](../home/opencode.md) for full details.
!!! tip "OpenCode Is a First-Class Citizen"
With the plugin installed, OpenCode gets lifecycle hooks and skills
@@ -187,7 +187,7 @@ registers the ctx MCP server globally. See
#### VS Code
-Install the **ctx** extension from the
+Install the **`ctx`** extension from the
[VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=activememory.ctx-context)
(publisher: `activememory`). Then, from your project root:
@@ -196,8 +196,8 @@ ctx init && eval "$(ctx activate)"
```
Open Copilot Chat and type `@ctx /init` to verify. The extension
-auto-downloads the ctx CLI if it isn't on PATH. See
-[ctx for VS Code](../home/vscode.md) for full details.
+auto-downloads the `ctx` CLI if it isn't on PATH. See
+[`ctx` for VS Code](../home/vscode.md) for full details.
!!! tip "VS Code Is a First-Class Citizen"
The extension carries its own runtime. No `ctx setup` step is
@@ -252,7 +252,7 @@ aider --read .context/TASKS.md --read .context/CONVENTIONS.md
### Step 3: Set Up Shell Completion
-Shell completion lets you tab-complete ctx subcommands and flags, which is
+Shell completion lets you tab-complete `ctx` subcommands and flags, which is
especially useful while learning the CLI.
```bash
@@ -312,7 +312,7 @@ If context is not loading, check the basics:
| Symptom | Fix |
|---------------------------------|---------------------------------------------------------------|
-| `ctx: command not found` | Ensure ctx is in your PATH: `which ctx` |
+| `ctx: command not found` | Ensure `ctx` is in your PATH: `which ctx` |
| Hook errors | Verify plugin is installed: `claude /plugin list` |
| Context not refreshing | Cooldown may be active; wait 10 minutes or set `--cooldown 0` |
@@ -408,7 +408,7 @@ ctx setup aider
To customize, adjust the `--budget` flag in the `ctx agent` hook command.
* The `--session $PPID` flag isolates cooldowns per Claude Code process, so
parallel sessions do not suppress each other.
-* Commit your `.context/` directory to version control. Several ctx features
+* Commit your `.context/` directory to version control. Several `ctx` features
(journals, changelogs, blog generation) rely on git history.
* For Cursor and Copilot, keep `CONVENTIONS.md` visible. These tools treat
open files as higher-priority context.
@@ -421,8 +421,8 @@ ctx setup aider
## Companion Tools (Highly Recommended)
-ctx skills can leverage external MCP servers for web search and code
-intelligence. ctx works without them, but they significantly improve
+`ctx` skills can leverage external MCP servers for web search and code
+intelligence. `ctx` works without them, but they significantly improve
agent behavior across sessions. The investment is small and the
benefits compound. Skills like `/ctx-code-review`, `/ctx-explain`,
and `/ctx-refactor` all become noticeably better with these tools
diff --git a/docs/recipes/multilingual-sessions.md b/docs/recipes/multilingual-sessions.md
index c7e0711b7..2480e8e5f 100644
--- a/docs/recipes/multilingual-sessions.md
+++ b/docs/recipes/multilingual-sessions.md
@@ -18,7 +18,7 @@ might use headers like `# Oturum: 2026-01-15 - API Düzeltme` (Turkish)
or `# セッション: 2026-01-15 - テスト` (Japanese) instead of
`# Session: 2026-01-15 - Fix API`.
-By default, ctx only recognizes `Session:` as a session header prefix.
+By default, `ctx` only recognizes `Session:` as a session header prefix.
Files with other prefixes are silently skipped during journal import and
journal generation: They look like regular Markdown, not sessions.
@@ -47,7 +47,7 @@ header that starts with a known prefix followed by a date:
```
The list of recognized prefixes comes from `session_prefixes` in
-`.ctxrc`. When the key is absent or empty, ctx falls back to the
+`.ctxrc`. When the key is absent or empty, `ctx` falls back to the
built-in default: `["Session:"]`.
Date-only headers (`# 2026-01-15 - Morning Work`) are always recognized
@@ -104,7 +104,7 @@ prefixes should appear in the output.
## What This Does NOT Do
- **Change the interface language**: `ctx` output is always English.
- This setting only controls which session files ctx can *parse*.
+ This setting only controls which session files `ctx` can *parse*.
- **Generate headers**: `ctx` never writes session headers. The prefix
list is recognition-only (input, not output).
- **Affect JSONL sessions**: Claude Code JSONL transcripts don't use
diff --git a/docs/recipes/permission-snapshots.md b/docs/recipes/permission-snapshots.md
index 6fca2b449..0e3dc939f 100644
--- a/docs/recipes/permission-snapshots.md
+++ b/docs/recipes/permission-snapshots.md
@@ -123,5 +123,5 @@ posts, changelogs, and journal sites from your project activity.
* [Permission Hygiene](claude-code-permissions.md): recommended defaults and
maintenance workflow
-* [CLI Reference: ctx permission](../cli/context.md#ctx-permission):
+* [CLI Reference: `ctx` permission](../cli/context.md#ctx-permission):
full command documentation
diff --git a/docs/recipes/publishing.md b/docs/recipes/publishing.md
index d1e6a19ab..ac3135af2 100644
--- a/docs/recipes/publishing.md
+++ b/docs/recipes/publishing.md
@@ -314,9 +314,9 @@ keyboard.
## See Also
* [Session Journal](../reference/session-journal.md): journal system, enrichment schema
-* [CLI Reference: ctx journal](../cli/journal.md#ctx-journal): import, list, show session history
-* [CLI Reference: ctx journal site](../cli/journal.md#ctx-journal-site): static site generation
-* [CLI Reference: ctx journal obsidian](../cli/journal.md#ctx-journal-obsidian): Obsidian vault export
-* [CLI Reference: ctx serve](../cli/journal.md#ctx-serve): serve-only (no regeneration)
+* [CLI Reference: `ctx` journal](../cli/journal.md#ctx-journal): import, list, show session history
+* [CLI Reference: `ctx` journal site](../cli/journal.md#ctx-journal-site): static site generation
+* [CLI Reference: `ctx` journal obsidian](../cli/journal.md#ctx-journal-obsidian): Obsidian vault export
+* [CLI Reference: `ctx` serve](../cli/journal.md#ctx-serve): serve-only (no regeneration)
* [Browsing and Enriching Past Sessions](session-archaeology.md): journal browsing workflow
* [The Complete Session](session-lifecycle.md): capturing context during a session
diff --git a/docs/recipes/session-archaeology.md b/docs/recipes/session-archaeology.md
index 558c57262..c187b9a3f 100644
--- a/docs/recipes/session-archaeology.md
+++ b/docs/recipes/session-archaeology.md
@@ -456,6 +456,6 @@ sessions.
* [The Complete Session](session-lifecycle.md): where session saving fits in the daily workflow
* [Turning Activity into Content](publishing.md): generating blog posts from session history
* [Session Journal](../reference/session-journal.md): full documentation of the journal system
-* [CLI Reference: ctx journal](../cli/journal.md#ctx-journal): all journal subcommands and flags
-* [CLI Reference: ctx serve](../cli/journal.md#ctx-serve): serve-only (no regeneration)
+* [CLI Reference: `ctx` journal](../cli/journal.md#ctx-journal): all journal subcommands and flags
+* [CLI Reference: `ctx` serve](../cli/journal.md#ctx-serve): serve-only (no regeneration)
* [Context Files](../home/context-files.md): the `.context/` directory structure
diff --git a/docs/recipes/session-changes.md b/docs/recipes/session-changes.md
index 7994c1d02..9a940b3f3 100644
--- a/docs/recipes/session-changes.md
+++ b/docs/recipes/session-changes.md
@@ -120,5 +120,5 @@ otherwise miss in the commit log.
filesystem mtime, not git. Code changes require git.
- **Hook integration.** The `context-load-gate` hook writes the
session marker that `ctx change` uses for auto-detection. If
- you're not using the ctx plugin, markers won't exist and it falls
+ you're not using the `ctx` plugin, markers won't exist and it falls
back to the event log or 24h window.
diff --git a/docs/recipes/session-lifecycle.md b/docs/recipes/session-lifecycle.md
index a16320240..816ab6af6 100644
--- a/docs/recipes/session-lifecycle.md
+++ b/docs/recipes/session-lifecycle.md
@@ -30,7 +30,7 @@ persisting context before you close it, so you can see how each piece connects.
Read on for the full walkthrough with examples.
!!! warning "Before You Start: Activate the Project"
- ctx commands (and the skills that call them) require `CTX_DIR` to be
+ `ctx` commands (and the skills that call them) require `CTX_DIR` to be
declared for the shell you're working in; `ctx` does not walk the
filesystem to find `.context/`. Once per shell (or via your shell
rc / direnv):
diff --git a/docs/recipes/session-reminders.md b/docs/recipes/session-reminders.md
index f62a1e86f..ee00f4c06 100644
--- a/docs/recipes/session-reminders.md
+++ b/docs/recipes/session-reminders.md
@@ -194,7 +194,7 @@ and sensitive values that don't need session-start announcements.
## See Also
-* [CLI Reference: ctx remind](../cli/remind.md): full
+* [CLI Reference: `ctx` remind](../cli/remind.md): full
command syntax and flags
* [The Complete Session](session-lifecycle.md): how reminders fit into
the session lifecycle
diff --git a/docs/recipes/triggers.md b/docs/recipes/triggers.md
index 7ef4179e9..5781f4f5f 100644
--- a/docs/recipes/triggers.md
+++ b/docs/recipes/triggers.md
@@ -233,7 +233,7 @@ surprising ways.
script live immediately. Always `ctx trigger test` first.
**Outputting non-JSON.** The trigger's stdout must be valid
-JSON or ctx's trigger runner will log a parse error. Use
+JSON or `ctx`'s trigger runner will log a parse error. Use
`jq -n` to construct output rather than hand-writing JSON
strings.
diff --git a/docs/recipes/troubleshooting.md b/docs/recipes/troubleshooting.md
index b0feaf1c7..4017a8183 100644
--- a/docs/recipes/troubleshooting.md
+++ b/docs/recipes/troubleshooting.md
@@ -158,7 +158,7 @@ See [Activating a Context Directory](activating-context.md) for the
full recipe (one-shot `CTX_DIR=...` inline form, CI patterns, direnv
setup).
-### "ctx: Not Initialized"
+### "`ctx`: Not Initialized"
**Symptoms**: After declaring `CTX_DIR`, the command fails with
`ctx: not initialized - run "ctx init" first`.
@@ -324,7 +324,7 @@ ctx hook event --hook context-load-gate
## Prerequisites
* **Event logging** (*optional but recommended*): `event_log: true` in `.ctxrc`
-* **ctx initialized**: `ctx init`
+* **`ctx` initialized**: `ctx init`
Event logging is not required for `ctx doctor` or `/ctx-doctor` to work. Both
degrade gracefully: structural checks run regardless, and the skill notes when
diff --git a/docs/recipes/webhook-notifications.md b/docs/recipes/webhook-notifications.md
index a5ebd1ff6..e8cb3058a 100644
--- a/docs/recipes/webhook-notifications.md
+++ b/docs/recipes/webhook-notifications.md
@@ -259,7 +259,7 @@ are running, audit what they do, and get alerted when they go silent.
## See Also
-* [CLI Reference: ctx hook notify](../cli/notify.md):
+* [CLI Reference: `ctx` hook notify](../cli/notify.md):
full command reference
* [Configuration](../home/configuration.md): `.ctxrc` settings including
`notify` options
diff --git a/docs/recipes/when-to-use-agent-teams.md b/docs/recipes/when-to-use-agent-teams.md
index f12297fef..3944343f3 100644
--- a/docs/recipes/when-to-use-agent-teams.md
+++ b/docs/recipes/when-to-use-agent-teams.md
@@ -155,9 +155,9 @@ communication are cheaper.
A team of 4 agents each reading 4000 tokens of context = 16000 tokens
before anyone does any work. For small tasks, that overhead dominates.
-## What ctx Gives You at Each Level
+## What `ctx` Gives You at Each Level
-| ctx Feature | Single Agent | Worktrees | Team |
+| `ctx` Feature | Single Agent | Worktrees | Team |
|---------------------|----------------------|----------------------|------------------------|
| `.context/` files | Full access | Shared via git | Shared via filesystem |
| `TASKS.md` | Work queue | Split by track | Assigned by lead |
diff --git a/docs/reference/comparison.md b/docs/reference/comparison.md
index f6f529720..8c45bcdb9 100644
--- a/docs/reference/comparison.md
+++ b/docs/reference/comparison.md
@@ -44,7 +44,7 @@ Most tools treat context as **input**.
That single difference explains nearly all of `ctx`'s design choices.
-| Question | Most tools | ctx |
+| Question | Most tools | `ctx` |
|--------------------------|---------------------------|------------------|
| Where does context live? | In prompts or APIs | In files |
| How long does it last? | One request / one session | Across time |
@@ -108,7 +108,7 @@ RAG answers questions like:
Here are some key differences:
-| RAG | ctx |
+| RAG | `ctx` |
|-----------------------|-----------------------|
| Statistical relevance | Intentional relevance |
| Embedding-based | File-based |
@@ -118,7 +118,7 @@ Here are some key differences:
`ctx` does not replace RAG.
Instead, it defines a persistent context layer that RAG can optionally augment.
-> RAG belongs to the **data plane**; ctx defines the **context control plane**.
+> RAG belongs to the **data plane**; `ctx` defines the **context control plane**.
It focuses on **project memory**, not knowledge search.
diff --git a/docs/reference/skills.md b/docs/reference/skills.md
index 1532ab448..db01b916e 100644
--- a/docs/reference/skills.md
+++ b/docs/reference/skills.md
@@ -72,7 +72,7 @@ opinionated behavior on top.
| [`/ctx-architecture`](#ctx-architecture) | Build and maintain architecture maps | user-invocable |
| [`/ctx-architecture-failure-analysis`](#ctx-architecture-failure-analysis) | Adversarial failure analysis for correctness bugs | user-invocable |
| [`/ctx-remind`](#ctx-remind) | Manage session-scoped reminders | user-invocable |
-| [`/ctx-doctor`](#ctx-doctor) | Troubleshoot ctx behavior with health checks and event analysis | user-invocable |
+| [`/ctx-doctor`](#ctx-doctor) | Troubleshoot `ctx` behavior with health checks and event analysis | user-invocable |
| [`/ctx-skill-audit`](#ctx-skill-audit) | Audit skills against Anthropic prompting best practices | user-invocable |
| [`/ctx-skill-create`](#ctx-skill-create) | Create, improve, and test skills | user-invocable |
| [`/ctx-pause`](#ctx-pause) | Pause context hooks for this session | user-invocable |
@@ -385,7 +385,7 @@ positive observations.
### `/ctx-doctor`
-Troubleshoot ctx behavior. Runs structural health checks via `ctx doctor`,
+Troubleshoot `ctx` behavior. Runs structural health checks via `ctx doctor`,
analyzes event log patterns via `ctx hook event`, and presents findings
with suggested actions. The CLI provides the structural baseline; the agent
adds semantic analysis of event patterns and correlations.
@@ -682,7 +682,7 @@ don't need ceremony overhead.
**Wraps**: `ctx hook pause`
-**Trigger phrases**: "pause ctx", "pause context", "stop the nudges",
+**Trigger phrases**: "pause `ctx`", "pause context", "stop the nudges",
"quiet mode"
**See also**:
@@ -697,7 +697,7 @@ and ceremony behavior. Silent no-op if not paused.
**Wraps**: `ctx hook resume`
-**Trigger phrases**: "resume ctx", "resume context", "turn nudges back on",
+**Trigger phrases**: "resume `ctx`", "resume context", "turn nudges back on",
"unpause"
**See also**:
@@ -707,7 +707,7 @@ and ceremony behavior. Silent no-op if not paused.
## Project-Specific Skills
-The ctx plugin ships the skills listed above.
+The `ctx` plugin ships the skills listed above.
Teams can add their own project-specific skills to `.claude/skills/` in the
project root: These are separate from plugin-shipped skills and are scoped
to the project.
diff --git a/docs/security/agent-security.md b/docs/security/agent-security.md
index 4fb86b1f4..b978f6cb1 100644
--- a/docs/security/agent-security.md
+++ b/docs/security/agent-security.md
@@ -329,7 +329,7 @@ Before running an unattended AI agent:
## Further Reading
* [Running an Unattended AI Agent](../recipes/autonomous-loops.md): the
- ctx recipe for autonomous loops, including step-by-step permissions
+ `ctx` recipe for autonomous loops, including step-by-step permissions
and isolation setup
* [Security](reporting.md): `ctx`'s own trust model and vulnerability
reporting
diff --git a/docs/security/hub.md b/docs/security/hub.md
index 21ab8f0b7..a169c9dc9 100644
--- a/docs/security/hub.md
+++ b/docs/security/hub.md
@@ -58,11 +58,11 @@ registered clients.
`.context/.connect.enc` stores the client token and hub address,
encrypted with **AES-256-GCM** using the same scheme the
-notification subsystem uses. The key is derived from ctx's local
+notification subsystem uses. The key is derived from `ctx`'s local
keyring (see `internal/crypto`).
An attacker with read access to the project directory cannot
-learn the client token without also breaking ctx's local
+learn the client token without also breaking `ctx`'s local
keyring.
### Hub-Side Token Storage
@@ -158,7 +158,7 @@ manually by the operator (see
## Responsible Disclosure
Security issues in the hub follow the same process as the rest
-of ctx; see [Reporting](reporting.md).
+of `ctx`; see [Reporting](reporting.md).
## See Also
diff --git a/internal/assets/commands/text/write.yaml b/internal/assets/commands/text/write.yaml
index 5d8c80ccd..4b137a900 100644
--- a/internal/assets/commands/text/write.yaml
+++ b/internal/assets/commands/text/write.yaml
@@ -953,6 +953,8 @@ write.steering-body-product:
short: |-
# Product Context
+
+
Describe the product, its goals, and target users.
- **What is this project?**
@@ -964,6 +966,8 @@ write.steering-body-tech:
short: |-
# Technology Stack
+
+
Describe the technology stack, constraints, and key dependencies.
- **Languages and versions**
@@ -975,6 +979,8 @@ write.steering-body-structure:
short: |-
# Project Structure
+
+
Describe the project layout and directory conventions.
- **Top-level directories and their purpose**
@@ -1047,6 +1053,8 @@ write.steering-body-workflow:
short: |-
# Development Workflow
+
+
Describe the development workflow, branching strategy, and process rules.
- **Branch strategy** (main-only, trunk-based, feature branches)
diff --git a/internal/cli/agent/core/steering/steering.go b/internal/cli/agent/core/steering/steering.go
index 869398a76..16d9adfb5 100644
--- a/internal/cli/agent/core/steering/steering.go
+++ b/internal/cli/agent/core/steering/steering.go
@@ -12,7 +12,9 @@ import (
"path/filepath"
"github.com/ActiveMemory/ctx/internal/config/dir"
+ cfgWarn "github.com/ActiveMemory/ctx/internal/config/warn"
errSkill "github.com/ActiveMemory/ctx/internal/err/skill"
+ "github.com/ActiveMemory/ctx/internal/log/warn"
"github.com/ActiveMemory/ctx/internal/rc"
"github.com/ActiveMemory/ctx/internal/skill"
"github.com/ActiveMemory/ctx/internal/steering"
@@ -23,6 +25,11 @@ import (
// when the steering directory does not exist or
// contains no applicable files.
//
+// Files whose body still contains the [steering.Tombstone]
+// placeholder marker are excluded and surfaced as a
+// warning on stderr so the user sees that scaffolded
+// content is being suppressed.
+//
// Returns:
// - []string: Body content of each matching steering file
func LoadBodies() []string {
@@ -39,9 +46,14 @@ func LoadBodies() []string {
var bodies []string
for _, sf := range filtered {
- if sf.Body != "" {
- bodies = append(bodies, sf.Body)
+ if sf.Body == "" {
+ continue
+ }
+ if steering.HasTombstone(sf.Body) {
+ warn.Warn(cfgWarn.SteeringUnfilled, sf.Path)
+ continue
}
+ bodies = append(bodies, sf.Body)
}
return bodies
}
diff --git a/internal/config/steering/steering.go b/internal/config/steering/steering.go
index 6e387fd41..21e15b812 100644
--- a/internal/config/steering/steering.go
+++ b/internal/config/steering/steering.go
@@ -43,3 +43,17 @@ const (
// NameWorkflow is the file name for the development workflow file.
NameWorkflow = "workflow"
)
+
+// Tombstone is the literal marker line embedded in scaffolded
+// foundation steering file bodies by ctx steering init. Its
+// presence in a steering file's body signals that the file has
+// not been customized yet and that the body content is
+// unmodified placeholder text. Files containing this marker
+// are excluded from the agent context packet, MCP
+// ctx_steering_get results, and native-tool sync (Cursor /
+// Cline / Kiro). Removing the line activates the file. The
+// marker is HTML-comment-shaped so it survives Markdown
+// rendering invisibly, and the match is a literal string
+// comparison so non-English body customizations still remove
+// it reliably.
+const Tombstone = ""
diff --git a/internal/config/warn/warn.go b/internal/config/warn/warn.go
index 32ee069f3..eef4b6ef6 100644
--- a/internal/config/warn/warn.go
+++ b/internal/config/warn/warn.go
@@ -104,6 +104,16 @@ const (
// explains why the state directory resolution went sideways
// before the caller surfaces an empty-path error.
StateDirProbe = "probe state dir: %v"
+
+ // SteeringUnfilled is the stderr format for steering files
+ // that still carry the cfgSteering.Tombstone placeholder
+ // marker. The file is skipped on every load path (agent
+ // context packet, MCP ctx_steering_get, sync to Cursor /
+ // Cline / Kiro). The warning is the breadcrumb that tells
+ // the user a scaffolded steering file is silently inert
+ // until the tombstone line is removed.
+ SteeringUnfilled = "skipping unfilled steering file %s " +
+ "(remove the tombstone line to activate)"
)
// Warn context identifiers for index generation.
diff --git a/internal/mcp/handler/steering.go b/internal/mcp/handler/steering.go
index b029efdd3..487a85b1d 100644
--- a/internal/mcp/handler/steering.go
+++ b/internal/mcp/handler/steering.go
@@ -16,9 +16,11 @@ import (
"github.com/ActiveMemory/ctx/internal/assets/read/desc"
"github.com/ActiveMemory/ctx/internal/config/embed/text"
+ cfgWarn "github.com/ActiveMemory/ctx/internal/config/warn"
"github.com/ActiveMemory/ctx/internal/entity"
errMcp "github.com/ActiveMemory/ctx/internal/err/mcp"
ctxIo "github.com/ActiveMemory/ctx/internal/io"
+ "github.com/ActiveMemory/ctx/internal/log/warn"
"github.com/ActiveMemory/ctx/internal/rc"
"github.com/ActiveMemory/ctx/internal/steering"
)
@@ -50,12 +52,25 @@ func SteeringGet(_ *entity.MCPDeps, prompt string) (string, error) {
filtered := steering.Filter(files, prompt, nil, "")
- if len(filtered) == 0 {
+ // Drop placeholder files (those still carrying the
+ // tombstone). The MCP path runs as a subprocess; warnings
+ // go to stderr where the host AI tool surfaces them in
+ // its MCP server logs.
+ active := filtered[:0]
+ for _, sf := range filtered {
+ if steering.HasTombstone(sf.Body) {
+ warn.Warn(cfgWarn.SteeringUnfilled, sf.Path)
+ continue
+ }
+ active = append(active, sf)
+ }
+
+ if len(active) == 0 {
return desc.Text(text.DescKeyMCPSteeringNoMatch), nil
}
var sb strings.Builder
- for _, sf := range filtered {
+ for _, sf := range active {
ctxIo.SafeFprintf(&sb,
desc.Text(text.DescKeyMCPSteeringSection),
sf.Name, sf.Body)
diff --git a/internal/steering/sync.go b/internal/steering/sync.go
index fa25a952e..cae20f957 100644
--- a/internal/steering/sync.go
+++ b/internal/steering/sync.go
@@ -66,6 +66,11 @@ func SyncTool(
continue
}
+ if HasTombstone(sf.Body) {
+ report.Skipped = append(report.Skipped, sf.Name)
+ continue
+ }
+
outPath := nativePath(projectRoot, tool, sf.Name)
if validateErr := validateOutputPath(
@@ -155,6 +160,9 @@ func StaleFiles(steeringDir, projectRoot, tool string) []string {
if !matchTool(sf, tool) {
continue
}
+ if HasTombstone(sf.Body) {
+ continue
+ }
outPath := nativePath(projectRoot, tool, sf.Name)
content := formatNative(tool, sf)
if !unchanged(outPath, content) {
diff --git a/internal/steering/sync_test.go b/internal/steering/sync_test.go
index 048b8ad61..249d2ee71 100644
--- a/internal/steering/sync_test.go
+++ b/internal/steering/sync_test.go
@@ -330,3 +330,63 @@ Auto body.
t.Error("kiro output should map auto inclusion to mode: auto")
}
}
+
+func TestSyncTool_SkipsTombstonedFile(t *testing.T) {
+ root := t.TempDir()
+ steeringDir := filepath.Join(root, ".context", "steering")
+
+ tombstoned := `---
+name: product
+description: Product context
+inclusion: always
+priority: 10
+---
+# Product Context
+
+` + Tombstone + `
+
+Describe the product, its goals, and target users.
+`
+ writeSteering(t, steeringDir, "product", tombstoned)
+
+ report, err := SyncTool(steeringDir, root, "cursor")
+ if err != nil {
+ t.Fatalf("SyncTool: %v", err)
+ }
+ if len(report.Written) != 0 {
+ t.Errorf("expected 0 written files (tombstoned file should be skipped), got %v", report.Written)
+ }
+ if len(report.Skipped) != 1 || report.Skipped[0] != "product" {
+ t.Errorf("expected product to be skipped, got %v", report.Skipped)
+ }
+
+ // The native-format output should NOT have been written.
+ out := filepath.Join(root, ".cursor", "rules", "product.mdc")
+ if _, statErr := os.Stat(out); statErr == nil {
+ t.Errorf("tombstoned file was synced to %s; expected no write", out)
+ }
+}
+
+func TestStaleFiles_SkipsTombstonedFile(t *testing.T) {
+ root := t.TempDir()
+ steeringDir := filepath.Join(root, ".context", "steering")
+
+ tombstoned := `---
+name: product
+description: Product context
+inclusion: always
+priority: 10
+---
+# Product Context
+
+` + Tombstone + `
+
+placeholder.
+`
+ writeSteering(t, steeringDir, "product", tombstoned)
+
+ stale := StaleFiles(steeringDir, root, "cursor")
+ if len(stale) != 0 {
+ t.Errorf("expected tombstoned file to be skipped (not reported as stale), got %v", stale)
+ }
+}
diff --git a/internal/steering/tombstone.go b/internal/steering/tombstone.go
new file mode 100644
index 000000000..3b5606c3b
--- /dev/null
+++ b/internal/steering/tombstone.go
@@ -0,0 +1,39 @@
+// / ctx: https://ctx.ist
+// ,'`./ do you remember?
+// `.,'\
+// \ Copyright 2026-present Context contributors.
+// SPDX-License-Identifier: Apache-2.0
+
+package steering
+
+import (
+ "strings"
+
+ cfgSteering "github.com/ActiveMemory/ctx/internal/config/steering"
+)
+
+// Tombstone re-exports the canonical tombstone marker from
+// [cfgSteering.Tombstone] so callers within this package and
+// nearby tests can reference it without an additional import.
+// The single source of truth is the config package.
+const Tombstone = cfgSteering.Tombstone
+
+// HasTombstone reports whether the given steering file body
+// still contains the [Tombstone] marker, indicating it is an
+// unmodified placeholder from `ctx steering init`.
+//
+// Files containing the tombstone are excluded from:
+// - the agent context packet assembled by `ctx agent`
+// - MCP `ctx_steering_get` results
+// - native-tool exports via `ctx steering sync` (Cursor,
+// Cline, Kiro)
+//
+// Parameters:
+// - body: steering file body content (the markdown after
+// the YAML frontmatter)
+//
+// Returns:
+// - bool: true if the tombstone marker is present in the body
+func HasTombstone(body string) bool {
+ return strings.Contains(body, cfgSteering.Tombstone)
+}
diff --git a/internal/steering/tombstone_test.go b/internal/steering/tombstone_test.go
new file mode 100644
index 000000000..aafb39e12
--- /dev/null
+++ b/internal/steering/tombstone_test.go
@@ -0,0 +1,48 @@
+// / ctx: https://ctx.ist
+// ,'`./ do you remember?
+// `.,'\
+// \ Copyright 2026-present Context contributors.
+// SPDX-License-Identifier: Apache-2.0
+
+package steering
+
+import "testing"
+
+func TestHasTombstone_PresentReturnsTrue(t *testing.T) {
+ body := "# Product Context\n\n" + Tombstone + "\n\nbody text"
+ if !HasTombstone(body) {
+ t.Errorf("expected HasTombstone to return true for body containing the marker")
+ }
+}
+
+func TestHasTombstone_AbsentReturnsFalse(t *testing.T) {
+ body := "# Product Context\n\nWe build a thing for AI coding sessions.\n"
+ if HasTombstone(body) {
+ t.Errorf("expected HasTombstone to return false for body without the marker")
+ }
+}
+
+func TestHasTombstone_EmptyReturnsFalse(t *testing.T) {
+ if HasTombstone("") {
+ t.Errorf("expected HasTombstone to return false for empty body")
+ }
+}
+
+func TestHasTombstone_PartialMatchReturnsFalse(t *testing.T) {
+ // A prefix substring of the tombstone must NOT trigger detection.
+ // This guards against accidental matches when a user happens to
+ // write a similar but distinct comment in their own steering body.
+ body := "# Project Structure\n\n\n\nbody text"
+ if HasTombstone(body) {
+ t.Errorf("expected HasTombstone to return false for a partial-match comment")
+ }
+}
+
+func TestHasTombstone_TombstoneAnywhereInBodyReturnsTrue(t *testing.T) {
+ // The marker may appear anywhere in the body; detection is a
+ // strings.Contains check, not a position-anchored one.
+ body := "# Workflow\n\nProse line.\n\nMore prose.\n\n" + Tombstone + "\n"
+ if !HasTombstone(body) {
+ t.Errorf("expected HasTombstone to return true regardless of marker position")
+ }
+}
diff --git a/site/blog/2026-01-27-building-ctx-using-ctx/index.html b/site/blog/2026-01-27-building-ctx-using-ctx/index.html
index 84b6099e3..64b05cce0 100644
--- a/site/blog/2026-01-27-building-ctx-using-ctx/index.html
+++ b/site/blog/2026-01-27-building-ctx-using-ctx/index.html
@@ -1175,7 +1175,7 @@
-Building ctx Using ctx
+Building ctx Using ctx
Update (2026-02-11)
As of v0.4.0, ctx consolidated sessions into the journal mechanism.
@@ -1575,7 +1575,7 @@
The Future: Recall System
The Configuration: .contextrc
-Projects can now customize ctx behavior
+Projects can now customize ctx behavior
via .contextrc.
-This makes ctx usable in real teams, not just personal projects.
+This makes ctx usable in real teams, not just personal projects.
Priority order: CLI flags > environment variables > .contextrc >
sensible defaults
The Flags: Global CLI Options
diff --git a/site/blog/2026-02-08-not-everything-is-a-skill/index.html b/site/blog/2026-02-08-not-everything-is-a-skill/index.html
index c26c87d45..e548432d1 100644
--- a/site/blog/2026-02-08-not-everything-is-a-skill/index.html
+++ b/site/blog/2026-02-08-not-everything-is-a-skill/index.html
@@ -1090,7 +1090,7 @@
Not Everything Is a Skill
Update (2026-02-11)
-
As of v0.4.0, ctx consolidated sessions into the journal mechanism.
+
As of v0.4.0, ctx consolidated sessions into the journal mechanism.
References to /ctx-save, .context/sessions/, and session auto-save
in this post reflect the architecture at the time of writing.
diff --git a/site/blog/2026-02-15-ctx-v0.3.0-the-discipline-release/index.html b/site/blog/2026-02-15-ctx-v0.3.0-the-discipline-release/index.html
index f9fc5fd86..c322def0c 100644
--- a/site/blog/2026-02-15-ctx-v0.3.0-the-discipline-release/index.html
+++ b/site/blog/2026-02-15-ctx-v0.3.0-the-discipline-release/index.html
@@ -1098,7 +1098,7 @@
-ctx v0.3.0: The Discipline Release
+ctx v0.3.0: The Discipline Release

When the Ratio of Polish to Features Is 3:1, You Know Something Changed
Jose Alekhinne / February 15, 2026
diff --git a/site/blog/2026-02-16-ctx-v0.6.0-the-integration-release/index.html b/site/blog/2026-02-16-ctx-v0.6.0-the-integration-release/index.html
index 28c58c67b..1cec7d4a9 100644
--- a/site/blog/2026-02-16-ctx-v0.6.0-the-integration-release/index.html
+++ b/site/blog/2026-02-16-ctx-v0.6.0-the-integration-release/index.html
@@ -1137,7 +1137,7 @@
-ctx v0.6.0: The Integration Release
+ctx v0.6.0: The Integration Release

Two Commands to Persistent Memory
Jose Alekhinne / February 16, 2026
diff --git a/site/blog/2026-02-17-code-is-cheap-judgment-is-not/index.html b/site/blog/2026-02-17-code-is-cheap-judgment-is-not/index.html
index b6fe9a978..6c6a074c6 100644
--- a/site/blog/2026-02-17-code-is-cheap-judgment-is-not/index.html
+++ b/site/blog/2026-02-17-code-is-cheap-judgment-is-not/index.html
@@ -1261,12 +1261,12 @@ Code Is Nothing
+The Evidence from Building ctx
I did not arrive at this conclusion theoretically.
I arrived at it by building a tool with an AI agent for three weeks
and watching exactly where a human touch mattered.
YOLO Mode Proved Production Is Cheap
-In Building ctx Using ctx, I documented the YOLO
+
In Building ctx Using ctx, I documented the YOLO
phase: auto-accept everything, let the AI ship features at full
speed. It produced 14 commands in a week. Impressive output.
The code worked. The architecture drifted. Magic strings
@@ -1427,7 +1427,7 @@
The Arc showed that production
+
Building ctx Using ctx showed that production
without direction creates debt
Refactoring with Intent
showed that slowing down is not the opposite of progress
@@ -1454,7 +1454,7 @@ The ArcThe Arc:
what happens when this infrastructure starts compounding in someone else's environment.
diff --git a/site/blog/2026-02-17-parallel-agents-merge-debt-and-the-myth-of-overnight-progress/index.html b/site/blog/2026-02-17-parallel-agents-merge-debt-and-the-myth-of-overnight-progress/index.html
index 157e069e7..ab225eaee 100644
--- a/site/blog/2026-02-17-parallel-agents-merge-debt-and-the-myth-of-overnight-progress/index.html
+++ b/site/blog/2026-02-17-parallel-agents-merge-debt-and-the-myth-of-overnight-progress/index.html
@@ -1456,7 +1456,7 @@ ctx Was Never abou
interference.
The ctx Manifesto's thesis holds:
-Without ctx, intelligence resets. With ctx, creation compounds.
+Without ctx, intelligence resets. With ctx, creation compounds.
Compounding requires structure.
Structure requires boundaries.
diff --git a/site/blog/2026-02-17-the-3-1-ratio/index.html b/site/blog/2026-02-17-the-3-1-ratio/index.html
index c7e7f9e4d..35f752b37 100644
--- a/site/blog/2026-02-17-the-3-1-ratio/index.html
+++ b/site/blog/2026-02-17-the-3-1-ratio/index.html
@@ -1511,7 +1511,7 @@ What the Ratio Is Not
This post sits at a crossroads in the ctx story. Looking back:
-- Building ctx Using ctx documented the YOLO sprint
+
- Building
ctx Using ctx documented the YOLO sprint
that created the initial codebase
- Refactoring with Intent introduced the 3:1 ratio
as an observation from the first cleanup
@@ -1530,7 +1530,7 @@ The Arc so Far: one mind, one repository
+
- Building
ctx Using ctx: one mind, one repository
- The Attention Budget: the constraint
- Context as Infrastructure: the architecture
- Code Is Cheap. Judgment Is Not.: the bottleneck
diff --git a/site/blog/2026-03-04-agent-memory-is-infrastructure/index.html b/site/blog/2026-03-04-agent-memory-is-infrastructure/index.html
index 2b9e152d0..7640ea1b2 100644
--- a/site/blog/2026-03-04-agent-memory-is-infrastructure/index.html
+++ b/site/blog/2026-03-04-agent-memory-is-infrastructure/index.html
@@ -1442,7 +1442,7 @@ A Layer That Doesn't Exist Yetctx builds: a version-controlled,
+
That missing layer is what ctx builds: a version-controlled,
structured knowledge layer that lives in .context/ alongside your code and
travels wherever your repository travels.
Not another memory feature.
diff --git a/site/blog/2026-03-23-ctx-v0.8.0-the-architecture-release/index.html b/site/blog/2026-03-23-ctx-v0.8.0-the-architecture-release/index.html
index 648a8ddd1..33d590ee4 100644
--- a/site/blog/2026-03-23-ctx-v0.8.0-the-architecture-release/index.html
+++ b/site/blog/2026-03-23-ctx-v0.8.0-the-architecture-release/index.html
@@ -1148,7 +1148,7 @@
-ctx v0.8.0: The Architecture Release
+ctx v0.8.0: The Architecture Release

- You can't localize what you haven't externalized.
@@ -1291,7 +1291,7 @@ What Got Deleted
-This is the seventh post in the ctx blog series. The arc so far:
+This is the seventh post in the ctx blog series. The arc so far:
- The Attention Budget:
why context windows are a scarce resource
diff --git a/site/blog/2026-03-23-we-broke-the-3-1-rule/index.html b/site/blog/2026-03-23-we-broke-the-3-1-rule/index.html
index f8166ccba..501e3812c 100644
--- a/site/blog/2026-03-23-we-broke-the-3-1-rule/index.html
+++ b/site/blog/2026-03-23-we-broke-the-3-1-rule/index.html
@@ -1375,7 +1375,7 @@ The Updated Rule
-This is the eighth post in the ctx blog series:
+This is the eighth post in the ctx blog series:
- The Attention Budget:
why context windows are a scarce resource
diff --git a/site/blog/2026-04-06-the-watermelon-rind-anti-pattern/index.html b/site/blog/2026-04-06-the-watermelon-rind-anti-pattern/index.html
index 01858d38f..a1c6395b9 100644
--- a/site/blog/2026-04-06-the-watermelon-rind-anti-pattern/index.html
+++ b/site/blog/2026-04-06-the-watermelon-rind-anti-pattern/index.html
@@ -1114,7 +1114,7 @@ A Turkish Proverb Walks into a
dashboards passing, reality crumbling.
Both halves of this metaphor showed up in a single experiment. And
the result changed how we design architecture analysis in
-ctx.
+[ctx][ctx].
The Experiment
We ran three sessions analyzing the same large codebase (~34,000
@@ -1275,7 +1275,7 @@
Takeaway series,
+
This post is part of the ctx field notes series,
documenting what we learn building persistent context
infrastructure for AI coding sessions.
diff --git a/site/blog/index.html b/site/blog/index.html
index 3285ecef4..7b30afedd 100644
--- a/site/blog/index.html
+++ b/site/blog/index.html
@@ -1499,7 +1499,7 @@ Blog
Stories, insights, and lessons learned from building and using ctx.
Releases
-
+
March 23, 2026: 374 commits, 1,708 Go files touched, and a near-complete
architectural overhaul. Every CLI package restructured into cmd/ + core/
taxonomy, all user-facing strings externalized to YAML, MCP server for
@@ -1558,10 +1558,10 @@
February 3, 2026: Every token you send to an AI consumes a finite
resource: the attention budget. Understanding this constraint shaped every
-design decision in ctx: hierarchical file structure, explicit budgets,
+design decision in ctx: hierarchical file structure, explicit budgets,
progressive disclosure, and filesystem-as-index.
Topics: attention mechanics, context engineering, progressive disclosure,
-ctx primitives, token budgets
+ctx primitives, token budgets
February 14, 2026: IRC is stateless. You disconnect, you vanish. Modern
@@ -1684,28 +1684,28 @@