@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
|
@@ -5,7 +5,7 @@ disable-model-invocation: true
|
|
|
5
5
|
user-invocable: true
|
|
6
6
|
allowed-tools: Read, Write, Bash(git:*), Glob, Grep, AskUserQuestion, Task
|
|
7
7
|
metadata:
|
|
8
|
-
version: 1.12.
|
|
8
|
+
version: 1.12.4
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
# Agent Instructions Analysis
|
|
@@ -259,7 +259,7 @@ documentation inventory from Step 2 to:
|
|
|
259
259
|
**Provider-specific validation:**
|
|
260
260
|
|
|
261
261
|
- **AGENTS.md**: Check section structure, command accuracy, size budget.
|
|
262
|
-
- **CLAUDE.md**:
|
|
262
|
+
- **CLAUDE.md**: Read the shim strategy with `oat config get instructions.claude.shims`. Under a shim strategy (`pointer`, `symlink`, or `copy`), verify the `@AGENTS.md` import if present and check for content duplication with AGENTS.md. Under `none` (the default), Claude Code reads AGENTS.md itself through its built-in `agents-md` plugin, which stands down while a `CLAUDE.md`, `.claude/CLAUDE.md`, or `CLAUDE.local.md` exists on the session's path: a root file affects the whole project, a nested file affects sessions started in its directory or below; record each such file as a High finding whose fix is to remove it or to configure a shim strategy and run `oat instructions sync`. Take the authoritative list from `oat instructions validate --json` `.warnings[]` (code `claude_md_hides_agents_md`), which covers the whole repository including `CLAUDE.local.md` (exact-case names only); the discovery script also lists `CLAUDE.local.md` under the claude provider. When a warning's `linkedBy` is non-empty, that file holds the only copy of the instructions behind those AGENTS.md links: the fix is to replace each linking AGENTS.md with the file's content first and only then remove the file; never recommend plain removal for it. When `.warnings[]` also holds a `claude_md_blocks_shim_removal` item, removal under `none` is all or nothing and is blocked: report its `paths` (the files with content of their own) as the High finding, whose fix is to move each file's content into an AGENTS.md or remove it (for a file its `linkedBy` maps to AGENTS.md links, replace each linking AGENTS.md with the file's content first) and then rerun `oat instructions sync`; list its `wouldRemove` as the CLAUDE.md files that sync then removes. Those files get no `claude_md_hides_agents_md` warning of their own while the block holds, so read them from the block item rather than reporting them as missing.
|
|
263
263
|
- **Claude rules** (`.claude/rules/*.md`): Validate `paths` frontmatter if conditional.
|
|
264
264
|
- **Cursor rules** (`.cursor/rules/*.mdc`): Validate frontmatter fields (`alwaysApply`, `globs`, `description`).
|
|
265
265
|
- **Copilot instructions** (`.github/instructions/*.instructions.md`): Validate `applyTo` frontmatter.
|
|
@@ -306,7 +306,7 @@ These checks are mandatory even when the missing file does not appear in the dis
|
|
|
306
306
|
|
|
307
307
|
Provider baseline examples:
|
|
308
308
|
|
|
309
|
-
- **Claude**: if a directory has `AGENTS.md` and the claude provider is active but the matching `CLAUDE.md` shim is missing, record an explicit recommendation to create `CLAUDE.md` with the canonical `@AGENTS.md` import. This applies to **every** directory with an `AGENTS.md` — root and nested alike (e.g., `packages/cli/AGENTS.md` → `packages/cli/CLAUDE.md`).
|
|
309
|
+
- **Claude**: only when a shim strategy is configured (`instructions.claude.shims` is `pointer`, `symlink`, or `copy`): if a directory has `AGENTS.md` and the claude provider is active but the matching `CLAUDE.md` shim is missing, record an explicit recommendation to create `CLAUDE.md` with the canonical `@AGENTS.md` import. This applies to **every** directory with an `AGENTS.md` — root and nested alike (e.g., `packages/cli/AGENTS.md` → `packages/cli/CLAUDE.md`). Under `none`, the default, recommend no `CLAUDE.md`: Claude Code loads AGENTS.md natively, and a shim in some directories but not others makes it ignore the AGENTS.md files that lack one.
|
|
310
310
|
- **Copilot**: if the copilot provider is active but `.github/copilot-instructions.md` is missing, record an explicit recommendation to create the minimal Copilot shim.
|
|
311
311
|
- **agents_md / codex**: no extra always-on shim beyond `AGENTS.md`.
|
|
312
312
|
|
|
@@ -314,7 +314,7 @@ Do not leave these as implied apply-time behavior. They must appear in the analy
|
|
|
314
314
|
|
|
315
315
|
**Chained recommendations for new AGENTS.md files:**
|
|
316
316
|
|
|
317
|
-
When a coverage-gap recommendation proposes creating a **new** `AGENTS.md` in a subdirectory, also emit the corresponding provider-baseline recommendations for that directory in the same artifact. For example, if the analysis recommends creating `packages/cli/AGENTS.md
|
|
317
|
+
When a coverage-gap recommendation proposes creating a **new** `AGENTS.md` in a subdirectory, also emit the corresponding provider-baseline recommendations for that directory in the same artifact. For example, if the analysis recommends creating `packages/cli/AGENTS.md`, the claude provider is active, and a shim strategy is configured, it must also recommend creating `packages/cli/CLAUDE.md` with `@AGENTS.md`. Do not defer these to a follow-up analysis — they belong in the same artifact so `oat-agent-instructions-apply` can generate both files in one pass.
|
|
318
318
|
|
|
319
319
|
**In delta mode:** Only assess directories that contain files changed since the last tracked commit. Skip unchanged directories.
|
|
320
320
|
|
package/assets/skills/oat-agent-instructions-analyze/references/analysis-artifact-template.md
CHANGED
|
@@ -119,11 +119,11 @@ None | {numbered list}
|
|
|
119
119
|
|
|
120
120
|
Missing always-on provider compatibility files that should exist even when no corresponding file was discovered during inventory.
|
|
121
121
|
|
|
122
|
-
| # | Provider | Required Path | Format | Reason
|
|
123
|
-
| --- | --------- | --------------------------------- | ------------------ |
|
|
124
|
-
| 1 | `claude` | `CLAUDE.md` | Claude import shim | {claude active + AGENTS.md present + shim missing} | {exact refs} | {High/Medium} |
|
|
125
|
-
| 2 | `copilot` | `.github/copilot-instructions.md` | Copilot shim | {copilot active + shim missing}
|
|
126
|
-
| ... | | | |
|
|
122
|
+
| # | Provider | Required Path | Format | Reason | Evidence | Severity |
|
|
123
|
+
| --- | --------- | --------------------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------- | ------------ | ------------- |
|
|
124
|
+
| 1 | `claude` | `CLAUDE.md` | Claude import shim | {claude active + shim strategy configured (`instructions.claude.shims` is not `none`) + AGENTS.md present + shim missing} | {exact refs} | {High/Medium} |
|
|
125
|
+
| 2 | `copilot` | `.github/copilot-instructions.md` | Copilot shim | {copilot active + shim missing} | {exact refs} | {High/Medium} |
|
|
126
|
+
| ... | | | | | | |
|
|
127
127
|
|
|
128
128
|
{Or: "No provider baseline gaps identified."}
|
|
129
129
|
|
|
@@ -125,13 +125,16 @@ User-level rules go in `~/.claude/rules/` and apply to all projects (lower prior
|
|
|
125
125
|
|
|
126
126
|
### 2.6 AGENTS.md Support
|
|
127
127
|
|
|
128
|
-
|
|
128
|
+
Source: `anthropics/claude-code` `mods/agents-md` README, as of v2.1.278.
|
|
129
129
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
130
|
+
**Claude Code reads AGENTS.md natively** through its built-in `agents-md` plugin. Its `instructionFiles` option defaults to `claude-md-or-agents-md`; the other values are `claude-md`, `claude-md-and-agents-md`, and `managed-only`.
|
|
131
|
+
|
|
132
|
+
- **Default mode stands down on any CLAUDE.md.** In `claude-md-or-agents-md`, the plugin loads no AGENTS.md for the session when any `CLAUDE.md`, `.claude/CLAUDE.md`, or `CLAUDE.local.md` exists in the working directory or any directory above it up to the project root; the engine then loads only CLAUDE.md files. A root `CLAUDE.md` or a personal `CLAUDE.local.md` therefore hides every AGENTS.md, and shims in some directories but not others hide every AGENTS.md without one.
|
|
133
|
+
- **`claude-md-and-agents-md`** loads both; an AGENTS.md that a CLAUDE.md already imports or links is not loaded twice.
|
|
134
|
+
- **Only user or managed settings can set the option** (`~/.claude/settings.json`, `--settings`, or managed settings); a project's `.claude/settings.json` cannot.
|
|
135
|
+
- **Nested gaps:** nested AGENTS.md files attach on a text `Read` only (not on `@`-mentions, IDE selections, or notebook, image, or PDF reads), and `--add-dir` directories contribute no AGENTS.md.
|
|
133
136
|
|
|
134
|
-
|
|
137
|
+
The one-line `CLAUDE.md` shim (`@AGENTS.md`, or `ln -s AGENTS.md CLAUDE.md`) is now **opt-in**: use it for Claude Code releases before the plugin, for users who set `instructionFiles` to `claude-md`, or when the nested gaps above matter, and then keep a shim beside every AGENTS.md. In OAT this is `instructions.claude.shims` (`none` by default; `pointer`, `symlink`, or `copy` to opt in), applied by `oat instructions sync`; see the OAT docs page `provider-sync/instruction-sync.md` (§ Claude Code and AGENTS.md).
|
|
135
138
|
|
|
136
139
|
### 2.7 Skills vs CLAUDE.md vs Rules
|
|
137
140
|
|
|
@@ -411,12 +414,12 @@ All three providers support file-pattern-based activation — this is the unifyi
|
|
|
411
414
|
|
|
412
415
|
### 5.4 AGENTS.md Support
|
|
413
416
|
|
|
414
|
-
| Provider | Native support
|
|
415
|
-
| ----------- |
|
|
416
|
-
| Claude Code | **
|
|
417
|
-
| Cursor | **Yes** (first-class)
|
|
418
|
-
| Copilot | **Yes** (`**/AGENTS.md`)
|
|
419
|
-
| Codex | **Yes** (primary format)
|
|
417
|
+
| Provider | Native support | Nested | Import mechanism |
|
|
418
|
+
| ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------- | ------------------------------------- |
|
|
419
|
+
| Claude Code | **Yes** (built-in `agents-md` plugin; stands down while any CLAUDE.md, `.claude/CLAUDE.md`, or `CLAUDE.local.md` is on the path to the working directory) | Yes (attached on a text `Read`) | Opt-in `@AGENTS.md` shim in CLAUDE.md |
|
|
420
|
+
| Cursor | **Yes** (first-class) | Yes (hierarchical) | N/A — read directly |
|
|
421
|
+
| Copilot | **Yes** (`**/AGENTS.md`) | Yes (nearest wins) | N/A — read directly |
|
|
422
|
+
| Codex | **Yes** (primary format) | Yes (override pattern) | N/A — native |
|
|
420
423
|
|
|
421
424
|
---
|
|
422
425
|
|
|
@@ -27,7 +27,7 @@ Per-file evaluation criteria for agent instruction files. Use this checklist to
|
|
|
27
27
|
|
|
28
28
|
### 4. Size Within Budget
|
|
29
29
|
|
|
30
|
-
- [ ] Root files (AGENTS.md, CLAUDE.md): <300 lines (hard max 500)
|
|
30
|
+
- [ ] Root files (AGENTS.md, and CLAUDE.md when a shim strategy is configured): <300 lines (hard max 500)
|
|
31
31
|
- [ ] Scoped/package files: 40–150 lines
|
|
32
32
|
- [ ] Individual rules files: <80 lines
|
|
33
33
|
- [ ] Always-on baseline load is estimated and kept comfortably below the task budget
|
|
@@ -44,7 +44,7 @@ Per-file evaluation criteria for agent instruction files. Use this checklist to
|
|
|
44
44
|
|
|
45
45
|
### 6. Precedence Clear
|
|
46
46
|
|
|
47
|
-
- [ ] Override semantics are explicit (nearest-wins for AGENTS.md, import directives for CLAUDE.md)
|
|
47
|
+
- [ ] Override semantics are explicit (nearest-wins for AGENTS.md, import directives for CLAUDE.md when a shim strategy is configured)
|
|
48
48
|
- [ ] No ambiguous or conflicting instructions across scope levels
|
|
49
49
|
- **Severity if failing:** Medium
|
|
50
50
|
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
#
|
|
11
11
|
# File patterns per provider:
|
|
12
12
|
# agents_md → **/AGENTS.md
|
|
13
|
-
# claude → **/CLAUDE.md, .claude/rules/*.md
|
|
13
|
+
# claude → **/CLAUDE.md, **/CLAUDE.local.md, .claude/rules/*.md
|
|
14
14
|
# cursor → .cursor/rules/*.mdc, .cursor/rules/*.md
|
|
15
15
|
# copilot → .github/copilot-instructions.md, .github/instructions/*.instructions.md
|
|
16
16
|
# cline → .cline/rules/*
|
|
@@ -58,8 +58,9 @@ discover_agents_md() {
|
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
discover_claude() {
|
|
61
|
-
# CLAUDE.md files
|
|
62
|
-
|
|
61
|
+
# CLAUDE.md and personal CLAUDE.local.md files (either one makes Claude
|
|
62
|
+
# Code's default agents-md mode ignore AGENTS.md)
|
|
63
|
+
find_exclude -name 'CLAUDE.md' -o -name 'CLAUDE.local.md' | while read -r f; do
|
|
63
64
|
local rel="${f#"$REPO_ROOT"/}"
|
|
64
65
|
printf 'claude\t%s\n' "$rel"
|
|
65
66
|
done
|
|
@@ -5,7 +5,7 @@ disable-model-invocation: true
|
|
|
5
5
|
user-invocable: true
|
|
6
6
|
allowed-tools: Read, Write, Edit, Bash(git:*), Bash(gh:*), Glob, Grep, AskUserQuestion
|
|
7
7
|
metadata:
|
|
8
|
-
version: 1.7.
|
|
8
|
+
version: 1.7.3
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
# Agent Instructions Apply
|
|
@@ -204,7 +204,7 @@ recommendation so plan review and generation stay aligned to the same pack file.
|
|
|
204
204
|
**For provider baseline gaps (always-on provider files):**
|
|
205
205
|
|
|
206
206
|
- Treat them as first-class recommendations from the artifact, not as implied apply-time behavior
|
|
207
|
-
- Examples include missing Claude `CLAUDE.md` import shims and missing `.github/copilot-instructions.md` shims
|
|
207
|
+
- Examples include missing Claude `CLAUDE.md` import shims (recommended only when `instructions.claude.shims` is a shim strategy: `pointer`, `symlink`, or `copy`) and missing `.github/copilot-instructions.md` shims
|
|
208
208
|
- Carry forward the artifact's evidence refs, confidence, and disclosure mode into the plan
|
|
209
209
|
- If the artifact marks a provider-baseline recommendation `omit`, do not include it in the apply plan
|
|
210
210
|
- If the artifact marks a provider-baseline recommendation `ask_user`, include it with the evidence and require explicit user approval
|
|
@@ -240,7 +240,7 @@ recommendation so plan review and generation stay aligned to the same pack file.
|
|
|
240
240
|
**Multi-format composition order:**
|
|
241
241
|
|
|
242
242
|
1. **AGENTS.md first** — the canonical, provider-agnostic file
|
|
243
|
-
2. **CLAUDE.md** — if claude provider is active, ensure `@AGENTS.md` import exists
|
|
243
|
+
2. **CLAUDE.md** — only if the claude provider is active and a shim strategy is configured (`oat config get instructions.claude.shims` returns `pointer`, `symlink`, or `copy`), ensure the `@AGENTS.md` import exists. Under `none`, the default, create no `CLAUDE.md`: Claude Code reads AGENTS.md itself, and a CLAUDE.md makes it ignore AGENTS.md for sessions started in that file's directory or below (project-wide for a root file)
|
|
244
244
|
3. **Glob-scoped rules** — author once in canonical format at `.agents/rules/{name}.md` with YAML frontmatter (`description`, `globs`, `activation`)
|
|
245
245
|
- `activation` MUST be one of `always`, `glob`, `agent-requested`, `manual` — any other value (e.g. `auto`) is rejected by `oat sync`. Use `glob` (with `globs`) for file-targeted rules; see `frontmatter/canonical-rule.md` for the full activation matrix.
|
|
246
246
|
- Provider-specific rule files are generated by `oat sync --scope project`
|
|
@@ -125,13 +125,16 @@ User-level rules go in `~/.claude/rules/` and apply to all projects (lower prior
|
|
|
125
125
|
|
|
126
126
|
### 2.6 AGENTS.md Support
|
|
127
127
|
|
|
128
|
-
|
|
128
|
+
Source: `anthropics/claude-code` `mods/agents-md` README, as of v2.1.278.
|
|
129
129
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
130
|
+
**Claude Code reads AGENTS.md natively** through its built-in `agents-md` plugin. Its `instructionFiles` option defaults to `claude-md-or-agents-md`; the other values are `claude-md`, `claude-md-and-agents-md`, and `managed-only`.
|
|
131
|
+
|
|
132
|
+
- **Default mode stands down on any CLAUDE.md.** In `claude-md-or-agents-md`, the plugin loads no AGENTS.md for the session when any `CLAUDE.md`, `.claude/CLAUDE.md`, or `CLAUDE.local.md` exists in the working directory or any directory above it up to the project root; the engine then loads only CLAUDE.md files. A root `CLAUDE.md` or a personal `CLAUDE.local.md` therefore hides every AGENTS.md, and shims in some directories but not others hide every AGENTS.md without one.
|
|
133
|
+
- **`claude-md-and-agents-md`** loads both; an AGENTS.md that a CLAUDE.md already imports or links is not loaded twice.
|
|
134
|
+
- **Only user or managed settings can set the option** (`~/.claude/settings.json`, `--settings`, or managed settings); a project's `.claude/settings.json` cannot.
|
|
135
|
+
- **Nested gaps:** nested AGENTS.md files attach on a text `Read` only (not on `@`-mentions, IDE selections, or notebook, image, or PDF reads), and `--add-dir` directories contribute no AGENTS.md.
|
|
133
136
|
|
|
134
|
-
|
|
137
|
+
The one-line `CLAUDE.md` shim (`@AGENTS.md`, or `ln -s AGENTS.md CLAUDE.md`) is now **opt-in**: use it for Claude Code releases before the plugin, for users who set `instructionFiles` to `claude-md`, or when the nested gaps above matter, and then keep a shim beside every AGENTS.md. In OAT this is `instructions.claude.shims` (`none` by default; `pointer`, `symlink`, or `copy` to opt in), applied by `oat instructions sync`; see the OAT docs page `provider-sync/instruction-sync.md` (§ Claude Code and AGENTS.md).
|
|
135
138
|
|
|
136
139
|
### 2.7 Skills vs CLAUDE.md vs Rules
|
|
137
140
|
|
|
@@ -411,12 +414,12 @@ All three providers support file-pattern-based activation — this is the unifyi
|
|
|
411
414
|
|
|
412
415
|
### 5.4 AGENTS.md Support
|
|
413
416
|
|
|
414
|
-
| Provider | Native support
|
|
415
|
-
| ----------- |
|
|
416
|
-
| Claude Code | **
|
|
417
|
-
| Cursor | **Yes** (first-class)
|
|
418
|
-
| Copilot | **Yes** (`**/AGENTS.md`)
|
|
419
|
-
| Codex | **Yes** (primary format)
|
|
417
|
+
| Provider | Native support | Nested | Import mechanism |
|
|
418
|
+
| ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------- | ------------------------------------- |
|
|
419
|
+
| Claude Code | **Yes** (built-in `agents-md` plugin; stands down while any CLAUDE.md, `.claude/CLAUDE.md`, or `CLAUDE.local.md` is on the path to the working directory) | Yes (attached on a text `Read`) | Opt-in `@AGENTS.md` shim in CLAUDE.md |
|
|
420
|
+
| Cursor | **Yes** (first-class) | Yes (hierarchical) | N/A — read directly |
|
|
421
|
+
| Copilot | **Yes** (`**/AGENTS.md`) | Yes (nearest wins) | N/A — read directly |
|
|
422
|
+
| Codex | **Yes** (primary format) | Yes (override pattern) | N/A — native |
|
|
420
423
|
|
|
421
424
|
---
|
|
422
425
|
|
|
@@ -6,7 +6,7 @@ disable-model-invocation: true
|
|
|
6
6
|
user-invocable: true
|
|
7
7
|
allowed-tools: Read, Bash, Glob, Grep, AskUserQuestion
|
|
8
8
|
metadata:
|
|
9
|
-
version: 2.0.
|
|
9
|
+
version: 2.0.2
|
|
10
10
|
---
|
|
11
11
|
|
|
12
12
|
# OAT Doctor
|
|
@@ -81,15 +81,15 @@ Run the seven commands below and the four file checks. Every command call is pro
|
|
|
81
81
|
|
|
82
82
|
A command has **failed** only when its stdout does not parse as JSON, or the process is killed or times out. A non-zero exit with parseable JSON is a findings result: `oat doctor` and `oat pjm doctor` both exit 1 whenever any check warns, which is the normal state of a healthy repository. A failed command becomes one `warning` finding for its area whose summary names the command and quotes the first line of stderr; the sweep continues.
|
|
83
83
|
|
|
84
|
-
| # | Command | Projection
|
|
85
|
-
| --- | --------------------------------------- |
|
|
86
|
-
| 1 | `oat doctor --json --scope all` | `.checks[] \| {name, status, message}` — drop `packEvidence` and `providerRefreshAdvice`
|
|
87
|
-
| 2 | `oat pjm doctor --json` | `.adoption` and `.checks[] \| {name, status, message}`
|
|
88
|
-
| 3 | `oat config dump --json` | `.shared`, `.local`, `.user` (the three surface objects)
|
|
89
|
-
| 4 | `oat config describe --json` | `.entries[] \| {key, group, file, scope, defaultValue, owningCommand, deprecated}`
|
|
90
|
-
| 5 | `oat instructions validate --json` | `.summary
|
|
91
|
-
| 6 | `oat tools list --json --scope all` | `.tools[] \| {name, pack, scope, status}`
|
|
92
|
-
| 7 | `oat tools outdated --json --scope all` | `.tools[] \| {name, version, bundledVersion, scope}`
|
|
84
|
+
| # | Command | Projection | Feeds |
|
|
85
|
+
| --- | --------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------- |
|
|
86
|
+
| 1 | `oat doctor --json --scope all` | `.checks[] \| {name, status, message}` — drop `packEvidence` and `providerRefreshAdvice` | config, tools, docs (by the check map below) |
|
|
87
|
+
| 2 | `oat pjm doctor --json` | `.adoption` and `.checks[] \| {name, status, message}` | PJM |
|
|
88
|
+
| 3 | `oat config dump --json` | `.shared`, `.local`, `.user` (the three surface objects) | config, docs |
|
|
89
|
+
| 4 | `oat config describe --json` | `.entries[] \| {key, group, file, scope, defaultValue, owningCommand, deprecated}` | config |
|
|
90
|
+
| 5 | `oat instructions validate --json` | `.strategy`, `.summary`, `.entries[] \| select(.status != "ok") \| {agentsPath, status, detail}`, and `.warnings[] \| {code, path, paths, wouldRemove, linkedBy, message}` (omitted when there are none) | agent instructions |
|
|
91
|
+
| 6 | `oat tools list --json --scope all` | `.tools[] \| {name, pack, scope, status}` | tools |
|
|
92
|
+
| 7 | `oat tools outdated --json --scope all` | `.tools[] \| {name, version, bundledVersion, scope}` | tools |
|
|
93
93
|
|
|
94
94
|
File checks (read-only):
|
|
95
95
|
|
|
@@ -123,9 +123,13 @@ Each finding is one line with an **area**, a **severity**, a one-line **summary*
|
|
|
123
123
|
|
|
124
124
|
**Agent instructions**
|
|
125
125
|
|
|
126
|
-
- An entry with status `
|
|
126
|
+
- An entry with status `content_mismatch` (the entry literal; the summary counter is spelled `contentMismatch`) → `error`; fix `oat instructions sync` (`--force` for a content mismatch the person confirms is stale).
|
|
127
|
+
- An entry with status `missing` → `error` only when a shim strategy is configured (`.strategy` is `pointer`, `symlink`, or `copy`); fix `oat instructions sync`. Under `none`, the default, an AGENTS.md without a CLAUDE.md is correct and the CLI never reports it as `missing`.
|
|
128
|
+
- An entry with status `managed_shim` (strategy `none` only: a CLAUDE.md in the exact shape OAT writes) → `warning`; fix `oat instructions sync`, which removes it, unless `.warnings[]` holds a `claude_md_blocks_shim_removal` item: then sync removes nothing, so report that item instead of sending the person to sync. An entry with status `unmanaged` (a hand-written or modified CLAUDE.md that sync keeps, or one an AGENTS.md links to) is not a finding of its own; the leftover warning below covers it, including the link caveat through `linkedBy`.
|
|
129
|
+
- Each `.warnings[]` item with code `claude_md_hides_agents_md` → `warning`; the summary names its `path`: while that `CLAUDE.md`, `.claude/CLAUDE.md`, or `CLAUDE.local.md` exists, Claude Code's default `agents-md` mode ignores every AGENTS.md in the project (for a file below the root: in sessions started in its directory or below). Offer exactly the two fixes the CLI names: the person removes the file (the doctor never deletes it), or `oat config set instructions.claude.shims pointer` (or `symlink` / `copy`) followed by `oat instructions sync` to add shims back. When the item's `linkedBy` is non-empty, the file holds the only copy of the instructions for those AGENTS.md links: the first fix becomes "the person replaces each linking AGENTS.md with the file's content first, then removes the file", naming the `linkedBy` paths, and never offer plain removal for it. Skip an item whose `path` is in a `claude_md_blocks_shim_removal` item's `wouldRemove`: that item already names the file, and removing one kept file by hand recreates the mix the block exists to prevent.
|
|
130
|
+
- A `.warnings[]` item with code `claude_md_blocks_shim_removal` → `warning`: removal under `none` is all or nothing, so while any file in its `paths` (a `CLAUDE.md`, `.claude/CLAUDE.md`, or `CLAUDE.local.md` with content that is not an OAT shim) exists, `oat instructions sync` removes none of the shims in its `wouldRemove`. The summary names both lists. Offer the fixes the CLI names: the person removes each file in `paths` or moves its content into an AGENTS.md, then reruns `oat instructions sync`; or `oat config set instructions.claude.shims` to `pointer`, `symlink`, or `copy` to keep CLAUDE.md files. Its `linkedBy` maps each file in `paths` to the AGENTS.md links that reach it: for a file with a non-empty list, the first fix becomes "the person replaces each linking AGENTS.md with the file's content first, then removes the file", naming those links, and never offer plain removal for it. While this item exists, offer no removal for any path in its `wouldRemove`. The doctor never deletes or edits the files.
|
|
127
131
|
- An entry with status `stray` → `warning`; fix `oat instructions sync` after the person decides whether the stray file should exist.
|
|
128
|
-
- A CLI-written heading absent while its capability is present → `warning`: no `## Tool Packs` while any pack is installed at project scope (fix `oat tools
|
|
132
|
+
- A CLI-written heading absent while its capability is present → `warning`: no `## Tool Packs` while any pack is installed at project scope (fix `oat tools guidance`, which prints the managed `OAT tools` block for the installed packs without installing, upgrading, or writing anything, for the person to add to `AGENTS.md`); no `### Project Management` or `### Decision Records` while PJM adoption is `declared` (fix `oat pjm init`, which appends the absent guidance blocks; a block that exists but differs gets a printed manual patch); no `## Documentation` while a docs surface exists (fix: `oat-docs-bootstrap`).
|
|
129
133
|
- Content quality beyond presence is not judged here; route to `oat-agent-instructions-analyze`.
|
|
130
134
|
|
|
131
135
|
**Docs**
|
|
@@ -221,7 +225,7 @@ State the adoption state (`declared`, `inferred-legacy`, `partial-initialization
|
|
|
221
225
|
|
|
222
226
|
#### Agent instructions dive
|
|
223
227
|
|
|
224
|
-
Explain the sync strategy in use (`oat instructions validate --json` `.
|
|
228
|
+
Explain the sync strategy in use (`oat instructions validate --json` `.strategy`: `none`, the default, keeps no CLAUDE.md because Claude Code reads AGENTS.md itself; `pointer`, `symlink`, and `copy` keep a shim beside each AGENTS.md) and each non-`ok` entry and leftover-CLAUDE.md warning with its path. Explain each missing heading: what the CLI writes there and why an agent needs it (`cli-utilities/bootstrap.md` for `## Tool Packs`; `cli-utilities/backlog-lifecycle.md` § Adoption comes first for the PJM sections). Offer `oat instructions sync`, `oat tools guidance` (read-only: prints the `OAT tools` block to add), or `oat pjm init` (appends absent PJM blocks) as the finding names; for wording and coverage beyond presence, hand off to `oat-agent-instructions-analyze` then `oat-agent-instructions-apply`.
|
|
225
229
|
|
|
226
230
|
#### Docs dive
|
|
227
231
|
|
|
@@ -7,7 +7,7 @@ disable-model-invocation: true
|
|
|
7
7
|
user-invocable: true
|
|
8
8
|
allowed-tools: Read, Write, Bash(git:*), Bash(oat:*), Bash(oat project log:*), Glob, Grep, AskUserQuestion, Task
|
|
9
9
|
metadata:
|
|
10
|
-
version: 2.3.
|
|
10
|
+
version: 2.3.14
|
|
11
11
|
---
|
|
12
12
|
|
|
13
13
|
# Implementation Phase
|
|
@@ -102,7 +102,7 @@ record only the gate decision and its review/dispatch provenance.
|
|
|
102
102
|
After every code commit and after every phase/review-fix completion, you MUST commit the OAT tracking files (project: `implementation.md`, `state.md`, `plan.md`) as a separate bookkeeping commit. Refresh the repo dashboard with `oat state refresh` before staging when available, but do not stage `.oat/state.md`; it is generated dashboard state and is normally gitignored. Do not defer, batch, or skip these commits under the reasoning that they "aren't related to the implementation." Skipping a bookkeeping commit is the primary cause of cross-session state drift and will cause the next implementation run to fail bookkeeping cross-checks. If bookkeeping commits feel frequent, that is the intended design — they are cheap and they prevent drift.
|
|
103
103
|
|
|
104
104
|
**CRITICAL — Review boundaries require a committed artifact baseline.**
|
|
105
|
-
Do not enter checkpoint review, final review, revise, or PR-final handoff with dirty core project artifacts (`discovery.md`, `spec.md`, `design.md`, `plan.md`, `implementation.md`, `state.md`). If one of those boundaries is next and artifact bookkeeping is still uncommitted, stop and create the bookkeeping commit first.
|
|
105
|
+
Do not enter checkpoint review, final review, revise, or PR-final handoff with dirty core project artifacts (`discovery.md`, `spec.md`, `design.md`, `plan.md`, `implementation.md`, `state.md`). If one of those boundaries is next and artifact bookkeeping is still uncommitted, stop and create the bookkeeping commit first. The per-phase review is such a boundary: commit the phase's task ledger (`references/phase-execution.md` Step 7a) before dispatching the per-phase reviewer, and write review-outcome bookkeeping after the review returns (Step 7b).
|
|
106
106
|
|
|
107
107
|
**CRITICAL — Intentional artifact divergence must be recorded.**
|
|
108
108
|
If implementation intentionally diverges from `spec.md`, `design.md`, or `plan.md`, record the delta in `implementation.md` before the next phase/review boundary. Include what diverged, why it diverged, whether the implementation or original artifact is now source of truth, and any follow-up artifact updates or explicit deferral. Do not leave accepted design drift only in chat, a review artifact, or code comments; final summary generation depends on `implementation.md` preserving the delta.
|
|
@@ -384,13 +384,13 @@ and can never be reused as a fresh `allowed` result once the gate is
|
|
|
384
384
|
re-enabled; the re-enabled gate requires a new configured generation.
|
|
385
385
|
|
|
386
386
|
New generations persist `implementation_fingerprint` as
|
|
387
|
-
`sha256:effective-delta-
|
|
387
|
+
`sha256:effective-delta-v2:<digest>`. Resolve the logical integration base from
|
|
388
388
|
the tracked PR's exact base ref, then the repository's configured remote default
|
|
389
389
|
branch; missing or ambiguous resolution fails closed. Persist the logical base
|
|
390
390
|
ref as `implementation_base_ref`; require exactly one merge base between that
|
|
391
391
|
ref and each compared HEAD.
|
|
392
392
|
|
|
393
|
-
Prefix the fingerprint input with the bytes `effective-delta-
|
|
393
|
+
Prefix the fingerprint input with the bytes `effective-delta-v2\0`. Hash the
|
|
394
394
|
exact NUL-delimited byte stream from Git
|
|
395
395
|
`--raw -z --no-renames --no-abbrev` output, which includes both base and final
|
|
396
396
|
modes and full object IDs for blobs, symlinks, deletions, and gitlinks. Run with
|
|
@@ -398,13 +398,29 @@ modes and full object IDs for blobs, symlinks, deletions, and gitlinks. Run with
|
|
|
398
398
|
format owns path framing and byte ordering; do not parse and reserialize it,
|
|
399
399
|
abbreviate object IDs, enable rename detection, or hash human patch output.
|
|
400
400
|
|
|
401
|
-
Exclude
|
|
402
|
-
self-referential
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
401
|
+
Exclude the exact `$PROJECT_PATH/state.md` checkpoint carrier, which would make
|
|
402
|
+
the digest self-referential, and every path under `.oat/projects/` and
|
|
403
|
+
`.oat/repo/`, whose project artifacts and repository records never make the
|
|
404
|
+
gate stale. Use Git's literal exclusion pathspecs
|
|
405
|
+
`:(exclude,literal)$PROJECT_PATH/state.md`, `:(exclude,literal).oat/projects`,
|
|
406
|
+
and `:(exclude,literal).oat/repo`, not globs. A literal directory pathspec
|
|
407
|
+
excludes that directory and everything beneath it, never a sibling whose name
|
|
408
|
+
merely starts the same way. `.oat/templates/`, `.oat/scripts/`,
|
|
409
|
+
`.oat/config*.json`, and `.oat/sync/` stay fingerprinted, as does every other
|
|
410
|
+
path. The `.oat/projects` exclusion names the default location literally; a
|
|
411
|
+
project whose configured `projects.root` lies outside `.oat/projects/` keeps
|
|
412
|
+
its other artifacts fingerprinted (more staleness, never less). Validate the
|
|
413
|
+
state carrier independently as the structured transition above.
|
|
414
|
+
|
|
415
|
+
Stored `sha256:effective-delta-v1:<digest>` values keep v1 semantics and are
|
|
416
|
+
never reinterpreted: recompute them with the `effective-delta-v1\0` prefix and
|
|
417
|
+
only the exact `$PROJECT_PATH/state.md` exclusion. A v1 generation stays v1
|
|
418
|
+
until it goes stale; its replacement generation uses v2.
|
|
419
|
+
|
|
420
|
+
Set `freshness_head` to `reviewed_head` and `freshness_fingerprint` to
|
|
421
|
+
`implementation_fingerprint` when the generation starts. These rolling fields
|
|
422
|
+
preserve the accepted tree outcome after later authorized closeout transitions
|
|
423
|
+
without changing the immutable reviewed basis.
|
|
408
424
|
|
|
409
425
|
An in-flight `pending` or `blocked` generation reuses its persisted resolved
|
|
410
426
|
configuration and never re-resolves it. Recompute the fingerprint from those
|
|
@@ -561,9 +577,14 @@ disposition.
|
|
|
561
577
|
closeout-only. A path category alone is insufficient: the corresponding
|
|
562
578
|
persisted gate or sequence transition must own that descendant boundary;
|
|
563
579
|
unknown or mixed work is substantive.
|
|
564
|
-
- For a qualified `sha256:effective-delta-
|
|
580
|
+
- For a qualified `sha256:effective-delta-v2:<digest>` or
|
|
581
|
+
`sha256:effective-delta-v1:<digest>` value, require the
|
|
565
582
|
persisted `implementation_base_ref`, `freshness_head`, one current merge base,
|
|
566
583
|
and 64-character lowercase hexadecimal implementation and freshness digests.
|
|
584
|
+
Recompute with the stored value's own version prefix and exclusion set.
|
|
585
|
+
Under v2, a descendant commit whose changes all fall inside the v2 exclusion
|
|
586
|
+
set leaves the effective delta unchanged; it is neither substantive nor
|
|
587
|
+
unknown and needs no owning transition.
|
|
567
588
|
Missing or malformed inputs fail closed. Walk descendants after
|
|
568
589
|
`freshness_head` in commit order. Ignore a checkpoint-persistence commit only
|
|
569
590
|
after verifying its diff changes the exact state carrier and nothing else.
|
|
@@ -587,7 +608,8 @@ disposition.
|
|
|
587
608
|
or workflow configuration changes make the prior result `stale`.
|
|
588
609
|
- Every stale transition preserves prior provenance for audit, requires a
|
|
589
610
|
current final lifecycle review for the changed basis, and starts a new
|
|
590
|
-
generation using the qualified fingerprint format
|
|
611
|
+
generation using the current qualified fingerprint format,
|
|
612
|
+
`effective-delta-v2`.
|
|
591
613
|
|
|
592
614
|
Before approval-aware sequencing, final HiLL approval, implementation
|
|
593
615
|
completion, or success output, run the configured gate:
|
|
@@ -684,8 +684,11 @@ degradation is forbidden for the invalid run.
|
|
|
684
684
|
### Per-Phase Review
|
|
685
685
|
|
|
686
686
|
The root workflow owns implementation review. After validating the phase
|
|
687
|
-
report
|
|
688
|
-
|
|
687
|
+
report (sequential phases; see the parallel-group note below), commit Step 7a
|
|
688
|
+
pre-review bookkeeping before resolving or dispatching the reviewer, so the
|
|
689
|
+
reviewed head carries the phase's current task ledger. Then resolve and
|
|
690
|
+
dispatch exactly one fresh `oat-reviewer` round at the configured review
|
|
691
|
+
ceiling:
|
|
689
692
|
|
|
690
693
|
```bash
|
|
691
694
|
oat project dispatch-ceiling resolve \
|
|
@@ -703,6 +706,17 @@ commit range, task IDs and boundaries, artifacts, verification evidence,
|
|
|
703
706
|
configured axes, selection reason, and candidates. Require a timestamped review
|
|
704
707
|
artifact under the project's `reviews/` directory.
|
|
705
708
|
|
|
709
|
+
The Review Scope names review-outcome bookkeeping as out of scope: this
|
|
710
|
+
review's `## Reviews` row and its disposition, the Orchestration Run entry for
|
|
711
|
+
this review's outcome, the deferred phase-outcome and review-orchestration
|
|
712
|
+
project-log entries, and the ledger's record of any review-fix commit. Step 7b
|
|
713
|
+
writes all of them after the review returns, so their absence at the reviewed
|
|
714
|
+
head is not a finding. The task ledger itself stays in scope and must be
|
|
715
|
+
current at the reviewed head, because Step 7a committed it before dispatch.
|
|
716
|
+
In a parallel group the phase worktree under review does not carry the root
|
|
717
|
+
ledger (step 10 of Parallel Group Execution commits it once after fan-in), so
|
|
718
|
+
that phase's Review Scope also names the task ledger as out of scope.
|
|
719
|
+
|
|
706
720
|
For a managed capped review, bind the exact provider argument to the actual
|
|
707
721
|
invocation: `providers.codex.dispatchArgs.variant`,
|
|
708
722
|
`providers.claude.dispatchArgs.variant` for an effort-pinned target,
|
|
@@ -755,7 +769,9 @@ and workers never write `project-log.md` or append this entry.
|
|
|
755
769
|
|
|
756
770
|
No project-log write happens anywhere between a reviewer returning and a fix
|
|
757
771
|
child being dispatched. The deferred orchestration entry is appended with the
|
|
758
|
-
phase-outcome entry at Step
|
|
772
|
+
phase-outcome entry at Step 7b and committed by that half's bookkeeping. Step
|
|
773
|
+
7a's commit lands before the reviewer is dispatched, so it cannot dirty that
|
|
774
|
+
window either.
|
|
759
775
|
|
|
760
776
|
After successful signal and orchestration validation, validate the review
|
|
761
777
|
artifact scope and commit range.
|
|
@@ -796,8 +812,10 @@ worktree in Outstanding Items.
|
|
|
796
812
|
|
|
797
813
|
### Optional External Phase Review Gate
|
|
798
814
|
|
|
799
|
-
After the root-owned per-phase reviewer passes and
|
|
800
|
-
run `oat_phase_review_gate` for selected phases
|
|
815
|
+
After the root-owned per-phase reviewer passes and both halves of Step 7
|
|
816
|
+
bookkeeping are committed, run `oat_phase_review_gate` for selected phases. The
|
|
817
|
+
gate reviews the committed ledger after both Step 7 halves — which, after a fix
|
|
818
|
+
loop or in a parallel group, is newer than the head the per-phase reviewer saw:
|
|
801
819
|
|
|
802
820
|
```bash
|
|
803
821
|
oat --json gate review \
|
|
@@ -817,6 +835,11 @@ and `handoff` is non-null.
|
|
|
817
835
|
implementer under the bounded loop, then re-run root review and the gate.
|
|
818
836
|
- target execution, artifact validation, or missing-artifact failure: stop.
|
|
819
837
|
|
|
838
|
+
The phase row stays `in_progress` until this gate passes and every review
|
|
839
|
+
disposition is settled; the bookkeeping that records the passing gate sets it
|
|
840
|
+
`complete`, and gate retry exhaustion sets it `blocked` (see Step 7b's phase
|
|
841
|
+
row transitions).
|
|
842
|
+
|
|
820
843
|
Gate retry rounds use the same orchestration retry limit. Gate independence,
|
|
821
844
|
configured provenance, liveness telemetry, and fail-closed behavior are
|
|
822
845
|
unchanged.
|
|
@@ -879,7 +902,65 @@ target-preserving execution and must be recorded.
|
|
|
879
902
|
|
|
880
903
|
### Step 7: Artifact Updates After Each Phase (or Group)
|
|
881
904
|
|
|
882
|
-
After each phase or parallel group
|
|
905
|
+
After each phase or parallel group, Step 7 runs in two halves around the
|
|
906
|
+
per-phase review, each with its own commit.
|
|
907
|
+
The split exists so the reviewer never evaluates a head whose task ledger is
|
|
908
|
+
stale by construction, while the tree stays clean for a bounded fix child.
|
|
909
|
+
|
|
910
|
+
#### Step 7a: Pre-Review Bookkeeping
|
|
911
|
+
|
|
912
|
+
Run after the phase report validates and before Per-Phase Review dispatches the
|
|
913
|
+
reviewer. Write the phase's task ledger:
|
|
914
|
+
|
|
915
|
+
- the `implementation.md` task and phase completion rows: each planned task's
|
|
916
|
+
status and commit; keep the phase row `in_progress` (tasks complete, review
|
|
917
|
+
pending), because the phase's terminal status depends on its review;
|
|
918
|
+
- the `state.md` resume pointer (`oat_current_task`, last commit, and
|
|
919
|
+
timestamp), advanced consistently with `implementation.md` so the two
|
|
920
|
+
resume pointers never disagree;
|
|
921
|
+
- when the phase report carried a recovery attempt, after the matching
|
|
922
|
+
handoff-matrix row validates, clear the terminal `pending_attempt` marker,
|
|
923
|
+
preserve `used_attempts`, and append the validated canonical recovery event
|
|
924
|
+
to `implementation.md`;
|
|
925
|
+
- remove legacy `oat_execution_mode: subagent-driven`; and
|
|
926
|
+
- preserve any configured retry override.
|
|
927
|
+
|
|
928
|
+
The task rows, resume pointer, and recovery settlement do not depend on the
|
|
929
|
+
review outcome, which is why they can move ahead of the review; the recovery
|
|
930
|
+
settlement is validated from the phase report, not from the review. A
|
|
931
|
+
terminal-stop branch that ends without a review (`failed-attempt`,
|
|
932
|
+
`direction-required`, or `BLOCKED`) records its event and marker disposition
|
|
933
|
+
through the Step 7a commit block and then stops; it has no Step 7b. Commit it
|
|
934
|
+
through the same scope-resolving branch as Step 7b, including the synced-scope
|
|
935
|
+
`oat project push` path. Why this keeps the fix-child
|
|
936
|
+
preflight clean: the pre-review writes are committed before the reviewer is
|
|
937
|
+
dispatched, so the tree is clean when a bounded fix child is dispatched after
|
|
938
|
+
the review. The Optional External Phase Review Gate later sees this committed
|
|
939
|
+
ledger plus Step 7b's writes.
|
|
940
|
+
|
|
941
|
+
Pre-review bookkeeping is mandatory:
|
|
942
|
+
|
|
943
|
+
```bash
|
|
944
|
+
oat state refresh
|
|
945
|
+
PROJECT_SCOPE=$(oat project scope "{PROJECT_PATH}" --format value) || { echo "oat: cannot resolve project scope for {PROJECT_PATH}; refusing to commit artifacts" >&2; exit 1; }
|
|
946
|
+
# fail closed: never fall back to branch bookkeeping when scope resolution fails
|
|
947
|
+
if [ "$PROJECT_SCOPE" = "synced" ]; then
|
|
948
|
+
oat project push "{PROJECT_PATH}" --message "chore(oat): record {pNN} task ledger before review" || { echo "oat: project push failed; run oat project pull, resolve the reported state, and retry" >&2; exit 1; }
|
|
949
|
+
else
|
|
950
|
+
git add {PROJECT_PATH}/implementation.md {PROJECT_PATH}/state.md {PROJECT_PATH}/plan.md
|
|
951
|
+
[ -f {PROJECT_PATH}/project-log.md ] && git add {PROJECT_PATH}/project-log.md
|
|
952
|
+
git commit -m "chore(oat): record {pNN} task ledger before review"
|
|
953
|
+
fi
|
|
954
|
+
```
|
|
955
|
+
|
|
956
|
+
A parallel group makes this commit once after fan-in, together with Step 7b
|
|
957
|
+
(step 10 of Parallel Group Execution), because its phase worktrees do not carry
|
|
958
|
+
the root ledger.
|
|
959
|
+
|
|
960
|
+
#### Step 7b: Post-Review Bookkeeping
|
|
961
|
+
|
|
962
|
+
Run after the phase's terminal review outcome (pass, or retry exhaustion).
|
|
963
|
+
Write the review-outcome bookkeeping that Step 7a leaves out:
|
|
883
964
|
|
|
884
965
|
- append an Orchestration Run with phase outcomes, task commits, phase/root
|
|
885
966
|
review result, fix iterations, dispatch stamps, selection reasons,
|
|
@@ -891,10 +972,30 @@ After each phase or parallel group:
|
|
|
891
972
|
move an event status backward;
|
|
892
973
|
- apply the Reviews Ledger Mutation Contract above before every disposition or
|
|
893
974
|
archive re-point;
|
|
894
|
-
-
|
|
895
|
-
|
|
975
|
+
- set the phase's `implementation.md` row from the review outcome: `blocked`
|
|
976
|
+
on retry exhaustion; on a passing review, keep the row nonterminal
|
|
977
|
+
(`in_progress`) while any review-fix task added by review-receive is open or
|
|
978
|
+
a selected Optional External Phase Review Gate has not yet passed, and set
|
|
979
|
+
`complete` only under the rule below; update the phase summary for any
|
|
980
|
+
review-fix commits;
|
|
981
|
+
- append the deferred phase-outcome and review-orchestration entries through
|
|
982
|
+
`oat project log append`;
|
|
983
|
+
- update `state.md` last commit and timestamp for any review-fix commit, and
|
|
984
|
+
its current task when the phase outcome changes it; and
|
|
896
985
|
- preserve any configured retry override.
|
|
897
986
|
|
|
987
|
+
Phase row transitions: a passing root review (zero Critical and zero High) can
|
|
988
|
+
still queue Medium or Low fix tasks through review-receive, and the selected
|
|
989
|
+
phase gate runs after this step, so neither makes the phase complete by itself.
|
|
990
|
+
An added review-fix task keeps the row `in_progress` and names the queued task;
|
|
991
|
+
the bookkeeping that completes that task re-evaluates the row. A `blocked` gate
|
|
992
|
+
keeps the row `in_progress` through the bounded fix loop; gate retry exhaustion
|
|
993
|
+
sets it `blocked`. Set the row `complete` only when every review disposition is
|
|
994
|
+
settled and every selected phase gate has passed, in whichever bookkeeping
|
|
995
|
+
commit observes that last condition: this Step 7b commit when nothing is
|
|
996
|
+
queued and no gate is selected, otherwise the commit that records the final
|
|
997
|
+
review-fix task or the passing gate.
|
|
998
|
+
|
|
898
999
|
Bookkeeping is mandatory:
|
|
899
1000
|
|
|
900
1001
|
```bash
|
|
@@ -7,7 +7,7 @@ disable-model-invocation: true
|
|
|
7
7
|
user-invocable: true
|
|
8
8
|
allowed-tools: Read, Write, Bash, Glob, Grep, AskUserQuestion
|
|
9
9
|
metadata:
|
|
10
|
-
version: 1.1.
|
|
10
|
+
version: 1.1.6
|
|
11
11
|
---
|
|
12
12
|
|
|
13
13
|
# Lite Project
|
|
@@ -159,6 +159,28 @@ PROJECT_PATH=$(oat config get activeProject)
|
|
|
159
159
|
Confirm `state.md` reports `oat_workflow_mode: lite`, `oat_phase: plan`, and
|
|
160
160
|
`oat_phase_status: in_progress`. Do not create discovery or design artifacts.
|
|
161
161
|
|
|
162
|
+
**Consolidating earlier scaffolds.** When this new Lite project absorbs work
|
|
163
|
+
that earlier project scaffolds already started — those directories are being
|
|
164
|
+
retired into this one rather than continued — record what was absorbed in
|
|
165
|
+
`"$PROJECT_PATH/state.md"` frontmatter as one frontmatter write immediately
|
|
166
|
+
after the scaffold above, before Step 1. `PROJECT_PATH` here is the value
|
|
167
|
+
re-resolved after `oat project new`, never the pre-scaffold value, which still
|
|
168
|
+
names the previously active project. The fields have the same shapes that
|
|
169
|
+
`oat-project-quick-start` records:
|
|
170
|
+
|
|
171
|
+
- `absorbed_projects: [<slug>]` — the project slug of every retired scaffold,
|
|
172
|
+
which also names the scaffold directory under the projects root that this
|
|
173
|
+
project supersedes.
|
|
174
|
+
- `absorbed_backlog_ids: [<BL-id>]` — every backlog ID those scaffolds carried
|
|
175
|
+
into this project.
|
|
176
|
+
|
|
177
|
+
Record both fields only when a consolidation actually happened; an absent field
|
|
178
|
+
and an empty list are equivalent. A resumed Lite project keeps whatever it
|
|
179
|
+
already recorded. These two fields are the only inputs the absorbed-project
|
|
180
|
+
retirement sweep reads at completion, where retiring a scaffold is treated as a
|
|
181
|
+
semantic claim about the planning surfaces rather than the physical removal of
|
|
182
|
+
a directory. The write travels with this project's next `state.md` commit.
|
|
183
|
+
|
|
162
184
|
### Step 1: Read Repository Knowledge
|
|
163
185
|
|
|
164
186
|
Read repository instructions and the minimum durable context needed for the
|
|
@@ -5,7 +5,7 @@ disable-model-invocation: true
|
|
|
5
5
|
user-invocable: true
|
|
6
6
|
allowed-tools: Read, Glob, Grep, Bash(git:*), Bash(oat:*), Skill
|
|
7
7
|
metadata:
|
|
8
|
-
version: 1.1.
|
|
8
|
+
version: 1.1.3
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
# Project Next
|
|
@@ -253,8 +253,8 @@ Otherwise, look up the target skill from the routing table for the current `oat_
|
|
|
253
253
|
| Current Phase | Phase Status | Boundary Tier | Quick Plan Readiness | Target Skill |
|
|
254
254
|
| ------------- | ------------ | ------------- | -------------------- | -------------------------- |
|
|
255
255
|
| discovery | in_progress | tier 3 | — | `oat-project-discover` |
|
|
256
|
-
| discovery | in_progress | tier 2 | — | `oat-project-
|
|
257
|
-
| discovery | complete | tier 1 | — | `oat-project-
|
|
256
|
+
| discovery | in_progress | tier 2 | — | `oat-project-quick-start` |
|
|
257
|
+
| discovery | complete | tier 1 | — | `oat-project-quick-start` |
|
|
258
258
|
| plan | in_progress | tier 3 | not ready | `oat-project-quick-start` |
|
|
259
259
|
| plan | in_progress | tier 2 | not ready | `oat-project-quick-start` |
|
|
260
260
|
| plan | in_progress | tier 1 | not ready | `oat-project-quick-start` |
|