context-creation
Wrap an existing codebase in project state, without guessing. Routed to by /create-context, and by startup when .codearbiter/CONTEXT.md exists but carries no <!--INITIALIZED--> body marker and meaningful source code is present. When no meaningful source exists, this is the wrong skill — route to decompose instead.
This back-fills from existing source. It complements /ca:init, which scaffolds an empty .codearbiter/ for a fresh project; here the docs are derived from what is already on disk.
Pre-flight
Read these, or STOP and surface the gap — never guess project identity or a command:
${CLAUDE_PROJECT_DIR}/.codearbiter/CONTEXT.md — if it already carries <!--INITIALIZED-->, context exists. Stop and route to normal operation.
- The repository root listing (one level deep) — the source surface this skill extracts from.
The excluded set (not "meaningful source"): .git/, .codearbiter/, .claude/, AGENTS.md, CLAUDE.md, README.md, LICENSE, .gitignore, .gitmodules, and standard tooling dotfiles (.editorconfig, .prettierrc, etc.). Meaningful source MUST exist beyond it.
Phase 1 — Pre-flight confirmation · gate: BLOCK
Confirm the repository is a brownfield codebase safe for scout-based extraction:
- Confirm
<!--INITIALIZED--> is absent from CONTEXT.md.
- Confirm meaningful source code is present beyond the excluded set.
- Identify the primary source directories (
src/, backend/, frontend/, lib/, app/, or equivalent).
State the finding to the user: existing source detected, beginning scout-based extraction.
Gate: <!--INITIALIZED--> absent AND meaningful source present. If the marker is present, stop and route to normal operation. If no meaningful source exists, stop and route to decompose. Neither condition met → do not proceed.
Phase 2 — Scout dispatch · gate: BLOCK
A scout is a restricted, read-only role, not an unconstrained
general-purpose agent. A scout reads one targeted slice of the codebase and
returns a structured findings report — file paths, line numbers, and named
values only, never raw code excerpts. Scouts are internal to this skill; they
are never invoked from a command.
Dispatch six isolated scout subagents simultaneously. If the active host
cannot provide isolated subagents, BLOCK context creation and report the host
capability gap. The general inline-role fallback does not apply here: this
skill's report-only synthesis contract depends on the orchestrator never
loading the scouts' raw source into its own context.
Each reads only its assigned slice:
- Scout A — Tech stack. Read
package.json, lockfiles, pyproject.toml, requirements.txt, go.mod, Cargo.toml, *.gemspec, Gemfile. Report languages, runtime versions, frameworks, key dependencies, the dependency manager, license fields.
- Scout B — Infrastructure. Read CI/CD config (
.github/workflows/, .gitlab-ci.yml, Jenkinsfile, .circleci/config.yml), Dockerfile*, docker-compose*.yml, Makefile, *.tf, IaC. Report CI/CD platform, build/test/lint commands, deployment targets, environment names, containerization, IaC tool.
- Scout C — Architecture. Read the source tree (names and structure only), entry points (
main.ts, index.ts, app.py, server.go), and imports in entry points only. Report component list, entry points, module boundaries, architectural pattern, public interfaces.
- Scout D — Security posture. Read auth files (
auth*, middleware*, guard*, jwt*, session*, oauth*), crypto import lines, secret-loading sites (process.env, os.environ, vault/KMS call sites — paths and line numbers only, never values), .env.example (never .env). Report auth mechanism, crypto libraries, secret-loading patterns (paths + lines, no values), vault/KMS integration, hardcoded-secret risk files (paths only).
- Scout E — Testing. Read test files and test config (
vitest.config.*, jest.config.*, pytest.ini, Makefile test flags), coverage config. Report test framework, runner command, coverage tool, coverage thresholds in config, naming convention, approximate test count by type, fixtures.
- Scout F — Data model. Read migration files (
migrations/, drizzle/, alembic/, db/migrate/), schema definitions (schema.ts, *.prisma, *.sql, models/), ORM config, DB connection config (keys only, never credentials). Report database type, ORM/query builder, entity names, migration tool, approximate entity count, multi-tenancy patterns.
The orchestrator reads only the scout reports in later phases — never the raw source — to preserve working context. A scout that finds nothing returns an explicit "not found" report, never silence.
Content hashes: Scouts additionally emit a git hash-object <path> content oid per cited file in the hash field of their evidence entry. The scout already Read those files — no additional pass is needed, and no raw content is forwarded to the orchestrator.
Gate: all six scout reports returned. A missing report is a blocking gap — do not proceed with an incomplete picture. Re-dispatch a failing scout before Phase 3.
Phase 3 — Synthesis · gate: BLOCK
Draft every surviving project-state doc from the six reports, working only from the reports. Map source to destination:
| Scout source |
Destination |
| A (tech stack), B (build/test/lint commands), E (test runner) |
tech-stack.md |
| C (architecture), E (structure) |
coding-standards.md |
| D (security) |
security-controls.md (thin) |
| All scouts |
CONTEXT.md (project identity, purpose, scope, NOT-building) |
Classify every finding by confidence:
- HIGH — directly and unambiguously in a report (e.g.,
"jest" in package.json). Write it as fact.
- MEDIUM — inferred from an indirect signal (directory layout implies layered architecture, no explicit config). Write it with a note: inferred from [signal], verify before relying on it.
- LOW — no signal, or conflicting signals. Write a
[CONFIRM-NN] placeholder.
Every [CONFIRM-NN] carries: a sequential ID, one sentence on what is unknown, why it matters, and what would resolve it. IDs are sequential with open-questions.md.
Gate: every surviving doc drafted; every low-confidence inference carries a [CONFIRM-NN]. No silent omission. A domain with no scout signal gets a doc with a [CONFIRM-NN] for the whole section — never an empty file.
Phase 4 — Gap interview · gate: BLOCK
Resolve [CONFIRM-NN] items with the user. Ask only what the scouts could not answer with HIGH confidence.
- Present the
[CONFIRM-NN] list grouped by category — gaps the scan could not resolve.
- Ask ONE targeted question per item. No compound questions. Do not re-ask anything scouts answered with HIGH confidence.
- Per answer: if it resolves the gap, replace the placeholder with content; if the user explicitly defers, keep the placeholder, mark it deferred with the date, and record it in
open-questions.md; if the answer is vague, challenge it and demand a concrete answer before recording anything.
Gate: every [CONFIRM-NN] has exactly one outcome — resolved (replaced with content) or explicitly deferred (marked and recorded in open-questions.md). No item is silently dropped. Do not proceed with unacknowledged gaps.
Phase 5 — Project-state write · gate: BLOCK
Write the surviving docs to ${CLAUDE_PROJECT_DIR}/.codearbiter/. Every doc carries actual content — no unresolved placeholder may remain where a value was determined:
| File |
Content |
CONTEXT.md |
Project identity, purpose, scope, primary users, NOT-building. Frontmatter MUST include arbiter: enabled (the activation flag the SessionStart hook keys on) and stage: set to a single maturity number (default 1; the user may raise it if the project is further along). |
tech-stack.md |
Languages, frameworks, test runner, lint command, build command, coverage command, issue-tracker command (e.g. gh issue create). |
coding-standards.md |
Structural patterns, naming conventions, style rules. |
security-controls.md |
Thin: auth mechanism, banned crypto primitives, secret-loading stance. Only what a security boundary actually requires. |
open-questions.md |
Every deferred [CONFIRM-NN] in CONFIRM-NN: <description> form. |
open-tasks.md |
The task backlog if scouts found one; otherwise a stub noting the user must populate it. |
overrides.log |
Empty append-only audit log, created so /override has a sink. |
If scouts found existing decision records (docs/decisions/, adr/), summarize them as entries under .codearbiter/decisions/ in the standard ADR format. If a record cannot be fully parsed, summarize what is known, flag the uncertainty, and note the source path for review.
Provenance and code-map (small addition, not a Phase 5 rebuild):
- Write ONE provenance file per derived doc to
.codearbiter/.provenance/<doc>.json via _provenancelib.write_provenance and new_record. Each entry carries: path (repo-relative), hash (the scout's git hash-object oid), drift_trigger (from _provenancelib.classify_source(path)), and the claims array with lines, claim, and confidence drawn from the scout evidence.
- Synthesize
.codearbiter/code-map.md (concern → path → ≤1-line role) from Scout C (architecture) evidence. Use concern headings (## <concern>) and column-0 bullets (- \path` — role`). Keep it coarse — module/concern granularity only, no full file listing.
Do NOT scaffold any cut doc — see ${CLAUDE_PLUGIN_ROOT}/includes/cut-docs.md for the canonical never-scaffold list. Maturity lives in the stage: frontmatter of CONTEXT.md, not a separate file.
Gate: every surviving doc written; CONTEXT.md frontmatter carries arbiter: enabled and stage:; no resolved value left as a placeholder. Deferred [CONFIRM-NN] items are acceptable only in open-questions.md.
Phase 6 — Initialization lock · gate: BLOCK
Lock the project state as initialized and return to normal orchestration:
- Write the
<!--INITIALIZED--> marker into the body of CONTEXT.md.
- List
.codearbiter/ and display the populated tree.
- Confirm each required file is present and non-empty:
CONTEXT.md (with arbiter: enabled frontmatter and the <!--INITIALIZED--> body marker), tech-stack.md, coding-standards.md, security-controls.md, open-questions.md, open-tasks.md, overrides.log.
- State the return to normal operation: extraction complete, project state initialized and locked,
/ca:feature available to begin work. Deferred questions live in open-questions.md.
Gate: arbiter: enabled set and <!--INITIALIZED--> present in CONTEXT.md; every required file present and non-empty. Do not close this skill without confirming both markers are written.
Hard rules
- MUST NOT write
<!--INITIALIZED--> while any [CONFIRM-NN] is unaddressed — every gap must be resolved or explicitly deferred to open-questions.md first.
- MUST NOT resolve a
[CONFIRM-NN] by guessing — surface the question to the user or defer it.
- MUST NOT proceed past Phase 2 with fewer than six scout reports.
- MUST NOT run Phase 2 inline — isolated scout subagents are required for the report-only synthesis boundary.
- MUST NOT load raw source into the orchestrator context after Phase 1 — synthesize from scout reports only.
- MUST NOT record a scout finding that exposes a secret value — paths and line numbers only.
- MUST NOT scaffold a cut doc — see
${CLAUDE_PLUGIN_ROOT}/includes/cut-docs.md for the canonical never-scaffold list. Maturity is the stage: frontmatter number in CONTEXT.md.
- MUST NOT run when
CONTEXT.md already carries <!--INITIALIZED--> — stop and route to normal operation.
1---2name: context-creation3description: The brownfield back-fill. Routed to by /create-context, and by startup when .codearbiter/CONTEXT.md lacks the <!--INITIALIZED--> body marker but source code exists. Six gated phases — pre-flight, scout dispatch, synthesis, gap interview, write, lock. Reads the existing codebase through parallel scouts, drafts every surviving project-state doc, resolves gaps with the user, and locks the project as initialized.4---5
6# context-creation
7
8Wrap an existing codebase in project state, without guessing. Routed to by `/create-context`, and by startup when `.codearbiter/CONTEXT.md` exists but carries no `<!--INITIALIZED-->` body marker and meaningful source code is present. When no meaningful source exists, this is the wrong skill — route to `decompose` instead.
9
10This back-fills from existing source. It complements `/ca:init`, which scaffolds an empty `.codearbiter/` for a fresh project; here the docs are derived from what is already on disk.
11
12## Pre-flight
13
14Read these, or STOP and surface the gap — never guess project identity or a command:
15
16- `${CLAUDE_PROJECT_DIR}/.codearbiter/CONTEXT.md` — if it already carries `<!--INITIALIZED-->`, context exists. Stop and route to normal operation.
17- The repository root listing (one level deep) — the source surface this skill extracts from.
18
19The excluded set (not "meaningful source"): `.git/`, `.codearbiter/`, `.claude/`, `AGENTS.md`, `CLAUDE.md`, `README.md`, `LICENSE`, `.gitignore`, `.gitmodules`, and standard tooling dotfiles (`.editorconfig`, `.prettierrc`, etc.). Meaningful source MUST exist beyond it.
20
21## Phase 1 — Pre-flight confirmation · gate: BLOCK
22
23Confirm the repository is a brownfield codebase safe for scout-based extraction:
24
251. Confirm `<!--INITIALIZED-->` is absent from `CONTEXT.md`.
262. Confirm meaningful source code is present beyond the excluded set.
273. Identify the primary source directories (`src/`, `backend/`, `frontend/`, `lib/`, `app/`, or equivalent).
28
29State the finding to the user: existing source detected, beginning scout-based extraction.
30
31Gate: `<!--INITIALIZED-->` absent AND meaningful source present. If the marker is present, stop and route to normal operation. If no meaningful source exists, stop and route to `decompose`. Neither condition met → do not proceed.
32
33## Phase 2 — Scout dispatch · gate: BLOCK
34
35A **scout** is a restricted, read-only role, not an unconstrained
36`general-purpose` agent. A scout reads one targeted slice of the codebase and
37returns a structured findings report — file paths, line numbers, and named
38values only, never raw code excerpts. Scouts are internal to this skill; they
39are never invoked from a command.
40
41Dispatch six isolated `scout` subagents simultaneously. If the active host
42cannot provide isolated subagents, BLOCK context creation and report the host
43capability gap. The general inline-role fallback does not apply here: this
44skill's report-only synthesis contract depends on the orchestrator never
45loading the scouts' raw source into its own context.
46Each reads only its assigned slice:
47
48- **Scout A — Tech stack.** Read `package.json`, lockfiles, `pyproject.toml`, `requirements.txt`, `go.mod`, `Cargo.toml`, `*.gemspec`, `Gemfile`. Report languages, runtime versions, frameworks, key dependencies, the dependency manager, license fields.
49- **Scout B — Infrastructure.** Read CI/CD config (`.github/workflows/`, `.gitlab-ci.yml`, `Jenkinsfile`, `.circleci/config.yml`), `Dockerfile*`, `docker-compose*.yml`, `Makefile`, `*.tf`, IaC. Report CI/CD platform, build/test/lint commands, deployment targets, environment names, containerization, IaC tool.
50- **Scout C — Architecture.** Read the source tree (names and structure only), entry points (`main.ts`, `index.ts`, `app.py`, `server.go`), and imports in entry points only. Report component list, entry points, module boundaries, architectural pattern, public interfaces.
51- **Scout D — Security posture.** Read auth files (`auth*`, `middleware*`, `guard*`, `jwt*`, `session*`, `oauth*`), crypto import lines, secret-loading sites (`process.env`, `os.environ`, vault/KMS call sites — paths and line numbers only, never values), `.env.example` (never `.env`). Report auth mechanism, crypto libraries, secret-loading patterns (paths + lines, no values), vault/KMS integration, hardcoded-secret risk files (paths only).
52- **Scout E — Testing.** Read test files and test config (`vitest.config.*`, `jest.config.*`, `pytest.ini`, Makefile test flags), coverage config. Report test framework, runner command, coverage tool, coverage thresholds in config, naming convention, approximate test count by type, fixtures.
53- **Scout F — Data model.** Read migration files (`migrations/`, `drizzle/`, `alembic/`, `db/migrate/`), schema definitions (`schema.ts`, `*.prisma`, `*.sql`, `models/`), ORM config, DB connection config (keys only, never credentials). Report database type, ORM/query builder, entity names, migration tool, approximate entity count, multi-tenancy patterns.
54
55The orchestrator reads only the scout reports in later phases — never the raw source — to preserve working context. A scout that finds nothing returns an explicit "not found" report, never silence.
56
57**Content hashes:** Scouts additionally emit a `git hash-object <path>` content oid per cited file in the hash field of their evidence entry. The scout already Read those files — no additional pass is needed, and no raw content is forwarded to the orchestrator.
58
59Gate: all six scout reports returned. A missing report is a blocking gap — do not proceed with an incomplete picture. Re-dispatch a failing scout before Phase 3.
60
61## Phase 3 — Synthesis · gate: BLOCK
62
63Draft every surviving project-state doc from the six reports, working only from the reports. Map source to destination:
64
65| Scout source | Destination |
66|---|---|
67| A (tech stack), B (build/test/lint commands), E (test runner) | `tech-stack.md` |
68| C (architecture), E (structure) | `coding-standards.md` |
69| D (security) | `security-controls.md` (thin) |
70| All scouts | `CONTEXT.md` (project identity, purpose, scope, NOT-building) |
71
72Classify every finding by confidence:
73
74- **HIGH** — directly and unambiguously in a report (e.g., `"jest"` in `package.json`). Write it as fact.
75- **MEDIUM** — inferred from an indirect signal (directory layout implies layered architecture, no explicit config). Write it with a note: inferred from [signal], verify before relying on it.
76- **LOW** — no signal, or conflicting signals. Write a `[CONFIRM-NN]` placeholder.
77
78Every `[CONFIRM-NN]` carries: a sequential ID, one sentence on what is unknown, why it matters, and what would resolve it. IDs are sequential with `open-questions.md`.
79
80Gate: every surviving doc drafted; every low-confidence inference carries a `[CONFIRM-NN]`. No silent omission. A domain with no scout signal gets a doc with a `[CONFIRM-NN]` for the whole section — never an empty file.
81
82## Phase 4 — Gap interview · gate: BLOCK
83
84Resolve `[CONFIRM-NN]` items with the user. Ask only what the scouts could not answer with HIGH confidence.
85
861. Present the `[CONFIRM-NN]` list grouped by category — gaps the scan could not resolve.
872. Ask ONE targeted question per item. No compound questions. Do not re-ask anything scouts answered with HIGH confidence.
883. Per answer: if it resolves the gap, replace the placeholder with content; if the user explicitly defers, keep the placeholder, mark it deferred with the date, and record it in `open-questions.md`; if the answer is vague, challenge it and demand a concrete answer before recording anything.
89
90Gate: every `[CONFIRM-NN]` has exactly one outcome — resolved (replaced with content) or explicitly deferred (marked and recorded in `open-questions.md`). No item is silently dropped. Do not proceed with unacknowledged gaps.
91
92## Phase 5 — Project-state write · gate: BLOCK
93
94Write the surviving docs to `${CLAUDE_PROJECT_DIR}/.codearbiter/`. Every doc carries actual content — no unresolved placeholder may remain where a value was determined:
95
96| File | Content |
97|---|---|
98| `CONTEXT.md` | Project identity, purpose, scope, primary users, NOT-building. Frontmatter MUST include `arbiter: enabled` (the activation flag the SessionStart hook keys on) and `stage:` set to a single maturity number (default `1`; the user may raise it if the project is further along). |
99| `tech-stack.md` | Languages, frameworks, test runner, lint command, build command, coverage command, issue-tracker command (e.g. `gh issue create`). |
100| `coding-standards.md` | Structural patterns, naming conventions, style rules. |
101| `security-controls.md` | Thin: auth mechanism, banned crypto primitives, secret-loading stance. Only what a security boundary actually requires. |
102| `open-questions.md` | Every deferred `[CONFIRM-NN]` in `CONFIRM-NN: <description>` form. |
103| `open-tasks.md` | The task backlog if scouts found one; otherwise a stub noting the user must populate it. |
104| `overrides.log` | Empty append-only audit log, created so `/override` has a sink. |
105
106If scouts found existing decision records (`docs/decisions/`, `adr/`), summarize them as entries under `.codearbiter/decisions/` in the standard ADR format. If a record cannot be fully parsed, summarize what is known, flag the uncertainty, and note the source path for review.
107
108**Provenance and code-map (small addition, not a Phase 5 rebuild):**
109
110- Write ONE provenance file per derived doc to `.codearbiter/.provenance/<doc>.json` via `_provenancelib.write_provenance` and `new_record`. Each entry carries: `path` (repo-relative), `hash` (the scout's `git hash-object` oid), `drift_trigger` (from `_provenancelib.classify_source(path)`), and the `claims` array with `lines`, `claim`, and `confidence` drawn from the scout evidence.
111- Synthesize `.codearbiter/code-map.md` (concern → path → ≤1-line role) from Scout C (architecture) evidence. Use concern headings (`## <concern>`) and column-0 bullets (`- \`path\` — role`). Keep it coarse — module/concern granularity only, no full file listing.
112
113Do NOT scaffold any cut doc — see `${CLAUDE_PLUGIN_ROOT}/includes/cut-docs.md` for the canonical never-scaffold list. Maturity lives in the `stage:` frontmatter of `CONTEXT.md`, not a separate file.
114
115Gate: every surviving doc written; `CONTEXT.md` frontmatter carries `arbiter: enabled` and `stage:`; no resolved value left as a placeholder. Deferred `[CONFIRM-NN]` items are acceptable only in `open-questions.md`.
116
117## Phase 6 — Initialization lock · gate: BLOCK
118
119Lock the project state as initialized and return to normal orchestration:
120
1211. Write the `<!--INITIALIZED-->` marker into the body of `CONTEXT.md`.
1222. List `.codearbiter/` and display the populated tree.
1233. Confirm each required file is present and non-empty: `CONTEXT.md` (with `arbiter: enabled` frontmatter and the `<!--INITIALIZED-->` body marker), `tech-stack.md`, `coding-standards.md`, `security-controls.md`, `open-questions.md`, `open-tasks.md`, `overrides.log`.
1244. State the return to normal operation: extraction complete, project state initialized and locked, `/ca:feature` available to begin work. Deferred questions live in `open-questions.md`.
125
126Gate: `arbiter: enabled` set and `<!--INITIALIZED-->` present in `CONTEXT.md`; every required file present and non-empty. Do not close this skill without confirming both markers are written.
127
128## Hard rules
129
130- MUST NOT write `<!--INITIALIZED-->` while any `[CONFIRM-NN]` is unaddressed — every gap must be resolved or explicitly deferred to `open-questions.md` first.
131- MUST NOT resolve a `[CONFIRM-NN]` by guessing — surface the question to the user or defer it.
132- MUST NOT proceed past Phase 2 with fewer than six scout reports.
133- MUST NOT run Phase 2 inline — isolated scout subagents are required for the report-only synthesis boundary.
134- MUST NOT load raw source into the orchestrator context after Phase 1 — synthesize from scout reports only.
135- MUST NOT record a scout finding that exposes a secret value — paths and line numbers only.
136- MUST NOT scaffold a cut doc — see `${CLAUDE_PLUGIN_ROOT}/includes/cut-docs.md` for the canonical never-scaffold list. Maturity is the `stage:` frontmatter number in `CONTEXT.md`.
137- MUST NOT run when `CONTEXT.md` already carries `<!--INITIALIZED-->` — stop and route to normal operation.