@open-agent-toolkit/cli 0.3.9 → 0.3.11

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 (193) hide show
  1. package/README.md +2 -1
  2. package/assets/bundle-metadata.json +1 -1
  3. package/assets/config/dispatch-matrix-recommendation.json +6 -6
  4. package/assets/docs/cli-utilities/configuration.md +12 -8
  5. package/assets/docs/cli-utilities/meta.json +13 -0
  6. package/assets/docs/cli-utilities/tool-packs.md +8 -2
  7. package/assets/docs/cli-utilities/workflow-gates.md +14 -1
  8. package/assets/docs/contributing/code.md +8 -2
  9. package/assets/docs/contributing/documentation.md +7 -1
  10. package/assets/docs/contributing/meta.json +15 -0
  11. package/assets/docs/contributing/updating-model-guidance.md +34 -6
  12. package/assets/docs/contributing/verifying-cursor-pins.md +38 -9
  13. package/assets/docs/docs-tooling/add-docs-to-a-repo.md +14 -5
  14. package/assets/docs/docs-tooling/commands.md +26 -8
  15. package/assets/docs/docs-tooling/meta.json +4 -0
  16. package/assets/docs/docs-tooling/workflows.md +2 -2
  17. package/assets/docs/guide/meta.json +4 -0
  18. package/assets/docs/meta.json +14 -0
  19. package/assets/docs/provider-sync/instruction-sync.md +8 -0
  20. package/assets/docs/provider-sync/meta.json +11 -0
  21. package/assets/docs/provider-sync/providers.md +4 -4
  22. package/assets/docs/provider-sync/scope-and-surface.md +3 -4
  23. package/assets/docs/reference/cli-reference.md +5 -2
  24. package/assets/docs/reference/docs-index-contract.md +22 -6
  25. package/assets/docs/reference/file-locations.md +7 -2
  26. package/assets/docs/reference/index.md +1 -1
  27. package/assets/docs/reference/meta.json +10 -0
  28. package/assets/docs/reference/troubleshooting.md +41 -6
  29. package/assets/docs/workflows/ideas/meta.json +4 -0
  30. package/assets/docs/workflows/meta.json +4 -0
  31. package/assets/docs/workflows/projects/cursor-cloud.md +8 -3
  32. package/assets/docs/workflows/projects/dispatch-ceiling.md +21 -14
  33. package/assets/docs/workflows/projects/evidence-layers.md +6 -8
  34. package/assets/docs/workflows/projects/implementation-execution.md +34 -5
  35. package/assets/docs/workflows/projects/lifecycle.md +7 -1
  36. package/assets/docs/workflows/projects/meta.json +25 -0
  37. package/assets/docs/workflows/projects/orchestration-model.md +5 -6
  38. package/assets/docs/workflows/skills/meta.json +10 -0
  39. package/assets/docs/workflows/skills/recon.md +28 -3
  40. package/assets/public-package-versions.json +4 -4
  41. package/assets/skills/oat-cursor-cloud-projects/SKILL.md +30 -16
  42. package/assets/skills/oat-dispatch-subagents/SKILL.md +4 -12
  43. package/assets/skills/oat-dispatch-subagents/references/managed-claude-example.json +1 -1
  44. package/assets/skills/oat-dispatch-subagents/references/provider-codex.md +51 -0
  45. package/assets/skills/oat-dispatch-subagents/references/provider-cursor.md +5 -2
  46. package/assets/skills/oat-dispatch-subagents/references/record-schema.md +8 -7
  47. package/assets/skills/oat-docs-analyze/SKILL.md +28 -3
  48. package/assets/skills/oat-docs-apply/SKILL.md +3 -3
  49. package/assets/skills/oat-docs-authoring/SKILL.md +1 -1
  50. package/assets/skills/oat-docs-authoring/references/oat-fumadocs-contract.md +5 -2
  51. package/assets/skills/oat-docs-bootstrap/SKILL.md +4 -3
  52. package/assets/skills/oat-docs-bootstrap/assets/AGENTS.md.template +3 -3
  53. package/assets/skills/oat-pjm-decision/SKILL.md +3 -2
  54. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +4 -4
  55. package/assets/skills/oat-project-complete/SKILL.md +47 -2
  56. package/assets/skills/oat-project-design/SKILL.md +10 -6
  57. package/assets/skills/oat-project-discover/SKILL.md +3 -3
  58. package/assets/skills/oat-project-dispatch-subagents/SKILL.md +3 -10
  59. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +4 -4
  60. package/assets/skills/oat-project-implement/SKILL.md +1 -1
  61. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +135 -3
  62. package/assets/skills/oat-project-implement/references/dispatch-and-dry-run.md +8 -10
  63. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +4 -4
  64. package/assets/skills/oat-project-implement/references/plan-and-resume.md +1 -1
  65. package/assets/skills/oat-project-import-plan/SKILL.md +3 -3
  66. package/assets/skills/oat-project-lite/references/docs/autonomy-contract.md +4 -4
  67. package/assets/skills/oat-project-new/SKILL.md +3 -3
  68. package/assets/skills/oat-project-next/SKILL.md +50 -7
  69. package/assets/skills/oat-project-plan/SKILL.md +4 -4
  70. package/assets/skills/oat-project-plan-writing/SKILL.md +4 -4
  71. package/assets/skills/oat-project-pr-final/SKILL.md +11 -1
  72. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +4 -4
  73. package/assets/skills/oat-project-promote-spec-driven/SKILL.md +2 -2
  74. package/assets/skills/oat-project-quick-start/SKILL.md +12 -8
  75. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +4 -4
  76. package/assets/skills/oat-project-retro/SKILL.md +6 -3
  77. package/assets/skills/oat-project-review-provide/SKILL.md +2 -2
  78. package/assets/skills/oat-project-review-provide-remote/SKILL.md +2 -2
  79. package/assets/skills/oat-project-spec/SKILL.md +3 -3
  80. package/assets/skills/oat-project-summary/SKILL.md +22 -3
  81. package/assets/skills/oat-repo-improve/SKILL.md +2 -2
  82. package/assets/skills/recon/SKILL.md +24 -3
  83. package/assets/skills/recon/references/packet-contract.md +36 -6
  84. package/assets/skills/recon/references/profiles.md +3 -0
  85. package/assets/skills/recon/references/worker-contract.md +16 -3
  86. package/assets/skills/recon/scripts/create-review-brief.mjs +17 -86
  87. package/assets/skills/recon/scripts/lib/contracts.mjs +158 -41
  88. package/assets/skills/recon/scripts/lib/review-binding.mjs +123 -0
  89. package/assets/skills/recon/scripts/lib/routing.mjs +5 -2
  90. package/assets/skills/recon/scripts/reconcile-ledger.mjs +18 -7
  91. package/assets/skills/recon/scripts/render-packet.mjs +93 -1
  92. package/assets/skills/recon/scripts/validate-packet.mjs +119 -88
  93. package/assets/skills/subagent-orchestration/SKILL.md +1 -1
  94. package/assets/skills/subagent-orchestration/references/evidence-and-refresh.md +20 -8
  95. package/assets/skills/subagent-orchestration/references/provider-claude.md +25 -12
  96. package/assets/skills/subagent-orchestration/references/provider-codex.md +27 -18
  97. package/assets/skills/subagent-orchestration/references/provider-cursor.md +40 -10
  98. package/assets/templates/state.md +1 -0
  99. package/dist/commands/backlog/new.d.ts +2 -2
  100. package/dist/commands/backlog/new.d.ts.map +1 -1
  101. package/dist/commands/backlog/new.js +2 -2
  102. package/dist/commands/decision/new.d.ts +2 -2
  103. package/dist/commands/decision/new.d.ts.map +1 -1
  104. package/dist/commands/decision/new.js +2 -2
  105. package/dist/commands/docs/nav/contents.d.ts +9 -0
  106. package/dist/commands/docs/nav/contents.d.ts.map +1 -1
  107. package/dist/commands/docs/nav/contents.js +7 -2
  108. package/dist/commands/docs/nav/fumadocs.d.ts +51 -0
  109. package/dist/commands/docs/nav/fumadocs.d.ts.map +1 -0
  110. package/dist/commands/docs/nav/fumadocs.js +301 -0
  111. package/dist/commands/docs/nav/sync.d.ts +31 -1
  112. package/dist/commands/docs/nav/sync.d.ts.map +1 -1
  113. package/dist/commands/docs/nav/sync.js +163 -6
  114. package/dist/commands/index.d.ts.map +1 -1
  115. package/dist/commands/index.js +2 -0
  116. package/dist/commands/instructions/instructions.utils.d.ts +19 -0
  117. package/dist/commands/instructions/instructions.utils.d.ts.map +1 -1
  118. package/dist/commands/instructions/instructions.utils.js +89 -17
  119. package/dist/commands/instructions/sync/sync.d.ts.map +1 -1
  120. package/dist/commands/instructions/sync/sync.js +49 -2
  121. package/dist/commands/pjm/init.d.ts.map +1 -1
  122. package/dist/commands/pjm/init.js +2 -2
  123. package/dist/commands/project/closeout-check/closeout-invariant.d.ts +97 -0
  124. package/dist/commands/project/closeout-check/closeout-invariant.d.ts.map +1 -0
  125. package/dist/commands/project/closeout-check/closeout-invariant.js +301 -0
  126. package/dist/commands/project/closeout-check/index.d.ts +38 -0
  127. package/dist/commands/project/closeout-check/index.d.ts.map +1 -0
  128. package/dist/commands/project/closeout-check/index.js +117 -0
  129. package/dist/commands/project/complete-state/index.d.ts +4 -0
  130. package/dist/commands/project/complete-state/index.d.ts.map +1 -1
  131. package/dist/commands/project/complete-state/index.js +11 -13
  132. package/dist/commands/project/dispatch/index.d.ts.map +1 -1
  133. package/dist/commands/project/dispatch/index.js +6 -30
  134. package/dist/commands/project/dispatch/record.d.ts +9 -18
  135. package/dist/commands/project/dispatch/record.d.ts.map +1 -1
  136. package/dist/commands/project/dispatch/record.js +15 -212
  137. package/dist/commands/project/index.d.ts.map +1 -1
  138. package/dist/commands/project/index.js +2 -0
  139. package/dist/commands/project/new/scaffold.d.ts +0 -1
  140. package/dist/commands/project/new/scaffold.d.ts.map +1 -1
  141. package/dist/commands/project/new/scaffold.js +19 -20
  142. package/dist/commands/project/promote/promote.d.ts +2 -2
  143. package/dist/commands/project/promote/promote.d.ts.map +1 -1
  144. package/dist/commands/project/promote/promote.js +13 -11
  145. package/dist/commands/shared/frontmatter.d.ts +21 -0
  146. package/dist/commands/shared/frontmatter.d.ts.map +1 -1
  147. package/dist/commands/shared/frontmatter.js +70 -4
  148. package/dist/commands/shared/template-source.d.ts +29 -0
  149. package/dist/commands/shared/template-source.d.ts.map +1 -0
  150. package/dist/commands/{pjm → shared}/template-source.js +24 -7
  151. package/dist/commands/state/generate.js +2 -2
  152. package/dist/commands/template/index.d.ts +10 -0
  153. package/dist/commands/template/index.d.ts.map +1 -0
  154. package/dist/commands/template/index.js +87 -0
  155. package/dist/commands/template/resolve.d.ts +31 -0
  156. package/dist/commands/template/resolve.d.ts.map +1 -0
  157. package/dist/commands/template/resolve.js +86 -0
  158. package/dist/fs/io.d.ts +0 -41
  159. package/dist/fs/io.d.ts.map +1 -1
  160. package/dist/fs/io.js +2 -414
  161. package/dist/providers/claude/dispatch-envelope.d.ts.map +1 -1
  162. package/dist/providers/claude/dispatch-envelope.js +1 -0
  163. package/dist/providers/claude/targets.d.ts +1 -0
  164. package/dist/providers/claude/targets.d.ts.map +1 -1
  165. package/dist/providers/claude/targets.js +3 -1
  166. package/dist/providers/codex/codec/shared.d.ts +3 -0
  167. package/dist/providers/codex/codec/shared.d.ts.map +1 -1
  168. package/dist/providers/codex/codec/shared.js +4 -0
  169. package/dist/providers/cursor/codec/catalog.d.ts +2 -2
  170. package/dist/providers/cursor/codec/catalog.d.ts.map +1 -1
  171. package/dist/providers/cursor/codec/catalog.js +45 -0
  172. package/dist/providers/cursor/codec/mapping-validation.d.ts +4 -0
  173. package/dist/providers/cursor/codec/mapping-validation.d.ts.map +1 -0
  174. package/dist/providers/cursor/codec/mapping-validation.js +25 -0
  175. package/dist/providers/cursor/codec/materialize.d.ts.map +1 -1
  176. package/dist/providers/cursor/codec/materialize.js +2 -11
  177. package/dist/providers/cursor/codec/sync-extension.d.ts.map +1 -1
  178. package/dist/providers/cursor/codec/sync-extension.js +2 -11
  179. package/dist/providers/identity/absolute-paths.d.ts +4 -13
  180. package/dist/providers/identity/absolute-paths.d.ts.map +1 -1
  181. package/dist/providers/identity/absolute-paths.js +4 -17
  182. package/dist/providers/identity/generic-dispatch-record.d.ts +1 -1
  183. package/dist/providers/identity/generic-dispatch-record.js +2 -2
  184. package/dist/providers/identity/oat-dispatch-record.d.ts +4 -357
  185. package/dist/providers/identity/oat-dispatch-record.d.ts.map +1 -1
  186. package/dist/providers/identity/oat-dispatch-record.js +4 -236
  187. package/dist/release/public-package-contract.d.ts.map +1 -1
  188. package/dist/release/public-package-contract.js +12 -4
  189. package/dist/validation/skills.d.ts.map +1 -1
  190. package/dist/validation/skills.js +32 -6
  191. package/package.json +2 -2
  192. package/dist/commands/pjm/template-source.d.ts +0 -14
  193. package/dist/commands/pjm/template-source.d.ts.map +0 -1
