@open-agent-toolkit/cli 0.3.27 → 0.3.29

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 (105) hide show
  1. package/README.md +8 -0
  2. package/assets/bundle-metadata.json +1 -1
  3. package/assets/docs/contributing/documentation.md +11 -2
  4. package/assets/docs/docs-tooling/add-docs-to-a-repo.md +12 -0
  5. package/assets/docs/docs-tooling/check.md +154 -0
  6. package/assets/docs/docs-tooling/commands.md +61 -11
  7. package/assets/docs/docs-tooling/index.md +1 -0
  8. package/assets/docs/docs-tooling/meta.json +7 -1
  9. package/assets/docs/docs-tooling/workflows.md +4 -0
  10. package/assets/docs/reference/cli-reference.md +2 -0
  11. package/assets/docs/reference/configuration.md +1 -0
  12. package/assets/public-package-versions.json +4 -4
  13. package/assets/skills/authoring-docs/SKILL.md +2 -2
  14. package/assets/skills/authoring-docs/references/information-architecture.md +5 -2
  15. package/assets/skills/authoring-docs/references/page-templates/alert-runbook.md +63 -0
  16. package/assets/skills/authoring-docs/references/page-templates/command-reference.md +55 -0
  17. package/assets/skills/authoring-docs/references/page-templates/decisions-pointer.md +44 -0
  18. package/assets/skills/authoring-docs/references/page-templates/engineering-feature.md +53 -0
  19. package/assets/skills/authoring-docs/references/page-templates/per-area-agents.md +42 -0
  20. package/assets/skills/authoring-docs/references/page-templates/product-feature.md +49 -0
  21. package/assets/skills/authoring-docs/references/page-templates/qa-validation.md +59 -0
  22. package/assets/skills/authoring-docs/references/page-templates/screen-spec.md +51 -0
  23. package/assets/skills/authoring-docs/references/page-templates/skill-command-guide.md +44 -0
  24. package/assets/skills/authoring-docs/references/page-templates/solution-record.md +43 -0
  25. package/assets/skills/authoring-docs/references/templates.md +22 -2
  26. package/assets/skills/oat-docs-analyze/SKILL.md +13 -2
  27. package/assets/skills/oat-docs-authoring/SKILL.md +1 -1
  28. package/assets/skills/oat-docs-authoring/references/validation.md +4 -0
  29. package/assets/skills/oat-docs-bootstrap/SKILL.md +63 -6
  30. package/assets/skills/oat-docs-bootstrap/references/pr-ci.md +89 -0
  31. package/assets/templates/docs-app-fuma/AGENTS.md +9 -2
  32. package/assets/templates/docs-app-fuma/docs/contributing/docs-toolchain.md +40 -3
  33. package/assets/templates/docs-app-fuma/docs/contributing.md +7 -1
  34. package/assets/templates/docs-app-fuma/docs/index.md +1 -1
  35. package/assets/templates/docs-app-fuma/gitignore.template +12 -0
  36. package/assets/templates/docs-app-fuma/package.json.template +2 -1
  37. package/assets/templates/docs-app-fuma/pnpm-workspace.yaml +5 -0
  38. package/assets/templates/docs-app-mkdocs/AGENTS.md +4 -2
  39. package/assets/templates/docs-app-mkdocs/docs/contributing/docs-toolchain.md +4 -2
  40. package/assets/templates/docs-app-mkdocs/docs/contributing.md +7 -1
  41. package/assets/templates/docs-app-mkdocs/docs/index.md +1 -1
  42. package/assets/templates/docs-app-mkdocs/gitignore.template +8 -0
  43. package/assets/templates/docs-app-mkdocs/package.json.template +3 -2
  44. package/dist/commands/config/index.d.ts.map +1 -1
  45. package/dist/commands/config/index.js +35 -3
  46. package/dist/commands/docs/check/check.d.ts +3 -0
  47. package/dist/commands/docs/check/check.d.ts.map +1 -0
  48. package/dist/commands/docs/check/check.js +48 -0
  49. package/dist/commands/docs/check/check.types.d.ts +17 -0
  50. package/dist/commands/docs/check/check.types.d.ts.map +1 -0
  51. package/dist/commands/docs/check/check.types.js +1 -0
  52. package/dist/commands/docs/check/checker.d.ts +8 -0
  53. package/dist/commands/docs/check/checker.d.ts.map +1 -0
  54. package/dist/commands/docs/check/checker.js +82 -0
  55. package/dist/commands/docs/check/commands.d.ts +5 -0
  56. package/dist/commands/docs/check/commands.d.ts.map +1 -0
  57. package/dist/commands/docs/check/commands.js +232 -0
  58. package/dist/commands/docs/check/diagrams.d.ts +5 -0
  59. package/dist/commands/docs/check/diagrams.d.ts.map +1 -0
  60. package/dist/commands/docs/check/diagrams.js +197 -0
  61. package/dist/commands/docs/check/files.d.ts +21 -0
  62. package/dist/commands/docs/check/files.d.ts.map +1 -0
  63. package/dist/commands/docs/check/files.js +121 -0
  64. package/dist/commands/docs/check/markdown.d.ts +60 -0
  65. package/dist/commands/docs/check/markdown.d.ts.map +1 -0
  66. package/dist/commands/docs/check/markdown.js +125 -0
  67. package/dist/commands/docs/check/mermaid-runtime.d.ts +3 -0
  68. package/dist/commands/docs/check/mermaid-runtime.d.ts.map +1 -0
  69. package/dist/commands/docs/check/mermaid-runtime.js +57 -0
  70. package/dist/commands/docs/check/navigation.d.ts +4 -0
  71. package/dist/commands/docs/check/navigation.d.ts.map +1 -0
  72. package/dist/commands/docs/check/navigation.js +104 -0
  73. package/dist/commands/docs/check/reader-rules.d.ts +6 -0
  74. package/dist/commands/docs/check/reader-rules.d.ts.map +1 -0
  75. package/dist/commands/docs/check/reader-rules.js +214 -0
  76. package/dist/commands/docs/index.d.ts.map +1 -1
  77. package/dist/commands/docs/index.js +2 -0
  78. package/dist/commands/docs/init/content.d.ts +23 -0
  79. package/dist/commands/docs/init/content.d.ts.map +1 -0
  80. package/dist/commands/docs/init/content.js +361 -0
  81. package/dist/commands/docs/init/index.d.ts +1 -0
  82. package/dist/commands/docs/init/index.d.ts.map +1 -1
  83. package/dist/commands/docs/init/index.js +40 -1
  84. package/dist/commands/docs/init/markdown.d.ts.map +1 -1
  85. package/dist/commands/docs/init/markdown.js +21 -2
  86. package/dist/commands/docs/init/resolve-options.d.ts +4 -1
  87. package/dist/commands/docs/init/resolve-options.d.ts.map +1 -1
  88. package/dist/commands/docs/init/resolve-options.js +4 -0
  89. package/dist/commands/docs/init/scaffold.d.ts +1 -0
  90. package/dist/commands/docs/init/scaffold.d.ts.map +1 -1
  91. package/dist/commands/docs/init/scaffold.js +57 -4
  92. package/dist/commands/docs/nav/contents.d.ts +4 -0
  93. package/dist/commands/docs/nav/contents.d.ts.map +1 -1
  94. package/dist/commands/docs/nav/contents.js +10 -0
  95. package/dist/config/documentation-check.d.ts +38 -0
  96. package/dist/config/documentation-check.d.ts.map +1 -0
  97. package/dist/config/documentation-check.js +132 -0
  98. package/dist/config/oat-config.d.ts +2 -0
  99. package/dist/config/oat-config.d.ts.map +1 -1
  100. package/dist/config/oat-config.js +4 -0
  101. package/dist/config/resolve.d.ts.map +1 -1
  102. package/dist/config/resolve.js +1 -0
  103. package/dist/release/public-package-contract.d.ts.map +1 -1
  104. package/dist/release/public-package-contract.js +13 -0
  105. package/package.json +11 -2
