@open-agent-toolkit/cli 0.3.21 → 0.3.23

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 (130) hide show
  1. package/assets/bundle-metadata.json +1 -1
  2. package/assets/docs/docs-tooling/add-docs-to-a-repo.md +3 -9
  3. package/assets/docs/reference/cli-reference.md +8 -3
  4. package/assets/docs/reference/configuration.md +3 -0
  5. package/assets/docs/reference/oat-directory-structure.md +1 -1
  6. package/assets/docs/reference/project-artifacts.md +141 -2
  7. package/assets/docs/reference/project-state-machine.md +2 -2
  8. package/assets/docs/workflows/advanced/autonomy.md +29 -12
  9. package/assets/docs/workflows/advanced/cursor-cloud.md +20 -6
  10. package/assets/docs/workflows/advanced/workflow-gates.md +9 -0
  11. package/assets/docs/workflows/projects/closeout/closeout-skills.md +24 -5
  12. package/assets/docs/workflows/projects/closeout/retro.md +6 -2
  13. package/assets/docs/workflows/projects/execution/implementation-execution.md +18 -4
  14. package/assets/docs/workflows/projects/execution/index.md +1 -1
  15. package/assets/docs/workflows/projects/execution/picking-up-projects.md +3 -2
  16. package/assets/docs/workflows/projects/execution/project-log.md +100 -11
  17. package/assets/docs/workflows/projects/lifecycle.md +3 -3
  18. package/assets/docs/workflows/projects/reviews/index.md +18 -0
  19. package/assets/public-package-versions.json +4 -4
  20. package/assets/skills/oat-cursor-cloud-projects/SKILL.md +12 -8
  21. package/assets/skills/oat-cursor-cloud-projects/references/cursor-cloud-mechanics.md +63 -2
  22. package/assets/skills/oat-docs/SKILL.md +14 -28
  23. package/assets/skills/oat-docs-analyze/SKILL.md +4 -2
  24. package/assets/skills/oat-docs-analyze/references/legacy-scaffold-checks.md +16 -0
  25. package/assets/skills/oat-docs-apply/SKILL.md +2 -2
  26. package/assets/skills/oat-docs-authoring/SKILL.md +2 -2
  27. package/assets/skills/oat-docs-authoring/references/lifecycle-boundaries.md +1 -2
  28. package/assets/skills/oat-docs-authoring/references/mkdocs-to-oat-fumadocs-refactor-guide.md +73 -0
  29. package/assets/skills/oat-docs-bootstrap/SKILL.md +44 -310
  30. package/assets/skills/oat-project-autonomous/SKILL.md +88 -26
  31. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +1 -1
  32. package/assets/skills/oat-project-brief/SKILL.md +1 -1
  33. package/assets/skills/oat-project-brief/references/brief-contract.md +33 -27
  34. package/assets/skills/oat-project-brief/references/docs/autonomy-contract.md +1 -1
  35. package/assets/skills/oat-project-complete/SKILL.md +142 -25
  36. package/assets/skills/oat-project-complete-auto/SKILL.md +4 -4
  37. package/assets/skills/oat-project-dispatch-subagents/SKILL.md +10 -5
  38. package/assets/skills/oat-project-document/SKILL.md +1 -1
  39. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +1 -1
  40. package/assets/skills/oat-project-goal/SKILL.md +63 -15
  41. package/assets/skills/oat-project-goal/references/docs/autonomy-contract.md +1 -1
  42. package/assets/skills/oat-project-implement/SKILL.md +6 -6
  43. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +28 -7
  44. package/assets/skills/oat-project-implement/references/dispatch-and-dry-run.md +10 -5
  45. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +1 -1
  46. package/assets/skills/oat-project-implement/references/phase-execution.md +23 -9
  47. package/assets/skills/oat-project-implement/references/plan-and-resume.md +4 -4
  48. package/assets/skills/oat-project-lite/SKILL.md +1 -1
  49. package/assets/skills/oat-project-lite/references/docs/autonomy-contract.md +1 -1
  50. package/assets/skills/oat-project-pr-final/SKILL.md +6 -1
  51. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +1 -1
  52. package/assets/skills/oat-project-pr-progress/SKILL.md +6 -1
  53. package/assets/skills/oat-project-quick-start/SKILL.md +1 -1
  54. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +1 -1
  55. package/assets/skills/oat-project-reconcile/SKILL.md +13 -19
  56. package/assets/skills/oat-project-retro/SKILL.md +5 -2
  57. package/assets/skills/oat-project-retro/references/evidence-and-lanes.md +9 -3
  58. package/assets/skills/oat-project-review-provide/SKILL.md +28 -3
  59. package/assets/skills/oat-project-review-receive/SKILL.md +32 -18
  60. package/assets/skills/oat-project-review-receive-remote/SKILL.md +10 -6
  61. package/assets/skills/oat-project-revise/SKILL.md +9 -2
  62. package/assets/skills/oat-project-summary/SKILL.md +166 -37
  63. package/assets/skills/oat-worktree-bootstrap-auto/SKILL.md +3 -3
  64. package/assets/templates/docs-app-fuma/docs/contributing.md +6 -0
  65. package/assets/templates/docs-app-fuma/docs/getting-started.md +1 -1
  66. package/assets/templates/docs-app-fuma/next.config.js +5 -1
  67. package/assets/templates/implementation-brief.md +5 -36
  68. package/assets/templates/implementation.md +11 -81
  69. package/assets/templates/project-log.md +2 -31
  70. package/assets/templates/project-retro.md +4 -1
  71. package/assets/templates/summary.md +13 -5
  72. package/dist/commands/config/index.d.ts.map +1 -1
  73. package/dist/commands/config/index.js +44 -1
  74. package/dist/commands/docs/analyze.js +1 -1
  75. package/dist/commands/docs/apply.js +1 -1
  76. package/dist/commands/docs/init/scaffold.d.ts.map +1 -1
  77. package/dist/commands/docs/init/scaffold.js +35 -2
  78. package/dist/commands/project/archive/archive-utils.d.ts +205 -8
  79. package/dist/commands/project/archive/archive-utils.d.ts.map +1 -1
  80. package/dist/commands/project/archive/archive-utils.js +708 -44
  81. package/dist/commands/project/archive/index.d.ts.map +1 -1
  82. package/dist/commands/project/archive/index.js +1 -0
  83. package/dist/commands/project/archive/push-runner.d.ts +9 -1
  84. package/dist/commands/project/archive/push-runner.d.ts.map +1 -1
  85. package/dist/commands/project/archive/push-runner.js +56 -18
  86. package/dist/commands/project/archive/sync-runner.d.ts +28 -0
  87. package/dist/commands/project/archive/sync-runner.d.ts.map +1 -1
  88. package/dist/commands/project/archive/sync-runner.js +44 -22
  89. package/dist/commands/project/complete-state/index.d.ts.map +1 -1
  90. package/dist/commands/project/complete-state/index.js +45 -0
  91. package/dist/commands/project/dispatch/index.d.ts.map +1 -1
  92. package/dist/commands/project/dispatch/index.js +24 -2
  93. package/dist/commands/project/dispatch/record.d.ts +54 -1
  94. package/dist/commands/project/dispatch/record.d.ts.map +1 -1
  95. package/dist/commands/project/dispatch/record.js +229 -1
  96. package/dist/commands/project/index.d.ts.map +1 -1
  97. package/dist/commands/project/index.js +2 -0
  98. package/dist/commands/project/journal-check/evaluator.d.ts +17 -0
  99. package/dist/commands/project/journal-check/evaluator.d.ts.map +1 -0
  100. package/dist/commands/project/journal-check/evaluator.js +140 -0
  101. package/dist/commands/project/journal-check/index.d.ts +34 -0
  102. package/dist/commands/project/journal-check/index.d.ts.map +1 -0
  103. package/dist/commands/project/journal-check/index.js +163 -0
  104. package/dist/commands/project/journal-check/rules.d.ts +68 -0
  105. package/dist/commands/project/journal-check/rules.d.ts.map +1 -0
  106. package/dist/commands/project/journal-check/rules.js +994 -0
  107. package/dist/commands/project/journal-check/types.d.ts +63 -0
  108. package/dist/commands/project/journal-check/types.d.ts.map +1 -0
  109. package/dist/commands/project/journal-check/types.js +26 -0
  110. package/dist/commands/project/log/append.d.ts +6 -0
  111. package/dist/commands/project/log/append.d.ts.map +1 -1
  112. package/dist/commands/project/log/append.js +114 -6
  113. package/dist/commands/project/log/check.d.ts +23 -1
  114. package/dist/commands/project/log/check.d.ts.map +1 -1
  115. package/dist/commands/project/log/check.js +20 -3
  116. package/dist/commands/project/log/grammar.d.ts +37 -0
  117. package/dist/commands/project/log/grammar.d.ts.map +1 -1
  118. package/dist/commands/project/log/grammar.js +72 -0
  119. package/dist/commands/project/log/rollup.d.ts +87 -1
  120. package/dist/commands/project/log/rollup.d.ts.map +1 -1
  121. package/dist/commands/project/log/rollup.js +257 -5
  122. package/dist/config/oat-config.d.ts +14 -0
  123. package/dist/config/oat-config.d.ts.map +1 -1
  124. package/dist/config/oat-config.js +17 -0
  125. package/dist/config/resolve.d.ts.map +1 -1
  126. package/dist/config/resolve.js +5 -1
  127. package/dist/providers/identity/generic-dispatch-record.d.ts +33 -0
  128. package/dist/providers/identity/generic-dispatch-record.d.ts.map +1 -1
  129. package/dist/providers/identity/generic-dispatch-record.js +60 -1
  130. package/package.json +2 -2