@@ -5,7 +5,7 @@ disable-model-invocation: false
5
5
  user-invocable: true
6
6
  allowed-tools: Read, Write, Bash, Glob, Grep
7
7
  metadata:
8
- version: 1.1.2
8
+ version: 1.1.3
9
9
  ---
10
10
 
11
11
  # OAT in Cursor Cloud
@@ -183,7 +183,7 @@ commands from the target repository or pass their supported project path.
183
183
 
184
184
  ### Step 3: Resolve Assets with User Scope First
185
185
 
186
- Apply one source order independently to every asset file:
186
+ Apply one source order independently to every skill and script file:
187
187
 
188
188
  1. user scope;
189
189
  2. target-repository scope when the user asset is absent;
@@ -191,18 +191,30 @@ Apply one source order independently to every asset file:
191
191
 
192
192
  User locations:
193
193
 
194
- | Asset | User source |
195
- | -------- | --------------------------- |
196
- | Skill | `~/.agents/skills/<skill>/` |
197
- | Template | `~/.oat/templates/<file>` |
198
- | Script | `~/.oat/scripts/<file>` |
194
+ | Asset | User source |
195
+ | ------ | --------------------------- |
196
+ | Skill | `~/.agents/skills/<skill>/` |
197
+ | Script | `~/.oat/scripts/<file>` |
199
198
 
