Skills › Compound Engineering › ce-setup › config-template.yaml
config-template.yaml
210 lines · skills/ce-setup/references/config-template.yaml at 3449230
1# Compound Engineering -- repo config
2# Copy to .compound-engineering/config.yaml in your project root (team defaults).
3# Optional override: .compound-engineering/config.local.yaml, same keys.
4# Ordinary keys: local wins when set, then this file, then the skill default.
5# docs_root is repo layout -- set it only here; local docs_root is ignored.
6# All settings are optional. Invalid ordinary values continue to the next layer.
7# docs_root fails closed on an unusable value.
9# --- Artifact root ---
10# Relocate every CE-written artifact folder (solutions, plans, ideation,
11# explainers, pulse-reports, dogfood-reports,
12# feedback-sweep, personas) under one repo-relative root. Unset -> `docs`,
13# byte-identical to today. A configured root becomes the sole location CE reads
14# and writes; CE never falls back to reading `docs/`.
15#
16# Set this only in this tracked file so every clone and worktree share one
17# artifact tree. A docs_root in config.local.yaml is ignored.
18#
19# The value must be a repo-relative directory whose real (symlink-resolved) path
20# stays inside the repo, is not the repo root itself, and is not under `.git/`.
21# Unlike every other setting here, an unusable value does NOT fall through to the
22# default -- CE stops with an error so a typo can't silently write artifacts into
23# the location you configured away from. `/ce-setup` reports the resolved root.
25# docs_root: .compound-engineering/artifacts # repo-relative dir (default: docs)
27# --- Product pulse ---
28# Settings written by /ce-product-pulse first-run interview. Re-run the skill with
29# argument `setup` or `reconfigure` to edit interactively.
31# pulse_product_name: "Spiral" # used in report titles (no default)
32# pulse_lookback_default: 24h # 1h | 24h | 7d | 30d (default: 24h)
33# pulse_primary_event: "session_started" # the event that means "user showed up"
34# pulse_value_event: "task_completed" # the event that means "user got value"
35# pulse_completion_events: "onboarded,first_purchase" # comma-separated, 0-3 events
36# pulse_quality_scoring: false # true | false (default: false; AI products only)
37# pulse_quality_dimension: "answer accuracy" # dimension scored 1-5 when pulse_quality_scoring is true
38# pulse_analytics_source: posthog # posthog | mixpanel | custom (no default)
39# pulse_tracing_source: sentry # sentry | datadog | custom (no default)
40# pulse_payments_source: stripe # stripe | custom (no default)
41# pulse_db_enabled: false # true | false (default: false; read-only DB if true)
42# pulse_metric_sources: "retention_d7=posthog,nps=delighted" # strategy-metric -> source overrides; comma-separated 'metric=source' pairs; unlisted metrics fall back to pulse_analytics_source
43# pulse_pending_metrics: "retention_d7,nps" # comma-separated strategy metrics awaiting instrumentation; render as 'no data'
44# pulse_excluded_metrics: "north_star" # comma-separated strategy metrics intentionally not in pulse
46# --- Output format ---
47# Per-skill output format default. Selects the exclusive format the artifact
48# is written in: `md` produces a markdown file, `html` produces a single
49# self-contained HTML file. The two are mutually exclusive -- there is no
50# sibling artifact. See DESIGN.md or your agent instructions to influence
51# HTML styling. Precedence: a format request in your prompt for that run wins
52# (e.g. "output:html" or "make it HTML"); a preference you established earlier
53# (in-session, saved to memory, or in your agent instructions) overrides these
54# keys (this config is the persisted fallback). A headless or pipeline run
55# resolves the format the same way; nothing forces `md`.
57# plan_output: html # md | html (default: md)
58# brainstorm_output: html # md | html (default: md)
59# ideate_output: md # md | html (default: html -- ideation docs are human-facing, so HTML is the default; set md to opt out)
61# --- Model elevation ---
62# Send only the reasoning-heavy step of /ce-plan (interpret research, then author
63# the plan) and /ce-brainstorm (generate approaches) to a model you name. The rest
64# of each skill -- dialogue, research, orchestration -- stays on your session
65# model. The value is a model alias (e.g. `fable`, `opus`). You can also name a
66# model in a prompt for a one-off, which overrides these keys.
67#
68# Cross-harness: setting a key means every harness you run these skills in will
69# attempt that model. The host serves it natively where it can; otherwise the
70# Claude CLI is invoked when installed and authenticated; otherwise the step runs
71# on your session model and the run says so. Invalid/commented/missing -> no
72# elevation.
74# plan_model: fable # model alias for plan authoring; candidate preference when a Bake-off runs (no default)
75# brainstorm_model: fable # model alias for approach generation; candidate preference when a Bake-off runs (no default)
77# --- PR concept teaching (ce-commit-push-pr) ---
78# When a PR introduces a concept new to the codebase, the generated PR
79# description gains a "New concepts" section teaching it. The section toggle is
80# the single gate: off disables judgment, the section, the /ce-explain offer,
81# and archival. Archival additionally writes the explainer to docs/explainers/
82# and links it from the PR (full-workflow runs only; override per run with
83# archive:on|off). Ordinary cascade: local, then this file, then the skill default.
85# pr_teaching_section: false # true | false (default: true)
86# pr_teaching_archive: true # true | false (default: false; full-workflow runs only)
88# --- ce-commit-push-pr babysit handoff ---
89# After a full-workflow PR is opened, ce-commit-push-pr auto-invokes ce-babysit-pr
90# to watch CI + incoming review and drive the PR toward merge-ready. Set false to
91# opt out standing (per-run override: the babysit:off token). This governs that
92# standing watch only -- lfg's in-pipeline babysit is bounded (3 fix rounds) and
93# still runs, since it is how that pipeline reaches "CI decided".
94# auto_babysit: false # true | false (default: true)
96# --- ce-plan scoping confirmation ---
97# By default /ce-plan pauses before research/plan-write to show a scoping
98# summary and wait for you to confirm scope. Set this to skip that wait: ce-plan
99# composes the summary for itself, records any inferred scope under an
100# Assumptions section, announces that it's proceeding, and keeps going. It skips
101# only that confirmation -- genuine blocking questions and the post-plan menu
102# still appear. Override per run with `confirm:auto` (skip) or `confirm:ask`
103# (force the gate on for one run).
105# plan_skip_scoping_confirm: true # true | false (default: false)
107# --- Cross-model review policy and preference ---
108# `cross_model_review_mode` decides whether ce-doc-review and ce-code-review may
109# automatically send review content (diffs, documents) to a second model
110# provider when their conditional cross-model pass activates. `off` skips that
111# pass before any route is chosen or process starts, leaves every local
112# reviewer in place, and reports "disabled by checkout config" instead of an
113# availability failure. `auto` keeps the current behavior. A direct request in
114# conversation ("use codex as the independent reviewer this time") overrides
115# `off` for that run; a conversation prohibition overrides `auto`.
116#
117# `cross_model_peer` is the preferred peer, consulted only when the mode is
118# `auto`. Conversation instructions still win, and the skills skip routes that
119# cannot establish the required host/peer distinction.
120# `cross_model_model` and `cross_model_effort` pin the model and reasoning
121# effort of whichever peer target runs; unset keeps the skills' editorial
122# mapping. The model must belong to that target's family (an alias such as
123# `fable` or a full id such as `claude-opus-5-5` for claude; `gpt-*` for codex,
124# optionally namespace-qualified such as `openai.gpt-6.1-sol` when the codex CLI
125# routes through a non-default `model_provider`; a `gemini-*` id such as
126# `gemini-3.8-flash` for antigravity).
127# Effort levels: claude low|medium|high|xhigh|max, codex low|medium|high|
128# xhigh plus max and ultra on the models that list them, grok low|medium|high|
129# xhigh, antigravity low|medium|high, OpenCode 2.x none|low|medium|high|xhigh|
130# max as each model lists them; cursor/composer routes take none. A value the peer
131# cannot honor skips the pass with a stated reason -- never substituted.
133# cross_model_review_mode: off # auto | off (default: auto)
134# cross_model_peer: codex # codex | claude | grok | antigravity | cursor | composer | opencode
135# cross_model_model: fable # model alias or full id for the resolved peer target (no default)
136# cross_model_effort: xhigh # reasoning effort for the resolved peer target (no default)
138# --- ce-work implementation engine ---
139# Standing preferences for who authors implementation units. Live
140# task/session/project instructions and LFG's provenance-bearing binding may
141# override or narrow these defaults. `off` disables only this standing preference.
142# `prefer` tries candidates in order, then falls back natively with disclosure.
143# `require` keeps the requested external identity fixed while viable, then also
144# falls back natively with disclosure if the route is unavailable. Harnesses:
145# codex | claude | grok | antigravity | cursor | opencode. Omit model to use that harness's configured
146# default. Composer is a model
147# family through Cursor: { harness: cursor, model: composer }. Do not put CLI flags
148# or commands here. A candidate equivalent to the current host/default is skipped;
149# a different explicit model in the same harness remains eligible.
151# work_engine_mode: prefer # off | prefer | require (default: off)
152# work_engine_preferences:
153# - harness: cursor
154# model: composer
155# - harness: codex
156# model: "gpt-6.1-sol"
157# - harness: claude # configured default model
159# Reasoning effort for the external worker, per harness. Each value is one of
160# that harness's own effort levels. An unset harness keeps its own default:
161# Codex and Claude at high, native Grok at xhigh, Antigravity at high (it takes
162# low|medium|high). OpenCode (2.x) keeps its own per-model default and takes
163# none|low|medium|high|xhigh|max as each model lists them. Cursor routes take no
164# effort. A map in config.local.yaml replaces this one.
166# work_engine_effort:
167# codex: xhigh
168# claude: max
170# --- ce-promote ---
171# Written automatically when you decline the Spiral setup offer in /ce-promote.
172# Suppresses that one-time setup nudge in this project. Remove the key to re-enable.
174# ce_promote_spiral_optout: true # true | (absent) (default: absent -- offer once)
176# --- Sweep (ce-sweep) ---
178# Feedback sources swept by /ce-sweep. Generic key: other skills may read this list.
179# Each entry: type (slack | github-issues | email), id (short name), target (channel ID /
180# owner/repo / mailbox), ack_action, closeout_action, sensitive (true withholds content
181# from committed state/plan text), approved (standing approval for source-side writes).
182# feedback_sources:
183# - { type: slack, id: slack-alpha, target: C0XXXXXXX, ack_action: eyes, closeout_action: white_check_mark, sensitive: false, approved: true }
184# - { type: github-issues, id: gh-issues, target: owner/repo, ack_action: "feedback:ack", closeout_action: "feedback:resolved", sensitive: false, approved: true }
186# Sweep-owned settings.
187# sweep_state_path: docs/feedback-sweep/state.yml # committed (multi-agent) or /tmp path (solo)
188# sweep_ack_cap: 25 # max acks per source per run before the circuit breaker
189# sweep_lease_ttl_minutes: 60 # single-writer lease staleness threshold
190# sweep_shared_branch: false # true: push-gated lease for shared-docs-branch topology
192# --- Compound Packs ---
194# Prescriptive domain knowledge folders that planning reads and cites.
195# Declared, never scanned: an entry names a source (repo-relative path,
196# ~/absolute path, or git URL) and what to install from it. Lists from this
197# file and config.local.yaml concatenate -- local adds packs, never replaces
198# the team's. Git sources require ref (tag or sha reproduce exactly; a branch
199# freezes at its cached resolution and can drift across machines). path: and
200# pasted GitHub /tree/<ref>/<sub> URLs scope a source to a subfolder.
201# pack: picks one id or a list; omit it to install everything the source
202# publishes. id: renames a single-pack entry.
203# Rules are top-level .md files with title + applies_when; subfolders are storage.
205# packs:
206# - source: compound-packs/local-rules # repo-relative, read live
207# - source: ~/compound-packs/kk-style # machine-local, read live
208# - source: https://github.com/org/rails-ce-pack # git, cached at ref
209# ref: v1.2.0
210# pack: [rails, inertia]