@@ -11,16 +11,20 @@ would otherwise remain in agent transcripts, then roll that evidence into
11
11
  tracked project and repository references before archiving the project.
12
12
 
13
13
  The command group is the only supported writer for the artifact. Do not edit
14
- entries or the synthesis section by hand.
14
+ entries or the synthesis section by hand. A new log starts with a two-line
15
+ header that links to this page; the entry contract lives here and in
16
+ `oat project log append --help` rather than in every log.
15
17
 
16
18
  ## Configure project logs
17
19
 
18
- Two workflow keys control the feature:
20
+ Four workflow keys control the feature:
19
21
 
20
- | Key | Values | Default |
21
- | ------------------------------- | ------------------------ | --------------------------------------------- |
22
- | `workflow.projectLog` | `auto`, `true`, `false` | `auto` |
23
- | `workflow.projectLogLedgerPath` | repository-relative path | `.oat/repo/reference/project-observations.md` |
22
+ | Key | Values | Default |
23
+ | -------------------------------------- | ------------------------ | --------------------------------------------- |
24
+ | `workflow.projectLog` | `auto`, `true`, `false` | `auto` |
25
+ | `workflow.projectLogLedgerPath` | repository-relative path | `.oat/repo/reference/project-observations.md` |
26
+ | `workflow.projectLogDigest.maxEntries` | positive integer | `12` |
27
+ | `workflow.projectLogDigest.maxLines` | positive integer | `60` |
24
28
 
25
29
  ```bash
26
30
  oat config set workflow.projectLog auto --shared
@@ -35,6 +39,12 @@ current config value.
35
39
  For one scaffold operation, `oat project new --with-project-log` forces
36
40
  creation and `--no-project-log` suppresses it.
37
41
 
42
+ The two `workflow.projectLogDigest` keys bound the Workflow Observations digest
43
+ that roll-up writes into `summary.md` (see
44
+ [Promote and roll up observations](#promote-and-roll-up-observations)). They
45
+ are siblings of `workflow.projectLog`, resolve independently of it, and accept
46
+ only positive integers.
47
+
38
48
  ## Append entries
39
49
 
40
50
  Judgment entries capture evidence about the project or reusable workflow:
@@ -57,6 +67,48 @@ Judgment flags:
57
67
  - `--version-note <text>` — adds an `observed on` clause
58
68
  - `--project <path>` — optional when an active project resolves
59
69
 
70
+ ### Learning entries
71
+
72
+ A judgment entry can carry a learning category and a stable source identity.
73
+ Autonomous, cloud and goal runs record their learnings this way, so the log is
74
+ the one place learnings live; summary and retro read these entries first and a
75
+ legacy `oat-execution-learnings.md` second.
76
+
77
+ ```bash
78
+ oat project log append \
79
+ --project .oat/projects/shared/example \
80
+ --type friction --scope project --area "cloud cache misses" \
81
+ --category environment-limited \
82
+ --source obs-2026-10-11-cache \
83
+ --origin oat-project-autonomous \
84
+ --idempotency-key obs-2026-10-11-cache \
85
+ --body "Observation: the runner cache missed on every run. Impact: builds doubled. Recommendation: warm the cache in setup."
86
+ ```
87
+
88
+ - `--category <category>` — one of `gotcha`, `efficiency`,
89
+ `documentation-gap`, `candidate-skill-content`, `decision`, or
90
+ `environment-limited`, carried verbatim. Any other value is refused, and
91
+ `--category` without `--source` is refused.
92
+ - `--source <id>` — the stable per-observation source id, one word. Pass the
93
+ same id as `--idempotency-key` and a retried write appends nothing; the key
94
+ is found in the `**Source:**` line, so the body need not repeat it.
95
+ - `--origin <producer>` — the producer that recorded the learning.
96
+
97
+ These flags write a body head above the body:
98
+
99
+ ```text
100
+ **Category:** environment-limited
101
+ **Source:** obs-2026-10-11-cache
102
+ **Origin:** oat-project-autonomous
103
+ **Recorded:** 2026-10-11T14:03:22Z
104
+ ```
105
+
106
+ The heading grammar and the four judgment types are unchanged, and an entry
107
+ written without these flags is stored exactly as before. The flags are refused
108
+ on structural entries.
109
+
110
+ ### Structural entries
111
+
60
112
  Structural entries record lifecycle events without duplicating larger
61
113
  artifacts:
62
114
 
@@ -185,7 +237,10 @@ oat project log check --project .oat/projects/shared/example --json
185
237
 
186
238
  `check` reports whether the log is absent, ready, or still awaiting synthesis;
187
239
  entry counts by class, type, and scope; the last entry date; and invalid
188
- hand-written headings. It reads only `project-log.md`.
240
+ hand-written headings. It reads `project-log.md` and checks only for the
241
+ presence of the legacy learnings file: `learnings` is `legacy` when the project
242
+ still has `oat-execution-learnings.md` (summary and retro read it after the
243
+ log) and `none` otherwise, in every status including `absent`.
189
244
 
190
245
  It also reports whether the log carries a completion seal:
191
246
 
@@ -253,16 +308,50 @@ oat project log rollup \
253
308
  --json
254
309
  ```