200
- Repository locations are `.agents/skills/`, `.oat/templates/`, and
201
- `.oat/scripts/` within the target repository.
199
+ Repository locations are `.agents/skills/` and `.oat/scripts/` within the
200
+ target repository.
202
201
 
203
- The user tier is provisioned from `@latest` at environment boot and is the
204
- canonical execution tier. Repository copies in this fleet are not customized;
205
- a difference indicates staleness, not a local override.
202
+ For skills and scripts, the user tier is provisioned from `@latest` at
203
+ environment boot and is the canonical execution tier. Repository copies of
204
+ skills and scripts in this fleet are not customized; a difference indicates
205
+ staleness, not a local override.
206
+
207
+ Templates are the exception. They resolve repository, then user, then bundled,
208
+ the same order every lifecycle skill uses, because a repository template is an
209
+ owner override. Resolve them only through the CLI, run from the target
210
+ repository:
211
+
212
+ ```bash
213
+ oat template resolve <name> --json # report the tier
214
+ oat template resolve <name> --output "<destination>" # copy the template
215
+ ```
216
+
217
+ Do not read `~/.oat/templates/` directly or choose a template tier by hand.
206
218
 
207
219
  #### Absolute-path loading contract
208
220
 
@@ -213,7 +225,6 @@ Therefore, resolve and read the selected user asset by absolute path as the
213
225
 
