@open-agent-toolkit/cli 0.3.8 → 0.3.10

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.
Files changed (121) hide show
  1. package/README.md +3 -3
  2. package/assets/agents/oat-codebase-mapper.md +3 -2
  3. package/assets/agents/oat-reviewer.md +5 -13
  4. package/assets/agents/skeptical-evaluator.md +6 -2
  5. package/assets/bundle-metadata.json +1 -1
  6. package/assets/config/dispatch-matrix-recommendation.json +6 -6
  7. package/assets/docs/cli-utilities/backlog-lifecycle.md +3 -2
  8. package/assets/docs/cli-utilities/bootstrap.md +5 -2
  9. package/assets/docs/cli-utilities/config-and-local-state.md +13 -6
  10. package/assets/docs/cli-utilities/configuration.md +22 -17
  11. package/assets/docs/cli-utilities/tool-packs.md +60 -10
  12. package/assets/docs/cli-utilities/workflow-gates.md +1 -1
  13. package/assets/docs/contributing/code.md +9 -5
  14. package/assets/docs/contributing/updating-model-guidance.md +34 -6
  15. package/assets/docs/contributing/verifying-cursor-pins.md +38 -9
  16. package/assets/docs/provider-sync/commands.md +11 -8
  17. package/assets/docs/provider-sync/instruction-sync.md +241 -39
  18. package/assets/docs/provider-sync/providers.md +4 -4
  19. package/assets/docs/provider-sync/scope-and-surface.md +1 -1
  20. package/assets/docs/reference/cli-reference.md +2 -0
  21. package/assets/docs/reference/oat-directory-structure.md +12 -11
  22. package/assets/docs/reference/troubleshooting.md +19 -4
  23. package/assets/docs/workflows/projects/dispatch-ceiling.md +21 -14
  24. package/assets/docs/workflows/projects/implementation-execution.md +26 -9
  25. package/assets/docs/workflows/projects/lifecycle.md +4 -6
  26. package/assets/public-package-versions.json +4 -4
  27. package/assets/skills/oat-agent-instructions-analyze/SKILL.md +4 -4
  28. package/assets/skills/oat-agent-instructions-analyze/references/analysis-artifact-template.md +5 -5
  29. package/assets/skills/oat-agent-instructions-analyze/references/docs/rules-files.md +14 -11
  30. package/assets/skills/oat-agent-instructions-analyze/references/quality-checklist.md +2 -2
  31. package/assets/skills/oat-agent-instructions-analyze/scripts/resolve-instruction-files.sh +4 -3
  32. package/assets/skills/oat-agent-instructions-apply/SKILL.md +3 -3
  33. package/assets/skills/oat-agent-instructions-apply/references/docs/rules-files.md +14 -11
  34. package/assets/skills/oat-dispatch-subagents/SKILL.md +1 -1
  35. package/assets/skills/oat-dispatch-subagents/references/provider-cursor.md +5 -2
  36. package/assets/skills/oat-doctor/SKILL.md +17 -13
  37. package/assets/skills/oat-project-implement/SKILL.md +2 -2
  38. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +33 -11
  39. package/assets/skills/oat-project-implement/references/dispatch-and-dry-run.md +1 -1
  40. package/assets/skills/oat-project-implement/references/phase-execution.md +109 -8
  41. package/assets/skills/oat-project-lite/SKILL.md +23 -1
  42. package/assets/skills/oat-project-next/SKILL.md +3 -3
  43. package/assets/skills/oat-project-plan-writing/SKILL.md +3 -3
  44. package/assets/skills/oat-project-progress/SKILL.md +2 -2
  45. package/assets/skills/subagent-orchestration/SKILL.md +1 -1
  46. package/assets/skills/subagent-orchestration/references/evidence-and-refresh.md +20 -8
  47. package/assets/skills/subagent-orchestration/references/provider-claude.md +25 -12
  48. package/assets/skills/subagent-orchestration/references/provider-codex.md +27 -18
  49. package/assets/skills/subagent-orchestration/references/provider-cursor.md +40 -10
  50. package/assets/templates/docs-app-mkdocs/docs/contributing.md +1 -3
  51. package/assets/templates/pjm-agents.md +7 -3
  52. package/assets/templates/state.md +2 -2
  53. package/dist/commands/backlog/archive.d.ts +10 -2
  54. package/dist/commands/backlog/archive.d.ts.map +1 -1
  55. package/dist/commands/backlog/archive.js +22 -6
  56. package/dist/commands/backlog/index.d.ts.map +1 -1
  57. package/dist/commands/backlog/index.js +5 -1
  58. package/dist/commands/backlog/rewrite-references.d.ts +41 -0
  59. package/dist/commands/backlog/rewrite-references.d.ts.map +1 -0
  60. package/dist/commands/backlog/rewrite-references.js +516 -0
  61. package/dist/commands/config/index.d.ts +1 -0
  62. package/dist/commands/config/index.d.ts.map +1 -1
  63. package/dist/commands/config/index.js +69 -34
  64. package/dist/commands/init/index.d.ts +6 -0
  65. package/dist/commands/init/index.d.ts.map +1 -1
  66. package/dist/commands/init/index.js +27 -4
  67. package/dist/commands/init/tools/index.d.ts +18 -1
  68. package/dist/commands/init/tools/index.d.ts.map +1 -1
  69. package/dist/commands/init/tools/index.js +84 -17
  70. package/dist/commands/init/tools/project-guidance.d.ts +19 -4
  71. package/dist/commands/init/tools/project-guidance.d.ts.map +1 -1
  72. package/dist/commands/init/tools/project-guidance.js +58 -15
  73. package/dist/commands/init/tools/workflows/index.d.ts.map +1 -1
  74. package/dist/commands/init/tools/workflows/index.js +5 -1
  75. package/dist/commands/instructions/instructions.types.d.ts +105 -4
  76. package/dist/commands/instructions/instructions.types.d.ts.map +1 -1
  77. package/dist/commands/instructions/instructions.types.js +4 -5
  78. package/dist/commands/instructions/instructions.utils.d.ts +161 -6
  79. package/dist/commands/instructions/instructions.utils.d.ts.map +1 -1
  80. package/dist/commands/instructions/instructions.utils.js +650 -12
  81. package/dist/commands/instructions/sync/sync.d.ts.map +1 -1
  82. package/dist/commands/instructions/sync/sync.js +256 -18
  83. package/dist/commands/instructions/validate/validate.d.ts.map +1 -1
  84. package/dist/commands/instructions/validate/validate.js +36 -8
  85. package/dist/commands/pjm/index.d.ts.map +1 -1
  86. package/dist/commands/pjm/index.js +19 -4
  87. package/dist/commands/pjm/init.d.ts +3 -0
  88. package/dist/commands/pjm/init.d.ts.map +1 -1
  89. package/dist/commands/pjm/init.js +23 -5
  90. package/dist/commands/shared/agents-md.d.ts +26 -5
  91. package/dist/commands/shared/agents-md.d.ts.map +1 -1
  92. package/dist/commands/shared/agents-md.js +182 -3
  93. package/dist/commands/tools/guidance/index.d.ts +15 -0
  94. package/dist/commands/tools/guidance/index.d.ts.map +1 -0
  95. package/dist/commands/tools/guidance/index.js +81 -0
  96. package/dist/commands/tools/index.d.ts.map +1 -1
  97. package/dist/commands/tools/index.js +2 -0
  98. package/dist/config/oat-config.d.ts +49 -3
  99. package/dist/config/oat-config.d.ts.map +1 -1
  100. package/dist/config/oat-config.js +107 -14
  101. package/dist/config/resolve.d.ts.map +1 -1
  102. package/dist/config/resolve.js +12 -2
  103. package/dist/providers/claude/dispatch-envelope.d.ts.map +1 -1
  104. package/dist/providers/claude/dispatch-envelope.js +1 -0
  105. package/dist/providers/claude/targets.d.ts +1 -0
  106. package/dist/providers/claude/targets.d.ts.map +1 -1
  107. package/dist/providers/claude/targets.js +3 -1
  108. package/dist/providers/codex/codec/shared.d.ts +3 -0
  109. package/dist/providers/codex/codec/shared.d.ts.map +1 -1
  110. package/dist/providers/codex/codec/shared.js +4 -0
  111. package/dist/providers/cursor/codec/catalog.d.ts +2 -2
  112. package/dist/providers/cursor/codec/catalog.d.ts.map +1 -1
  113. package/dist/providers/cursor/codec/catalog.js +45 -0
  114. package/dist/providers/cursor/codec/mapping-validation.d.ts +4 -0
  115. package/dist/providers/cursor/codec/mapping-validation.d.ts.map +1 -0
  116. package/dist/providers/cursor/codec/mapping-validation.js +25 -0
  117. package/dist/providers/cursor/codec/materialize.d.ts.map +1 -1
  118. package/dist/providers/cursor/codec/materialize.js +2 -11
  119. package/dist/providers/cursor/codec/sync-extension.d.ts.map +1 -1
  120. package/dist/providers/cursor/codec/sync-extension.js +2 -11
  121. package/package.json +2 -2