255
310
 
256
- `rollup` writes or updates `## Workflow Observations` in `summary.md` and
257
- appends `general` judgments to `workflow.projectLogLedgerPath`. Ledger entries
311
+ `rollup` writes a bounded observations digest into `summary.md` and appends
312
+ `general` judgments to `workflow.projectLogLedgerPath`. Ledger entries
258
313
  deduplicate by date and area. The command is idempotent.
259
314
 
315
+ The digest is a projection, not a copy:
316
+
317
+ - Only judgment entries qualify. Structural entries are provenance and stay in
318
+ the log; they are counted, never rendered.
319
+ - Entries are ordered newest first, then `decision` and `gotcha` categories
320
+ ahead of the rest, then by heading text, and taken while both bounds hold:
321
+ at most `workflow.projectLogDigest.maxEntries` items and at most
322
+ `workflow.projectLogDigest.maxLines` lines for the whole section. Entries
323
+ beyond the bound are counted in a one-line trailer, never copied.
324
+ - Each item is concise: a line with date, type, area, scope, category and the
325
+ entry's source locator, then the first observation sentence and any
326
+ limitation or uncertainty line. A recommendation is rendered only for an
327
+ uncategorized entry; a categorized learning's recommendation belongs to the
328
+ summary's Autonomous Execution Learnings section, and the digest adds a
329
+ one-line cross-reference to it.
330
+ - The locator is a plain token, never a link:
331
+ `oat-project:<slug>#<entry-id>`, where the entry id is
332
+ `<date>-<type>-<area slug>-<n>` and `n` counts entries sharing that date,
333
+ type and area slug in log order. Archive export finalizes the token to the
334
+ archive identity.
335
+ - Live `.oat/projects/<scope>/<slug>/…` paths in rendered text are replaced by
336
+ a `(project file …)` label that keeps the project-relative remainder.
337
+ - When no judgment entry qualifies, the section is omitted: an existing
338
+ Workflow Observations section is removed and none is created.
339
+
340
+ The digest never feeds the ledger. Ledger graduation reads the complete
341
+ judgment set, so a `general` lesson the digest bound left out still graduates.
342
+
260
343
  The structured result contains:
261
344
 
262
345
  - `status`: `ok`, `failed`, or `ambiguous`
263
- - `summarySection`: `written` or `updated`
346
+ - `summarySection`: `written`, `updated`, or `omitted`
264
347
  - `ledgerOutcome`: `appended`, `deduplicated`, `skipped_permitted`, or `failed`
265
- - `entriesRolledUp`: number of log entries written to the summary section
348
+ - `entriesRolledUp`: number of log entries read, structural and judgment
349
+ - `digest`: the bounds used (`maxEntries`, `maxLines`), the `rendered` count,
350
+ `omitted` counts (`overBound`, `structural`, and `malformed` for a heading
351
+ that matches neither grammar and was skipped individually),
352
+ `omittedEntries` (the locator tokens of over-bound entries, no bodies), and
353
+ `byProducer` rendered/omitted counts keyed by a judgment's `**Origin:**` (or
354
+ `unattributed`) or a structural entry's producer
266
355
 
267
356
  An `ambiguous` result carries only `status` and an `ambiguity` reason, and exits
268
357
  1: the log's structure has two readings, so no count would mean anything and
@@ -66,7 +66,7 @@ Implementation closeout has one authoritative order:
66
66
  4. Run the configured pre-approval sequence.
67
67
  5. Record final HiLL approval when the final phase is a checkpoint.
68
68
  6. Run the configured post-approval sequence.
69
- 7. Mark implementation complete and emit the implementation success output.
69
+ 7. Check the journal (`oat project journal check --at implement-preflight`), then mark implementation complete and emit the implementation success output.
70
70
 
71
71
  The configured exit gate is independent from the mandatory lifecycle review,
72
72
  root-owned phase reviews, and optional `oat_phase_review_gate`. It must reach an
@@ -91,7 +91,7 @@ After implementation closeout finishes:
91
91
  - GitHub PR feedback delegates to `oat-project-review-receive-remote`
92
92
  - Review artifacts delegate to `oat-project-review-receive`
93
93
  - After revision tasks complete, state returns to `pr_open`
