Skip to content

Commit b2cf5d6

Browse files
committed
v3.1.0: .devloop/ project-config convention
Introduce a single project-local home for devloop's per-project files: .devloop/. Fixes config discovery under a plugin install (skills live in a read-only shared cache where a PROJECT.md beside SKILL.md never resolves in the user's project) and gives trackers a stable home outside docs/. - .devloop/config.md: engineering config + operational paths (spec and tracker directories, commit conventions), read by /plan, /implement, the three review agents, and /spec (spec-directory setting). - .devloop/domain.md: pure domain knowledge, read by /spec. - .devloop/trackers/: default tracker home (was docs/). - Two-tier discovery: .devloop/<file> -> copied-in PROJECT.md template -> generic mode. - Harness-agnostic project-rules references throughout (CLAUDE.md/AGENTS.md). - validate.sh: section 18 requires each skill and review agent to name the .devloop/ home; section 17 now also rejects en dashes. - Manifests bumped to 3.1.0; Claude manifest gains repository + license.
1 parent d405e6a commit b2cf5d6

26 files changed

Lines changed: 316 additions & 284 deletions

.claude-plugin/plugin.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
{
22
"name": "devloop",
3-
"version": "3.0.0",
3+
"version": "3.1.0",
44
"description": "Spec, plan, implement, review: a test-driven development loop for AI coding agents. Three commands map to three gates, one per command (plus a convergence back-edge where /implement re-runs the plan gate): /spec (WHAT, spec validation), /plan (HOW, plan review), /implement (BUILD, conformance + adversarial red-team review).",
55
"keywords": ["tdd", "specification", "code-review", "red-team", "workflow", "quality"],
66
"homepage": "https://github.com/KashZod/devloop",
7+
"repository": "https://github.com/KashZod/devloop",
8+
"license": "Apache-2.0",
79
"author": {
810
"name": "KashZod"
911
},

.codex-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "devloop",
3-
"version": "3.0.0",
3+
"version": "3.1.0",
44
"description": "Spec, plan, implement, review: a test-driven development loop for AI coding agents. Three commands map to three gates, one per command (plus a convergence back-edge where /implement re-runs the plan gate): /spec (WHAT, spec validation), /plan (HOW, plan review), /implement (BUILD, conformance + adversarial red-team review).",
55
"author": {
66
"name": "KashZod"

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
# Working docs
1212
docs/
1313

14+
# devloop's own dev-time state (this repo dogfoods the convention it ships)
15+
.devloop/
16+
1417
# Node (if users clone into a node project)
1518
node_modules/
1619

CHANGELOG.md

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,61 @@
11
# Changelog
22

3+
## 3.1.0
4+
5+
A single project-local home for devloop's per-project files: `.devloop/`.
6+
This fixes config discovery under a plugin install (where the skills live
7+
in a read-only shared cache and a `PROJECT.md` beside `SKILL.md` never
8+
resolves in the user's project) and gives trackers a stable home outside
9+
`docs/`.
10+
11+
### Added
12+
- **`.devloop/` convention**: skills and agents read project config from
13+
`.devloop/` in the project root:
14+
- `config.md`, engineering config (build/test/lint commands, architecture
15+
rules, standards, blindspots, commit conventions, and the spec/tracker
16+
directory settings), read by `/plan`, `/implement`, `review-plan`,
17+
`review-impl`, `red-team`, and `/spec` (for the spec-directory setting).
18+
- `domain.md`, pure domain knowledge (domain context, architecture
19+
overview, domain-specific concerns, existing patterns, quality
20+
standards), read by `/spec`.
21+
- `trackers/`, home for `impl-tracker-<feature>.json`, written by `/plan`.
22+
- **Two-tier discovery**: each skill and agent resolves config as
23+
`.devloop/<file>` in the project, then the copied-in `PROJECT.md` template
24+
that ships with the skills, then generic mode. This is why a plugin install
25+
now works: the read-only cache holds the skills, but they read `.devloop/`
26+
from the project.
27+
- **`validate.sh` section 18**: fails if a core file reintroduces the
28+
plugin-cache config pointer ("plugin's skill directory") and requires each
29+
skill and review agent to name the `.devloop/` home.
30+
- **`validate.sh` section 17** now also rejects en dashes (not just em
31+
dashes), closing a gap in the standard-punctuation guard.
32+
33+
### Changed
34+
- **Config ownership**: `config.md` owns the operational paths (spec
35+
directory, tracker directory) alongside the engineering settings;
36+
`domain.md` is now purely domain knowledge. Commit conventions live only
37+
in `config.md` (read by the skills that commit). `/spec` reads its output
38+
path from `config.md` and its domain context from `domain.md`.
39+
- **Tracker home**: `/plan` writes trackers to `.devloop/trackers/` by
40+
default (was `docs/`); `/implement`, `review-plan`, and `review-impl`
41+
look there.
42+
- **Example configs** now label their destination: the
43+
`implement/project-configs/` examples are headed as `.devloop/config.md`
44+
examples, the `spec/project-configs/` examples as `.devloop/domain.md`
45+
examples (the directory names are unchanged).
46+
47+
### Migration
48+
- **Move in-flight trackers.** Trackers previously written under `docs/`
49+
now live in `.devloop/trackers/`, and this release drops the `docs/`
50+
read-fallback. Move any existing `docs/impl-tracker-*.json` into
51+
`.devloop/trackers/`, or pass an explicit tracker path when invoking
52+
`/implement` or the review agents.
53+
- **Split an old `PROJECT.md`.** If you relied on a copied-in `PROJECT.md`,
54+
split it into `.devloop/config.md` (engineering settings and paths) and
55+
`.devloop/domain.md` (domain knowledge). The copied-in `PROJECT.md`
56+
templates still work as the fallback, but `.devloop/` takes precedence and
57+
is what a plugin install reads.
58+
359
## 3.0.0
460

561
Three-command split, a harness-agnostic rewrite, and a de-overlapped

README.md

Lines changed: 62 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,10 @@ red-team Independent agent hunts bugs + cleanups in the diff
2828
via the review-plan agent in-session, then resumes
2929
```
3030

31-
Three commands map to three gates, one gate per command: `/spec` (WHAT,
32-
spec validation), `/plan` (HOW, plan review), `/implement` (BUILD,
33-
conformance + red-team review). The one exception is the convergence
34-
back-edge below, where `/implement` re-runs the plan-review gate
35-
in-session. The three review agents run in isolated context, they didn't
36-
write the plan or code, so they evaluate honestly.
31+
Three commands, three gates, one per command: `/spec` (WHAT), `/plan`
32+
(HOW), `/implement` (BUILD). The review agents run in a context that did
33+
not write the plan or code, so their verdict is independent, not the author
34+
grading itself.
3735

3836
## Why not just prompt the AI?
3937

@@ -54,18 +52,14 @@ everything *around* the code:
5452
- **Prompts do not compose or persist.** They live in your head and drift
5553
from run to run and project to project.
5654

57-
devloop exists to close exactly these gaps: it separates WHAT / HOW /
58-
BUILD into three gated steps, runs review in a context that did not write
59-
the code, persists a tracker so work survives resets, makes every gate an
55+
devloop closes these gaps: it separates WHAT / HOW / BUILD into three
56+
gated steps, runs review in a context that did not write the code,
57+
persists a tracker so work survives resets, makes every gate an
6058
evidence-backed hard-stop, and ships as a versioned artifact that behaves
61-
the same across projects and harnesses. The next section is how each piece
62-
pays off; [How the loop works](#how-the-loop-works) is the mechanics.
59+
the same across projects and harnesses.
6360

64-
## Why This Workflow
61+
## What the review layer adds
6562

66-
- **The reviewer didn't write the code.** Review agents spawn in a
67-
fresh context, separate from the author, so author-evaluator bias is
68-
cut by the setup, not just by asking the reviewer to be objective.
6963
- **Design bugs are caught before coding starts.** An 8-point plan
7064
review runs before any code is written. Fixing a wrong abstraction
7165
in a plan costs minutes; in code, hours.
@@ -83,8 +77,6 @@ pays off; [How the loop works](#how-the-loop-works) is the mechanics.
8377
under-report), then runs a verify pass that keeps only
8478
CONFIRMED/PLAUSIBLE findings and drops the rest, trading a noisier
8579
find phase for higher recall without shipping the false positives.
86-
- **Work survives context resets.** A JSON tracker tells a new session
87-
exactly where to pick up.
8880

8981
## How the loop works
9082

@@ -106,8 +98,8 @@ agent would tie the loop to a single harness.
10698

10799
The gates depend on spawning those agents. On a harness with no subagent
108100
capability at all, each gate degrades to an in-context self-check and
109-
loses the author-evaluator isolation that is the point, the skills say so
110-
at each gate rather than pretending the guarantee still holds.
101+
loses the author-evaluator isolation; the skills say so at each gate
102+
rather than pretending the guarantee still holds.
111103

112104
## What's Included
113105

@@ -134,9 +126,10 @@ in a fresh context and runs a two-family review:
134126
- **Correctness** (5 angles): line-by-line diff scan, removed-behavior
135127
auditor, cross-file caller/callee tracer, language-pitfall
136128
specialist, wrapper/proxy correctness.
137-
- **Cleanup** (4 angles): reuse, simplification, efficiency, altitude
138-
, plus a conventions angle that reads the project's own `CLAUDE.md` /
139-
`PROJECT.md` at runtime and only flags rules it can quote.
129+
- **Cleanup** (4 angles): reuse, simplification, efficiency, altitude,
130+
plus a conventions angle that reads the project's own rules file
131+
(`CLAUDE.md`/`AGENTS.md`) and `.devloop/config.md` at runtime and only
132+
flags rules it can quote.
140133

141134
It then **verifies** each candidate (recall-biased: PLAUSIBLE by
142135
default, REFUTED only when the code proves it) and **sweeps** once more
@@ -155,10 +148,6 @@ Use the red-team agent in mode: both to review the changed files
155148
Use the red-team agent in mode: cleanup to tidy the changed files
156149
```
157150

158-
`red-team` reads no project assumptions of its own, it discovers
159-
standards from the project's `CLAUDE.md` / `PROJECT.md` each run, so
160-
the same agent works across projects.
161-
162151
## Install
163152

164153
**Claude Code.** Copy `skills/` and `agents/` into your project's
@@ -174,27 +163,42 @@ ride along as prompt files: the skills spawn them as subagents where the
174163
harness supports delegation, and otherwise degrade to the in-context
175164
self-check the gates already document.
176165

177-
Then give the loop project context. There are **two** `PROJECT.md`
178-
templates:
166+
Then give the loop project context in a `.devloop/` directory at your
167+
project root:
179168

180-
- `skills/implement/PROJECT.md`, the engineering config, build/test/lint
181-
commands, architecture rules, standards, and blindspots. Read by
182-
`/plan`, `/implement`, `review-plan`, `review-impl`, and `red-team`.
183-
`/plan` and `/implement` share this one config; there is no separate
184-
plan config.
185-
- `skills/spec/PROJECT.md`, domain context, architecture overview, and
186-
domain-specific concerns. Read by `/spec`.
169+
```
170+
.devloop/
171+
config.md # engineering: build/test/lint, architecture, standards,
172+
# blindspots, commit conventions, and the spec/tracker
173+
# directory settings. Read by /plan, /implement,
174+
# review-plan, review-impl, red-team, and /spec (which
175+
# reads the spec-directory setting from here).
176+
domain.md # domain context, architecture overview, domain-specific
177+
# concerns. Read by /spec.
178+
trackers/ # impl-tracker-<feature>.json, written by /plan
179+
```
187180

188-
Fill in both (each is a template of `YOUR_*_HERE` placeholders). The
189-
fastest start is to copy the closest example from
181+
Each skill and agent resolves its config in this order: `.devloop/<file>`
182+
in your project first, then the copied-in `PROJECT.md` template, then
183+
generic mode if neither exists (the loop still runs, with less
184+
project-specific insight). The `PROJECT.md` template is the fallback only
185+
when devloop is copied into your project rather than installed as a plugin;
186+
the engineering config ships as the implement skill's `PROJECT.md`, the
187+
domain config as the spec skill's. This is why a plugin install works: the
188+
skills live in a read-only cache, but they read `.devloop/` from your
189+
project, not the cache.
190+
191+
The fastest start is to copy the closest example to `.devloop/config.md`
192+
from
190193
[`skills/implement/project-configs/`](skills/implement/project-configs/)
191-
and [`skills/spec/project-configs/`](skills/spec/project-configs/),
192-
ready-made configs for Node/TypeScript, Python, Rust, and
193-
Android/Kotlin. Both skills run fine with no `PROJECT.md` (generic
194-
defaults apply), just with less project-specific insight.
194+
and to `.devloop/domain.md` from
195+
[`skills/spec/project-configs/`](skills/spec/project-configs/),
196+
ready-made configs for Node/TypeScript, Python, Rust, and Android/Kotlin.
197+
Each is a template of `YOUR_*_HERE` placeholders; fill them in.
195198

196-
**Installing as a plugin?** Your filled-in `PROJECT.md` belongs in your
197-
own project, not in the read-only plugin directory.
199+
**Commit `config.md` and `domain.md`** so the whole team shares one
200+
context. `.devloop/trackers/` holds in-progress work; commit it for
201+
cross-machine resumability or gitignore it, your call.
198202

199203
## Optional: proof that the check actually ran (rung)
200204

@@ -206,10 +210,9 @@ that last gap: it records whether a check drove the real surface (not just
206210
an isolated test or a reading of the code) and whether an independent
207211
context ran it, then gates on that record deterministically.
208212

209-
It maps cleanly onto devloop. rung's author-vs-independent context is the
210-
same author-evaluator split the review agents enforce, and its rung-level
211-
(drove the real surface vs isolated test) hardens the TDD green step into
212-
a re-checkable artifact instead of a self-report.
213+
rung's author-vs-independent split is the same one devloop's review agents
214+
enforce, and its check-level record hardens the TDD green step into a
215+
re-checkable artifact instead of a self-report.
213216

214217
This is optional and unbundled by design. devloop ships only markdown and
215218
a bash validator, with no runtime dependencies; rung is a separate
@@ -218,6 +221,18 @@ regression run in `rung run --rung 1` and gate CI on `rung gate`
218221
(exit `0` is the only pass). Keep it out of the core loop unless you want
219222
CI-enforceable proof that the checks were real.
220223

224+
## Related Work
225+
226+
[GitHub Spec Kit](https://github.com/github/spec-kit) is a spec-driven
227+
development toolkit in the same space, with a comparable specify -> plan ->
228+
tasks -> implement flow across several coding agents. devloop's `/spec ->
229+
/plan -> /implement` shape covers similar ground; where it differs is the
230+
review layer: three independent agents (`review-plan`, `review-impl`,
231+
`red-team`) run in author-isolated context as hard gates between the
232+
phases, and the loop is TDD-first with a JSON tracker that survives context
233+
resets. For the broader spec-driven tooling ecosystem, start with Spec Kit;
234+
for the gated, review-heavy loop, devloop is narrower by design.
235+
221236
## License
222237

223238
Apache-2.0. See [LICENSE](LICENSE).

agents/red-team.md

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -168,12 +168,13 @@ special cases.
168168

169169
### Conventions angle (all modes, run when project rules exist)
170170

171-
Find the guidance files that govern the changed code: the repo-root
172-
`CLAUDE.md`, plus any `CLAUDE.md`/`CLAUDE.local.md` in a directory that is an
173-
ancestor of a changed file (a directory's `CLAUDE.md` applies only to files
174-
at or below it), plus `PROJECT.md` in this plugin's skill directory if the
175-
task points at one. Read each that exists, then check the diff for clear
176-
violations of the rules they state.
171+
Find the guidance files that govern the changed code: the repo-root project
172+
rules file (`CLAUDE.md` or `AGENTS.md`), plus any such file (including local
173+
overrides) in a directory that is an ancestor of a changed file (it applies
174+
only to files at or below it), plus `.devloop/config.md` in the project root (or the
175+
copied-in `PROJECT.md` engineering template shipped with the implement skill,
176+
when devloop is copied in rather than installed as a plugin). Read each that
177+
exists, then check the diff for clear violations of the rules they state.
177178

178179
Only flag a violation when you can quote the exact rule and the exact line
179180
that breaks it, no style preferences, no vague "spirit of the doc"
@@ -182,7 +183,7 @@ governing file applies, return nothing for this angle.
182183

183184
**This is where project-specific standards enter, at runtime, from the
184185
project's own files.** Do not carry project assumptions into this agent;
185-
read `CLAUDE.md`/`PROJECT.md` fresh each run and let them define what a
186+
read the project rules file (`CLAUDE.md`/`AGENTS.md`) and `.devloop/config.md` fresh each run and let them define what a
186187
violation is (architecture layers, test-double policy, forbidden vocabulary,
187188
i18n rules, whatever the project states).
188189

@@ -242,7 +243,7 @@ empty sweep, do not pad.
242243

243244
### `bugs` / `both` mode, report findings
244245

245-
Report the surviving findings (CONFIRMED + PLAUSIBLE from Phases 23), ranked
246+
Report the surviving findings (CONFIRMED + PLAUSIBLE from Phases 2-3), ranked
246247
most-severe first, correctness before cleanup. For each:
247248

248249
```

agents/review-impl.md

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ effort: high
1111
You are an independent conformance reviewer. Your job is to verify that
1212
the implementation matches the plan, every acceptance criterion is met
1313
and proven by a test, and no regressions were introduced. You did NOT
14-
write this code, you are reviewing someone else's work. Be thorough,
15-
specific, and honest.
14+
write this code, you are reviewing someone else's work.
1615

1716
## Division of Labor (read this first)
1817

@@ -24,8 +23,8 @@ with the `red-team` agent, which is the **correctness gate**.
2423

2524
- adversarial correctness bug hunting (inputs, state, timing, platform)
2625
- robustness and blindspot hunting (edge cases, resource cleanup, races)
27-
- standards and architecture violations (when no `PROJECT.md`/`CLAUDE.md`
28-
exists, `red-team`'s conventions angle has nothing to quote, so
26+
- standards and architecture violations (when no `.devloop/config.md` or
27+
project rules file exists, `red-team`'s conventions angle has nothing to quote, so
2928
`/implement` Phase 3 covers these with a self-check, they are not
3029
silently dropped)
3130
- dead code, reuse, simplification, efficiency, altitude cleanup
@@ -44,8 +43,9 @@ You will receive:
4443
- The **project root** (for reading implementation and tests)
4544
- Optionally, a list of **changed files** or a git diff range
4645

47-
If no plan path is given, look for the most recent
48-
`impl-tracker-*.json` in `docs/`. If no changed files are given, derive
46+
If no plan path is given, look for the most recent `impl-tracker-*.json` in
47+
the tracker directory (the tracker-directory setting in `.devloop/config.md`,
48+
default `.devloop/trackers/`). If no changed files are given, derive
4949
them from the tracker's `files_create` and `files_modify` arrays across
5050
all chunks.
5151

@@ -55,9 +55,9 @@ all chunks.
5555

5656
Read these files (skip any that don't exist):
5757
- The plan/tracker document
58-
- `CLAUDE.md` (project rules and architecture)
59-
- The project's engineering `PROJECT.md` (build commands, standards)
60-
- The spec the tracker names in `spec_doc` (or, if absent, any spec in the configured spec directory: `PROJECT.md`, default `docs/specs/`)
58+
- The project rules file, `CLAUDE.md` or `AGENTS.md` (project rules and architecture)
59+
- The project's engineering config `.devloop/config.md` (build commands, standards; the copied-in `PROJECT.md` engineering template shipped with the implement skill is the fallback)
60+
- The spec the tracker names in `spec_doc` (or, if absent, any spec in the configured spec directory: the spec-directory setting in `.devloop/config.md`, default `docs/specs/`)
6161

6262
### Step 2: Build the Review Map
6363

@@ -163,8 +163,8 @@ is misapplied, FAIL this criterion and recommend extracting the holder.
163163
Did the implementation break existing functionality, and does it build?
164164

165165
**How to check:**
166-
- Run the full test suite (see `PROJECT.md` for command)
167-
- Run the build/compile command (see `PROJECT.md` for command)
166+
- Run the full test suite (see `.devloop/config.md` for command)
167+
- Run the build/compile command (see `.devloop/config.md` for command)
168168
- Compare test count to before (check git log for prior test counts if available)
169169
- Note new warnings in build output
170170

@@ -253,7 +253,7 @@ WARN, not FAIL, unless the plan's `tdd` promised a test for them.
253253
## Rules
254254

255255
- **Run the tests.** Don't just read them, execute the project's test
256-
and build commands (see `PROJECT.md`). Report actual results, not assumptions.
256+
and build commands (see `.devloop/config.md`). Report actual results, not assumptions.
257257
- **Read the actual code.** Don't trust the plan's description of what
258258
was implemented. Read every file in the tracker's file lists.
259259
- **Quote your evidence.** Every criterion state and every WARN/FAIL

0 commit comments

Comments
 (0)