@open-agent-toolkit/cli 0.3.8 → 0.3.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/assets/agents/oat-codebase-mapper.md +3 -2
- package/assets/agents/oat-reviewer.md +5 -13
- package/assets/agents/skeptical-evaluator.md +6 -2
- package/assets/bundle-metadata.json +1 -1
- package/assets/docs/cli-utilities/backlog-lifecycle.md +3 -2
- package/assets/docs/cli-utilities/bootstrap.md +5 -2
- package/assets/docs/cli-utilities/config-and-local-state.md +13 -6
- package/assets/docs/cli-utilities/configuration.md +10 -9
- package/assets/docs/cli-utilities/tool-packs.md +60 -10
- package/assets/docs/contributing/code.md +9 -5
- package/assets/docs/provider-sync/commands.md +11 -8
- package/assets/docs/provider-sync/instruction-sync.md +241 -39
- package/assets/docs/provider-sync/scope-and-surface.md +1 -1
- package/assets/docs/reference/cli-reference.md +2 -0
- package/assets/docs/reference/oat-directory-structure.md +12 -11
- package/assets/docs/reference/troubleshooting.md +19 -4
- package/assets/docs/workflows/projects/implementation-execution.md +22 -8
- package/assets/docs/workflows/projects/lifecycle.md +4 -6
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/oat-agent-instructions-analyze/SKILL.md +4 -4
- package/assets/skills/oat-agent-instructions-analyze/references/analysis-artifact-template.md +5 -5
- package/assets/skills/oat-agent-instructions-analyze/references/docs/rules-files.md +14 -11
- package/assets/skills/oat-agent-instructions-analyze/references/quality-checklist.md +2 -2
- package/assets/skills/oat-agent-instructions-analyze/scripts/resolve-instruction-files.sh +4 -3
- package/assets/skills/oat-agent-instructions-apply/SKILL.md +3 -3
- package/assets/skills/oat-agent-instructions-apply/references/docs/rules-files.md +14 -11
- package/assets/skills/oat-doctor/SKILL.md +17 -13
- package/assets/skills/oat-project-implement/SKILL.md +2 -2
- package/assets/skills/oat-project-implement/references/completion-and-closeout.md +33 -11
- package/assets/skills/oat-project-implement/references/phase-execution.md +109 -8
- package/assets/skills/oat-project-lite/SKILL.md +23 -1
- package/assets/skills/oat-project-next/SKILL.md +3 -3
- package/assets/skills/oat-project-progress/SKILL.md +2 -2
- package/assets/templates/docs-app-mkdocs/docs/contributing.md +1 -3
- package/assets/templates/pjm-agents.md +7 -3
- package/assets/templates/state.md +2 -2
- package/dist/commands/backlog/archive.d.ts +10 -2
- package/dist/commands/backlog/archive.d.ts.map +1 -1
- package/dist/commands/backlog/archive.js +22 -6
- package/dist/commands/backlog/index.d.ts.map +1 -1
- package/dist/commands/backlog/index.js +5 -1
- package/dist/commands/backlog/rewrite-references.d.ts +41 -0
- package/dist/commands/backlog/rewrite-references.d.ts.map +1 -0
- package/dist/commands/backlog/rewrite-references.js +516 -0
- package/dist/commands/config/index.d.ts +1 -0
- package/dist/commands/config/index.d.ts.map +1 -1
- package/dist/commands/config/index.js +69 -34
- package/dist/commands/init/index.d.ts +6 -0
- package/dist/commands/init/index.d.ts.map +1 -1
- package/dist/commands/init/index.js +27 -4
- package/dist/commands/init/tools/index.d.ts +18 -1
- package/dist/commands/init/tools/index.d.ts.map +1 -1
- package/dist/commands/init/tools/index.js +84 -17
- package/dist/commands/init/tools/project-guidance.d.ts +19 -4
- package/dist/commands/init/tools/project-guidance.d.ts.map +1 -1
- package/dist/commands/init/tools/project-guidance.js +58 -15
- package/dist/commands/init/tools/workflows/index.d.ts.map +1 -1
- package/dist/commands/init/tools/workflows/index.js +5 -1
- package/dist/commands/instructions/instructions.types.d.ts +105 -4
- package/dist/commands/instructions/instructions.types.d.ts.map +1 -1
- package/dist/commands/instructions/instructions.types.js +4 -5
- package/dist/commands/instructions/instructions.utils.d.ts +161 -6
- package/dist/commands/instructions/instructions.utils.d.ts.map +1 -1
- package/dist/commands/instructions/instructions.utils.js +650 -12
- package/dist/commands/instructions/sync/sync.d.ts.map +1 -1
- package/dist/commands/instructions/sync/sync.js +256 -18
- package/dist/commands/instructions/validate/validate.d.ts.map +1 -1
- package/dist/commands/instructions/validate/validate.js +36 -8
- package/dist/commands/pjm/index.d.ts.map +1 -1
- package/dist/commands/pjm/index.js +19 -4
- package/dist/commands/pjm/init.d.ts +3 -0
- package/dist/commands/pjm/init.d.ts.map +1 -1
- package/dist/commands/pjm/init.js +23 -5
- package/dist/commands/shared/agents-md.d.ts +26 -5
- package/dist/commands/shared/agents-md.d.ts.map +1 -1
- package/dist/commands/shared/agents-md.js +182 -3
- package/dist/commands/tools/guidance/index.d.ts +15 -0
- package/dist/commands/tools/guidance/index.d.ts.map +1 -0
- package/dist/commands/tools/guidance/index.js +81 -0
- package/dist/commands/tools/index.d.ts.map +1 -1
- package/dist/commands/tools/index.js +2 -0
- package/dist/config/oat-config.d.ts +49 -3
- package/dist/config/oat-config.d.ts.map +1 -1
- package/dist/config/oat-config.js +107 -14
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resolve.js +12 -2
- package/package.json +2 -2
|
@@ -1,19 +1,22 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Instruction Sync
|
|
3
|
-
description: Project-scoped AGENTS.md and CLAUDE.md validation,
|
|
3
|
+
description: Project-scoped AGENTS.md and CLAUDE.md validation, the no-shim default, opt-in shim strategies, and Claude-only adoption.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Instruction Sync
|
|
7
7
|
|
|
8
|
-
`oat instructions ...` is the project-scoped lane for keeping canonical `AGENTS.md` files
|
|
8
|
+
`oat instructions ...` is the project-scoped lane for keeping canonical `AGENTS.md` files and any sibling `CLAUDE.md` files consistent throughout a repository tree.
|
|
9
|
+
|
|
10
|
+
By default OAT keeps **no** `CLAUDE.md` shims: Claude Code reads `AGENTS.md` itself (see [Claude Code and AGENTS.md](#claude-code-and-agentsmd)). A repository opts back into shims with `instructions.claude.shims`.
|
|
9
11
|
|
|
10
12
|
Use it when you want OAT to:
|
|
11
13
|
|
|
12
|
-
- validate nested `AGENTS.md`
|
|
13
|
-
-
|
|
14
|
+
- validate nested `AGENTS.md` files, and their `CLAUDE.md` shims when a shim strategy is configured
|
|
15
|
+
- remove the `CLAUDE.md` shims OAT created, under the default, once no `CLAUDE.md` with its own content remains, and warn about any `CLAUDE.md` that would hide `AGENTS.md` from Claude Code
|
|
16
|
+
- create or repair `CLAUDE.md` shims with a chosen strategy, when you opt in
|
|
14
17
|
- adopt Claude-only directories back into canonical `AGENTS.md`
|
|
15
18
|
|
|
16
|
-
This command group is intentionally separate from manifest-backed provider sync. It operates on repo-local instruction files, not provider view manifests.
|
|
19
|
+
This command group is intentionally separate from manifest-backed provider sync. It operates on repo-local instruction files, not provider view manifests. The shim setting affects only `oat instructions`: `oat sync` writes the same rules (including `.claude/rules`), skills, and agents under every strategy and never creates or removes a `CLAUDE.md`, and `oat instructions sync` leaves synced `.claude/rules` files alone.
|
|
17
20
|
|
|
18
21
|
## Scope
|
|
19
22
|
|
|
@@ -22,8 +25,9 @@ Instruction sync is currently project-only.
|
|
|
22
25
|
- It scans the current repository recursively.
|
|
23
26
|
- It supports nested directories all the way down the tree.
|
|
24
27
|
- It skips provider-irrelevant or local-only roots such as `.git`, `.oat`, `.worktrees`, and `node_modules`.
|
|
25
|
-
-
|
|
26
|
-
-
|
|
28
|
+
- It stops at nested git checkouts: any directory below the root that holds its own `.git` (a directory, or the gitdir file of a submodule or linked worktree such as `.claude/worktrees/<name>`) is a separate repository that its own `oat instructions` run owns. Nothing inside it is scanned, removed, or warned about.
|
|
29
|
+
- Exception: `.oat/repo/**` is scanned even though the rest of `.oat/` is skipped, so the curated `AGENTS.md` files there (repo root guidance, `pjm/`, `reference/`) are managed and validated like any other directory. The rest of `.oat/` (`templates/`, `projects/`, `sync/`) stays excluded.
|
|
30
|
+
- It skips the documentation content tree by default, and any path you add to `instructions.claude.excludes`. See [Documentation trees](#documentation-trees) below.
|
|
27
31
|
- It does not scan user-level provider roots such as `~/.claude` in this release.
|
|
28
32
|
|
|
29
33
|
## Documentation Trees
|
|
@@ -49,20 +53,25 @@ only; it does not change what instruction sync excludes.)
|
|
|
49
53
|
canonically names the docs _app_ root, and a file like
|
|
50
54
|
`apps/oat-docs/AGENTS.md` is instructions for working on the docs app rather
|
|
51
55
|
than a documentation page. When the app root has a `docs` child, only that
|
|
52
|
-
child is skipped, and the app root
|
|
53
|
-
the app root out explicitly if
|
|
56
|
+
child is skipped, and the app root is still synced (under a shim strategy it
|
|
57
|
+
keeps receiving its `CLAUDE.md` pointer). Opt the app root out explicitly if
|
|
58
|
+
you do not want it synced.
|
|
54
59
|
|
|
55
|
-
Add further paths with `
|
|
60
|
+
Add further paths with `instructions.claude.excludes`, a list of
|
|
56
61
|
repository-relative directories. Set it with
|
|
57
|
-
`oat config set
|
|
62
|
+
`oat config set instructions.claude.excludes "vendor,third_party/docs"`
|
|
58
63
|
(an empty value clears it, and `oat config unset` removes it), or write it
|
|
59
64
|
directly:
|
|
60
65
|
|
|
61
66
|
```json
|
|
62
67
|
{
|
|
63
68
|
"documentation": {
|
|
64
|
-
"root": "apps/oat-docs"
|
|
65
|
-
|
|
69
|
+
"root": "apps/oat-docs"
|
|
70
|
+
},
|
|
71
|
+
"instructions": {
|
|
72
|
+
"claude": {
|
|
73
|
+
"excludes": ["vendor", "third_party/docs"]
|
|
74
|
+
}
|
|
66
75
|
}
|
|
67
76
|
}
|
|
68
77
|
```
|
|
@@ -115,8 +124,11 @@ leaves the content root underived, and no default exclusion applies).
|
|
|
115
124
|
|
|
116
125
|
Exclusion only stops a directory from being scanned. Nothing is deleted: a
|
|
117
126
|
`CLAUDE.md` that already exists inside an excluded tree is left exactly as it
|
|
118
|
-
is
|
|
119
|
-
|
|
127
|
+
is, even under the default `none` strategy, which removes managed shims
|
|
128
|
+
everywhere else. Exclusion does not silence the
|
|
129
|
+
[leftover `CLAUDE.md` warning](#leftover-claudemd-warnings), because Claude
|
|
130
|
+
Code does not honor OAT's exclusions. When any exclusion is configured,
|
|
131
|
+
`--json` output carries three additional fields.
|
|
120
132
|
|
|
121
133
|
- `excludedPaths` lists the configured exclusions — a statement of intent, not
|
|
122
134
|
a per-directory skip log, so `.oat` appearing there does not contradict
|
|
@@ -135,8 +147,8 @@ dropped before `excludedPaths` is built, so it appears only here.
|
|
|
135
147
|
## Canonical Model
|
|
136
148
|
|
|
137
149
|
- `AGENTS.md` is canonical.
|
|
138
|
-
- `CLAUDE.md` is derived from the sibling `AGENTS.md
|
|
139
|
-
- If a directory contains only `CLAUDE.md`, OAT can adopt that file by writing canonical `AGENTS.md` content first
|
|
150
|
+
- A `CLAUDE.md` beside it is either absent (the default, strategy `none`) or a shim derived from the sibling `AGENTS.md` (strategies `pointer`, `symlink`, and `copy`).
|
|
151
|
+
- If a directory contains only `CLAUDE.md`, OAT can adopt that file by writing canonical `AGENTS.md` content first. Under a shim strategy it then regenerates `CLAUDE.md`; under `none` it removes it.
|
|
140
152
|
|
|
141
153
|
## Commands
|
|
142
154
|
|
|
@@ -146,40 +158,177 @@ Read-only validation for instruction integrity.
|
|
|
146
158
|
|
|
147
159
|
- Resolves the project root automatically.
|
|
148
160
|
- Scans nested directories for instruction pairs and Claude-only strays.
|
|
149
|
-
- Returns exit code `0` when everything is valid and `1` when drift is detected.
|
|
150
|
-
- Suggests the matching repair command, including `--strategy` when you validated with
|
|
161
|
+
- Returns exit code `0` when everything is valid and `1` when drift is detected. Leftover-`CLAUDE.md` warnings never change the exit code.
|
|
162
|
+
- Suggests the matching repair command, including `--strategy` when you validated with an explicit `--strategy`.
|
|
151
163
|
|
|
152
164
|
### `oat instructions sync`
|
|
153
165
|
|
|
154
166
|
Repair and adoption command for instruction drift.
|
|
155
167
|
|
|
156
168
|
- Mutates by default.
|
|
157
|
-
- Use `--dry-run` to preview planned actions.
|
|
158
|
-
-
|
|
159
|
-
-
|
|
169
|
+
- Use `--dry-run` to preview planned actions, including every planned removal.
|
|
170
|
+
- Under a shim strategy, use `--force` to overwrite mismatched `CLAUDE.md` files. Under `none`, `--force` has no effect: sync never deletes anything that is not an exact managed shim.
|
|
171
|
+
- Applies the effective strategy when creating, repairing, or removing `CLAUDE.md`.
|
|
160
172
|
|
|
161
|
-
|
|
173
|
+
Both commands report the effective strategy as `strategy:` in human output and as the `strategy` field under `--json`.
|
|
162
174
|
|
|
163
|
-
|
|
175
|
+
## Supported Strategies
|
|
164
176
|
|
|
165
|
-
| Strategy | Expected `CLAUDE.md` shape | Notes
|
|
166
|
-
| --------- | -------------------------------- |
|
|
167
|
-
| `
|
|
168
|
-
| `
|
|
169
|
-
| `
|
|
177
|
+
| Strategy | Expected `CLAUDE.md` shape | Notes |
|
|
178
|
+
| --------- | -------------------------------- | --------------------------------------------------------------------------------------------------- |
|
|
179
|
+
| `none` | no `CLAUDE.md` | Default. Sync removes the shims OAT created (all or nothing) and warns about any other `CLAUDE.md`. |
|
|
180
|
+
| `pointer` | file content `@AGENTS.md` | Lightweight and explicit. The default before shims became opt-in. |
|
|
181
|
+
| `symlink` | file symlink to `AGENTS.md` | Uses a same-directory relative symlink. |
|
|
182
|
+
| `copy` | hard copy of `AGENTS.md` content | Useful when symlinks are undesirable. |
|
|
170
183
|
|
|
171
184
|
Validation treats the selected file shape as part of correctness. For example, `copy` mode rejects a symlink even if the symlink resolves to identical content.
|
|
172
185
|
|
|
186
|
+
### Choosing a strategy
|
|
187
|
+
|
|
188
|
+
The effective strategy for a run is resolved in this order:
|
|
189
|
+
|
|
190
|
+
1. the `--strategy` flag, which overrides for that one run and never changes config;
|
|
191
|
+
2. `instructions.claude.shims` in `.oat/config.json`;
|
|
192
|
+
3. the built-in default, `none`.
|
|
193
|
+
|
|
194
|
+
Persist a shim strategy for the repository with:
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
oat config set instructions.claude.shims pointer
|
|
198
|
+
oat instructions sync
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
`oat config unset instructions.claude.shims` returns to the default. A value outside `none`, `pointer`, `symlink`, and `copy` is rejected with exit code `2` instead of silently falling back to the default, and `oat config set` can still repair it.
|
|
202
|
+
|
|
173
203
|
## Reported States
|
|
174
204
|
|
|
175
205
|
`oat instructions validate` and `oat instructions sync --dry-run` work from the same scan model.
|
|
176
206
|
|
|
177
|
-
| State | Meaning
|
|
178
|
-
| ------------------ |
|
|
179
|
-
| `ok` | The
|
|
180
|
-
| `missing` | `AGENTS.md` exists but sibling `CLAUDE.md` is missing.
|
|
181
|
-
| `content_mismatch` | `CLAUDE.md` exists but has the wrong shape/content, or an instruction file is unreadable/broken.
|
|
182
|
-
| `stray` | `CLAUDE.md` exists without sibling `AGENTS.md` and the Claude file is readable enough to adopt.
|
|
207
|
+
| State | Meaning |
|
|
208
|
+
| ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
209
|
+
| `ok` | The directory matches the effective strategy (under `none`: no `CLAUDE.md` beside `AGENTS.md`). |
|
|
210
|
+
| `missing` | Shim strategies only: `AGENTS.md` exists but sibling `CLAUDE.md` is missing. Under `none` a missing `CLAUDE.md` is correct, never drift. |
|
|
211
|
+
| `content_mismatch` | `CLAUDE.md` exists but has the wrong shape/content, or an instruction file is unreadable/broken. |
|
|
212
|
+
| `stray` | `CLAUDE.md` exists without sibling `AGENTS.md` and the Claude file is readable enough to adopt. |
|
|
213
|
+
| `managed_shim` | `none` only: a `CLAUDE.md` in an exact shape OAT writes. Drift; sync removes it unless [a `CLAUDE.md` with content blocks removal](#all-or-nothing). |
|
|
214
|
+
| `unmanaged` | `none` only: a `CLAUDE.md` that is not an exact managed shape (hand-written, modified, or a symlink elsewhere). Reported and kept, never deleted, and not drift. |
|
|
215
|
+
|
|
216
|
+
## Removing OAT-Managed Shims
|
|
217
|
+
|
|
218
|
+
Under `none`, a non-dry-run sync removes the `CLAUDE.md` files OAT created, so
|
|
219
|
+
the repository never sits with shims in some directories and not others (see
|
|
220
|
+
[Claude Code and AGENTS.md](#claude-code-and-agentsmd) for why that state is
|
|
221
|
+
worse than either extreme). `--dry-run` lists each planned `remove` action and
|
|
222
|
+
changes nothing.
|
|
223
|
+
|
|
224
|
+
Removal is deliberately narrow. It only ever targets a file named `CLAUDE.md`
|
|
225
|
+
whose sibling is `AGENTS.md`, inside the tree the scan walks, in one of these
|
|
226
|
+
exact shapes:
|
|
227
|
+
|
|
228
|
+
- the pointer `@AGENTS.md` followed by a newline (LF or CRLF), and nothing else;
|
|
229
|
+
- a symlink whose target names the sibling `AGENTS.md`;
|
|
230
|
+
- a byte-identical copy of the sibling `AGENTS.md`.
|
|
231
|
+
|
|
232
|
+
Everything else is kept and reported as `unmanaged`: a hand-written or edited
|
|
233
|
+
`CLAUDE.md`, a pointer with extra lines or trailing spaces, a symlink to any
|
|
234
|
+
other file, `.claude/CLAUDE.md`, and any `CLAUDE.md` that a scanned instruction
|
|
235
|
+
file in another directory links to (`pkg/AGENTS.md -> ../CLAUDE.md`), which
|
|
236
|
+
is neither removed nor adopted because that would leave the link dangling; the
|
|
237
|
+
entry names the links. A `CLAUDE.md` that the sibling
|
|
238
|
+
`AGENTS.md` resolves to (the Claude-first `ln -s CLAUDE.md AGENTS.md` layout,
|
|
239
|
+
or a hard link) holds the only copy of the instructions, so it is never
|
|
240
|
+
treated as a shim of any shape; and a copy is only ever recognized against a
|
|
241
|
+
distinct regular `AGENTS.md`. `CLAUDE.local.md` is never touched and never
|
|
242
|
+
scanned as a shim; it is reported only through the
|
|
243
|
+
[leftover warning](#leftover-claudemd-warnings). A `CLAUDE.md` inside the
|
|
244
|
+
documentation content tree, an excluded directory, or a nested git checkout is
|
|
245
|
+
never touched.
|
|
246
|
+
|
|
247
|
+
### All or nothing
|
|
248
|
+
|
|
249
|
+
A file with content never leaves a mix behind. If any `CLAUDE.md`,
|
|
250
|
+
`.claude/CLAUDE.md`, or `CLAUDE.local.md` in the repository is not one of the
|
|
251
|
+
exact shapes above — it has content of its own — sync removes **nothing**, not
|
|
252
|
+
even the managed shims.
|
|
253
|
+
A partial removal would strand directories: while that file exists, Claude
|
|
254
|
+
Code ignores `AGENTS.md` for the sessions it covers, and the removed shims were
|
|
255
|
+
what carried those directories' instructions. The check covers the whole
|
|
256
|
+
repository, including excluded and documentation trees, because Claude Code's
|
|
257
|
+
walk does not honor OAT's exclusions. A lone `CLAUDE.md` that sync will adopt
|
|
258
|
+
(no sibling `AGENTS.md`) is not counted: its content moves into a new
|
|
259
|
+
`AGENTS.md`. While another file blocks removal, that stray is still adopted
|
|
260
|
+
into `AGENTS.md`, but its `CLAUDE.md` is kept.
|
|
261
|
+
|
|
262
|
+
Exact shims do not block. An exact shim inside an `instructions.claude.excludes`
|
|
263
|
+
directory or the documentation content tree is never touched, so sync removes
|
|
264
|
+
the other shims and reports that one as a
|
|
265
|
+
[leftover](#leftover-claudemd-warnings); sessions started in its directory
|
|
266
|
+
still ignore `AGENTS.md` until you remove it.
|
|
267
|
+
|
|
268
|
+
When removal is blocked, sync reports every removal it held back as a skipped
|
|
269
|
+
action and exits `1`, and sync, `oat instructions validate`, and `oat-doctor`
|
|
270
|
+
report one finding (`code: "claude_md_blocks_shim_removal"` under `--json`,
|
|
271
|
+
with `paths` naming the files with content, `wouldRemove` naming the
|
|
272
|
+
`CLAUDE.md` files kept, and `linkedBy` mapping each file in `paths` to the
|
|
273
|
+
`AGENTS.md` links that reach it). The finding names the `CLAUDE.md` files the
|
|
274
|
+
configuration would remove, says none were removed and why, links to
|
|
275
|
+
[Claude Code and AGENTS.md](#claude-code-and-agentsmd), and names what to do
|
|
276
|
+
next:
|
|
277
|
+
|
|
278
|
+
- remove each named file, or move its content into an `AGENTS.md`, and rerun
|
|
279
|
+
`oat instructions sync`; for a file an `AGENTS.md` links to (the Claude-first
|
|
280
|
+
layout), replace each link with the file's content first, then remove the
|
|
281
|
+
file, because it holds the only copy of those instructions; or
|
|
282
|
+
- set `instructions.claude.shims` to a shim strategy (`pointer`, `symlink`, or
|
|
283
|
+
`copy`) to keep `CLAUDE.md` files.
|
|
284
|
+
|
|
285
|
+
While removal is blocked, the files in `wouldRemove` get no
|
|
286
|
+
[leftover warning](#leftover-claudemd-warnings) of their own: the finding
|
|
287
|
+
already names them, and removing one by hand would recreate the mix.
|
|
288
|
+
|
|
289
|
+
Removal also fails closed at apply time. Immediately before deleting, sync
|
|
290
|
+
re-checks the file: it must still be the same file the scan saw (same device
|
|
291
|
+
and inode, and the same symlink target), still an exact managed shape, and not
|
|
292
|
+
the target of a link from any scanned instruction file. If it was edited or
|
|
293
|
+
replaced, or a link to it appeared, in between, it is kept, byte for byte, and reported
|
|
294
|
+
as `CLAUDE.md changed since planning (...); kept`, and the command exits `1`
|
|
295
|
+
so you can rerun it.
|
|
296
|
+
|
|
297
|
+
## Leftover `CLAUDE.md` Warnings
|
|
298
|
+
|
|
299
|
+
Under `none`, after sync (and on every `validate`) OAT reports each remaining
|
|
300
|
+
`CLAUDE.md`, `.claude/CLAUDE.md`, and `CLAUDE.local.md` anywhere in the
|
|
301
|
+
repository with a warning: while that file exists, Claude Code's default
|
|
302
|
+
`agents-md` mode ignores every `AGENTS.md` in the project. For a file at the
|
|
303
|
+
root (including `.claude/CLAUDE.md` and `CLAUDE.local.md` there) that holds for
|
|
304
|
+
every session; for a file in a subdirectory it holds for sessions started in
|
|
305
|
+
that directory or below, and the warning says so. The warning names exactly
|
|
306
|
+
two ways out:
|
|
307
|
+
|
|
308
|
+
- remove the file — or, when an `AGENTS.md` links to it (the warning's
|
|
309
|
+
`linkedBy`), first replace each linking `AGENTS.md` with the file's content,
|
|
310
|
+
because the file holds the only copy of those instructions; or
|
|
311
|
+
- set `instructions.claude.shims` in `.oat/config.json` to a shim
|
|
312
|
+
strategy (`pointer`, `symlink`, or `copy`) and rerun `oat instructions sync`
|
|
313
|
+
to add shims back everywhere.
|
|
314
|
+
|
|
315
|
+
This check is a separate, read-only walk of the whole repository. It
|
|
316
|
+
deliberately ignores `documentation.root` and
|
|
317
|
+
`instructions.claude.excludes`, which only limit what OAT may
|
|
318
|
+
change, because Claude Code's own walk does not honor them. Only `.git`,
|
|
319
|
+
`node_modules`, the root `.worktrees`, and nested git checkouts are skipped.
|
|
320
|
+
|
|
321
|
+
Warnings go to stderr in human mode and to the `warnings` array under `--json`
|
|
322
|
+
(each item has `code: "claude_md_hides_agents_md"`, a repository-relative
|
|
323
|
+
`path`, `linkedBy` — the repository-relative `AGENTS.md` paths whose symlink
|
|
324
|
+
chain reaches the file, empty when there are none — and the `message`).
|
|
325
|
+
Names are matched exactly: a case variant such as `claude.md` is neither
|
|
326
|
+
reported nor ever removed, because such names are common for ordinary
|
|
327
|
+
documents (a provider page named `claude.md`, for example). On a
|
|
328
|
+
case-insensitive filesystem, rename a case-variant file yourself if Claude Code
|
|
329
|
+
treats it as `CLAUDE.md`. They never change the exit code, a dry run leaves
|
|
330
|
+
out files it is about to remove, a repository with no remaining `CLAUDE.md`
|
|
331
|
+
prints nothing, and no warning is emitted under a shim strategy.
|
|
183
332
|
|
|
184
333
|
## Claude-Only Adoption
|
|
185
334
|
|
|
@@ -187,15 +336,59 @@ When a directory contains `CLAUDE.md` but no `AGENTS.md`, sync can adopt it:
|
|
|
187
336
|
|
|
188
337
|
1. Read the existing `CLAUDE.md`
|
|
189
338
|
2. Write canonical `AGENTS.md` with that content
|
|
190
|
-
3.
|
|
339
|
+
3. Under a shim strategy, regenerate `CLAUDE.md` using that strategy. Under
|
|
340
|
+
`none`, remove the `CLAUDE.md`, so adoption never leaves a file that makes
|
|
341
|
+
Claude Code ignore `AGENTS.md` — unless another `CLAUDE.md` with content
|
|
342
|
+
[blocks removal](#all-or-nothing), in which case the adopted `CLAUDE.md` is
|
|
343
|
+
kept.
|
|
344
|
+
|
|
345
|
+
This means the original Claude instructions become canonical before the derived file is rewritten or removed.
|
|
191
346
|
|
|
192
|
-
|
|
347
|
+
Under `none` the removal is re-verified like any other: the `CLAUDE.md` must
|
|
348
|
+
still be the same file and now byte-identical to the new `AGENTS.md`. If it
|
|
349
|
+
changed during adoption, it is kept and reported as
|
|
350
|
+
`CLAUDE.md kept after adoption into AGENTS.md (...)`, and it is also named in a
|
|
351
|
+
leftover warning.
|
|
193
352
|
|
|
194
353
|
Readable Claude-only files are adoptable. Unreadable Claude-only files are not.
|
|
354
|
+
`.claude/CLAUDE.md` is Claude Code's own alternate project file, not a stray,
|
|
355
|
+
so under `none` it is never adopted.
|
|
356
|
+
|
|
357
|
+
## Claude Code and AGENTS.md
|
|
358
|
+
|
|
359
|
+
Claude Code reads `AGENTS.md` natively through its built-in `agents-md` plugin
|
|
360
|
+
(`anthropics/claude-code`, `mods/agents-md`, as of v2.1.278). Its
|
|
361
|
+
`instructionFiles` option defaults to `claude-md-or-agents-md`:
|
|
362
|
+
|
|
363
|
+
- In that default mode the plugin stands down for the **whole project** when
|
|
364
|
+
any `CLAUDE.md`, `.claude/CLAUDE.md`, or `CLAUDE.local.md` exists in any
|
|
365
|
+
directory from the project root down to the working directory; Claude Code
|
|
366
|
+
then loads only `CLAUDE.md` files. A single root `CLAUDE.md` or a personal
|
|
367
|
+
`CLAUDE.local.md` is enough to make it ignore every `AGENTS.md`, and a
|
|
368
|
+
repository with shims in some directories but not others loses every
|
|
369
|
+
`AGENTS.md` that has no shim. This is why the default removes managed shims
|
|
370
|
+
and warns about the rest.
|
|
371
|
+
- In `claude-md-and-agents-md` mode, an `AGENTS.md` that a `CLAUDE.md` already
|
|
372
|
+
imports or links is not loaded twice, so shims are harmless there.
|
|
373
|
+
- The option can be set only in user settings (`~/.claude/settings.json`),
|
|
374
|
+
with `--settings`, or in managed settings. A project's
|
|
375
|
+
`.claude/settings.json` cannot set it, so a repository cannot choose the mode
|
|
376
|
+
for its contributors.
|
|
377
|
+
|
|
378
|
+
Opt into a shim strategy when your contributors need `CLAUDE.md`:
|
|
379
|
+
|
|
380
|
+
- they run Claude Code releases from before the built-in `agents-md` plugin;
|
|
381
|
+
- they set `instructionFiles` to `claude-md`, which loads no `AGENTS.md`;
|
|
382
|
+
- the plugin's documented gaps matter to you: nested `AGENTS.md` files attach
|
|
383
|
+
only on a text file `Read` (not on `@`-mentions, IDE selections, or
|
|
384
|
+
notebook, image, or PDF reads), and `--add-dir` directories contribute no
|
|
385
|
+
`AGENTS.md`, where Claude Code's own `CLAUDE.md` loading covers those cases
|
|
386
|
+
(for `--add-dir`, only when `CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1`
|
|
387
|
+
is set).
|
|
195
388
|
|
|
196
389
|
## When `--force` Is Required
|
|
197
390
|
|
|
198
|
-
`oat instructions sync` does not overwrite a mismatched `CLAUDE.md` unless you pass `--force`.
|
|
391
|
+
Under a shim strategy, `oat instructions sync` does not overwrite a mismatched `CLAUDE.md` unless you pass `--force`.
|
|
199
392
|
|
|
200
393
|
Typical pattern:
|
|
201
394
|
|
|
@@ -223,9 +416,18 @@ In these cases, sync reports a manual-repair skip instead of guessing at destruc
|
|
|
223
416
|
|
|
224
417
|
## Example Workflow
|
|
225
418
|
|
|
226
|
-
Preview and
|
|
419
|
+
Preview and apply the default: remove OAT-managed shims and adopt Claude-only
|
|
420
|
+
strays into `AGENTS.md`:
|
|
421
|
+
|
|
422
|
+
```bash
|
|
423
|
+
oat instructions sync --dry-run
|
|
424
|
+
oat instructions sync
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
Opt the repository into pointer shims:
|
|
227
428
|
|
|
228
429
|
```bash
|
|
430
|
+
oat config set instructions.claude.shims pointer
|
|
229
431
|
oat instructions sync --dry-run
|
|
230
432
|
oat instructions sync
|
|
231
433
|
```
|
|
@@ -123,7 +123,7 @@ runtime mismatch, malformed output, and missing telemetry never authorize it.
|
|
|
123
123
|
## Non-interop namespaces in the same CLI
|
|
124
124
|
|
|
125
125
|
- `oat project new <name>` (workflow/project scaffolding)
|
|
126
|
-
- `oat instructions validate` / `oat instructions sync` (AGENTS.md
|
|
126
|
+
- `oat instructions validate` / `oat instructions sync` (AGENTS.md integrity with no CLAUDE.md shims by default, opt-in pointer, symlink, or copy shims, plus Claude-only adoption)
|
|
127
127
|
- `oat internal validate-oat-skills` (internal maintenance)
|
|
128
128
|
|
|
129
129
|
## Reference artifacts
|
|
@@ -134,6 +134,7 @@ Notable commands introduced in the current CLI surface:
|
|
|
134
134
|
`refs/oat/completed/<project>` result counts as absence. Transport,
|
|
135
135
|
authentication, and other lookup failures fail the command closed; they are
|
|
136
136
|
never converted into a `recorded-absent` row or pull guidance.
|
|
137
|
+
- `oat tools guidance` - print the managed `OAT tools` `AGENTS.md` block for the currently installed packs without installing, upgrading, or writing anything; `--json` returns `status`, `sectionKey`, `target`, `packs`, `otherProjectSkills`, and `managedBlock`. See [Tool Packs](../cli-utilities/tool-packs.md#oat-tools-guidance).
|
|
137
138
|
- `oat tools migrate --pack <pack> --from <scope> --to <scope>` - move one installed pack between project and user scope. Always previews first, installs and re-inventories the destination before touching the source, and offers source removal only after the destination is verified complete. Declining or running non-interactively leaves the pack installed at both scopes rather than failing. `--dry-run` stops after the preview; there is no force flag. See [Tool Packs](../cli-utilities/tool-packs.md#oat-tools-migrate).
|
|
138
139
|
- `oat pjm doctor --json` - read-only repository PJM diagnostics whose result carries an additive `adoption` object (`state` of `declared` | `inferred-legacy` | `partial-initialization` | `none`, `repoRoot`, and `recovery`). This, not `oat tools has project-management`, is the check that answers whether _this repository_ adopted PJM.
|
|
139
140
|
- `oat pjm remote ... --json` - operate one explicit provider-neutral binding.
|
|
@@ -165,6 +166,7 @@ Notable commands introduced in the current CLI surface:
|
|
|
165
166
|
- `oat gate target set <id> --timeout-ms <milliseconds>` - persist a validated per-target gate budget.
|
|
166
167
|
- `oat gate target list --json` - inspect resolved gate targets without selecting or executing a reviewer. Each entry reports its config origin, whether it is explicitly configured and enabled, current availability, and normalized configured invocation values (`unknown` when omitted).
|
|
167
168
|
- `oat gate cross-provider-exec <prompt...>` - choose an available exec target while avoiding the current runtime by default, then run the prompt with the chosen target's configured base command and exit with the child status.
|
|
169
|
+
- `oat instructions sync [--dry-run] [--strategy none|pointer|symlink|copy]` - apply the effective `CLAUDE.md` strategy (`--strategy`, else `instructions.claude.shims`, else `none`). Under the default `none` it removes the `CLAUDE.md` shims OAT created — none at all while any `CLAUDE.md` has content of its own — keeps and reports every other `CLAUDE.md`, and warns about any `CLAUDE.md`, `.claude/CLAUDE.md`, or `CLAUDE.local.md` that would make Claude Code ignore `AGENTS.md`. `oat instructions validate` checks the same strategy read-only. See [Instruction Sync](../provider-sync/instruction-sync.md).
|
|
168
170
|
|
|
169
171
|
## `oat config` surface flags
|
|
170
172
|
|
|
@@ -48,16 +48,16 @@ Project scope is used for project workflows and repo-local sync state. User scop
|
|
|
48
48
|
|
|
49
49
|
## Top-level entries
|
|
50
50
|
|
|
51
|
-
| Path | Purpose | Notes
|
|
52
|
-
| ------------------------ | --------------------------------------------------- |
|
|
53
|
-
| `.oat/config.json` | Shared repo runtime config for non-sync settings | Includes `worktrees.root`, `projects.root`, `git.defaultBranch`, `archive.*`, `documentation.*`, and `pjm.remote.*` |
|
|
54
|
-
| `.oat/config.local.json` | Local per-developer runtime state | Gitignored; includes `activeProject`, `lastPausedProject`, `activeIdea`
|
|
55
|
-
| `.oat/state.md` | Generated repo state dashboard | Gitignored; rebuilt with `oat state refresh` from config, project artifacts, and knowledge metadata
|
|
56
|
-
| `.oat/projects/` | OAT project artifacts | `shared`, `synced`, `local`, and lifecycle `archived` locations
|
|
57
|
-
| `.oat/ideas/` | Project-level ideas store | Often gitignored
|
|
58
|
-
| `.oat/sync/` | Interop sync state/config | See details below
|
|
59
|
-
| `.oat/templates/` | Artifact templates used by OAT skills | Source for scaffolding. Includes `docs-app-fuma/` (Fumadocs) and `docs-app-mkdocs/` (MkDocs) templates.
|
|
60
|
-
| `.oat/repo/` | Repo-level PJM/knowledge/reference/review artifacts | Active PJM state under `pjm/`; durable references (including decisions) under `reference/`
|
|
51
|
+
| Path | Purpose | Notes |
|
|
52
|
+
| ------------------------ | --------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
|
|
53
|
+
| `.oat/config.json` | Shared repo runtime config for non-sync settings | Includes `worktrees.root`, `projects.root`, `git.defaultBranch`, `archive.*`, `documentation.*`, `instructions.*`, and `pjm.remote.*` |
|
|
54
|
+
| `.oat/config.local.json` | Local per-developer runtime state | Gitignored; includes `activeProject`, `lastPausedProject`, `activeIdea` |
|
|
55
|
+
| `.oat/state.md` | Generated repo state dashboard | Gitignored; rebuilt with `oat state refresh` from config, project artifacts, and knowledge metadata |
|
|
56
|
+
| `.oat/projects/` | OAT project artifacts | `shared`, `synced`, `local`, and lifecycle `archived` locations |
|
|
57
|
+
| `.oat/ideas/` | Project-level ideas store | Often gitignored |
|
|
58
|
+
| `.oat/sync/` | Interop sync state/config | See details below |
|
|
59
|
+
| `.oat/templates/` | Artifact templates used by OAT skills | Source for scaffolding. Includes `docs-app-fuma/` (Fumadocs) and `docs-app-mkdocs/` (MkDocs) templates. |
|
|
60
|
+
| `.oat/repo/` | Repo-level PJM/knowledge/reference/review artifacts | Active PJM state under `pjm/`; durable references (including decisions) under `reference/` |
|
|
61
61
|
|
|
62
62
|
## `.oat/sync/` details
|
|
63
63
|
|
|
@@ -125,9 +125,10 @@ Current schema keys:
|
|
|
125
125
|
| `documentation.config` | `string` | - | Path to the documentation framework config file (e.g., `mkdocs.yml`, `next.config.js`) |
|
|
126
126
|
| `documentation.index` | `string` | - | Path to the docs surface entry point: the generated app-root manifest `<root>/index.md` for Fumadocs, `mkdocs.yml` for MkDocs. Set by `oat docs init`. `oat docs generate-index` writes it only for the Fumadocs manifest transition and never for MkDocs. |
|
|
127
127
|
| `documentation.excludes` | `string[]` | - | Globs, relative to the docs directory, that `oat docs generate-index` leaves out of the generated index. See [Excluding pages from the generated index](#excluding-pages-from-the-generated-index). |
|
|
128
|
-
| `documentation.instructionPointerExcludes` | `string[]` | - | Repo-relative directories `oat instructions sync`/`validate` must not treat as pointer sites, additive to the documentation content root they skip by default. Normalized and de-duplicated; a malformed value (non-array, or an empty or non-string entry) is rejected with exit code `2`. Set as one comma-separated value with `oat config set`; absolute paths and paths escaping the repository are refused. See [Instruction Sync](../provider-sync/instruction-sync.md#documentation-trees). |
|
|
129
128
|
| `documentation.requireForProjectCompletion` | `boolean` | `false` | When `true`, OAT project completion gates require documentation to be updated |
|
|
130
129
|
| `git.defaultBranch` | `string` | `"main"` | Default branch for PR creation. Auto-detected during `oat init` via `gh repo view` or `origin/HEAD`. Used by `oat-project-pr-final` and `oat-project-pr-progress`. |
|
|
130
|
+
| `instructions.claude.shims` | `string` | `"none"` | CLAUDE.md shim strategy for `oat instructions sync`/`validate`: `none` (no shims; sync removes OAT-managed ones, all or nothing: none while any `CLAUDE.md` has content; see [All or nothing](../provider-sync/instruction-sync.md#all-or-nothing)), `pointer`, `symlink`, or `copy`. `--strategy` overrides it for one run; any other value is rejected with exit code `2`. See [Instruction Sync](../provider-sync/instruction-sync.md#choosing-a-strategy). |
|
|
131
|
+
| `instructions.claude.excludes` | `string[]` | - | Repo-relative directories `oat instructions sync`/`validate` must not treat as pointer sites, additive to the documentation content root they skip by default. Normalized and de-duplicated; a malformed value (non-array, or an empty or non-string entry) is rejected with exit code `2`. Set as one comma-separated value with `oat config set`; absolute paths and paths escaping the repository are refused. See [Instruction Sync](../provider-sync/instruction-sync.md#documentation-trees). |
|
|
131
132
|
| `workflow.autoReviewAtHillCheckpoints` | `boolean` | unset | When `true`, completing a HiLL checkpoint automatically runs the extra lifecycle review. Does not control Tier 1 per-phase `oat-reviewer` gates. Can be overridden per-project via `oat_auto_review_at_hill_checkpoints` in `plan.md` frontmatter. Legacy `autoReviewAtCheckpoints` remains a fallback. |
|
|
132
133
|
| `workflow.dispatchPolicy.mode` | `string` | unset | Dispatch policy mode: `managed` lets OAT select model/effort controls; `inherit` leaves controls to the host/provider defaults. |
|
|
133
134
|
| `workflow.dispatchPolicy.policy` | `string` | unset | Managed dispatch policy: `economy`, `balanced`, `high`, `frontier`, or `uncapped`. Capped policies compile to provider targets; `uncapped` keeps OAT-managed preferred selection without provider caps. `inherit` mode is separate and leaves controls to the host/provider. |
|
|
@@ -56,12 +56,27 @@ when a same-name canonical skill exists; rename one package before retrying.
|
|
|
56
56
|
- `oat providers set --scope project --enabled <providers> --disabled <providers>`
|
|
57
57
|
- Re-run `oat sync --scope project` after updating config.
|
|
58
58
|
|
|
59
|
-
## `instructions validate` reports `missing`, `content_mismatch`, or `
|
|
59
|
+
## `instructions validate` reports `missing`, `content_mismatch`, `stray`, or `managed_shim`
|
|
60
60
|
|
|
61
|
+
- Check the effective strategy (`strategy:` in the output). The default is `none`, which expects no `CLAUDE.md`; `missing` is only reported under a configured shim strategy.
|
|
61
62
|
- Run `oat instructions sync --dry-run` to preview changes.
|
|
62
|
-
-
|
|
63
|
-
-
|
|
64
|
-
-
|
|
63
|
+
- Under `none`, `managed_shim` entries are `CLAUDE.md` files OAT created; `oat instructions sync` removes them, unless a `CLAUDE.md` with its own content blocks removal (see below).
|
|
64
|
+
- To keep shims instead, run `oat config set instructions.claude.shims pointer` (or `symlink` / `copy`) and then `oat instructions sync`.
|
|
65
|
+
- Under a shim strategy, if mismatched `CLAUDE.md` files should be overwritten, run `oat instructions sync --force`.
|
|
66
|
+
- If `stray` is reported, `oat instructions sync` will adopt the Claude-only file into `AGENTS.md`, then regenerate `CLAUDE.md` under a shim strategy or remove it under `none`.
|
|
67
|
+
|
|
68
|
+
## `instructions sync` removed no shims because a `CLAUDE.md` has content
|
|
69
|
+
|
|
70
|
+
- Under `none`, removal is all or nothing: while any `CLAUDE.md`, `.claude/CLAUDE.md`, or `CLAUDE.local.md` has content of its own, sync removes no `CLAUDE.md` at all, reports each held-back removal as skipped, and exits `1`. The finding (`claude_md_blocks_shim_removal` under `--json`) names the files with content (`paths`) and the `CLAUDE.md` files kept (`wouldRemove`); `linkedBy` names any `AGENTS.md` link to a file with content, which you replace with that file's content before removing it. `oat instructions validate` reports the same finding.
|
|
71
|
+
- Either remove each named file or move its content into an `AGENTS.md`, then rerun `oat instructions sync`; or set `instructions.claude.shims` to `pointer`, `symlink`, or `copy` to keep `CLAUDE.md` files.
|
|
72
|
+
- See [Instruction Sync](../provider-sync/instruction-sync.md#all-or-nothing).
|
|
73
|
+
|
|
74
|
+
## `instructions sync` warns that a `CLAUDE.md` makes Claude Code ignore every `AGENTS.md`
|
|
75
|
+
|
|
76
|
+
- Under the default `none` strategy, a remaining `CLAUDE.md`, `.claude/CLAUDE.md`, or `CLAUDE.local.md` makes Claude Code's `agents-md` plugin stand down: for every session when the file is at the repository root, and for sessions started in its directory or below when it is in a subdirectory.
|
|
77
|
+
- Either remove the named file, or set `instructions.claude.shims` to a shim strategy and rerun `oat instructions sync` to add shims everywhere.
|
|
78
|
+
- If the warning names an `AGENTS.md` that links to the file (`linkedBy` under `--json`), that file holds the only copy of those instructions: replace each linking `AGENTS.md` with the file's content first, then remove the file.
|
|
79
|
+
- Sync never deletes a hand-written or modified `CLAUDE.md` itself; see [Instruction Sync](../provider-sync/instruction-sync.md#leftover-claudemd-warnings).
|
|
65
80
|
- If a broken or unreadable instruction path is reported, fix the underlying file or symlink target first; sync will intentionally skip manual-repair cases instead of forcing recovery.
|
|
66
81
|
- If a directory you expected to see is missing from the scan, confirm it is not under `.git`, `.oat`, `.worktrees`, or `node_modules`.
|
|
67
82
|
- Re-run `oat instructions validate` and confirm status is `ok`.
|
|
@@ -47,8 +47,9 @@ flowchart LR
|
|
|
47
47
|
|
|
48
48
|
P --> Report["Phase report\nverification + commits"]
|
|
49
49
|
Report --> Root
|
|
50
|
-
Root -->
|
|
51
|
-
|
|
50
|
+
Root --> Ledger["Commit task ledger\npre-review bookkeeping"]
|
|
51
|
+
Ledger --> R["Independent phase reviewer"]
|
|
52
|
+
R -->|pass| Book["Review-outcome bookkeeping\n+ next phase"]
|
|
52
53
|
R -->|blocking findings| Fix["Resume phase implementer\nbounded fix scope"]
|
|
53
54
|
Fix --> R2["Fresh root-owned review round"]
|
|
54
55
|
```
|
|
@@ -241,7 +242,14 @@ already part of the next phase's base.
|
|
|
241
242
|
|
|
242
243
|
The root sends the reviewer a fresh scope containing the authoritative phase
|
|
243
244
|
commit range, task IDs and boundaries, project artifacts, and verification
|
|
244
|
-
evidence. The
|
|
245
|
+
evidence. The root commits the phase's task ledger — task rows, the resume
|
|
246
|
+
pointer, and any settled recovery marker — before it dispatches the reviewer,
|
|
247
|
+
so the reviewed head is never stale by construction. Review-outcome
|
|
248
|
+
bookkeeping — the Reviews row and its disposition, the Orchestration Run, and
|
|
249
|
+
the deferred project-log entries — is out of scope at the reviewed head: the
|
|
250
|
+
root writes it after the review returns. In a parallel group the phase worktree
|
|
251
|
+
does not carry the root ledger, so the reviewer brief names the task ledger out
|
|
252
|
+
of scope as well. The review passes with zero Critical and zero High findings.
|
|
245
253
|
Medium and Low findings are recorded without blocking the phase.
|
|
246
254
|
|
|
247
255
|
## Final Exit-Gate Boundary
|
|
@@ -278,14 +286,20 @@ contradictory, or ambiguous correlation fails closed. A valid accepted run or
|
|
|
278
286
|
completed receive is never duplicated.
|
|
279
287
|
|
|
280
288
|
Freshness is bound to the reviewed HEAD and a versioned implementation
|
|
281
|
-
fingerprint. New generations use an `effective-delta-
|
|
289
|
+
fingerprint. New generations use an `effective-delta-v2` fingerprint over
|
|
282
290
|
Git's canonical NUL-delimited raw tree delta. The generation persists the
|
|
283
291
|
logical PR/default-branch base ref, requires one merge base, and hashes full
|
|
284
292
|
base and final modes and object IDs with rename detection disabled. This makes
|
|
285
293
|
same-file base changes visible while excluding commit history and human diff
|
|
286
294
|
context. Every effective-delta path is included except the exact project
|
|
287
|
-
`state.md` file that carries the digest and would otherwise be self-referential
|
|
288
|
-
that structured state is validated independently
|
|
295
|
+
`state.md` file that carries the digest and would otherwise be self-referential
|
|
296
|
+
(that structured state is validated independently) and everything under
|
|
297
|
+
`.oat/projects/` and `.oat/repo/`: project artifacts and repository records
|
|
298
|
+
such as reviews, summaries, backlog items, and decisions never make the exit
|
|
299
|
+
gate stale. `.oat/templates/`, `.oat/scripts/`, `.oat/config*.json`, and
|
|
300
|
+
`.oat/sync/` stay fingerprinted. A stored `effective-delta-v1` value keeps its
|
|
301
|
+
original meaning (only the `state.md` carrier excluded) and is never
|
|
302
|
+
reinterpreted; the next generation after it goes stale uses v2.
|
|
289
303
|
|
|
290
304
|
Recognized closeout-only descendants preserve a valid result: gate artifacts
|
|
291
305
|
and receipts, project tracking and project-log appends,
|
|
@@ -301,8 +315,8 @@ A merge, rebase, or base update preserves the result only when its full
|
|
|
301
315
|
effective delta matches that rolling checkpoint. Conflict resolution or
|
|
302
316
|
branch-owned implementation, test, skill, template, or workflow changes that
|
|
303
317
|
alter the delta make the result stale, require a current final lifecycle review,
|
|
304
|
-
and start a new gate generation.
|
|
305
|
-
excluded from the comparison. Legacy unqualified fingerprints retain the older
|
|
318
|
+
and start a new gate generation. Beyond the version's own exclusion set, no
|
|
319
|
+
implementation or closeout output path is excluded from the comparison. Legacy unqualified fingerprints retain the older
|
|
306
320
|
fail-closed descendant-path behavior and are not migrated in place.
|
|
307
321
|
|
|
308
322
|
This narrow merge-only exemption relies on fresh repository CI, automated
|
|
@@ -158,13 +158,11 @@ filesystem operation. Deleting or archiving the old scaffold does not make the
|
|
|
158
158
|
roadmap stop promising its work, so completion checks the claim against the
|
|
159
159
|
prose that still makes it.
|
|
160
160
|
|
|
161
|
-
When a quick project consolidates earlier scaffolds,
|
|
161
|
+
When a quick or lite project consolidates earlier scaffolds, the workflow that
|
|
162
|
+
scaffolds it (`oat-project-quick-start` or `oat-project-lite`) records
|
|
162
163
|
`absorbed_projects` and `absorbed_backlog_ids` in that project's `state.md`
|
|
163
|
-
frontmatter. Those two fields are the
|
|
164
|
-
|
|
165
|
-
Recording them is a quick-mode step today. A lite project that consolidates
|
|
166
|
-
earlier scaffolds records nothing, so the sweep finds no inputs and degrades to
|
|
167
|
-
its recorded note rather than checking that project's surfaces.
|
|
164
|
+
frontmatter, with the same field shapes in both modes. Those two fields are the
|
|
165
|
+
only inputs the sweep takes.
|
|
168
166
|
|
|
169
167
|
Inside the project-log completion gate — after the log status probe and before
|
|
170
168
|
the roll-up and seal — completion searches the active planning surfaces for each
|