94
- 5. **Complete** (`oat-project-complete`) — accepts any phase status (`pr_open`, `complete`, `in_progress`), auto-refreshes `summary.md` before closeout when needed, and archives when selected by the workflow preference or completion prompt. Before any completion write it runs the read-only `oat project closeout-check`: a configured, autonomous, or lite closeout whose `oat_post_implement_sequence` snapshot is missing, malformed, or incomplete stops and routes back to `oat-project-implement`, and `oat project complete-state` refuses the same state. There is no override; see the [CLI reference](../../reference/cli-reference.md).
94
+ 5. **Complete** (`oat-project-complete`) — accepts `pr_open` or `complete` (an `in_progress` project is routed back to `oat-project-implement`, because the journal and `state.md` must agree at completion), auto-refreshes `summary.md` before closeout when needed, and archives when selected by the workflow preference or completion prompt. Before any completion write it runs the read-only `oat project closeout-check`: a configured, autonomous, or lite closeout whose `oat_post_implement_sequence` snapshot is missing, malformed, or incomplete stops and routes back to `oat-project-implement`, and `oat project complete-state` refuses the same state. There is no override for that invariant. Completion then refreshes the journal's Final Summary and `summary.md` prose from observed facts, runs the summary staged, and validates the journal with `oat project journal check --at completion` before any roll-up, seal, archive or lifecycle write; a refusal stops completion with the reason, line and owner, and `complete-state` rechecks the same evaluator before its write. A journal-only override line under `## Deviations from Plan / Design` can cover an authorized gap such as lost commit evidence, never the closeout invariant; see the [CLI reference](../../reference/cli-reference.md) and [Project Artifacts](../../reference/project-artifacts.md#the-implementation-journal).
95
95
 
96
96
  ### Project-recap gate (non-lite)
97
97
 
@@ -157,7 +157,7 @@ On completion, OAT treats archive handling as an explicit closeout choice:
157
157
  - If `.oat/config.json` sets `archive.awsProfile` and/or `archive.awsRegion`, those values are forwarded to every `aws` invocation triggered by completion (preflight checks + `aws s3 sync`) and override any ambient shell `AWS_PROFILE` / `AWS_DEFAULT_PROFILE` / `AWS_REGION` / `AWS_DEFAULT_REGION` values. The repo's archive-scoped credentials are treated as deliberate intent so users don't have to unset shell env vars before running completion. See [`config-and-local-state.md`](../../reference/config-and-local-state.md) for the full precedence chain.
158
158
  - If `.oat/config.json` sets `archive.summaryExportPath`, completion copies `summary.md` to `<archive.summaryExportPath>/20260401-<project>.md`.
159
159
  - Missing or unusable AWS CLI configuration blocks synced terminal cleanup when S3 durability is configured; when S3 sync is not configured, it is not part of the durability requirement.
160
- - `oat repo archive sync` can later sync all archived projects, or one named archived project, back down from S3; it selects the latest dated remote snapshot and materializes it into the local bare archive tree.
160
+ - `oat repo archive sync` can later sync all archived projects, or one named archived project, back down from S3, materializing each snapshot into the local bare archive tree under its full local name (generation 2 of `<project>` restores to `<project>-g2`, never over generation 1). Archive names follow one contract, `<project>[-gN][-<scope>]` locally and `<YYYYMMDD>-<project>[-gN][-<scope>]` in S3, where `-<scope>` appears only when another scope's archive already held the unqualified name. An unnamed sync restores the latest dated snapshot of every local archive. A named sync takes an exact snapshot name first, then a full generation name such as `<project>-g2` or `<project>-g2-local`, then a generation family: `<project>-<scope>` restores that scope's latest generation, and the base `<project>` restores every family of the project (the unqualified one and each scope-qualified one) at its latest generation, then latest date. A project whose own name ends in `-gN` or `-<scope>` reads as that generation or qualifier, so its name can resolve to the same archive directory as a shorter-named project's; sync it by exact snapshot name to remove the ambiguity.
161
161
  - Persisted archive metadata binds the snapshot to the source-ref SHA, allowing
162
162
  an interrupted closeout or legacy complete record to resume without
163
163
  rematerializing an active project. Dashboard and list surfaces omit fully
@@ -259,6 +259,24 @@ Final review `passed` gate requires:
259
259
  A goal milestone delivery is gated by its passed, fresh integrated review and
260
260
  exit carrier rather than by a `final` row.
261
261
 
262
+ ## Receipts in the journal
263
+
264
+ `oat-project-review-receive` writes one receipt per received review: a
265
+ phase-scoped receipt in that phase's section of `implementation.md`, a final,
266
+ multi-phase, milestone or remote (PR) receipt under `## Reviews and Gates`,
267
+ never after `## References`. Each receipt lists every finding's identity and
268
+ substance, its disposition and rationale, the fix task or approved deferral it
269
+ links to, and the final outcome; approved deferrals are also lines under
270
+ `## Deferred Findings`. The review file path is a local-only citation: reviews
271
+ are not archived, so the journal and plan must stand without it, and an
272
+ unresolved review path is never a completion defect.
273
+
274
+ Code reviews run `oat project journal check --at review --scope <phases>`
275
+ first; its reasons reach the reviewer in the Review Scope. A finding that a
276
+ mechanical pointer or projection refresh resolves (stale overview totals, a
277
+ run line to re-render, a lagging resume pointer) is refresh-only and belongs to
278
+ closeout's refresh, never a fix task.
279
+
262
280
  ## Complexity review at budget exhaustion
263
281
 
264
282
  When a review or gate budget runs out, another round of the same review is
@@ -1,6 +1,6 @@
1
1
  {
2
- "cli": "0.3.21",
3
- "docs-config": "0.3.21",
4
- "docs-theme": "0.3.21",
5
- "docs-transforms": "0.3.21"
2
+ "cli": "0.3.23",
3
+ "docs-config": "0.3.23",
4
+ "docs-theme": "0.3.23",
5
+ "docs-transforms": "0.3.23"
6
6
  }
@@ -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.3
8
+ version: 1.1.4
9
9
  ---
10
10
 
11
11
  # OAT in Cursor Cloud
@@ -33,7 +33,8 @@ end-to-end requests route to `oat-project-autonomous` after orientation.
33
33
 
34
34
  - A shell and Node/npm are available.
35
35
  - Read `references/cursor-cloud-mechanics.md` only when model-family identity,
36
- dispatch-surface catalogs, or degraded review evidence is needed.
36
+ dispatch-surface catalogs, degraded review evidence, or a learning write is
37
+ needed.
37
38
 
38
39
  ## Mode Assertion
39
40
 
@@ -62,7 +63,7 @@ context without taking ownership of a lifecycle phase.
62
63
  - Verifying or installing the supported OAT CLI.
63
64
  - Comparing skill versions as a freshness check.
64
65
  - Loading Cursor mechanics and org-layer context skills when relevant.
65
- - Recording environment anomalies and degraded routes in project learnings.
66
+ - Recording environment anomalies and degraded routes as project-log learnings.
66
67
 