214
226
  ```bash
215
227
  USER_SKILLS_ROOT="${HOME}/.agents/skills"
216
- USER_TEMPLATES_ROOT="${HOME}/.oat/templates"
217
228
  USER_SCRIPTS_ROOT="${HOME}/.oat/scripts"
218
229
  ```
219
230
 
@@ -238,8 +249,9 @@ It never chooses the source:
238
249
  - if freshness is safety-critical, refresh and re-verify before continuing;
239
250
  stop if the user tier cannot be refreshed safely.
240
251
 
241
- Never silently switch to the repo copy. Apply per-file precedence to templates
242
- and scripts without using skill semver as their arbitration mechanism.
252
+ Never silently switch to the repo copy. Apply per-file precedence to scripts
253
+ without using skill semver as their arbitration mechanism; templates follow
254
+ `oat template resolve`.
243
255
 
244
256
  ### Step 4: Load Cursor Dispatch Context When Needed
245
257
 
@@ -328,7 +340,9 @@ separate dispatch surface and snapshot its current catalog. See
328
340
  - ✅ `oat` was verified before project artifact work.
329
341
  - ✅ The project home is anchored inside the target repository in both single-
330
342
  and multi-repo environments.
331
- - ✅ Existing user assets won independently for skills, templates, and scripts.
343
+ - ✅ Existing user assets won independently for skills and scripts.
344
+ - ✅ Templates were resolved through `oat template resolve` (repository, user,
345
+ then bundled).
332
346
  - ✅ Skill version comparison verified freshness without changing source.
333
347
  - ✅ User assets were read by absolute path as the primary mechanism.
334
348
  - ✅ Cursor dispatch mechanics remained delegated to the canonical provider
@@ -5,7 +5,7 @@ disable-model-invocation: true
5
5
  user-invocable: false
6
6
  allowed-tools: Read
7
7
  metadata:
8
- version: 1.2.10
8
+ version: 1.2.12
9
9
  ---
10
10
 
11
11
  # Dispatching OAT Subagents
@@ -176,17 +176,9 @@ terminal outcome, not a pre-start rejection, and must be recorded through
176
176
  `provesNoChildStarted: true`, and no fallback is authorized.
177
177
 
178
178
  The calling workflow records each launch in its own run record (request ID,
179
- `Dispatch:` stamp, launch status, terminal outcome). Writing a per-dispatch file with `oat project dispatch record` is optional and off by default: no lifecycle skill or command consumes those files, so do not write them unless the host has explicitly opted in. A host that has opted
180
- in passes the validated record and event on standard input:
181
-
182
- ```bash
183
- oat project dispatch record \
184
- --project "$PROJECT_PATH" \
185
- --event-file - \
186
- --json
187
- ```
188
-
189
- The command validates and persists evidence only. It never launches a provider.
179
+ `Dispatch:` stamp, launch status, terminal outcome); that run record is the
180
+ only launch record. `oat project dispatch record --event-file - --json`
181
+ validates a record and event and writes nothing. It never launches a provider.
190
182
 
191
183
  ## Capability and Authorization
192
184
 