package/README.md CHANGED
@@ -45,8 +45,16 @@ Additional useful entry points:
45
45
 
46
46
  `oat docs init --framework fumadocs --app-name my-docs` creates a docs app with app-root `AGENTS.md`, a reader-first Getting Started stub and contributor/toolchain guides. The CLI owns these templates for both Fumadocs and legacy MkDocs; the bootstrap skill guides inspection and setup. Existing files and plain Markdown adoption are preserved.
47
47
 
48
+ For an approved fresh reader model, pass `--ia-preset <preset> --planned-pages <count>` together. The six presets materialize reader tracks at 15 or more anticipated pages, or grouped flat headings below 15; `flat-small` always stays flat. Canonical page templates go under excluded `contributing/templates/`, with a track table in framework app-root AGENTS or Markdown contributing guidance. Existing surfaces route to analyze/apply. See [preset selection and template subsets](../../apps/oat-docs/docs/docs-tooling/commands.md#approved-preset-readers). Direct init without both inputs retains its starter; selection does not create an IA decision.
49
+
48
50
  Fumadocs static exports include `llms.txt`, `llms-full.txt` and `llms/<page-slugs>/content.md` (root `llms/content.md`) for loaded `.md` readers. These retain authored Markdown and source-relative-link guidance; configured non-readers and MDX are excluded. Use authored Contents maps and `oat docs nav sync`, followed by `--check`, for navigation changes.
49
51
 
52
+ `oat docs check [--target-dir <dir>] [--rule <id>...] [--json]` performs read-only reader, navigation, contributor-command and Mermaid/SVG checks without a site build. Errors exit 1; warnings exit 0. Configure validated severities, numeric thresholds and reason-bearing exceptions under `documentation.check`. Mermaid syntax parsing lazily uses a real DOM with strict sanitization and no script/resource execution; Node 22.17 remains the minimum. See [checker rules and configuration](../../apps/oat-docs/docs/docs-tooling/check.md).
53
+
54
+ Fumadocs starters constrain `mdast-util-to-markdown` to 2.1.2 for the current upstream handler compatibility defect. New independent install roots get `pnpm-workspace.yaml`; workspace members get manual setup advice for the existing root YAML, with approval/conflict preservation in bootstrap. No member-local boundary or root dependency-policy merge is performed; `--no-root-patch` still controls build scripts only. Keep the effective policy and lockfile and verify actual resolution before building.
55
+
56
+ Framework starters expose `docs:check` and run it before build; MkDocs `test` is a real check. Bootstrap proposes approved PR CI edits with explicit generated-manifest freshness. Markdown needs neither an app build nor a default manifest.
57
+
50
58
  ## Update Notifications
51
59
 
52
60
  On ordinary interactive command runs, OAT may print a passive notice when npm's stable `latest` CLI version is newer than the installed version. The cache normally limits checks to once every 24 hours and same-version notices to once every 72 hours; overlapping CLI processes can each perform a check or print a notice.
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "oatVersion": "0.3.27"
3
+ "oatVersion": "0.3.29"
4
4
  }
@@ -43,9 +43,9 @@ To add a page, choose its scope from the nearest map, add title/description fron
43
43
 
44
44
  Use **Markdown → existing transform → MDX** in that order. Tables, task lists, fenced code, callouts, nested tabs and Mermaid are configured. MDX is for actual JSX/component needs and is excluded from the Markdown manifest and agent endpoints. See [Markdown Features](markdown-features.md) for paired Syntax/Rendered examples.
45
45
 
46
- Not configured: executable notebooks, API playgrounds, diagram syntax validation or screenshot testing. A successful build or Mermaid transform test does not prove diagram validity. Keep language labels on code fences and use `bash` for shell commands.
46
+ Not configured: executable notebooks, API playgrounds, screenshot testing. The portable checker validates Mermaid syntax with the installed parser; a successful build alone does not prove diagram validity or visual correctness. Keep language labels on code fences and use `bash` for shell commands.
47
47
 
48
- Mermaid is diagram source. Important or phone-sized diagrams also get matching light/dark SVGs under `public/diagrams/`, linked as `/diagrams/name-light.svg` and `/diagrams/name-dark.svg`; the theme adds the base path, selects the theme and supports zoom. Update source and both SVGs in the same commit. Use descriptive SVG `<title>`/`<desc>` with `role="img"` and `aria-labelledby`, readable labels and concise meaningful image alt text (about 155 characters or less).
48
+ Mermaid is diagram source; include `accTitle` and `accDescr`. Important or phone-sized diagrams also get matching light/dark SVGs under `public/diagrams/`, linked as `/diagrams/name-light.svg` and `/diagrams/name-dark.svg`; the theme adds the base path, selects the theme and supports zoom. Update source and both SVGs in the same commit. Use descriptive SVG `<title>`/`<desc>` with `role="img"` and `aria-labelledby`, readable labels and concise meaningful image alt text (about 155 characters or less).
49
49
 