67
68
  **Self-Correction Protocol:**
68
69
 
@@ -243,9 +244,10 @@ user version >= repo version
243
244
  It never chooses the source:
244
245
 
245
246
  - user version equal to or higher than repo → read the user copy;
246
- - repo version higher than user → still read the user copy, append an anomaly
247
- to `oat-execution-learnings.md`, and flag the user tier for refresh with
248
- `oat tools update` or an environment rebuild;
247
+ - repo version higher than user → still read the user copy, record the anomaly
248
+ as a learning through the project-log learning write in
249
+ `references/cursor-cloud-mechanics.md` (Learning Write), and flag the user
250
+ tier for refresh with `oat tools update` or an environment rebuild;
249
251
  - if freshness is safety-critical, refresh and re-verify before continuing;
250
252
  stop if the user tier cannot be refreshed safely.
251
253
 
@@ -283,8 +285,10 @@ the provider dispatch algorithm.
283
285
  environment when integrated systems require them. Do not hard-depend on,
284
286
  name, or emulate an absent org layer.
285
287
  - When an expected skill, MCP server, CLI surface, or credential is absent,
286
- record the gap in the active project's `oat-execution-learnings.md`. Continue
287
- only through a documented integrity-preserving route.
288
+ record the gap as a learning in the active project's `project-log.md` through
289
+ the Learning Write in `references/cursor-cloud-mechanics.md`; with the
290
+ project log disabled it warns once and records nothing. Continue only through
291
+ a documented integrity-preserving route.
288
292
 
289
293
  Return an orientation summary:
290
294
 
@@ -92,10 +92,71 @@ That provider reference owns Cursor launch, acceptance, continuation, retry,
92
92
  and recovery mechanics. `oat-project-dispatch-subagents` owns lifecycle scope
93
93
  and policy adaptation. Do not duplicate those contracts here.
94
94
 
95
+ ## Learning Write
96
+
97
+ Cloud learnings — environment anomalies, setup gaps, degraded checks, freshness
98
+ anomalies and missing skills, MCP servers, CLI surfaces or credentials — are
99
+ category-bearing judgment entries in the active project's `project-log.md`,
100
+ written only through `oat project log append`. Never create or append to
101
+ `oat-execution-learnings.md`.
102
+
103
+ Give each observation a stable, whitespace-free source id unique to this run
104
+ and observation (for example `cloud-<run id>-<NN>`) and retain it for retries;
105
+ it is both `--source` and `--idempotency-key`, so a replay appends nothing.
106
+ Write the learning title as `--area` and the body as `Observation:`,
107
+ `Impact:`, `Recommendation:` and, when it applies, `Uncertainty:` lines.
108
+
109
+ ```bash
110
+ # Learning write (shared by oat-project-autonomous, oat-cursor-cloud-projects
111
+ # and oat-project-goal): oat_record_learning <category> <source-id> <title> <body>
112
+ oat_record_learning() {
113
+ local category="$1" source="$2" title="$3" body="$4" type result
114
+ case "$category" in
115
+ gotcha | environment-limited) type=friction ;;
116
+ efficiency | candidate-skill-content) type=worked-well ;;
117
+ documentation-gap | decision) type=feedback ;;
118
+ *)
119
+ echo "oat: unknown learning category '$category'" >&2
120
+ return 1
121
+ ;;
122
+ esac
123
+ result=$(oat project log append --json --project "$PROJECT_PATH" \
124
+ --type "$type" --scope project --area "$title" \
125
+ --category "$category" \
126
+ --source "$source" \
127
+ --origin "${LEARNING_ORIGIN:?set to the producer skill name}" \
128
+ --idempotency-key "$source" \
129
+ --body "$body") || {
130
+ printf '%s\n' "$result" >&2
131
+ return 1
132
+ }
133
+ if printf '%s' "$result" | grep -Eq '"status": *"skipped"'; then
134
+ echo "oat: warning: project log disabled (workflow.projectLog=false); learning $source not recorded" >&2
135
+ fi
136
+ }
137
+ ```
138
+
139
+ Set `LEARNING_ORIGIN=oat-cursor-cloud-projects`. Use the six categories
140
+ verbatim; an environment anomaly or a missing surface is usually
141
+ `environment-limited`, a stale user tier `gotcha`. The write maps the category
142
+ to the judgment type (`gotcha`, `environment-limited` → `friction`;
143
+ `efficiency`, `candidate-skill-content` → `worked-well`; `documentation-gap`,
144
+ `decision` → `feedback`).
145
+
146
+ Call it unconditionally; do not read `workflow.projectLog` yourself. The
147
+ append consults that flag only while `project-log.md` does not exist: with the
148
+ log disabled and absent it creates nothing and reports `status: skipped`, the
149
+ write prints one warning line, records nothing, and orientation continues. An
150
+ existing `project-log.md` keeps accepting categorized learnings whatever the
151
+ flag says (`DR-260718-automatic-create-on-first`). Commit `project-log.md`, when it
152
+ exists, with the next bookkeeping commit for the project (a synced project uses
153
+ `oat project push`).
154
+
95
155
  ## Degraded Route Evidence
96
156
 
97
157
  Degradation is a pre-launch selection outcome, not a post-accept fallback.
98
- Record it in the canonical dispatch record plus project learnings.
158
+ Record it in the canonical dispatch record plus one learning (see Learning
159
+ Write).
99
160
 
100
161
  Use this shape for the Cursor-specific evidence supplied to the generic record:
101
162
 
@@ -149,7 +210,7 @@ independence:
149
210
  degradation:
150
211
  present: true
151
212
  reason: catalog-contained-one-dispatchable-family
