Skip to content

Commit 6035c3b

Browse files
committed
merge: v2.6.2 — stop committing machine-local capability into compound-v.json
2 parents 597594f + 2f6a753 commit 6035c3b

6 files changed

Lines changed: 116 additions & 15 deletions

File tree

.claude-plugin/marketplace.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
{
1010
"name": "superpowers-v",
1111
"description": "Compound V for Superpowers: triple parallel pre-flight (code archaeology + domain-expert + Context7 library validator), disjoint partitioning, manifest-driven multi-backend dispatch (Claude + Codex + Antigravity + Cursor), git-diff scope enforcement, crash-resumable runs, adaptive tier-based routing, epic mode, V-memory local-first semantic+lexical recall over docs/superpowers (opt-in pure-python embeddings + a deterministic recall→action bridge), and batched parallel dispatch (Opus default, narrow Sonnet exception)",
12-
"version": "2.6.1",
12+
"version": "2.6.2",
1313
"source": "./",
1414
"author": {
1515
"name": "Oleg",

.claude-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "superpowers-v",
33
"description": "Compound V for Superpowers: triple parallel pre-flight (code archaeology + domain-expert advisor + library/doc validator via Context7), disjoint file partitioning, manifest-driven multi-backend dispatch (Claude + headless Codex + Antigravity + Cursor workers), git-diff scope enforcement, crash-resumable runs, adaptive tier-based routing, epic mode for multi-feature builds, V-memory local-first semantic+lexical recall over docs/superpowers (opt-in pure-python embeddings + a deterministic recall\u2192action bridge), and batched parallel dispatch (Opus default, Sonnet for narrow junior-task carve-out), plus /v:onboard — a project-onboarding command that builds a citation-verified knowledge base + AGENTS.md/CLAUDE.md bridge behind a human gate. Auto-intercepts brainstorming \u2192 writing-plans \u2192 execution transitions.",
4-
"version": "2.6.1",
4+
"version": "2.6.2",
55
"author": {
66
"name": "Oleg",
77
"email": "copeus@gmail.com"

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,15 @@ All notable changes to **superpowers-v (Compound V)** are documented here.
44

55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project uses semantic versioning.
66

7+
## [2.6.2] — 2026-07-06
8+
9+
### Fixed — `.claude/compound-v.json` no longer commits machine-local capability
10+
11+
- **Closed a real downstream-repo review comment:** a teammate flagged the committed `.claude/compound-v.json` as looking like it should be gitignored. The diagnosis: the file mixed genuine team **policy** (`stance`, `models`, `memory`, `epic`, `review`, `workflows_accelerator` — correct to commit) with a **machine-local capability snapshot** (`backends`, `checked_at` — "which CLI/MCP tools were detected on the machine that last ran `/v:init`") — a fact about one developer's machine, wrong the moment a teammate with a different local setup opens the file.
12+
- **The fix removes `backends`/`checked_at` from the committed file — no new file needed.** A correct, already-uncommitted home for exactly this data already existed: `~/.claude/compound-v-capabilities.json` (`/v:init` Step 4b, user-home-scoped, already documented as "reused across repos"). `backends` was pure redundancy with it.
13+
- **Audited before touching anything:** `compound-v-resolve-model.py`'s `load_config_models()` reads only the `models` key; a full-repo grep found **zero** programmatic readers of `backends`/`checked_at` — actual backend availability is already re-probed live at dispatch time (the env-aware codex→claude fallback). So this is a hygiene/trust fix, not a routing-behavior change — nothing about dispatch logic changed. **Backward-compatible**: an existing committed file with the old fields is simply ignored, no migration needed.
14+
- `commands/v-init.md` Step 4a and `commands/v-models.md` Step 3 updated (write path + example JSON + an explicit "why" note at the canonical source). **Codex cross-model verification: ACCURATE** — independently confirmed `load_config_models()` reads only `models`, zero remaining `backends` references anywhere in the repo, the sole remaining `checked_at` is correctly inside the Step 4b capability-cache shape, and the Step 4b cache fully covers the old capability role.
15+
716
## [2.6.1] — 2026-07-06
817

918
### Fixed — worktree git-base fixes are the caller's job, never the worker's

commands/v-init.md

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -261,11 +261,17 @@ Write **both**. Create parent dirs as needed.
261261

262262
### 4a. Project stance → `.claude/compound-v.json` (project-local; committed in YOUR project, never in the plugin repo)
263263

264+
**Committed team POLICY only — never machine-local capability.** This file is shared across every
265+
developer's checkout, so it must never claim something that's only true of the machine that ran
266+
`/v:init` (e.g. "Codex is available" when a teammate's machine doesn't have it installed) — that
267+
data already has a correct, uncommitted home: the Step 4b user-level capability cache below. Do not
268+
add a `backends` or `checked_at` field here; they were removed in v2.6.2 for exactly this reason
269+
(a real downstream repo review flagged the committed file as looking like machine-local state — it
270+
was, in those two fields).
271+
264272
```json
265273
{
266274
"stance": "balanced",
267-
"backends": ["claude", "codex"],
268-
"checked_at": "<YYYY-MM-DD>",
269275
"memory": { "embeddings": false, "auto_recall": true, "auto_tighten": false },
270276
"epic": { "max_features": 1 },
271277
"review": { "cross_model": false },
@@ -291,13 +297,6 @@ identically to `balanced`. Only `cost-aware.claude.standard` differs: `sonnet`,
291297
`opus`; `cost-aware.claude.deep` stays `opus`.)
292298

293299
- `stance` = the stance chosen in Step 3.
294-
- `backends` = the usable set: always includes `"claude"`; add `"codex"` if Codex is
295-
usable, add `"antigravity"` if `agy` is installed (Step 1a-bis), add `"cursor"` if
296-
`cursor-agent` is installed **and authenticated** (Step 1a-ter). E.g. `["claude","codex"]`
297-
or `["claude","codex","antigravity","cursor"]`. Antigravity and Cursor are the lower-trust
298-
opt-in backends (no kernel sandbox); list each only when its CLI is present (Cursor also
299-
requires auth).
300-
- `checked_at` = today's date.
301300
- If the user opted into the Workflows accelerator, also include
302301
`"workflows_accelerator": true` (omit otherwise — default OFF).
303302
- **`memory.embeddings`** = the Step 3b lane choice (default `false` = FTS5-only). When `true`,

commands/v-models.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -179,10 +179,13 @@ Guardrails on every assignment:
179179
## Step 3 — Write the map into `.claude/compound-v.json`
180180

181181
Merge the confirmed assignments into the config's `models` block. **Preserve every
182-
other key** in the file (`stance`, `backends`, `checked_at`, `workflows_accelerator`,
182+
other key** in the file (`stance`, `memory`, `epic`, `review`, `workflows_accelerator`,
183183
…) and any backend block you did not refresh this run. Create the file (and parent
184184
dir) if absent, seeding the non-`models` keys from `/v:init` conventions if they
185-
aren't there yet.
185+
aren't there yet. **Never write `backends` or `checked_at`** — machine-local
186+
capability lives in `~/.claude/compound-v-capabilities.json`, not in this committed
187+
file (v2.6.2). If an older file already has those two keys (pre-2.6.2), leave them
188+
untouched — they're inert, no migration needed.
186189

187190
Resulting shape (only `models` is this command's responsibility) — write the
188191
**per-stance** shape, refreshing each backend's row inside every stance block (only
@@ -191,8 +194,6 @@ Resulting shape (only `models` is this command's responsibility) — write the
191194
```jsonc
192195
{
193196
"stance": "", // preserved
194-
"backends": [""], // preserved
195-
"checked_at": "", // preserved
196197
"models": {
197198
"balanced": {
198199
"claude": { "deep": "opus", "standard": "opus", "light": "sonnet" },
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
# Stop committing machine-local capability into `.claude/compound-v.json` (design, v2.6.2)
2+
3+
**Status:** approved for build (2026-07-06). Triggered by a real downstream-repo PR review comment
4+
(a teammate flagged `.claude/compound-v.json` — 109 new lines — as "should be in exclusions").
5+
6+
## 1. What it is
7+
`.claude/compound-v.json` (written by `/v:init` Step 4a, refreshed by `/v:models` Step 3) currently
8+
mixes two unrelated kinds of data in one **committed** file: genuine team/project **policy**
9+
(`stance`, `models`, `memory`, `epic`, `review`, `workflows_accelerator`) and a **machine-local
10+
capability snapshot** (`backends`, `checked_at` — "which CLI/MCP tools were detected on the machine
11+
that last ran `/v:init`"). The fix: **stop writing `backends`/`checked_at` into the committed
12+
file.** No new file is needed — a correct, already-uncommitted home for exactly this data already
13+
exists: `~/.claude/compound-v-capabilities.json` (`/v:init` Step 4b, user-home-scoped, "reused
14+
across repos"). `backends` was pure redundancy with it.
15+
16+
## 2. Why
17+
`backends` is written as *"add `codex` if Codex is usable... add `cursor` if `cursor-agent` is
18+
installed **and authenticated**"* — a fact about **the machine that ran `/v:init`**, not a team
19+
decision. Committing it means every other developer's checkout claims their teammate's local tool
20+
availability as if it were their own — wrong the moment a second developer (with a different local
21+
setup) opens the file. This is precisely what the reviewer flagged.
22+
23+
**It is also not load-bearing today** — audited via full-repo grep before writing this spec:
24+
`compound-v-resolve-model.py`'s `load_config_models()` reads only the `models` key; no script or
25+
skill prose reads `backends`/`checked_at` back out of `.claude/compound-v.json` programmatically.
26+
Actual backend availability is already re-probed live at dispatch/orchestrate time (the "env-aware"
27+
codex→claude fallback in `routing-policy.md`, invoked "at runtime, not only at `/v:init`") and by
28+
the Step 4b capability cache. So this is a hygiene/trust fix (stop the file lying to teammates), not
29+
a routing-behavior fix — nothing about actual dispatch logic changes.
30+
31+
## 3. The split (final — after the audit, simpler than a new file)
32+
33+
| Field | Home | Committed? |
34+
|---|---|---|
35+
| `stance`, `models`, `memory`, `epic`, `review`, `workflows_accelerator` | `.claude/compound-v.json` (unchanged) | ✅ yes — team policy |
36+
| Backend/tool availability (`codex`, `antigravity`, `cursor`, `context7`, `workflows`) | `~/.claude/compound-v-capabilities.json` (**already exists**, Step 4b, user-home) | ❌ no — already outside any repo |
37+
| ~~`backends`~~, ~~`checked_at`~~ | **removed** from `.claude/compound-v.json` ||
38+
39+
No new file, no new read path, no resolver/dispatcher/memory code changes — the two fields being
40+
removed have zero programmatic readers today (confirmed by audit). This is a **documentation +
41+
write-path** change only.
42+
43+
## 4. Components
44+
45+
### 4.1 `commands/v-init.md` Step 4a
46+
Drop `backends` and `checked_at` from the written JSON example and the field-by-field write
47+
instructions. Add one clarifying sentence: this file is committed team **policy** only; machine
48+
capability already lives in the Step 4b user-level cache and must never be duplicated here.
49+
50+
### 4.2 `commands/v-models.md` Step 3
51+
Drop `backends`/`checked_at` from the "preserve every other key" list (nothing seeds or reads them
52+
going forward). **Backward-compat:** if an existing project's file already has these keys (written
53+
by a pre-2.6.2 `/v:init`), `/v:models` does not need to actively strip them — they're inert. No
54+
migration tooling; a user who wants a clean file re-runs `/v:init`, or edits the two keys out by
55+
hand. (No over-engineering: don't build a migration script for two dead JSON keys.)
56+
57+
### 4.3 Every other doc showing the full example JSON
58+
`skills/compound-v/routing-policy.md`, `skills/compound-v/execution-manifest.md`, and any other
59+
doc that reproduces the `.claude/compound-v.json` example shape gets the same trim, so there is
60+
exactly one place a reader learns the shape and it's consistent everywhere.
61+
62+
### 4.4 Explicit "why" note, once, at the canonical source
63+
`v-init.md` Step 4a (the canonical place the file is first written) states the committed/uncommitted
64+
split explicitly and *why* — this is the paragraph a future contributor (or a `git blame`-curious
65+
teammate) reads to understand the reasoning, so it doesn't need re-litigating per downstream repo.
66+
67+
## 5. Invariants
68+
1. **`.claude/compound-v.json` (committed) never records what's true only of one machine.**
69+
2. **No duplication** — machine capability has exactly one home (`~/.claude/compound-v-capabilities.json`).
70+
3. **No functional/runtime behavior changes**`models` resolution, `memory`/`epic`/`review` reads,
71+
and the live env-aware backend fallback are all unaffected (none of them read `backends`/`checked_at`).
72+
4. **Backward-compatible** — an existing committed file with the old fields still works (they're
73+
simply ignored by everything, as they are today); no migration required to upgrade.
74+
75+
## 6. Verification
76+
- Grep-based check: after the doc edits, no doc's *written* example (the JSON blocks presented as
77+
"what `/v:init`/`/v:models` writes") contains `backends`/`checked_at` inside `.claude/compound-v.json`'s
78+
shape.
79+
- Re-confirm the audit finding holds after edits: `load_config_models()` and every other reader are
80+
unaffected (they were never touched).
81+
- Codex cross-model verification: does the doc consistently point machine-capability data at the
82+
Step 4b cache everywhere, with no leftover reference implying `backends` is still needed/read?
83+
- Full existing regression (`compound-v-resolve-model.py --selftest`, `compound-v-memory.py --selftest`,
84+
frontmatter lint, CI version lockstep) stays green — expected, since no code changed.
85+
86+
## 7. Out of scope
87+
- An automated migration/cleanup tool for existing committed files with the old fields.
88+
- Any change to the Step 4b capability-cache format (it's already correct).
89+
- Any change to live routing/fallback behavior (unaffected by this fix).
90+
91+
## 8. Version
92+
**v2.6.2** (patch — docs/write-path only; `plugin.json` + `marketplace.json` in lockstep).

0 commit comments

Comments
 (0)