50
50
  ## Local workflow
51
51
 
@@ -84,6 +84,15 @@ All commands below run from the **repository root**. Contributor setup is in [Co
84
84
  pnpm --filter oat-docs docs:format:check
85
85
  ```
86
86
 
87
+ Run portable validation from the repository root before committing:
88
+
89
+ ```bash
90
+ pnpm --filter oat-docs docs:check
91
+ pnpm docs:validate
92
+ ```
93
+
94
+ The first command checks reader structure/metadata/links, contributor commands, navigation and diagrams without a build. Errors fail; warnings prompt review. The second retains flagship hosted README/catalog/live-consumer checks too. See [Check Documentation](../docs-tooling/check.md) for policy, counting and repair guidance.
95
+
87
96
  ## Authoring Expectations
88
97
 
89
98
  - Keep docs aligned with the current repo behavior and current command surface.
@@ -63,6 +63,8 @@ Choose Markdown files or a framework app, using the guided skill or direct CLI.
63
63
 
64
64
  The docs-bootstrap skill offers Markdown, Fumadocs, and MkDocs. Configured tooling is authoritative; framework evidence is checked before plain-directory evidence. A root README alone does not trigger adoption, and an empty selected target stays fresh setup. Markdown uses file checks and an adopt/audit handoff, with no app questions, dependencies, framework patches, docs-root AGENTS, or site build.
65
65
 
66
+ For fresh empty targets, the skill obtains explicit IA approval with an anticipated reader-page count, probes `--ia-preset` and `--planned-pages`, then passes both to CLI init. The CLI materializes the selected model at 15 or more pages and collapses it into grouped root headings below 15 (always flat for `flat-small`). It also supplies relevant non-reader page templates. Existing surfaces use analyze and individually approved apply; adoption receives no preset flags. See [preset mappings and template subsets](commands.md#approved-preset-readers). Selection guidance does not replace the existing IA decision/adoption flow.
67
+
66
68
  For framework apps, it wraps `oat docs init` with a seven-step guided flow: preflight detection (repo shape + existing-setup conflict surfacing), richer input gathering (including a site name distinct from the package name), the CLI invocation itself, CLI-owned scaffold inspection, install + build verification, post-scaffold config inspection, and a chunked educational walkthrough.
67
69
 
68
70
  What the framework path adds over the raw CLI:
@@ -326,3 +328,13 @@ need.
326
328
  and frontmatter; it only previews changes until you pass `--apply`.
327
329
 
328
330
  MkDocs/Material scaffolding is **legacy**; its existing Python pins remain unchanged. [Material's changelog](https://squidfunk.github.io/mkdocs-material/changelog/) says Material receives critical/security fixes through May 5, 2027 and names Zensical as its successor. That lifecycle belongs to Material, not MkDocs core, and does not promise that the scaffold's older pins contain the latest fixes. Pinned MkDocs 1.4.2 still renders configured non-reader routes even though OAT omits them from navigation and manifests.
331
+
332
+ ## Verify the scaffold in PR CI
333
+
334
+ Current framework starters run `docs:check` before build and MkDocs `test` runs the same checker. Bootstrap presents concrete CI edits after inspecting config: checker, actual framework build, then regeneration and Git diff of a configured generated Markdown inventory. It preserves existing workflow content and writes only the approved diff. Use full-history checkout/fetch for diagram comparisons. Markdown gets checker-only wiring unless an external manifest was separately configured. See [Check Documentation](check.md) for diagnostics and repair.
335
+
336
+ ## Fumadocs install-root compatibility
337
+
338
+ Current Fumadocs needs exact `mdast-util-to-markdown: 2.1.2` to avoid the upstream bold/italic handler recursion in 2.2.0. CLI init creates a small `pnpm-workspace.yaml` only for a new independent app that is its own installation root. A real workspace member gets no local boundary: bootstrap presents the exact root YAML override for approval, preserving package globs, unrelated settings and conflicting pins. Declined/skipped edits remain manual and build verification stays pending. `--no-root-patch` controls root build scripts only.
339
+
340
+ Use effective-root `pnpm-workspace.yaml` for pnpm 10+ (including 12, which ignores `package.json`'s `pnpm.overrides`); member-only policy is ineffective. After installing from the actual root, inspect `pnpm why mdast-util-to-markdown`, confirm 2.1.2 and retain root config/lockfile. Run the checker and real build with all authored content preserved. This is a constrained fresh-install policy, not a framework upgrade or an unconstrained resolution claim.
@@ -0,0 +1,154 @@
1
+ ---
2
+ title: Check Documentation
3
+ description: Validate reader structure, links, navigation, contributor commands and accessible diagram sources without building a site.
4
+ ---
5
+
6
+ # Check Documentation
7
+
8
+ Run the portable checker before committing documentation. It reads authored
9
+ Markdown/MDX, config, local package scripts and diagram assets; it never builds a
10
+ site, runs page scripts or MDX, executes documented commands, or fetches links.
11
+
12
+ ```bash
13
+ oat docs check
14
+ oat docs check --target-dir docs-site
15
+ oat docs check --rule description h1 --rule links --json
16
+ ```
17
+
18
+ Omitted targets use `documentation.root`, then the existing `docs` fallback.
19
+ Framework app roots resolve to their content directory. A literal Markdown root
20
+ stays literal even with a child named `docs`. Paths in findings are deterministic,
21
+ content-root-relative POSIX paths; physical line locations are included when
22
+ available, including nested supported tabs. No sidebar or default manifest is
23
+ required for Markdown.
24
+
25
+ ## Results and repair
26
+
27
+ Errors exit **1**; warning-only runs exit **0**. System/runtime failures retain
28
+ exit **2**. Unknown rule IDs and malformed checker config are actionable
29
+ `configuration` findings. JSON has exactly these top-level keys:
30
+
31
+ ```json
32
+ {
33
+ "summary": { "errors": 1, "warnings": 0 },
34
+ "findings": [
35
+ {
36
+ "ruleId": "description",
37
+ "severity": "error",
38
+ "path": "guide.md",
39
+ "line": 1,
40
+ "message": "Frontmatter description is required and must be nonempty."
41
+ }
42
+ ]
43
+ }
44
+ ```
45
+
46
+ Fix the authored page, its local Contents map and inbound links together. For
47
+ owned generated navigation, run `oat docs nav sync`, then rerun the checker.
48
+ Hand-authored or undeclared navigation is compared for membership/order without
49
+ requiring generated display labels, title fields or YAML formatting; do not
50
+ silently regenerate it. Missing optional Fumadocs metadata, metadata objects without
51
+ `pages`, and absent MkDocs `nav` skip comparison. Present `pages` must be an array;
52
+ explicit entries still compare membership/order. Implicit Fumadocs order is not
53
+ compared. Nav-sync ownership retains its existing strict read-only freshness check. Generated inventories are separate: regenerate configured output
54
+ and check its Git diff after the build. A build that rewrites the inventory does
55
+ not prove the committed copy was fresh.
56
+
57
+ The framework starters provide `docs:check`; MkDocs `test` runs the checker too.
58
+ Both build scripts run it before navigation/build. In OAT's workspace, from the
59
+ repository root use `pnpm --filter oat-docs docs:check`. The existing
60
+ `pnpm docs:validate` also keeps OAT-specific hosted README, skill catalog and
61
+ live-consumer checks. Review warnings; avoid blanket suppressions.
62
+
63
+ ## Stable rules and default counting
64
+
65
+ Threshold names below are keys of `documentation.check.thresholds`. Comparisons
66
+ are strictly **above** the stated limits except depth, which triggers **at** its
67
+ threshold. Counts use authored reader `.md`/`.mdx` files and real Markdown nodes;
68
+ fenced examples do not become headings, links, groups or diagrams. YAML
69
+ frontmatter, GFM/reference links, explicit heading IDs, static HTML and supported
70
+ recursive tabs participate.
71
+
72
+ | Rule ID | Default behavior |
73
+ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
74
+ | `directory-index` | Error for a reader-bearing directory without `index.md` and a nonempty dash-bullet Contents map, invalid map grammar or unresolved strict Contents target. Ancestors of reader pages participate. |
75
+ | `root-width` | Flat root Contents links warn above `rootWarn: 10`, error above `rootError: 14`. Real groups exempt the width. |
76
+ | `contents-width` | Ungrouped Contents links warn above `contentsWarn: 10`, error above `contentsError: 15`. `catalog: true` or the recognized OAT generated-index marker exempts only this width rule. |
77
+ | `leaf-size` | Direct reader pages include index. A leaf has no reader-bearing child directory: index-only errors; two total pages warn. |
78
+ | `folder-size` | Direct reader pages including index warn above `folderWarn: 12`, error above `folderError: 20`, unless the index has real groups. |
79
+ | `depth` | Content root is depth 0; warn at `depthWarn: 4`, error at `depthError: 5`. |
80
+ | `page-length` | Warn above `pageLines: 500` physical source lines. Explicit `type: reference` or `reference`/`references` path segments use `referenceLines: 1000` and warn above `referenceH3: 40` real H3 headings. No default length error limit. |
81
+ | `frontmatter` | Unreadable source, invalid YAML or a non-mapping frontmatter document errors. Read failures use relative paths and safe error codes; invalid metadata skips description validation while independent body checks continue at physical positions. |
82
+ | `description` | Missing/empty frontmatter description errors; character lengths below `descriptionMin: 40` or above `descriptionMax: 160` warn. |
83
+ | `h1` | Error unless each page has exactly one real H1. |
84
+ | `links` | Error for unresolved in-root source links/anchors. No network checking. Ordinary escaping links are provenance warnings and their targets are not read. Contents links retain stricter local-map rules. |
85
+ | `contents-description` | Error for descriptions ending in an ellipsis/truncation. |
86
+ | `overview` | Warn below `overviewWords: 10` before Contents. |
87
+ | `contents-separator` | Warn when Contents descriptions mix separators in a tree. |
88
+ | `navigation` | Error for explicit navigation drift using declared ownership semantics; hand-authored/undeclared absent optional meta/pages/nav skips comparison. Nav-sync freshness stays strict; Markdown skips it. |
89
+ | `commands` | Error for missing literal contributor scripts; implicit pnpm shorthand also accepts installed package/workspace `.bin` entries. Explicit pnpm run/npm run stays script-only; unresolved context errors; echo scripts warn. |
90
+ | `mermaid` | Parse every real Mermaid fence using the pinned Mermaid parser. Invalid syntax errors. |
91
+ | `diagram-pairs` | Diagram light/dark SVG siblings and both page references are required. Conventional diagram paths and explicit paired references participate; ordinary logos are not diagrams. |
92
+ | `diagram-accessibility` | Mermaid missing `accTitle`/`accDescr` warns. SVGs require `role="img"`, nonempty title/desc. Rendered diagrams without page-visible explanatory text or an associated long description warn. |
93
+ | `diagram-freshness` | Warn when changed Mermaid lacks both associated SVG changes; association follows the actual section/tab group. Missing usable Git comparison is explicitly unverified. |
94
+ | `image-alt` | Warn for empty, filename/slug-like or longer than `altMax: 155` image alt text. |
95
+ | `provenance` | Warn for planning/backlog/home paths, configured ticket/milestone patterns and ordinary links escaping the root. Legitimate reader docs remain visible. |
96
+
97
+ These are lint limits, distinct from authoring targets for concise pages and
98
+ focused maps. `documentation.nonReaderPaths` uses the existing
99
+ [bounded matcher](commands.md#exclusion-patterns) for reader inventory and checks.
100
+ `documentation.excludes` remains manifest-only and cannot hide reader defects.
101
+
102
+ ## Contributor command context
103
+
104
+ Literal pnpm script and npm run examples in `contributing.md`/`.mdx` and
105
+ `contributing/**` are checked against package manifests. Each code block starts
106
+ at the repository root. Use executable `cd`, `-w`/`--workspace-root`, `--dir` or
107
+ literal `--filter` selection to establish another context. Prose such as “from
108
+ the app directory” alone does not change it. Built-in package-manager commands
109
+ and illustrative placeholders are recognized; commands are never run.
110
+
111
+ Implicit pnpm shorthand (for example, `pnpm tsc`) may use an installed entry in
112
+ that package's or the workspace root's `node_modules/.bin`. Only its presence is
113
+ checked. Explicit `pnpm run tsc` and `npm run tsc` still require a package script.
114
+ System PATH lookup is outside this check; before dependencies are installed, a
115
+ binary shorthand may be reported missing. Use `pnpm exec` for explicit binary examples.
116
+
117
+ ## Diagram comparison and limits
118
+
119
+ Syntax validation lazily loads the pinned Mermaid parser with a real Node DOM
120
+ and strict sanitization; script execution and resource loading stay disabled.
121
+ It does not render or prove semantic/visual correctness. Inspect both themes
122
+ for important diagrams. Put meaningful `accTitle` and `accDescr` in Mermaid,
123
+ keep SVG title/desc and page explanations, and change both theme SVGs with source.
124
+
125
+ Freshness uses the merge base against `documentation.check.diagramBaseRef`
126
+ (default `origin/main` when available), plus committed, staged, unstaged and
127
+ untracked changes. It never mutates Git. PR checkout/fetch must provide the base;
128
+ without one, static validation still runs and freshness is reported unverified.
129
+ Bootstrap supplies concrete checker → framework build → configured-manifest
130
+ freshness CI guidance. Markdown runs only the checker unless an external generated
131
+ manifest was explicitly configured.
132
+
133
+ ## Configure narrow policy
134
+
135
+ `documentation.check` is a shared repository object preserved by real config
136
+ commands. Rule values are `error`, `warn` or `off`; `--rule` selects checks without
137
+ changing policy. `frontmatter` and `mermaid` govern syntax independently from
138
+ `description` and `diagram-accessibility`; metadata/accessibility exceptions do
139
+ not suppress syntax or body findings. Explicit `warn`/`off` settings or exceptions
140
+ for the syntax rule itself remain supported. Exceptions use the same bounded path matcher, a stable rule ID
141
+ and a mandatory nonempty reason; omitted exception severity means `off`.
142
+
143
+ ```bash
144
+ oat config set documentation.check '{"rules":{"image-alt":"warn"},"thresholds":{"referenceLines":1200},"exceptions":[{"path":"reference/decisions.md","rule":"provenance","reason":"Reader-facing decision pointers preserve canonical rationale."}],"provenance":{"ticketPatterns":["TICKET-[0-9]+"],"milestonePatterns":["Milestone [0-9]+"]},"diagramBaseRef":"origin/main"}'
145
+ oat config get documentation.check --json
146
+ oat config dump --json
147
+ oat config unset documentation.check --shared
148
+ ```
149
+
150
+ Numeric thresholds are nonnegative safe integers with ordered warn/error and
151
+ min/max pairs. Patterns must compile as regular expressions. Unknown names,
152
+ invalid values, blank reasons and escaping exception paths are rejected rather
153
+ than silently dropped. Keep decision-pointer exceptions narrow and justified;
154
+ metadata/maps/links should normally be repaired in source.
@@ -13,18 +13,23 @@ or **MkDocs Material**.
13
13
 
14
14
  - What it does: documents the docs-specific CLI surface for scaffolding apps, migrating markdown, generating Fumadocs app-root index manifests, and syncing MkDocs or Fumadocs navigation.
15
15
  - When to use it: when you already know you are working on a docs surface and need the exact command-level behavior.
16
- - Primary commands: `oat docs init`, `oat docs migrate`, `oat docs generate-index`, `oat docs nav sync`
16
+ - Primary commands: `oat docs init`, `oat docs migrate`, `oat docs generate-index`, `oat docs nav sync`, `oat docs check`
17
17
 
18
18
  ## Command surface
19
19
 
20
- | Command | Purpose |
21
- | ------------------------- | ------------------------------------------------------------------------- |
22
- | `oat docs init` | Set up Markdown files or a docs app; additively adopt Markdown. |
23
- | `oat docs migrate` | Convert MkDocs admonitions to GFM callouts and inject frontmatter. |
24
- | `oat docs generate-index` | Generate a manifest from Markdown files, outside authored content. |
25
- | `oat docs nav sync` | Regenerate `mkdocs.yml` nav or Fumadocs `meta.json` from `index.md` maps. |
26
- | `oat docs analyze` | CLI entrypoint that points users to the `oat-docs-analyze` skill. |
27
- | `oat docs apply` | CLI entrypoint that points users to the `oat-docs-apply` skill. |
20
+ | Command | Purpose |
21
+ | ------------------------- | ------------------------------------------------------------------------------------- |
22
+ | `oat docs init` | Set up Markdown files or a docs app; additively adopt Markdown. |
23
+ | `oat docs migrate` | Convert MkDocs admonitions to GFM callouts and inject frontmatter. |
24
+ | `oat docs generate-index` | Generate a manifest from Markdown files, outside authored content. |
25
+ | `oat docs nav sync` | Regenerate `mkdocs.yml` nav or Fumadocs `meta.json` from `index.md` maps. |
26
+ | `oat docs check` | Read-only reader, navigation, command and diagram checks; errors fail, warnings pass. |
27
+ | `oat docs analyze` | CLI entrypoint that points users to the `oat-docs-analyze` skill. |
28
+ | `oat docs apply` | CLI entrypoint that points users to the `oat-docs-apply` skill. |
29
+
30
+ ## `oat docs check`
31
+
32
+ Run `oat docs check [--target-dir <dir>] [--rule <id>...] [--json]` before committing. It resolves the configured root, validates real reader files without a site build, and emits deterministic findings. Errors exit 1; warning-only exits 0. See [Check Documentation](check.md) for stable rule IDs, counting, narrow policy/exception settings and the exact JSON contract.
28
33
 
29
34
  ## Which Generation Command To Run
30
35
 
@@ -55,9 +60,53 @@ Key behavior:
55
60
  - for framework apps, when the repo root exposes a compatible Turbo `scripts.build`, patches it to exclude the new docs app from the default root build and adds a root-level `build:docs` script
56
61
  - prints a unified diff before writing the root `package.json` change and returns a manual snippet when the patch is skipped because the build script is missing, non-Turbo, or ambiguous
57
62
 
58
- Markdown setup:
63
+ ### Approved preset readers
64
+
65
+ Opt into an approved reader model with `--ia-preset <preset> --planned-pages <count>`.
66
+ Both flags are required together; the count is an integer of at least 1 and covers
67
+ anticipated reader pages, excluding contributor/toolchain/template content. No flags
68
+ keeps the existing starter. Preset init requires an empty target and refuses existing
69
+ docs config/ownership; use analyze and individually approved apply for existing trees.
70
+
71
+ | Preset | Reader directories at 15 or more anticipated pages | Templates |
72
+ | ------------------------ | ----------------------------------------------------- | ------------------------------------------- |
73
+ | `product-engineering-qa` | `product/`, `engineering/`, `qa/` | All ten |
74
+ | `consumer-maintainer` | `consumer/`, `maintainer/` | Six support shapes |
75
+ | `domain-engineering` | `engineering/` | Engineering feature plus six support shapes |
76
+ | `task-type` | `tutorials/`, `how-to/`, `reference/`, `explanation/` | Six support shapes |
77
+ | `toolkit-cli` | `tools/`, `workflows/` | Six support shapes |
78
+ | `flat-small` | Always grouped headings in one flat root index | Six support shapes |
79
+
80
+ Below 15 pages, each model uses grouped root headings and flat reader pages while
81
+ retaining its template subset. Track entries have purpose, entry principle and
82
+ useful sections. Engineering is hybrid: domain/implementation contracts alongside
83
+ paired feature pages; Product/QA enter by feature or journey.
84
+
85
+ Templates live under `contributing/templates/`: Product feature, Engineering
86
+ feature, QA validation, conditional Screen spec, Alert runbook, incident Solution
87
+ record, Command reference, Skill or command guide, Decisions pointer and Per-area
88
+ AGENTS. The six support shapes are the last six in that list. Screen pages and
89
+ per-track AGENTS are never automatically instantiated. Bodies come from canonical
90
+ `authoring-docs` assets, with verified-literal rules and separate planned automation,
91
+ implemented assertions and dated execution evidence.
92
+
93
+ The CLI merges `contributing/templates/**` into `documentation.nonReaderPaths`
94
+ before nav generation. These drafts stay out of reader Contents, navigation,
95
+ checker inventory and manifests; `excludes` remains manifest-only. Pinned MkDocs
96
+ 1.4.2 can still render excluded routes and retains `use_directory_urls: false`.
97
+ Framework app-root AGENTS gets the track table; Markdown uses `contributing.md`,
98
+ with no docs-root AGENTS, dependencies, sidebar, build or default manifest.
99
+ Selection guidance is not a persisted IA decision: bootstrap still requires explicit
100
+ approval and the existing adoption/`record-ia` flow, without implicit PJM adoption.
101
+
102
+ ```bash
103
+ oat docs init --framework markdown --ia-preset toolkit-cli --planned-pages 14 --yes
104
+ oat docs init --framework fumadocs --ia-preset product-engineering-qa --planned-pages 30 --yes
105
+ ```
106
+
107
+ ### Default Markdown setup
59
108
 
60
- - Creates only authored root `index.md` and `contributing.md` baseline pages,
109
+ - Without preset inputs, creates only authored root `index.md` and `contributing.md` baseline pages,
61
110
  with metadata, context and real relative `.md` Contents links.
62
111
  - Records literal root/tooling/authored index and managed root guidance; no
63
112
  docs-root AGENTS, app package, dependencies, package/Turbo patch or site build.
@@ -107,6 +156,7 @@ Supported flags:
107
156
  - `--framework <markdown|fumadocs|mkdocs>` (default: `fumadocs` in non-interactive mode)
108
157
  - `--site-name <name>` (site display title or Markdown documentation title)
109
158
  - `--description <text>` (documentation description, optional)
159
+ - `--ia-preset <preset>` and `--planned-pages <count>` (approved fresh selection; pair required, integer count >= 1)
110
160
  - `--lint <none|markdownlint-cli2>`
111
161
  - `--format <oxfmt|none>`
112
162
  - `--adopt` (Markdown only; add missing baseline files, preserve existing bytes)
@@ -13,6 +13,7 @@ Use this section when you are adopting the docs app workflow in a repo, maintain
13
13
 
14
14
  - [Add or Adopt Docs in a Repo](add-docs-to-a-repo.md) - Set up Markdown or a docs app and safely adopt existing Markdown.
15
15
  - [Documentation Commands](commands.md) - Docs CLI surface for init, migration, index generation, and nav sync.
16
+ - [Check Documentation](check.md) - Portable reader, navigation, command and diagram validation.
16
17
  - [Docs Workflows](workflows.md) - How the docs CLI helpers pair with analyze/apply workflows.
17
18
  - [Improve Agent Instructions](agent-instructions.md) - Analyze instruction gaps and apply approved evidence-backed changes.
18
19
 
@@ -1,4 +1,10 @@
1
1
  {
2
2
  "title": "Docs Tooling",
3
- "pages": ["add-docs-to-a-repo", "commands", "workflows", "agent-instructions"]
3
+ "pages": [
4
+ "add-docs-to-a-repo",
5
+ "commands",
6
+ "check",
7
+ "workflows",
8
+ "agent-instructions"
9
+ ]
4
10
  }
@@ -523,3 +523,7 @@ routes and package scripts remain manual required changes.
523
523
  - [Improve Agent Instructions](agent-instructions.md)
524
524
  - [`../reference/docs-index-contract.md`](../reference/docs-index-contract.md)
525
525
  - [`../contributing/skills.md`](../contributing/skills.md)
526
+
527
+ ## Portable checks and PR CI
528
+
529
+ Run `oat docs check` before proposing repairs. Its findings feed analysis and approved apply work; it does not rewrite sources or grant navigation ownership. Bootstrap uses its concrete PR CI recipe to propose checker, real framework build and configured generated-manifest freshness steps while preserving existing workflows. Approve the exact workflow diff before writes. Markdown has no build or default manifest step. Full Git history/fetch enables the diagram base comparison. See [Check Documentation](check.md).
@@ -78,6 +78,8 @@ Git retries include prior outputs only with HEAD ownership evidence, while
78
78
  no-Git retries report current-pass mutations. See [Backlog
79
79
  Lifecycle](../workflows/backlog-and-planning/backlog-lifecycle.md).
80
80
 
81
+ `oat docs check [--target-dir <dir>] [--rule <id>...] [--json]` validates reader structure, links, navigation, contributor commands and diagrams without a site build. Errors exit 1; warning-only exits 0. See [Check Documentation](../docs-tooling/check.md) for rules/config and JSON.
82
+
81
83
  ## Command Groups
82
84
 
83
85
  | Command group | What it covers | Go deeper |
@@ -99,6 +99,7 @@ Common keys in `.oat/config.json`:
99
99
  - `documentation.guidance` — advisory Markdown IA source paths/URLs, as a string or ordered non-empty string array. Repo config overrides user config; explicit skill input overrides both. Absent values use the installed `authoring-docs` IA reference. Use `oat config set documentation.guidance ./docs/ia/index.md` or `oat config set documentation.guidance '["~/guidance/index.md","https://example.com/docs/index.md"]' --user`. Arrays retain order; commas in paths are literal. `--local` is unsupported. `get --json` reports `shared`, `user`, or `default` provenance; `unset` reveals the next tier. Only locators are stored, with unrelated config fields preserved. Sources stay read-only, external packs have `index.md` and `## Contents`, and local AGENTS/contributing rules remain authoritative. Conflicts become `ask_user`. See [IA selection](../docs-tooling/workflows.md#ia-selection-and-guidance).
100
100
  - `documentation.nonReaderPaths` — shared repository-only array of content-root-relative globs for drafts/templates. Set with `oat config set documentation.nonReaderPaths 'templates/,drafts/**'`; empty value clears and `unset` removes it. Entries are trimmed/de-duplicated; non-arrays, empty or non-string entries are rejected. Local/user writes are refused. The [bounded grammar](../docs-tooling/commands.md#exclusion-patterns) matches nav inventory, explicit Contents targets, nav checks and manifests only for the configured app/content root; excluded metadata is not rewritten. Fumadocs source collections also exclude rendering when wired through OAT source config. Pinned MkDocs 1.4.2 still renders excluded pages as routes; only nav/manifest exclusion is supported.
101
101
  - `documentation.excludes` — a JSON array of globs, relative to the docs directory, that `oat docs generate-index` leaves out of the generated index. `oat config set` takes the list as one comma-separated value (`"a/**,b.md"`) and stores it as an array; repeated `--exclude` flags extend it, and an empty value clears the key
102
+ - `documentation.check` — shared checker policy: stable rule severities, named numeric thresholds, reason-bearing bounded path/rule exceptions, ticket/milestone regex patterns and optional diagram base ref. Set/get/dump/unset preserve and validate the object. See [Check Documentation](../docs-tooling/check.md#configure-narrow-policy) for exact fields/defaults and repair commands.
102
103
  - `documentation.requireForProjectCompletion` — whether docs sync is a completion gate
103
104
  - `instructions.claude.shims` — how `oat instructions sync` keeps a `CLAUDE.md` beside each `AGENTS.md`: `none` (the default: no shims; sync removes the ones OAT created and warns about any other `CLAUDE.md`, all or nothing: it removes none while any `CLAUDE.md`, `.claude/CLAUDE.md`, or `CLAUDE.local.md` has content of its own; see [All or nothing](../provider-sync/instruction-sync.md#all-or-nothing)), `pointer`, `symlink`, or `copy`. The `--strategy` flag overrides it for one run. Set it with `oat config set instructions.claude.shims pointer` when contributors need `CLAUDE.md` (see [Claude Code and AGENTS.md](../provider-sync/instruction-sync.md#claude-code-and-agentsmd)); `oat config unset` returns to `none`. Any other value is rejected with exit code `2` rather than read as unset, and `oat config set` can still replace it
104
105
  - `instructions.claude.excludes` — a JSON array of repository-relative directories that `oat instructions sync` and `oat instructions validate` must not treat as pointer sites, additive to the documentation content root they already skip by default (see [Instruction Sync](../provider-sync/instruction-sync.md#documentation-trees)). `oat config set` takes the list as one comma-separated value (`"vendor/generated,apps/oat-docs/docs"`) and stores it as an array of repository-relative POSIX paths, trimmed and de-duplicated; an empty value clears the key, and `oat config unset instructions.claude.excludes` removes it. An entry that could never exclude anything — an absolute path, or one escaping the repository with `..` — is rejected with exit code `1` rather than stored. A structurally malformed value already on disk (a non-array, or an empty or non-string entry) is rejected with exit code `2` and a repair message, and `oat config set` can still replace it. Entries that are well formed but cannot exclude anything — among them absolute paths, paths escaping the repository, paths that match no directory (matching is case-sensitive, and the warning names the on-disk spelling when the path differs only in case), paths that resolve elsewhere through a symlink (the warning names the resolved target instead of blaming case-sensitivity), and the unexcludable `.oat/repo` carve-in root — never abort the command; they are reported as warnings and are not counted as protection. Warnings go to stderr in human mode and to the `exclusionWarnings` field under `--json`
@@ -1,6 +1,6 @@
1
1
  {
2
- "cli": "0.3.27",
3
- "docs-config": "0.3.27",
4
- "docs-theme": "0.3.27",
5
- "docs-transforms": "0.3.27"
2
+ "cli": "0.3.29",
3
+ "docs-config": "0.3.29",
4
+ "docs-theme": "0.3.29",
5
+ "docs-transforms": "0.3.29"
6
6
  }
@@ -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.1.0
9
+ version: 1.2.0
10
10
  ---
11
11
 
12
12
  # Authoring Docs
@@ -116,7 +116,7 @@ Load only the references needed for the current task:
116
116
  - `references/categories.md`: API, CLI, app, service, library, framework,
117
117
  monorepo, architecture, operations, and audience-specific guidance.
118
118
  - `references/writing-style.md`: plain technical writing and Markdown rules.
119
- - `references/templates.md`: reusable page and handoff templates.
119
+ - `references/templates.md`: reusable page and handoff templates, linking canonical copyable Markdown under `references/page-templates/`. Fresh approved preset init consumes those same bodies; local templates remain preferred.
120
120
  - `references/review-rubric.md`: readiness checklist and review rubric.
121
121
 
122
122
  ## Examples
@@ -123,8 +123,11 @@ use filename/slug parity for paired features and reciprocal links. A Product
123
123
  feature must link to its QA validation and Engineering counterpart (and back).
124
124
  Quote exact UI literals only when verified against source; distinguish a user
125
125
  concept from literal screen text. Do not fabricate test IDs or independent
126
- verification needs. Feature and QA validation page templates are not included here;
127
- use the page-type guidance and IA Proposal template to plan their content.
126
+ verification needs. Use the [Product feature](page-templates/product-feature.md),
127
+ [Engineering feature](page-templates/engineering-feature.md) and
128
+ [QA validation](page-templates/qa-validation.md) templates alongside the page-type
129
+ guidance and IA Proposal template. A shared screen spec is conditional on several
130
+ journeys using the same screen; do not manufacture one per feature.
128
131
 
129
132
  ## Navigation Principles
130
133
 
@@ -0,0 +1,63 @@
1
+ ---
2
+ title: Alert runbook
3
+ description: Triage, recovery and verification for a specific operational alert.
4
+ ---
5
+
6
+ # Alert runbook
7
+
8
+ ## When to use and entry criteria
9
+
10
+ Name the alert/symptoms and checks that establish this runbook applies.
11
+
12
+ ## Production context
13
+
14
+ Identify environment, affected components, customer impact and access prerequisites.
15
+
16
+ ## Ownership
17
+
18
+ Name the responding role, escalation route and owner-review gaps.
19
+
20
+ ## First-five-minutes triage
21
+
22
+ | Signal | Check | Interpretation | Next action |
23
+ | ------------------ | ----------------- | -------------------------- | ----------------------------- |
24
+ | <observed symptom> | <read-only check> | <supported interpretation> | <numbered step or escalation> |
25
+
26
+ ## Procedure
27
+
28
+ 1. Establish scope with a read-only check.
29
+ **Verify:** state the expected observation and stop/escalate condition.
30
+ 2. Perform the reviewed recovery action.
31
+ **Verify:** state the successful observation and failure response.
32
+
33
+ Warn immediately before any destructive command, state its scope and require the
34
+ reviewed dry run first. Do not invent runnable production commands or dry-run flags.
35
+
36
+ ## Why this approach
37
+
38
+ Explain the evidence and tradeoffs behind the recovery sequence.
39
+
40
+ ## Rollback
41
+
42
+ Describe the inverse action, recovery prerequisites and verification, or state why
43
+ rollback is unavailable and give the escalation route.
44
+
45
+ ## Verification checklist
46
+
47
+ - Confirm service health and the original alert condition.
48
+ - Confirm customer-visible recovery and absence of new side effects.
49
+ - Record dated evidence and unresolved owner-reviewed gaps.
50
+
51
+ ## Writing and evidence rules
52
+
53
+ Use backticks only for literals verified verbatim in source, such as commands,
54
+ errors, labels and identifiers. Write concepts in ordinary prose. Cite the
55
+ source location for each verified literal; label unknown facts as unknown.
56
+ Remove drafting prompts before publishing and retain owner-review gaps explicitly.
57
+
58
+ Keep these three evidence classes separate:
59
+
60
+ - Planned automation: intended coverage, with owner and remaining work.
61
+ - Implemented assertions: the test path and the exact assertion it implements.
62
+ - Dated execution evidence: date, environment/configuration, result and evidence
63
+ location. Implemented assertions alone do not prove a successful execution.
@@ -0,0 +1,55 @@
1
+ ---
2
+ title: Command reference
3
+ description: Verified command inputs, outputs and mutation boundaries.
4
+ ---
5
+
6
+ # Command reference
7
+
8
+ Source: <source location for the command registration and handler, or unknown>
9
+
10
+ ## Production impact
11
+
12
+ State affected environments, access and operational risks; say unknown when unknown.
13
+
14
+ ## Command group index
15
+
16
+ | Command | Purpose | Mutates |
17
+ | --------------------- | ------------- | -------------------------- |
18
+ | <verified invocation> | <reader goal> | <yes/no/unknown and scope> |
19
+
20
+ ## Shared flags
21
+
22
+ List verified spelling, defaults, accepted values and applicability.
23
+
24
+ ## Per-command arguments
25
+
26
+ For each command, describe positional arguments, flags, required combinations,
27
+ validation and defaults. State unknown rather than inferring behavior from a name.
28
+
29
+ ## Outputs and JSON
30
+
31
+ Describe human output and the verified --json schema where supported; otherwise
32
+ state unsupported or unknown. Show examples only when verified from source or a run.
33
+
34
+ ## Exit codes
35
+
36
+ List known categorical outcomes and their codes, including partial results.
37
+
38
+ ## Side effects
39
+
40
+ Name file, config, service and remote mutations, overwrite behavior and dry-run
41
+ support. Mark unverified effects unknown and identify the reviewing owner.
42
+
43
+ ## Writing and evidence rules
44
+
45
+ Use backticks only for literals verified verbatim in source, such as commands,
46
+ errors, labels and identifiers. Write concepts in ordinary prose. Cite the
47
+ source location for each verified literal; label unknown facts as unknown.
48
+ Remove drafting prompts before publishing and retain owner-review gaps explicitly.
49
+
50
+ Keep these three evidence classes separate:
51
+
52
+ - Planned automation: intended coverage, with owner and remaining work.
53
+ - Implemented assertions: the test path and the exact assertion it implements.
54
+ - Dated execution evidence: date, environment/configuration, result and evidence
55
+ location. Implemented assertions alone do not prove a successful execution.
@@ -0,0 +1,44 @@
1
+ ---
2
+ title: Decisions pointer
3
+ description: A curated guide to consequential decisions, not a ledger or an ADR.
4
+ ---
5
+
6
+ # Decisions pointer
7
+
8
+ ## Where records live
9
+
10
+ Link the repository's authoritative decision store. This page is not a ledger and
11
+ is not an ADR; it routes readers to records without copying their full content.
12
+
13
+ ## How records are created
14
+
15
+ Describe the existing repository process and required review. Do not initialize a
16
+ new decision system or imply adoption because this template was scaffolded.
17
+
18
+ ## Selected decisions
19
+
20
+ Curate 3–8 real records relevant to this audience, each with a one-line consequence.
21
+ Remove the drafting row and do not fabricate records to fill a quota.
22
+
23
+ | Record | Consequence | Staleness flag |
24
+ | ------------------ | ------------------------------------ | --------------------------------- |
25
+ | <real record link> | <current effect on reader decisions> | <current/superseded/needs review> |
26
+
27
+ ## Staleness and review
28
+
29
+ Identify superseded guidance, last verification and owner-review gaps. Keep the
30
+ canonical record authoritative when this pointer becomes stale.
31
+
32
+ ## Writing and evidence rules
33
+
34
+ Use backticks only for literals verified verbatim in source, such as commands,
35
+ errors, labels and identifiers. Write concepts in ordinary prose. Cite the
36
+ source location for each verified literal; label unknown facts as unknown.
37
+ Remove drafting prompts before publishing and retain owner-review gaps explicitly.
38
+
39
+ Keep these three evidence classes separate:
40
+
41
+ - Planned automation: intended coverage, with owner and remaining work.
42
+ - Implemented assertions: the test path and the exact assertion it implements.
43
+ - Dated execution evidence: date, environment/configuration, result and evidence
44
+ location. Implemented assertions alone do not prove a successful execution.