@@ -26,7 +26,9 @@ they choose to adopt a newer recommendation.
26
26
 
27
27
  A model can remain supported for a user's explicit configuration without being
28
28
  recommended by the new ladder. For example, this refresh keeps GPT-5.6 Codex
29
- and Cursor targets available while preferring GPT-6 in Codex. Claude Opus 4.8
29
+ and Cursor targets available while preferring GPT-6.1 Sol and GPT-6 Luna in
30
+ Codex. GPT-6 Sol remains supported for explicit compatibility configurations.
31
+ Claude Opus 4.8
30
32
  and 5.0 have left current supported generations and recommendations; historical
31
33
  probe records can still describe past behavior, clearly labeled as historical.
32
34
 
@@ -34,7 +36,11 @@ probe records can still describe past behavior, clearly labeled as historical.
34
36
 
35
37
  Check the provider's official model documentation and the local runtime before
36
38
  editing an ID or effort range. The [OpenAI model catalog](https://developers.openai.com/api/docs/models)
37
- lists GPT-6 Astra, Sol, and Luna. The
39
+ lists GPT-6.1 Sol and GPT-6 Astra, Sol, and Luna. The
40
+ [GPT-6.1 Sol model page](https://developers.openai.com/api/docs/models/gpt-6.1-sol)
41
+ identifies `gpt-6.1-sol` and supports `low`, `medium`, `high`, `xhigh`, and
42
+ `max`; `none` and `minimal` are not supported efforts for this family. Direct
43
+ API tool calls require the Responses API. The
38
44
  [Astra model page](https://developers.openai.com/api/docs/models/gpt-6-astra)
39
45
  names `gpt-6-astra` and documents `low`, `medium`, `high`, `xhigh`, and `max`;
40
46
  compare it with the installed Codex runtime model cache for the exact names and
@@ -42,7 +48,11 @@ local effort set. Catalog presence establishes support, not relative task
42
48
  quality. The
43
49
  [Anthropic Opus 5.5 documentation](https://www.anthropic.com/claude-opus-5-5)
44
50
  names `claude-opus-5-5`; confirm a Claude Code invocation reports that exact
45
- assistant model before admitting it to the Claude catalog. Claude subagent
51
+ assistant model before admitting it to the Claude catalog. The
52
+ [Sonnet 5.5 overview](https://platform.claude.com/docs/en/models/sonnet-5-5/overview)
53
+ and [effort reference](https://platform.claude.com/docs/en/build-with-claude/effort)
54
+ identify `claude-sonnet-5-5` and its five low-through-max efforts. Verify
55
+ Claude Code identity separately. Claude subagent
46
56
  `model` and `effort` frontmatter select a per-agent route; see the
47
57
  [Claude Code subagent fields](https://code.claude.com/docs/en/sub-agents).
48
58
  An API model announcement alone does not prove a third-party harness supports
@@ -66,14 +76,32 @@ The positive Sonnet control resolved, while invalid family and effort controls
66
76
  fell back to defaults. Five Opus 5.5 mappings are now approved for desktop
67
77
  subagents; the CLI result alone does not establish that the same bracket syntax
68
78
  works as a CLI top-level `--model` argument. Likewise, do not add GPT-6
69
- Cursor targets until that runtime lists and verifies them.
79
+ or GPT-6.1 Cursor targets until that runtime lists and verifies them.
70
80
 
71
81
  A 2026-09-25 desktop 3.21.18 probe added Grok 4.6 and Fable 5.1 mappings
72
82
  and moved the bundled Cursor ladder to them. The same probe showed Grok 4.7
73
- resolves only bare flat IDs, never bracket selectors, so it stays out of the
74
- catalogue; see [Verifying Cursor Pins](verifying-cursor-pins.md). See [Dispatch Policy](../workflows/projects/dispatch-ceiling.md#cursor-evidence-authority)
83
+ resolves only bare flat IDs, never bracket selectors. It still needs its own
84
+ approved registry entry and complete per-pin evidence before admission; see [Verifying Cursor Pins](verifying-cursor-pins.md). See [Dispatch Policy](../workflows/projects/dispatch-ceiling.md#cursor-evidence-authority)
75
85
  for the distinction between catalog, configured mapping, and runtime identity.
76
86
 
87
+ The October 1 refresh migrates Codex Sol defaults and examples to
88
+ `gpt-6.1-sol` while preserving existing effort choices, including medium for
89
+ intelligent recon. Claude Economy moves to `claude-sonnet-5-5` medium by user
90
+ direction. GPT-6 Sol and Sonnet 5 remain explicitly supported. Cursor lists
91
+ Sonnet 5.5 flat IDs at low through max. Cursor 3.22.12 native probes matched
92
+ those exact IDs at start, Shell execution, and stop while every Sonnet 5.5
93
+ bracket pin fell back to the account default. The existing Opus low control
94
+ matched; unknown-family and Sonnet `ultra` exact-ID controls fell back. The
95
+ fixture summary and event records at
96
+ `packages/cli/src/providers/cursor/codec/__fixtures__/cursor-pin-probe-2026-10-01{,-events}.jsonl`
97
+ retain both rounds. Ship explicit, evidence-backed exact-ID mappings for that family;
98
+ keep existing bracket mappings. An exact-ID mapping requires the same per-pin
99
+ native evidence and controls as a bracket mapping. Do not enable generic
100
+ pass-through of CLI IDs. Cursor does not list GPT-6 Sol or
101
+ GPT-6.1 Sol in the observed catalog. Do not carry Codex model IDs into Cursor
102
+ configurations. These selector changes do not import a separate vault policy
103
+ refresh or claim newly measured task-performance gains.
104
+
77
105
  ## Change and Validate
78
106
 
79
107
  1. Update the supported catalog for each verified runtime and its tests. Preserve
@@ -7,7 +7,8 @@ description: 'Runbook for probe-verifying a Cursor model pin before shipping it:
7
7
 
8
8
  A Cursor model pin maps an OAT ladder model ID to the frontmatter selector that
9
9
  materialized role files carry, for example `gpt-5.6-sol-medium` to
10
- `gpt-5.6-sol[reasoning=medium]`. Adding one to
10
+ `gpt-5.6-sol[reasoning=medium]`, or the verified exact ID
11
+ `claude-sonnet-5-5-medium`. Adding one to
11
12
  `packages/cli/src/providers/cursor/codec/catalog.ts` requires evidence that
12
13
  Cursor actually resolves that selector to the intended model.
13
14
 
@@ -81,10 +82,22 @@ flat IDs such as `grok-4.7-medium` resolved exactly. Two lessons follow:
81
82
  control and probe non-default rungs. Here even `effort=low,fast=false`
82
83
  landed on the high-fast default.
83
84
 
84
- Approved mappings are bracket-form only
85
- (`DR-260718-explicit-cursor-pin-mapping`), so Grok 4.7 has no mapping until
86
- that decision is revisited. The redacted evidence is in the same fixtures
87
- directory.
85
+ The 2026-10-01 revision of `DR-260718-explicit-cursor-pin-mapping` permits
86
+ verified exact-ID entries as well as bracket selectors. Grok 4.7 remains
87
+ outside the shipped catalog until its own entry is added and approved. The
88
+ redacted evidence is in the same fixtures directory.
89
+
90
+ The 2026-10-01 Sonnet 5.5 probe on Cursor 3.22.12 confirmed the same syntax
91
+ distinction: every `claude-sonnet-5-5[effort=...]` selector fell back to
92
+ `grok-4.7-high-fast`, but all five exact IDs
93
+ `claude-sonnet-5-5-low|medium|high|xhigh|max` resolved correctly. Both rounds
94
+ included a working Opus 5.5 low control and unknown-family and unsupported-effort
95
+ controls that fell back. The summary and 64 correlated native events are
96
+ retained beside the earlier fixtures.
97
+
98
+ [Cursor documents specific model IDs and bracket parameters](https://cursor.com/docs/subagents#model-configuration).
99
+ Choose a candidate from the live catalog, then probe its exact frontmatter
100
+ spelling. Documentation and catalog presence do not replace native evidence.
88
101
 
89
102
  ## Prerequisites
90
103
 
@@ -272,10 +285,19 @@ approved it:
272
285
 
273
286
  ```ts
274
287
  approvedMapping(
275
- 'gpt-5.6-sol-medium',
276
- 'gpt-5.6-sol[reasoning=medium]',
277
- 'gpt-reasoning',
278
- { probeName: 'zz-pin-probe-sol56-medium', verifiedAt: '2026-07-25', evidencePath: '...' },
288
+ 'claude-sonnet-5-5-medium',
289
+ 'claude-sonnet-5-5-medium',
290
+ 'explicit-model-id',
291
+ {
292
+ probeName: 'zz-pin-probe-sonnet55-flat-medium',
293
+ probeRecord: {
294
+ submittedSelector: 'claude-sonnet-5-5-medium',
295
+ resolvedModel: 'claude-sonnet-5-5-medium',
296
+ verifiedAt: '2026-10-01',
297
+ evidencePath:
298
+ 'packages/cli/src/providers/cursor/codec/__fixtures__/cursor-pin-probe-2026-10-01.jsonl',
299
+ },
300
+ },
279
301
  ),
280
302
  ```
281
303
 
@@ -287,6 +309,13 @@ than inheriting an approval that never covered the new selector.
287
309
  Retain the raw payloads alongside the summary. They are the primary evidence;
288
310
  the summary is an interpretation of them.
289
311
 
312
+ For an exact-ID mapping, use the `explicit-model-id` syntax family and a
313
+ mapping-specific probe record. The frontmatter selector must equal the ladder
314
+ ID, and the independently captured submitted selector and resolved model must
315
+ agree with both. Missing or mismatched evidence must fail materialization;
316
+ there is no generic model-ID pass-through. Preserve rejected selector results
317
+ and control observations alongside the successful rungs.
318
+
290
319
  ## Cleanup
291
320
 
292
321
  Delete every temporary artifact:
@@ -213,10 +213,11 @@ Purpose:
213
213
  Key behavior:
214
214
 
215
215
  - Read-only validation of nested project-scoped instruction directories
216
- - Supports `--strategy pointer|symlink|copy` to validate the expected file shape
217
- - Reports `ok`, `missing`, `content_mismatch`, and `stray` states
216
+ - Validates the effective strategy: `--strategy none|pointer|symlink|copy`, else `instructions.claude.shims`, else `none` (the default, which expects no `CLAUDE.md`); reports it as `strategy` under `--json`
217
+ - Reports `ok`, `missing` (shim strategies only), `content_mismatch`, `stray`, and, under `none`, `managed_shim` (drift sync removes) and `unmanaged` (kept, not drift)
218
218
  - Detects Claude-only adoptable directories and unreadable/broken instruction paths as drift
219
- - Skips the derived documentation content root and any `documentation.instructionPointerExcludes` paths, using the same exclusions as `oat instructions sync`
219
+ - Under `none`, warns about every remaining `CLAUDE.md`, `.claude/CLAUDE.md`, and `CLAUDE.local.md` (stderr, or the `warnings` array under `--json`) without changing the exit code
220
+ - Skips the derived documentation content root and any `instructions.claude.excludes` paths, using the same exclusions as `oat instructions sync`
220
221
  - Exit code `0` when all entries are valid, `1` when drift is detected
221
222
  - Detailed behavior: [`Instruction Sync`](instruction-sync.md)
222
223
 
@@ -229,12 +230,14 @@ Purpose:
229
230
  Key behavior:
230
231
 
231
232
  - Mutates by default; use `--dry-run` to preview changes
232
- - Supports `--strategy pointer|symlink|copy`
233
- - Creates missing `CLAUDE.md` files using the selected strategy
234
- - Adopts Claude-only stray files by writing canonical `AGENTS.md` content first, then regenerating `CLAUDE.md`
235
- - Skips mismatched files unless `--force` is provided
233
+ - Supports `--strategy none|pointer|symlink|copy` as a one-run override of `instructions.claude.shims` (default `none`)
234
+ - Under `none`, removes the `CLAUDE.md` shims OAT created (exact `@AGENTS.md` pointer, symlink to the sibling `AGENTS.md`, or byte-identical copy), re-verifying each immediately before deletion; hand-written or modified `CLAUDE.md` files are reported, never deleted, and while any `CLAUDE.md`, `.claude/CLAUDE.md`, or `CLAUDE.local.md` has content of its own, nothing is removed (`claude_md_blocks_shim_removal`)
235
+ - Under a shim strategy, creates missing `CLAUDE.md` files using that strategy
236
+ - Adopts Claude-only stray files by writing canonical `AGENTS.md` content first, then regenerating `CLAUDE.md` (shim strategies) or removing it (`none`)
237
+ - Under a shim strategy, skips mismatched files unless `--force` is provided
236
238
  - Skips unreadable canonical or Claude-only sources and reports manual-repair guidance instead of forcing recovery
237
- - Skips the documentation content tree (`<documentation.root>/docs` when that is a directory, otherwise `documentation.root`) plus any `documentation.instructionPointerExcludes` paths, so authored pages never receive pointers; app-level instruction files such as `apps/oat-docs/AGENTS.md` are still synced
239
+ - Skips the documentation content tree (`<documentation.root>/docs` when that is a directory, otherwise `documentation.root`) plus any `instructions.claude.excludes` paths, so authored pages never receive pointers; app-level instruction files such as `apps/oat-docs/AGENTS.md` are still synced
238
240
  - Never deletes an existing `CLAUDE.md` inside an excluded tree
241
+ - Under `none`, warns about every `CLAUDE.md` that remains after sync, including inside excluded trees, because any one of them makes Claude Code ignore every `AGENTS.md`
239
242
  - Uses pointer content `@AGENTS.md\n`, file symlinks, or hard copies depending on the selected strategy
240
243
  - Detailed behavior and examples: [`Instruction Sync`](instruction-sync.md)
@@ -1,19 +1,22 @@
1
1
  ---
2
2
  title: Instruction Sync
3
- description: Project-scoped AGENTS.md and CLAUDE.md validation, repair strategies, and Claude-only adoption.
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 aligned with sibling `CLAUDE.md` files throughout a repository tree.
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` / `CLAUDE.md` pairs
13
- - repair missing or drifted `CLAUDE.md` files with a chosen strategy
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
- - 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/`) get their sibling `CLAUDE.md` shims managed and validated like any other directory. The rest of `.oat/` (`templates/`, `projects/`, `sync/`) stays excluded.
26
- - It skips the documentation content tree by default, and any path you add to `documentation.instructionPointerExcludes`. See [Documentation trees](#documentation-trees) below.
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 keeps receiving its `CLAUDE.md` pointer. Opt
53
- the app root out explicitly if you do not want it synced.
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 `documentation.instructionPointerExcludes`, a list of
60
+ Add further paths with `instructions.claude.excludes`, a list of
56
61
  repository-relative directories. Set it with
57
- `oat config set documentation.instructionPointerExcludes "vendor,third_party/docs"`
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
- "instructionPointerExcludes": ["vendor", "third_party/docs"]
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. When any exclusion is configured, `--json` output carries three additional
119
- fields.
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 and then regenerating `CLAUDE.md`.
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 a non-default mode.
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
- - Use `--force` to overwrite mismatched `CLAUDE.md` files.
159
- - Reuses the selected strategy when creating or repairing `CLAUDE.md`.
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
- ## Supported Strategies
173
+ Both commands report the effective strategy as `strategy:` in human output and as the `strategy` field under `--json`.
162
174
 
163
- `CLAUDE.md` can be generated or validated in one of three modes:
175
+ ## Supported Strategies
164
176
 
165
- | Strategy | Expected `CLAUDE.md` shape | Notes |
166
- | --------- | -------------------------------- | --------------------------------------- |
167
- | `pointer` | file content `@AGENTS.md` | Default mode. Lightweight and explicit. |
168
- | `symlink` | file symlink to `AGENTS.md` | Uses a same-directory relative symlink. |
169
- | `copy` | hard copy of `AGENTS.md` content | Useful when symlinks are undesirable. |
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 discovered instruction pair matches the selected strategy. |
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. Regenerate `CLAUDE.md` using the selected strategy
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
- This means the original Claude instructions become canonical before the derived file is rewritten.
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 adopt nested Claude-only strays as pointer files:
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
  ```
@@ -26,11 +26,11 @@ description: 'Provider-specific path mappings for Claude, Cursor, Copilot, Gemin
26
26
  - Interactive `oat init` and `oat status` ask for an individual disposition for each unresolved Cursor-local skill: adopt it into `.agents/skills` or keep it Cursor-only and remember the exact path in sync config
27
27
  - Keep-local is blocked when a canonical skill has the same name because Cursor does not document a safe duplicate-resolution order
28
28
  - During upgrades, OAT removes only verified clean legacy managed skill views. Changed or replaced views are preserved, detached from manifest ownership, and offered for migration.
29
- - Sync materializes pinned Markdown definitions for both `oat-phase-implementer` and `oat-reviewer` in addition to the base roles, which sync like any other canonical agent at both scopes. Each generated name keeps the configured flat ladder ID, while an explicit verified mapping writes the separate bracket-form frontmatter model. OAT never derives one form from the other.
29
+ - Sync materializes pinned Markdown definitions for both `oat-phase-implementer` and `oat-reviewer` in addition to the base roles, which sync like any other canonical agent at both scopes. Each generated name keeps the configured flat ladder ID, while an explicit verified mapping writes its frontmatter model: a bracket-form selector for existing families or an exact ID for Sonnet 5.5. The supported catalogue contains 31 pins and 62 pinned role variants. OAT never derives a selector from the ladder ID or passes through an unregistered ID.
30
30
  - Generated definitions carry `supported-catalogue`, `project-config`, or `user-config` ownership. Project and supported output lives in the tracked `.cursor/agents` view; user-owned output lives under `~/.cursor/agents`. Cleanup reconciles only the applicable owner.
31
31
  - Managed dispatch requires `providers.cursor.dispatchArgs.variant` and launches that exact resolver-selected native agent type first. Skills do not pass a Task-level model argument or normalize Cursor model strings.
32
32
  - Cursor may silently fallback when a definition pin cannot be honored. Variant acceptance therefore establishes launcher-owned `configured` provenance only; runtime identity remains `not-reported` unless independently observed.
33
- - `oat doctor` checks whether each flat ID is still present in the current Cursor catalogue and reports availability drift. Catalogue availability is diagnostic and does not prove that a definition-level bracket pin ran as configured.
33
+ - `oat doctor` checks whether each flat ID is still present in the current Cursor catalogue and reports availability drift. Catalogue availability is diagnostic and does not prove that a definition-level pin ran as configured.
34
34
  - Rule files render as `.cursor/rules/*.mdc`
35
35
 
36
36
  === "Copilot"
@@ -59,7 +59,7 @@ description: 'Provider-specific path mappings for Claude, Cursor, Copilot, Gemin
59
59
  - `.codex/agents/<role>.toml`
60
60
  - `.codex/config.toml` (`[features] multi_agent = true`, `[agents.<role>]` upserts)
61
61
  - Codex role files include OAT managed provenance headers and are regenerated by `oat sync --scope project|user|all`
62
- - Project sync writes and maintains the version-controlled supported catalogue: GPT-6 Luna, Sol, and Astra at `low`, `medium`, `high`, `xhigh`, and `max`; GPT-5.6 Luna and Terra through `xhigh`; and GPT-5.6 Sol through `max`. Both `oat-phase-implementer` and `oat-reviewer` receive each supported pair (56 pinned variants). Sync writes files; it does not create a Git commit.
62
+ - Project sync writes and maintains the version-controlled supported catalogue: GPT-6.1 Sol and GPT-6 Luna, Sol, and Astra at `low`, `medium`, `high`, `xhigh`, and `max`; GPT-5.6 Luna and Terra through `xhigh`; and GPT-5.6 Sol through `max`. Both `oat-phase-implementer` and `oat-reviewer` receive each supported pair (66 pinned variants). Sync writes files; it does not create a Git commit.
63
63
  - Custom targets follow configuration provenance: user-config targets write only under `~/.codex`; shared, repo-local, and active-project targets write under the project's tracked `.codex` view.
64
64
  - User sync loads only the bundled canonical `oat-phase-implementer` and `oat-reviewer` definitions needed to expand user-config targets. It does not enable general user-agent mirroring, and it refuses stale user-role cleanup if either managed definition is unavailable.
65
65
  - Generated variants carry `supported-catalogue`, `user-config`, or `project-config` ownership. Cleanup removes stale entries only for the owner being reconciled and preserves other scopes plus unrelated Codex entries.
@@ -67,7 +67,7 @@ description: 'Provider-specific path mappings for Claude, Cursor, Copilot, Gemin
67
67
  - A single role can be materialized directly with `oat providers codex materialize <agent-name> --model <model-id> --effort <reasoning-effort>`; `--agent-path` selects a specific canonical markdown agent, `--role-name` overrides the generated role name, and `--scope user` writes a user-config-owned role.
68
68
  - Aggregate Codex config drift metadata (`aggregateConfigHash`) is emitted in sync/status codex extension output and intentionally not stored as a separate manifest row
69
69
  - Sync-time materialization is best effort; managed workflow correctness uses exact registered roles or a fresh child pinned to the resolved model plus reasoning effort with canonical role instructions. After a successful provider-visible file change, OAT conservatively advises starting a new Codex session so it has an opportunity to load the role. This repository policy is not a Codex hot-reload contract, an application-process restart requirement, or proof that the new session exposed the role.
70
- - Codex `max` is a first-class dispatch effort. It is supported for GPT-6 Luna, Sol, and Astra, plus GPT-5.6 Sol, for both implementer and reviewer roles.
70
+ - Codex `max` is a first-class dispatch effort. It is supported for GPT-6.1 Sol, GPT-6 Luna, Sol, and Astra, plus GPT-5.6 Sol, for both implementer and reviewer roles.
71
71
  - Codex multi-agent dispatch uses config-defined roles (`[agents.<name>]`) and `agent_type`
72
72
  - Codex subagent workflows require `[features] multi_agent = true` in active Codex config layers
73
73
  - Default managed Codex execution requires root (depth 0) → phase implementer (depth 1). `agents.max_depth >= 2` enables optional nested phase-agent work; sync and direct materialization still merge that capability floor without lowering a higher target value.
@@ -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/CLAUDE.md pointer, symlink, or copy integrity plus Claude-only adoption)
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