152
- learnings_entry: oat-execution-learnings.md#<entry>
213
+ learnings_entry: <learning source id>
153
214
  ```
154
215
 
155
216
  Include the exact configured invocation evidence required by the generic record
@@ -6,7 +6,7 @@ disable-model-invocation: false
6
6
  user-invocable: true
7
7
  allowed-tools: Read, Glob, Grep, AskUserQuestion
8
8
  metadata:
9
- version: 1.0.6
9
+ version: 1.0.7
10
10
  ---
11
11
 
12
12
  # OAT Docs
@@ -89,29 +89,15 @@ Read the user's question from `$ARGUMENTS`. If no question was provided or the q
89
89
 
90
90
  > "What would you like to know about OAT? I can help with workflows, CLI commands, skill authoring, configuration, project lifecycle, and more."
91
91
 
92
- Classify the question into one or more topic areas to guide the search:
93
-
94
- | Topic Area | Docs Path | Key Content |
95
- | ---------------- | --------------------------------------------------------------- | -------------------------------------------- |
96
- | Getting started | `getting-started/quickstart.md`, `getting-started/bootstrap.md` | Installation, first project setup |
97
- | Concepts | `getting-started/concepts.md` | Core OAT concepts and terminology |
98
- | CLI commands | `reference/cli-reference.md` | Full CLI command reference |
99
- | Tool packs | `getting-started/tool-packs.md` | Installing and managing skill packs |
100
- | Skills | `contributing/skills.md` | Skill authoring, SKILL.md format |
101
- | Workflows | `workflows/projects/` | Project lifecycle, state machine, artifacts |
102
- | Ideas | `workflows/ideas/` | Idea capture and brainstorming |
103
- | Provider sync | `provider-sync/` | Multi-provider sync, config, commands |
104
- | Documentation | `docs-tooling/` | Docs analysis and apply workflows |
105
- | Contributing | `contributing/` | Code contributions, design principles, hooks |
106
- | File locations | `reference/file-locations.md` | Where OAT puts things |
107
- | Directory layout | `reference/oat-directory-structure.md` | `.oat/` and `.agents/` structure |
108
- | Troubleshooting | `reference/troubleshooting.md` | Common issues and fixes |
92
+ Read `DOCS_ROOT/index.md` and its `## Contents` section. Derive a temporary topic map from the installed labels, summaries, and link targets; do not assume OAT's repository layout or a fixed set of topic paths. Choose the entries that match the question and descend through their authored `index.md` Contents maps when needed. Resolve each link relative to its containing file and verify it exists before reading it.
93
+
94
+ If the installed index has no usable Contents or a linked target is missing, report that specific stale or incomplete installation. Search within `DOCS_ROOT` for the requested terms to find existing evidence, and recommend updating the installed docs when appropriate. Never invent a replacement path or fall back to the repository.
109
95
 
110
96
  ### Step 3: Search and Read Documentation
111
97
 
112
98
  Based on the topic classification:
113
99
 
114
- 1. **Read the most relevant docs file(s)** — start with the primary match from the topic table. All paths are relative to `DOCS_ROOT` (`~/.oat/docs/`).
100
+ 1. **Read the most relevant docs file(s)** — start with the primary match from the topic map derived in Step 2. All paths are relative to `DOCS_ROOT` (`~/.oat/docs/`).
115
101
  2. **Search for specific terms** — if the question mentions specific concepts, commands, or features, use Grep to find mentions across `~/.oat/docs/`.
116
102
  3. **Follow cross-references** — if the primary doc references other pages, read those for complete context.
117
103
  4. **Check the index** — read the `index.md` of relevant directories to discover additional relevant pages.
@@ -143,7 +129,7 @@ Frame these as suggestions, not automatic actions. Let the user decide.
143
129
  ```
144
130
  Based on the docs, here's how OAT project workflows work: [answer]
145
131
 
146
- You can read more in `workflows/projects/lifecycle.md`.
132
+ Cite the installed workflow page discovered through Contents.
147
133
 
148
134
  Would you like me to:
149
135
  - Start a new project? (I'd invoke oat-project-lite for single-sitting work, oat-project-brief for one delivery planned as a Project Brief, oat-project-goal for an outcome delivered over several milestones, or oat-project-quick-start for a larger quick workflow)
@@ -190,7 +176,7 @@ Both create a project directory under your projects root
190
176
  state.md, plan.md, and implementation.md; quick and spec-driven modes also use
191
177
  discovery.md.
192
178
 
193
- See: workflows/projects/lifecycle.md, getting-started/quickstart.md
179
+ See: the actual installed workflow and getting-started pages found through Contents.
194
180
 
195
181
  Would you like me to create a project for you?
196
182
  ```
@@ -203,20 +189,20 @@ Would you like me to create a project for you?
203
189
 
204
190
  ```
205
191
  Tool packs are bundles of related OAT skills that you install together.
206
- There are four packs:
192
+ Describe the packs listed by the installed tool-pack documentation, for example:
207
193
 
208
- - **core** — Diagnostics and docs skills (oat-doctor, oat-docs).
209
- Always installed at user level. 2 skills.
194
+ - **core** — Diagnostics and docs skills.
195
+ Read the installed docs for scope and current membership.
210
196
  - **workflows** — Project lifecycle skills (discover, plan, implement,
211
- review, PR). 26 skills total.
212
- - **ideas** — Brainstorming and idea capture skills. 4 skills.
197
+ review, PR).
198
+ - **ideas** — Brainstorming and idea capture skills.
213
199
  - **utility** — Cross-cutting tools (docs analysis, code review,
214
- skill creation). 9 skills.
200
+ skill creation).
215
201
 
216
202
  Install with: oat init tools
217
203
  Manage with: oat tools list, oat tools update, oat tools outdated
218
204
 
219
- See: getting-started/tool-packs.md
205
+ See: the installed tool-pack page discovered through Contents.
220
206
 
221
207
  Would you like me to check which packs you have installed? (I'd run /oat-doctor --summary)
222
208
  ```
@@ -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 documentation 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:*), Bash(oat docs nav sync --check:*), Glob, Grep, AskUserQuestion, Task
6
+ allowed-tools: Read, Write, Bash(git:*), Bash(oat config:*), Bash(oat docs nav sync --check:*), Bash(pnpm:*), Bash(bash:*), Bash(jq:*), Bash(mkdir:*), Bash(date:*), Bash(echo:*), Bash(cd:*), Bash(pwd:*), Glob, Grep, AskUserQuestion, Task
7
7
  metadata:
8
- version: '1.6.2'
8
+ version: '1.6.3'
9
9
  ---
10
10
 
11
11
  # Docs Analysis
@@ -162,6 +162,8 @@ Capture the evidence sources that will justify later findings and recommendation
162
162
  - existing `index.md` trees and repeated directory patterns
163
163
  - exact missing or stale paths, commands, and page references
164
164
 
165
+ For framework apps, also read [Legacy scaffold checks](references/legacy-scaffold-checks.md). Apply those checks to the actual installed app, cite the observed file and source contract, and report discrepancies in Findings and Recommendations. These are read-only checks, not bootstrap post-patches. Do not change app-shell configuration during analysis or assume docs-apply can edit it; identify the manual upgrade needed when outside apply's current scope.
166
+
165
167
  Do **not** infer docs structure conventions from a tiny sample of pages when the broader
166
168
  tree or config disagrees.
167
169
 