@@ -1,5 +1,5 @@
1
1
  {
2
- "description": "Managed Claude validation-only inputs for `oat project dispatch record --event-file <file> --json` (no --project). Each role key is one complete input. claudeLaunch.resolution is `oat project dispatch-ceiling resolve --provider claude --role <role> --json` output verbatim; claudeLaunch.definition is the generated Claude agent file content; claudeLaunch.payload is the exact launch payload; event is `oat project dispatch canonical-role --json` output. Built from fixture agents, so the definition body, role version, and content digest are illustrative. See record-schema.md, Managed Claude Validation Input.",
2
+ "description": "Managed Claude validation-only inputs for `oat project dispatch record --event-file <file> --json`. Each role key is one complete input. claudeLaunch.resolution is `oat project dispatch-ceiling resolve --provider claude --role <role> --json` output verbatim; claudeLaunch.definition is the generated Claude agent file content; claudeLaunch.payload is the exact launch payload; event is `oat project dispatch canonical-role --json` output. Built from fixture agents, so the definition body, role version, and content digest are illustrative. See record-schema.md, Managed Claude Validation Input.",
3
3
  "implementer": {
4
4
  "claudeLaunch": {
5
5
  "resolution": {
@@ -110,3 +110,54 @@ Add a service tier or reasoning mode only through controls shown by the current
110
110
  CLI/schema. Honor the caller's authorization boundary. Record every selector
111
111
  as configured invocation evidence; do not infer runtime identity from process
112
112
  success alone.
113
+
114
+ ## Agent-Limit Rejections and v2 Residency
115
+
116
+ A native spawn rejected with `agent thread limit reached`
117
+ (`AgentLimitReached`) before any child is accepted is a pre-start
118
+ provider/dispatch outcome, not a worker failure, and not by itself evidence of
119
+ cumulative or lifetime thread exhaustion. The v2 lifecycle facts below are
120
+ cited from the openai/codex `rust-v0.159.2` tag; re-check them when the
121
+ installed Codex version changes.
122
+
123
+ - Before returning `AgentLimitReached`, v2 admission tries to unload an eligible
124
+ resident. A resident is eligible only when it is completed, errored, or
125
+ interrupted, has no active turn, has no pending mailbox items, and holds no
126
+ residency lock
127
+ ([`residency.rs` L99-L120](https://github.com/openai/codex/blob/rust-v0.159.2/codex-rs/core/src/agent/control/residency.rs#L99-L120),
128
+ [eligibility L266-L272](https://github.com/openai/codex/blob/rust-v0.159.2/codex-rs/core/src/agent/control/residency.rs#L266-L272)).
129
+ A visible completed status does not prove eligibility: status does not
130
+ expose mailbox state, active-turn cleanup, or residency locks.
131
+ - The v2 toolset exposes `interrupt_agent`, which interrupts work but does not
132
+ unregister the agent. Older toolsets expose `close_agent`
133
+ ([`spec_plan.rs`](https://github.com/openai/codex/blob/rust-v0.159.2/codex-rs/core/src/tools/spec_plan.rs)).
134
+ Never present `interrupt_agent` as a close or release.
135
+ - A queue-only message to a completed v2 agent can pin it by leaving a pending
136
+ mailbox item
137
+ ([openai/codex#32353](https://github.com/openai/codex/issues/32353)). Do not
138
+ message completed agents to clean them up.
139
+ - Reports of completed residents blocking replacement are nondeterministic
140
+ ([openai/codex#44351](https://github.com/openai/codex/issues/44351)), and
141
+ older open-thread quota behavior
142
+ ([openai/codex#22779](https://github.com/openai/codex/issues/22779)) is a
143
+ different mechanism. Do not conflate either with v2 residency eviction.
144
+
145
+ On a pre-acceptance agent-limit rejection:
146
+
147
+ 1. Keep every accepted artifact and record the exact rejection as a
148
+ provider/dispatch outcome.
149
+ 2. Inspect the available lifecycle tools and statuses. Release only completed
150
+ agents whose output is already retained, and only through a close or release
151
+ tool the live toolset supports; never close the root or an active required
152
+ lane.
153
+ 3. Do not archive or delete sessions to free capacity. Archive availability
154
+ does not prove that it releases a v2 residency slot.
155
+ 4. Make at most one admission retry, only when the caller's approved dispatch
156
+ envelope allows retries and after the eligibility check above. A wait result
157
+ or a completed status alone does not justify another attempt.
158
+ 5. If admission still fails, use an alternate route only when the caller
159
+ already approved it; otherwise stop and return the partial result for a
160
+ concrete continuation amendment.
161
+
162
+ No retry or route changes model, effort, role behavior, data authority, output
163
+ limits, or reviewer blindness. Never rerun an accepted lane to free capacity.
@@ -46,8 +46,11 @@ prohibited.
46
46
 
47
47
  Outer lifecycle implementer and reviewer dispatch uses the exact
48
48
  `providers.cursor.dispatchArgs.variant` returned by the lifecycle resolver.
49
- The resolver maps an opaque flat model ID and owns the bracket-form model pin
50
- inside the materialized definition; skills never parse, normalize, or
49
+ The resolver maps an opaque flat model ID to the mapping's explicit frontmatter
50
+ pin inside the materialized definition. Existing families keep their verified
51
+ bracket-form pins; Sonnet 5.5 uses verified exact-ID pins. Each exact ID needs
52
+ its own native evidence and approved registry entry: this is not generic
53
+ pass-through of any CLI catalog ID. Skills never parse, normalize, or
51
54
  reconstruct either model string.
52
55
 
53
56
  1. Require a non-empty resolver-returned variant for managed dispatch.
@@ -212,7 +212,7 @@ selection source.
212
212
 
213
213
  Before every managed, effort-pinned Claude implementer or reviewer launch,
214
214
  `oat-project-implement` runs `oat project dispatch record --event-file <file>
215
- --json` without `--project` and requires `status: validated-only`. That input
215
+ --json` and requires `status: validated-only`. That input
216
216
  replaces `record` with three top-level keys:
217
217
 
218
218
  - `claudeLaunch`, an object with three keys of its own:
@@ -361,10 +361,10 @@ be traded against another:
361
361
  strings; and
362
362
  - at most 16 KiB serialized per field.
363
363
 
364
- The whole record is additionally capped at 64 KiB, measured as the **published**
365
- bytes — the pretty-printed JSON plus trailing newline that is actually written
366
- to the journal, not compact `JSON.stringify` output. The two differ by roughly a
367
- tenth on a nested record, so size against the published form. Per-field
364
+ The whole record is additionally capped at 64 KiB, measured as the **serialized**
365
+ document — the pretty-printed JSON plus trailing newline, not compact
366
+ `JSON.stringify` output. The two differ by roughly a tenth on a nested record,
367
+ so size against the serialized form. Per-field
368
368
  projection limits above remain compact measurements, because they bound the
369
369
  shape of a field rather than the size of a file. A realistically rich record
370
370
  measures a few kilobytes, so these limits bind prompt bodies, transcripts, and
@@ -376,8 +376,9 @@ cannot fully account for is treated as sensitive rather than classified on a
376
376
  partial token. Store references, identifiers, and digests; never role content, message bodies,
377
377
  or credentials.
378
378
 
379
- Absolute filesystem paths are handled by field class, because the journal is
380
- committed and a home path in it is permanent:
379
+ Absolute filesystem paths are handled by field class, because the validated
380
+ record is printed verbatim and a caller may copy it into a committed artifact,
381
+ where a home path is permanent:
381
382
 
382
383
  - **Identity and control fields reject them.** `caller`, `scope`, every
383
384
  selector, `selected_route`, the `guidance_*` fields, `authority`,
@@ -3,9 +3,9 @@ name: oat-docs-analyze
3
3
  description: Run when you need to evaluate documentation structure, navigation, and coverage against the OAT docs app contract. Produces a severity-rated analysis artifact for oat-docs-apply.
4
4
  disable-model-invocation: true
5
5
  user-invocable: true
6
- allowed-tools: Read, Write, Bash(git:*), Glob, Grep, AskUserQuestion, Task
6
+ allowed-tools: Read, Write, Bash(git:*), Bash(oat docs nav sync --check:*), Glob, Grep, AskUserQuestion, Task
7
7
  metadata:
8
- version: 1.5.2
8
+ version: 1.6.0
9
9
  ---
10
10
 
11
11
  # Docs Analysis
@@ -386,6 +386,31 @@ If a generated root index or manifest exists:
386
386
  files, and representative links for each finding.
387
387
  5. Prefer source-of-truth fixes over generated-file edits.
388
388
 
389
+ If the app is Fumadocs (a `source.config.ts` beside `docs/`), its sidebar comes from
390
+ `docs/**/meta.json` files that `oat docs nav sync` generates from `## Contents`:
391
+
392
+ 1. Flag a docs directory with an `index.md` but no `meta.json` as a missing
393
+ generated artifact.
394
+ 2. Flag a `meta.json` whose `pages` order or entries differ from that directory's
395
+ `## Contents` (immediate pages and child folders by name, `index` first in the
396
+ docs root and in any `root: true` folder, other targets as `[Title](url)` link
397
+ entries) as stale; the fix is to rerun `oat docs nav sync`.
398
+ 3. Flag a `"..."` or `"z...a"` rest entry as a hand edit; nav sync output is strict.
399
+ 4. Flag pages that no `## Contents` map lists: under strict `meta.json` they are
400
+ hidden from the sidebar. Recommend listing them, not adding a rest entry.
401
+ 5. During analysis, run only the read-only check, with `--check` first and
402
+ `--target-dir` set to the resolved docs app directory (the directory that
403
+ holds `source.config.ts` and `docs/`, such as `apps/oat-docs`, not its `docs/`
404
+ content root):
405
+
406
+ ```bash
407
+ oat docs nav sync --check --target-dir <docs-app-dir>
408
+ ```
409
+
410
+ It writes nothing, names stale `meta.json` files and unlisted pages, and exits
411
+ 1 when either exists. The skill grants only this `--check` form; plain
412
+ `oat docs nav sync` writes files and is not part of analysis.
413
+
389
414
  If `mkdocs.yml` exists:
390
415
 
391
416
  1. Compare nav entries with the docs tree.
@@ -394,7 +419,7 @@ If `mkdocs.yml` exists:
394
419
  4. Flag directories whose `index.md` `## Contents` section appears inconsistent with nav structure.
395
420
  5. Flag docs guidance that claims structure, plugin support, or workflow rules not backed by current repo evidence.
396
421
 
397
- If no `mkdocs.yml` exists, record whether the repo should be migrated to an OAT docs app.
422
+ If neither `mkdocs.yml` nor a Fumadocs app exists, record whether the repo should be migrated to an OAT docs app.
398
423
 
399
424
  ### Step 7: Severity-Rate Findings
400
425
 
@@ -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.3.1
8
+ version: 1.3.2
9
9
  ---
10
10
 
11
11
  # Docs Apply
@@ -34,7 +34,7 @@ Generate or update documentation files from a docs analysis artifact, with expli
34
34
  **ALLOWED Activities:**
35
35
 
36
36
  - Reading analysis artifacts and the current docs surface.
37
- - Creating or updating docs files and `mkdocs.yml` when approved.
37
+ - Creating or updating docs files and `mkdocs.yml` when approved. Fumadocs `meta.json` files change only through `oat docs nav sync`.
38
38
  - Running `oat docs nav sync` after approved structural changes.
39
39
  - Creating branches, commits, and optional PRs.
40
40
 
@@ -203,7 +203,7 @@ For each approved recommendation:
203
203
  When approved actions involve docs app creation or nav updates:
204
204
 
205
205
  - Use `oat docs init` for scaffolding when appropriate.
206
- - Use `oat docs nav sync` instead of manually editing nav when the CLI helper can generate it.
206
+ - Use `oat docs nav sync` instead of manually editing nav when the CLI helper can generate it. In Fumadocs apps it writes strict `meta.json` files and reports pages no `## Contents` map lists (`unlisted` in `--json`); resolve a reported page through an approved `## Contents` change, never by hand-editing `meta.json`.
207
207
 
208
208
  Negative rules:
209
209
 
@@ -6,7 +6,7 @@ disable-model-invocation: false
6
6
  allowed-tools: Read, Write, Bash, Glob, Grep, AskUserQuestion
7
7
  user-invocable: true
8
8
  metadata:
9
- version: 1.0.1
9
+ version: 1.0.2
10
10
  ---
11
11
 
12
12
  # OAT Docs Authoring
@@ -60,8 +60,11 @@ authored docs tree. Treat it as generated output.
60
60
  - Asset-only directories do not need `index.md` unless local guidance says so.
61
61
  - Build output, hidden tool directories, and generated artifacts are not content
62
62
  directories.
63
- - Optional Fumadocs metadata files, such as `meta.json`, may refine sidebar
64
- presentation when local style uses them. They do not replace `## Contents`.
63
+ - Fumadocs `meta.json` files are generated by `oat docs nav sync` from each
64
+ directory's `## Contents`, not hand-authored. After structural changes, rerun
65
+ nav sync and commit the result; it never adds a `"..."` rest entry, so list a
66
+ page in `## Contents` to show it in the sidebar. Keys nav sync does not own,
67
+ such as `icon` or `defaultOpen`, may be added by hand and are preserved.
65
68
  - Preserve local audience routers, ownership notes, and app-shell
66
69
  customizations.
67
70
 
@@ -6,7 +6,7 @@ disable-model-invocation: true
6
6
  user-invocable: true
7
7
  allowed-tools: Read, Write, Edit, Bash, Glob, Grep, AskUserQuestion
8
8
  metadata:
9
- version: 1.2.1
9
+ version: 1.2.2
10
10
  ---
11
11
 
12
12
  # Docs Bootstrap
@@ -930,10 +930,11 @@ Narrate:
930
930
 
931
931
  - **The authored source** at `<appRoot>/docs/index.md`. This is the file the user edits. It has frontmatter (`title`, `description`) and a `## Contents` section listing direct children of the docs root. It is the top of a fractal: every directory has its own `index.md`, each with its own `## Contents`.
932
932
  - **The Fumadocs generated map** at `<appRoot>/index.md`. Regenerated on every `predev` / `prebuild` by the `oat docs generate-index` command. Machine-shaped: inventories Markdown files with titles and descriptions so tools have a single searchable map. **Hand-edits are silently clobbered.**
933
+ - **The Fumadocs sidebar navigation** in `<appRoot>/docs/**/meta.json`. `oat docs nav sync` writes one per docs directory from that directory's `## Contents` order, and the files are committed. Navigation is strict: a page no `## Contents` map lists stays out of the sidebar and the command reports it, so the fix is to list the page, never to edit `meta.json` by hand.
933
934
  - **The MkDocs derived nav** in `mkdocs.yml` `nav:`. MkDocs does not use a Fumadocs-style generated app-root manifest; its generated/derived navigation boundary is the YAML nav block.
934
935
  - **How to tell them apart when opening a file.** If the file sits inside `docs/`, it's authored. If it sits at `<appRoot>/index.md` (outside `docs/`), it's the Fumadocs generated manifest — and when the CLI wrote the warning correctly, the first line is `<!-- AUTOGENERATED by \`oat docs generate-index\`... -->`.
935
936
 
936
- End with: "Always edit `docs/index.md` and the `## Contents` sections. In Fumadocs, never edit the root-level `index.md` — your edits will disappear next build. In MkDocs, treat `mkdocs.yml` `nav:` as derived from authored Contents unless the local workflow says otherwise."
937
+ End with: "Always edit `docs/index.md` and the `## Contents` sections. In Fumadocs, never edit the root-level `index.md` — your edits will disappear next build — and regenerate `meta.json` with `oat docs nav sync` instead of editing it. In MkDocs, treat `mkdocs.yml` `nav:` as derived from authored Contents unless the local workflow says otherwise."
937
938
 
938
939
  #### Section C (both frameworks) — The `## Contents` contract
939
940
 
@@ -944,7 +945,7 @@ Narrate:
944
945
  - **Every directory under `docs/` has an `index.md`.** No exceptions, no `overview.md`, no README-as-index. Missing `index.md`s are the first thing `oat-docs-analyze` flags.
945
946
  - **Every `index.md` has a `## Contents` section.** The section is a plain Markdown bulleted list of links to the direct children of that directory — both subdirectory `index.md`s and leaf pages.
946
947
  - **Link targets use `.md` extensions.** Leaf pages link as `[Title](page.md)`; subdirectories link as `[Section](subdir/index.md)`. The `@open-agent-toolkit/docs-transforms` remark-links plugin normalizes these at build time for Fumadocs routing (`.md` stripped; `dir/index.md` collapsed to `dir`). `.md`-suffixed authored links render correctly **and** let agents follow each link to the target file without path inference — the best of both worlds.
947
- - **The `## Contents` section is the machine-readable local map.** For Fumadocs, it remains the authored navigation intent that agents maintain and compare against the generated app-root manifest. For MkDocs, `oat docs nav sync` reads it to update `mkdocs.yml` `nav:`. `oat-docs-analyze` reads the same authored source to find orphaned pages and stale generated artifacts.
948
+ - **The `## Contents` section is the machine-readable local map.** For Fumadocs, `oat docs nav sync` reads it to write the committed `meta.json` sidebar files, and agents compare it against the generated app-root manifest. For MkDocs, `oat docs nav sync` reads it to update `mkdocs.yml` `nav:`. `oat-docs-analyze` reads the same authored source to find orphaned pages and stale generated artifacts.
948
949
  - **Anything not listed in `## Contents` is invisible to the tooling.** Adding a Markdown file is not enough — it must also appear under the parent `index.md`'s `## Contents`.
949
950
 
950
951
  Show the user their own `docs/index.md` `## Contents` as a concrete example (read the file and paste the relevant 5–15 lines). If `patchesApplied` includes an `FP-16` entry with `status: 'applied'`, mention it — the skill rewrote the scaffold's extension-less links to `.md`-suffixed form so agents can follow them. Then note: "That's the pattern. Every directory you create from now on follows the same shape — `.md`-suffixed links, bulleted list, dash-separated summary per entry."
@@ -12,13 +12,13 @@ This file tells agents how to work inside `{{APP_DIR}}`, the documentation app f
12
12
  2. Add frontmatter with at minimum `title:` and `description:`. The title drives nav display and page `<title>`; the description drives search previews, social cards, and sibling summaries. Empty descriptions hurt all three.
13
13
  3. Update the nearest `index.md`'s `## Contents` section to include a link to the new page. Use `.md`-suffixed relative links: `[Title](page.md)` for leaf pages, `[Section](subdir/index.md)` for subdirectories. The `@open-agent-toolkit/docs-transforms` remark-links plugin normalizes these for Fumadocs routing at build time (strips `.md`, collapses `dir/index.md` → `dir`), so the suffixed form renders correctly **and** lets agents follow links to the target file without path inference. The `## Contents` section is the machine-readable local map — anything not listed there is effectively invisible to the navigation tooling.
14
14
  4. If the new page introduces a new subdirectory, create an `index.md` in that subdirectory with its own `## Contents` section. Every content directory must have an `index.md`.
15
- 5. Regenerate the derived navigation artifact for this framework. For Fumadocs, run the generated-index command (`{{GENERATE_INDEX_CMD}}`) so the app-root `index.md` manifest reflects the current Markdown file tree. For MkDocs, run `oat docs nav sync` or the local equivalent so `mkdocs.yml` `nav:` reflects authored `## Contents`. Derived artifacts never replace the authored `## Contents`; keep authored maps current and compare generated output against them when checking freshness.
15
+ 5. Regenerate the derived navigation artifacts for this framework. For Fumadocs, run `oat docs nav sync` (from the app directory, or with `--target-dir <app-dir>`) so the committed `docs/**/meta.json` sidebar files follow authored `## Contents`, and run the generated-index command (`{{GENERATE_INDEX_CMD}}`) so the app-root `index.md` manifest reflects the current Markdown file tree. Fumadocs nav sync is strict: a page no `## Contents` map lists stays out of the sidebar and is reported, so list the new page rather than editing `meta.json`. For MkDocs, run `oat docs nav sync` or the local equivalent so `mkdocs.yml` `nav:` reflects authored `## Contents`. Derived artifacts never replace the authored `## Contents`; keep authored maps current and compare generated output against them when checking freshness.
16
16
 
17
17
  ## When you need to restructure navigation
18
18
 
19
19
  1. Make changes in the authored `## Contents` sections of each affected `index.md`. That is the authoritative local map.
20
- 2. Do **not** hand-edit generated navigation artifacts. The Fumadocs app-root `index.md` manifest, `mkdocs.yml` `nav:` (for MkDocs), and any other derived nav file is rewritten by the local generation workflow.
21
- 3. After editing `## Contents`, run the framework's generation command to refresh derived artifacts.
20
+ 2. Do **not** hand-edit generated navigation artifacts. The Fumadocs app-root `index.md` manifest, Fumadocs `meta.json` files, `mkdocs.yml` `nav:` (for MkDocs), and any other derived nav file is rewritten by the local generation workflow.
21
+ 3. After editing `## Contents`, run `oat docs nav sync` and the framework's generation command to refresh derived artifacts.
22
22
  4. If you're moving pages between directories, update both source and destination `index.md` `## Contents` entries in the same commit so the site isn't broken mid-way through history.
23
23
  5. If you're reparenting an entire subtree, consider whether the moved directory's own `index.md` needs a revised "scope" paragraph.
24
24
 
@@ -5,7 +5,7 @@ disable-model-invocation: false
5
5
  user-invocable: true
6
6
  allowed-tools: Read, Write, Bash, Glob, Grep, AskUserQuestion
7
7
  metadata:
8
- version: 1.1.1
8
+ version: 1.1.2
9
9
  ---
10
10
 
11
11
  # Record Repo Decision
@@ -90,7 +90,8 @@ The CLI:
90
90
 
91
91
  - Generates a deterministic `DR-YYMMDD-slug` ID from the creation date and title.
92
92
  - Writes one record file whose filename stem equals the ID.
93
- - Strips template frontmatter and seeds the body from `.oat/templates/decision.md`.
93
+ - Strips template frontmatter and seeds the body from the `decision.md` template, resolved
94
+ repository (`.oat/templates/`), then user (`~/.oat/templates/`), then bundled.
94
95
  - Regenerates the managed decision index.
95
96
 
96
97
  The slug is **capped at 30 characters** at the last whole-word boundary, with trailing