@@ -0,0 +1,16 @@
1
+ # Legacy scaffold checks
2
+
3
+ Evaluate existing framework apps against the current contracts below. A match produces an evidence-backed finding in the analysis artifact, never an automatic rewrite. Cite the actual app path and line, the missing contract, confidence and a specific repair. Respect intentional user customization; when intent is unclear, use `ask_user`.
4
+
5
+ | Observed older shape | Finding and repair | Contract source |
6
+ | ------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
7
+ | Fumadocs `next.config.js` replaces `createDocsConfig` with `createMDX()({ reactStrictMode: true, turbopack: { root: __dirname } })` | High: static-export settings are missing and `__dirname` is invalid in ESM. Recommend a manual app-config upgrade to `createDocsConfig({ basePath, turbopack: { root: dirname(fileURLToPath(import.meta.url)) } })`, preserving `output: 'export'`, `trailingSlash`, `images.unoptimized`, base path and client environment. Verify the installed docs-config supports forwarding the root first. | `@open-agent-toolkit/docs-config` factory and the current Fumadocs template |
8
+ | Layout lacks Next `metadata`, or site title differs between branding, metadata and authored headings | Medium: site identity or document metadata is inconsistent. Report exact mismatches; titles belong in layout metadata and branding, not `createDocsConfig`. | Fumadocs layout template and Next metadata export |
9
+ | Getting Started has an empty description, bare commands with no working directory, or claims lint runs when package scripts disable it | Medium: setup guidance disagrees with package scripts or page metadata. Recommend corrected prose backed by the actual scripts. | Rendered scaffold package scripts and page frontmatter |
10
+ | Node prerequisite is a fixed old major or tells readers to guess from repo pins | Medium: compare `.nvmrc` first, then root `package.json` `engines.node`; quote the detected requirement. When neither exists, disclose the CLI minimum rather than claiming a repo pin. | Repository Node pin and current scaffold renderer |
11
+ | Authored `docs/index.md` says it is generated, or contributing lacks the generated-files boundary | Medium: distinguish authored `docs/index.md` from the generated app-root manifest. Document committed `docs/**/meta.json` and `oat docs nav sync` separately. | `oat docs generate-index` and `oat docs nav sync` |
12
+ | Contents links omit `.md` despite real Markdown targets | Medium: recommend `.md`-suffixed source links, which the build transforms into routes. | Authored Contents contract and docs-transforms links plugin |
13
+ | Contributing duplicates agent runtime rules rather than pointing to app-root `AGENTS.md` | Low: recommend consolidating runtime instructions into the existing agent guidance after approval; preserve custom rules. | Docs-app guidance and contributing audience boundary |
14
+ | MkDocs setup says `setup-docs.sh` creates a virtual environment, config calls `tooling` an object, or index points at an assumed `docs/index.md` | Medium: verify the actual script and `.oat/config.json`. The scaffold installs with the selected Python, uses a framework string, and seeds index/config as `mkdocs.yml`. | MkDocs setup script, documentation schema and scaffold config |
15
+
16
+ A user-owned dynamic app may intentionally omit static export. Do not apply a static-export finding to it without evidence that static output is required. Likewise, verify commands and filenames against the target repository; these patterns identify discrepancies, not authority to overwrite customization.
@@ -3,9 +3,9 @@ name: oat-docs-apply
3
3
  description: Run when you have a docs analysis artifact and want to generate or update documentation structure and content. Creates a branch, applies approved changes, and optionally opens a PR.
4
4
  disable-model-invocation: true
5
5
  user-invocable: true
6
- allowed-tools: Read, Write, Edit, Bash(git:*), Bash(gh:*), Glob, Grep, AskUserQuestion
6
+ allowed-tools: Read, Write, Edit, Bash(git:*), Bash(gh:*), Bash(oat:*), Bash(pnpm:*), Bash(bash:*), Bash(jq:*), Bash(mkdir:*), Bash(date:*), Bash(echo:*), Bash(cd:*), Bash(pwd:*), Glob, Grep, AskUserQuestion
7
7
  metadata:
8
- version: '1.4.3'
8
+ version: '1.4.4'
9
9
  ---
10
10
 
11
11
  # Docs Apply
@@ -3,10 +3,10 @@ name: oat-docs-authoring
3
3
  description: Use when authoring or restructuring targeted content inside an existing OAT Markdown surface or OAT/Fumadocs docs app. Preserves OAT docs navigation, generated indexes, and validation boundaries.
4
4
  argument-hint: '[docs task or target path]'
5
5
  disable-model-invocation: false
6
- allowed-tools: Read, Write, Bash, Glob, Grep, AskUserQuestion
6
+ allowed-tools: Read, Write, Edit, Bash, Glob, Grep, AskUserQuestion
7
7
  user-invocable: true
8
8
  metadata:
9
- version: '1.1.2'
9
+ version: '1.1.3'
10
10
  ---
11
11
 
12
12
  # OAT Docs Authoring
@@ -42,8 +42,7 @@ Stop and reroute when you notice:
42
42
  ## Migration Pointer
43
43
 
44
44
  Full MkDocs-to-OAT-Fumadocs migration is not bootstrap and is not targeted
45
- authoring. Use the standalone `mkdocs-to-oat-fumadocs-refactor-guide.md` handoff
46
- when available, and keep the migration in an OAT project or explicit migration
45
+ authoring. Use the bundled [MkDocs-to-OAT-Fumadocs migration guide](mkdocs-to-oat-fumadocs-refactor-guide.md), and keep the migration in an OAT project or explicit migration
47
46
  branch with owner-review items for unverifiable claims.
48
47
 
49
48
  For migration-sensitive follow-up after the migration workflow has created a
@@ -0,0 +1,73 @@
1
+ # MkDocs to OAT/Fumadocs migration guide
2
+
3
+ Use this standalone handoff for an explicitly approved migration of an existing MkDocs site. Bootstrap creates an app; targeted authoring edits content; neither performs a full migration. Keep migration work in an OAT project or an explicit migration branch, with the agreed scope and owner recorded before changes.
4
+
5
+ This guide is reconstructed from current OAT CLI, template and authoring contracts. The older project-local handoff mentioned in OAT's docs-authoring project summary was unavailable; this is not a copy of that historical document.
6
+
7
+ ## Preflight: inventory before mutation
8
+
9
+ 1. Read repository and docs-local instructions, `mkdocs.yml`, `.oat/config.json`, Python dependency files, docs package scripts and deployment workflows. Resolve the actual content root, published URL/base path and build output; do not assume `docs/` or GitHub Pages.
10
+ 2. Inventory every source page, attachment, image, local link, anchor, nav entry and public URL. Record pages outside nav too. Keep a before/after mapping for every source path and URL; never silently drop an unlisted page.
11
+ 3. Inventory MkDocs-specific features: admonitions, tabs, includes/macros, plugin-generated pages, API generation, Mermaid, custom assets/theme, search and redirects. Distinguish supported conversion from manual work and unsupported features.
12
+ 4. Find claims requiring code/config evidence, confidential material, unresolved product behavior and owner-only knowledge. Record owner-review items rather than guessing or publishing uncertain claims.
13
+ 5. Discover validation commands and required runtimes from scripts, CI and contributor instructions. Establish a baseline with exact commands and exit codes, including existing failures. Agree on the target app location, dependency policy, URL preservation strategy and deployment change with the user.
14
+
15
+ Produce an inventory and proposed migration scope for approval. Do not overwrite the MkDocs app, clear its configuration, delete Python tooling or switch deployment as a side effect of preparing a proposal.
16
+
17
+ ## Phase 1: create the approved target app
18
+
19
+ Use `oat docs init --help` to inspect installed capabilities. Scaffold Fumadocs into an empty, approved destination with `--framework fumadocs`, a package/app name, site name, description and target directory. Bootstrap can guide this step, but creating a second app does not imply support for two active `documentation` entries: the current config describes one surface. Explicitly agree when the configured docs root will switch, and preserve the old config for rollback.
20
+
21
+ Read the rendered package scripts and configuration. The current Fumadocs template uses Next static export, trailing slashes and unoptimized images through `createDocsConfig`. For nested-standalone repos only, it forwards an ESM-safe app directory as `turbopack.root`; monorepo and single-package scaffolds use Next.js root discovery. Preserve the site's base path and `NEXT_PUBLIC_BASE_PATH`; set site identity through layout metadata and `DocsLayout` branding, not factory title options.
22
+
23
+ Install using the repository's package-manager conventions. Keep dependency or workspace changes visible in the migration diff. Do not delete the old site yet.
24
+
25
+ ## Phase 2: migrate content without losing source
26
+
27
+ Copy approved content and assets into the target content root, retaining the source until parity is verified. Use the inventory to account for every file.
28
+
29
+ `oat docs migrate` converts supported MkDocs admonitions and injects missing frontmatter in `.md` files. It is a dry run by default; `--apply` writes changes. `--config` supplies MkDocs nav title hints, not a complete navigation or app migration. For example, from the repository root:
30
+
31
+ ```bash
32
+ # Replace paths with the approved destination and preserved source config.
33
+ oat docs migrate --docs-dir apps/handbook/docs --config documentation/mkdocs.yml
34
+ # Review the preview and approve the content conversion before writing.
35
+ oat docs migrate --docs-dir apps/handbook/docs --config documentation/mkdocs.yml --apply
36
+ ```
37
+
38
+ The command does not migrate app shells, deployment, plugins, macros, redirects or all Markdown extensions. Review seeded descriptions for meaningful content; metadata injection is not editorial completion. Convert unsupported syntax manually within the approved scope, preferring `.md` and using `.mdx` only where components require it. Preserve code examples, cautions, provenance and external attributions.
39
+
40
+ ## Phase 3: preserve navigation, links and URLs
41
+
42
+ Create authored `index.md` pages with purpose and `## Contents` maps in each content directory. Map every retained page into the approved tree; use `.md` or `subdir/index.md` targets and the current dash-bullet Contents grammar. When consolidating `overview.md`, carry its content and inbound references into `index.md` and retain the old-URL mapping.
43
+
44
+ Run `oat docs nav sync --target-dir <app-root>` to generate committed `docs/**/meta.json` navigation from authored maps. Resolve unlisted pages explicitly. Do not hand-edit generated navigation. The separate app-root `index.md` manifest is generated by `oat docs generate-index` through the scaffold's `predev`/`prebuild`; it is not the authored root page.
45
+
46
+ Rewrite inbound links, relative assets and anchors using the before/after map. Test public URLs under the real base path. Choose an approved host-compatible recovery for moved URLs; do not assume Next redirects work with static export. If old URLs cannot be preserved, report the exact break and obtain a decision before deployment changes or source deletion.
47
+
48
+ ## Phase 4: validate the migration
49
+
50
+ Discover and run the target app's actual lint, format, build and any link checks. Do not treat disabled/no-op scripts as validation. Run nav sync's read-only `--check` form to check committed navigation. Run existing repository gates required for package, config and workflow changes; keep exact exit codes and distinguish new failures from the baseline.
51
+
52
+ Inspect the static output and use the available browser to spot-check:
53
+
54
+ - landing and deeply nested pages, sidebar labels/order and search;
55
+ - old and new URLs, anchors, relative links and base-path assets;
56
+ - admonitions, tabs, tables, Mermaid, code blocks and custom components;
57
+ - title/description metadata, theme and layout behavior.
58
+
59
+ A successful build does not prove rendering or link parity. If a check cannot run, record the missing evidence and owner action; do not mark it verified. Review every inventory entry as migrated, deliberately retained, or explicitly approved for retirement, with a reason.
60
+
61
+ ## Phase 5: review, switch and retain rollback
62
+
63
+ Present the content conservation diff, URL map, validation evidence, unresolved owner-review items, config changes and deployment proposal. Obtain user approval before switching the configured docs surface, changing publication workflows or retiring the old site. Use `oat-docs-analyze` for a read-only audit and the appropriate reviewed workflow for follow-up changes; do not assume docs-apply may edit app-shell or deployment configuration.
64
+
65
+ Only after parity and approval, remove obsolete MkDocs dependencies/configuration and update repository guidance to the new authored source, generated artifacts and commands. Keep an explicit rollback reference to the prior site/config/deployment. Package publishing and production deployment require their own authorization.
66
+
67
+ ## Final report
68
+
69
+ Report the approved scope, changed files and commits; source-to-target page and URL dispositions; commands and exit codes; rendered spot checks; the configured docs root and publication behavior; known failures and unverified evidence; owner-review items and decisions; and the rollback reference. State whether the migration is ready for owner acceptance, rather than treating the absence of build errors as acceptance.
70
+
71
+ ## Current contract references
72
+
73
+ Within this installed skill, read [lifecycle boundaries](lifecycle-boundaries.md), [the Fumadocs contract](oat-fumadocs-contract.md) and [validation](validation.md). Load `authoring-docs` from installed scope for universal evidence and writing guidance. Inspect installed CLI help and rendered templates before executing commands; the consuming repository's instructions and approved migration scope remain authoritative.