docs-cli 1.3.0__tar.gz → 1.4.0__tar.gz

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 (411) hide show
  1. {docs_cli-1.3.0 → docs_cli-1.4.0}/PKG-INFO +9 -7
  2. {docs_cli-1.3.0 → docs_cli-1.4.0}/README.md +8 -6
  3. {docs_cli-1.3.0 → docs_cli-1.4.0}/docs/INDEX.md +12 -9
  4. {docs_cli-1.3.0 → docs_cli-1.4.0}/docs/architecture.md +38 -13
  5. docs_cli-1.4.0/docs/archive/2026-05-27/m10-adoption-polish.md +268 -0
  6. {docs_cli-1.3.0/src/docs_cli/skill/references → docs_cli-1.4.0/docs}/cli.md +52 -7
  7. {docs_cli-1.3.0/src/docs_cli/skill/references → docs_cli-1.4.0/docs}/convention.md +23 -3
  8. docs_cli-1.4.0/docs/m10-adoption-polish-impl.md +985 -0
  9. docs_cli-1.4.0/docs/m11-pypi-publish-impl.md +364 -0
  10. docs_cli-1.4.0/docs/m11-pypi-publish.md +255 -0
  11. {docs_cli-1.3.0 → docs_cli-1.4.0}/docs/m7-migration-accuracy.md +16 -0
  12. {docs_cli-1.3.0 → docs_cli-1.4.0}/docs/m8-adoption-workflow.md +16 -0
  13. docs_cli-1.4.0/docs/m9-pypi-publish-log.md +257 -0
  14. {docs_cli-1.3.0 → docs_cli-1.4.0}/docs/m9-pypi-publish.md +146 -12
  15. {docs_cli-1.3.0 → docs_cli-1.4.0}/docs/plan.md +60 -30
  16. {docs_cli-1.3.0 → docs_cli-1.4.0}/docs/release-runbook.md +23 -6
  17. {docs_cli-1.3.0 → docs_cli-1.4.0}/docs/status.md +116 -52
  18. {docs_cli-1.3.0 → docs_cli-1.4.0}/pyproject.toml +1 -1
  19. {docs_cli-1.3.0 → docs_cli-1.4.0}/src/docs_cli/cli.py +330 -79
  20. {docs_cli-1.3.0 → docs_cli-1.4.0}/src/docs_cli/skill/references/adoption-playbook.md +150 -145
  21. {docs_cli-1.3.0/docs → docs_cli-1.4.0/src/docs_cli/skill/references}/cli.md +52 -7
  22. {docs_cli-1.3.0/docs → docs_cli-1.4.0/src/docs_cli/skill/references}/convention.md +23 -3
  23. {docs_cli-1.3.0 → docs_cli-1.4.0}/src/docs_cli/skill/references/use-cases.md +1 -1
  24. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/_typing/docs.pyi +1 -0
  25. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/expected/docs-INDEX.md +12 -9
  26. docs_cli-1.4.0/tests/fixtures/trees/real-trees-adopted/kebab-tiny/.docs.toml +6 -0
  27. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/kebab-tiny/INDEX.md +4 -4
  28. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/kebab-tiny/foo-bar-plan.md +1 -1
  29. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/kebab-tiny/foo-bar-spec.md +1 -1
  30. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/kebab-tiny/foo-bar-status.md +1 -1
  31. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/test_check.py +153 -0
  32. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/test_cli_check.py +42 -0
  33. docs_cli-1.4.0/tests/test_cli_migrate.py +619 -0
  34. docs_cli-1.4.0/tests/test_cli_touch.py +195 -0
  35. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/test_config.py +32 -0
  36. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/test_inference.py +14 -16
  37. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/test_lifecycle_rename.py +3 -3
  38. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/test_migrate.py +143 -20
  39. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/test_packaging.py +16 -16
  40. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/test_skill_adoption.py +2 -2
  41. docs_cli-1.3.0/docs/m9-pypi-publish-log.md +0 -30
  42. docs_cli-1.3.0/tests/fixtures/trees/real-trees-adopted/kebab-tiny/.docs.toml +0 -2
  43. docs_cli-1.3.0/tests/test_cli_migrate.py +0 -327
  44. docs_cli-1.3.0/tests/test_cli_touch.py +0 -84
  45. {docs_cli-1.3.0 → docs_cli-1.4.0}/.gitignore +0 -0
  46. {docs_cli-1.3.0 → docs_cli-1.4.0}/LICENSE +0 -0
  47. {docs_cli-1.3.0 → docs_cli-1.4.0}/docs/.docs.toml +0 -0
  48. {docs_cli-1.3.0 → docs_cli-1.4.0}/docs/charter.md +0 -0
  49. {docs_cli-1.3.0 → docs_cli-1.4.0}/docs/definition-of-ready.md +0 -0
  50. {docs_cli-1.3.0 → docs_cli-1.4.0}/docs/dual-status-adr.md +0 -0
  51. {docs_cli-1.3.0 → docs_cli-1.4.0}/docs/m1-parser-and-index-log.md +0 -0
  52. {docs_cli-1.3.0 → docs_cli-1.4.0}/docs/m1-parser-and-index.md +0 -0
  53. {docs_cli-1.3.0 → docs_cli-1.4.0}/docs/m2-mutating-verbs-log.md +0 -0
  54. {docs_cli-1.3.0 → docs_cli-1.4.0}/docs/m2-mutating-verbs.md +0 -0
  55. {docs_cli-1.3.0 → docs_cli-1.4.0}/docs/m3-validation-and-query-log.md +0 -0
  56. {docs_cli-1.3.0 → docs_cli-1.4.0}/docs/m3-validation-and-query.md +0 -0
  57. {docs_cli-1.3.0 → docs_cli-1.4.0}/docs/m4-migration-helper-log.md +0 -0
  58. {docs_cli-1.3.0 → docs_cli-1.4.0}/docs/m4-migration-helper.md +0 -0
  59. {docs_cli-1.3.0 → docs_cli-1.4.0}/docs/m5-claude-code-skill-log.md +0 -0
  60. {docs_cli-1.3.0 → docs_cli-1.4.0}/docs/m5-claude-code-skill.md +0 -0
  61. {docs_cli-1.3.0 → docs_cli-1.4.0}/docs/m6-pypi-distribution-log.md +0 -0
  62. {docs_cli-1.3.0 → docs_cli-1.4.0}/docs/m6-pypi-distribution.md +0 -0
  63. {docs_cli-1.3.0 → docs_cli-1.4.0}/docs/m7-migration-accuracy-log.md +0 -0
  64. {docs_cli-1.3.0 → docs_cli-1.4.0}/docs/m8-adoption-workflow-log.md +0 -0
  65. {docs_cli-1.3.0 → docs_cli-1.4.0}/docs/test-strategy.md +0 -0
  66. {docs_cli-1.3.0 → docs_cli-1.4.0}/docs/vocab-adr.md +0 -0
  67. {docs_cli-1.3.0 → docs_cli-1.4.0}/src/docs_cli/__init__.py +0 -0
  68. {docs_cli-1.3.0 → docs_cli-1.4.0}/src/docs_cli/skill/SKILL.md +0 -0
  69. {docs_cli-1.3.0 → docs_cli-1.4.0}/src/docs_cli/skill/references/docs-toml-template.toml +0 -0
  70. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/.gitkeep +0 -0
  71. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/conftest.py +0 -0
  72. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/body-from/clean-body.md +0 -0
  73. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/body-from/edge-case-keyword.md +0 -0
  74. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/body-from/with-frontmatter.txt +0 -0
  75. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/lifecycle/lifecycle-key.md +0 -0
  76. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/lifecycle/lifecycle-plus-status-prose.md +0 -0
  77. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/lifecycle/status-only.md +0 -0
  78. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/parser/well-formed.md +0 -0
  79. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/project-names/Abc5Migration/alpha.md +0 -0
  80. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/project-names/Abc5Migration/beta.md +0 -0
  81. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/project-names/Abc5Migration/gamma.md +0 -0
  82. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/project-names/FOO_BAR_BAZ/alpha.md +0 -0
  83. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/project-names/FOO_BAR_BAZ/beta.md +0 -0
  84. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/project-names/FOO_BAR_BAZ/gamma.md +0 -0
  85. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/project-names/FooBarBaz/alpha.md +0 -0
  86. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/project-names/FooBarBaz/beta.md +0 -0
  87. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/project-names/FooBarBaz/gamma.md +0 -0
  88. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/project-names/Foo_Bar_Baz/alpha.md +0 -0
  89. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/project-names/Foo_Bar_Baz/beta.md +0 -0
  90. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/project-names/Foo_Bar_Baz/gamma.md +0 -0
  91. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/project-names/Plan/alpha.md +0 -0
  92. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/project-names/Plan/beta.md +0 -0
  93. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/project-names/Plan/gamma.md +0 -0
  94. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/project-names/bugs-2026-01-26/alpha.md +0 -0
  95. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/project-names/bugs-2026-01-26/beta.md +0 -0
  96. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/project-names/bugs-2026-01-26/gamma.md +0 -0
  97. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/project-names/embedded-ai-discovery-parallel/alpha.md +0 -0
  98. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/project-names/embedded-ai-discovery-parallel/beta.md +0 -0
  99. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/project-names/embedded-ai-discovery-parallel/gamma.md +0 -0
  100. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/sibling-defaulting/majority-met/file-01-spec.md +0 -0
  101. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/sibling-defaulting/majority-met/file-02-spec.md +0 -0
  102. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/sibling-defaulting/majority-met/file-03-spec.md +0 -0
  103. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/sibling-defaulting/majority-met/file-04-spec.md +0 -0
  104. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/sibling-defaulting/majority-met/file-05-spec.md +0 -0
  105. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/sibling-defaulting/majority-met/file-06-spec.md +0 -0
  106. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/sibling-defaulting/majority-met/file-07-spec.md +0 -0
  107. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/sibling-defaulting/majority-met/file-08-no-suffix.md +0 -0
  108. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/sibling-defaulting/majority-met/file-09-no-suffix.md +0 -0
  109. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/sibling-defaulting/majority-met/file-10-no-suffix.md +0 -0
  110. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/sibling-defaulting/majority-not-met/file-01-spec.md +0 -0
  111. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/sibling-defaulting/majority-not-met/file-02-spec.md +0 -0
  112. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/sibling-defaulting/majority-not-met/file-03-spec.md +0 -0
  113. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/sibling-defaulting/majority-not-met/file-04-spec.md +0 -0
  114. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/sibling-defaulting/majority-not-met/file-05-plan.md +0 -0
  115. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/sibling-defaulting/majority-not-met/file-06-plan.md +0 -0
  116. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/sibling-defaulting/majority-not-met/file-07-plan.md +0 -0
  117. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/sibling-defaulting/majority-not-met/file-08-no-suffix.md +0 -0
  118. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/sibling-defaulting/majority-not-met/file-09-no-suffix.md +0 -0
  119. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/sibling-defaulting/majority-not-met/file-10-no-suffix.md +0 -0
  120. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/sibling-defaulting/sample-too-small/file-01-spec.md +0 -0
  121. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/sibling-defaulting/sample-too-small/file-02-spec.md +0 -0
  122. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/sibling-defaulting/sample-too-small/file-03-spec.md +0 -0
  123. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/sibling-defaulting/sample-too-small/file-04-no-suffix.md +0 -0
  124. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/status-prose/draft-companion.md +0 -0
  125. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/status-prose/freeform-status.md +0 -0
  126. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/status-prose/p0-implemented.md +0 -0
  127. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/status-prose/planning-only.md +0 -0
  128. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/cross-refs/.docs.toml +0 -0
  129. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/cross-refs/core.md +0 -0
  130. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/cross-refs/helper.md +0 -0
  131. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/cross-refs/overview.md +0 -0
  132. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/drift/.docs.toml +0 -0
  133. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/drift/archive/2026-01-01/properly-archived.md +0 -0
  134. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/drift/archive/2026-01-01/wrongly-active.md +0 -0
  135. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/drift/clean.md +0 -0
  136. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/drift/wrongly-archived.md +0 -0
  137. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/foreign/archived/proj-old-decision.md +0 -0
  138. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/foreign/proj-auth-spec.md +0 -0
  139. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/foreign/proj-db-adr.md +0 -0
  140. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/foreign/proj-deploy-log.md +0 -0
  141. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/foreign/proj-extra-metadata.md +0 -0
  142. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/foreign/proj-has-metadata.md +0 -0
  143. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/foreign/proj-no-h1.md +0 -0
  144. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/foreign/proj-overview.md +0 -0
  145. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/foreign/proj-release-plan.md +0 -0
  146. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/foreign/topics/proj-deep-notes.md +0 -0
  147. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/invalid/.docs.toml +0 -0
  148. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/invalid/bad-date.md +0 -0
  149. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/invalid/bad-role.md +0 -0
  150. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/invalid/bad-status.md +0 -0
  151. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/invalid/broken-ref.md +0 -0
  152. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/invalid/empty-role.md +0 -0
  153. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/invalid/no-h1.md +0 -0
  154. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/invalid/no-status.md +0 -0
  155. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/marker-preservation/.docs.toml +0 -0
  156. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/marker-preservation/INDEX.md +0 -0
  157. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/marker-preservation/lone-doc.md +0 -0
  158. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/minimal/.docs.toml +0 -0
  159. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/minimal/lone-doc.md +0 -0
  160. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/multi-project/.docs.toml +0 -0
  161. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/multi-project/alpha-charter.md +0 -0
  162. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/multi-project/alpha-old-spec.md +0 -0
  163. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/multi-project/alpha-plan.md +0 -0
  164. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/multi-project/alpha-spec.md +0 -0
  165. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/multi-project/archive/2026-04-01/beta-old.md +0 -0
  166. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/multi-project/beta-done.md +0 -0
  167. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/multi-project/beta-notes.md +0 -0
  168. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/multi-project/beta-status.md +0 -0
  169. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/multi-project/topics/orphan.md +0 -0
  170. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/nested/.docs.toml +0 -0
  171. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/nested/root-doc.md +0 -0
  172. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/nested/topics/deep-dive.md +0 -0
  173. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/README.md +0 -0
  174. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/archive-subdir/archived/foo-deprecated-plan.md +0 -0
  175. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/archive-subdir/archived/foo-historical-decision.md +0 -0
  176. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/archive-subdir/archived/foo-old-thing.md +0 -0
  177. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/archive-subdir/archived/foo-rejected-spec.md +0 -0
  178. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/archive-subdir/archived/foo-superseded-runbook.md +0 -0
  179. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/archive-subdir/foo-architecture-decision.md +0 -0
  180. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/archive-subdir/foo-bar-plan.md +0 -0
  181. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/archive-subdir/foo-bar-spec.md +0 -0
  182. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/archive-subdir/foo-charter.md +0 -0
  183. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/archive-subdir/foo-design-notes.md +0 -0
  184. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/archive-subdir/foo-launch-log.md +0 -0
  185. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/archive-subdir/foo-misc.md +0 -0
  186. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/archive-subdir/foo-overview.md +0 -0
  187. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/archive-subdir/foo-runbook.md +0 -0
  188. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/archive-subdir/foo-status.md +0 -0
  189. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/kebab-tiny/foo-bar-plan.md +0 -0
  190. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/kebab-tiny/foo-bar-spec.md +0 -0
  191. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/kebab-tiny/foo-bar-status.md +0 -0
  192. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/mixed-naming/API Reference.md +0 -0
  193. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/mixed-naming/Acme Plan - Database Population Plan.md +0 -0
  194. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/mixed-naming/AcmeApiSpec.md +0 -0
  195. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/mixed-naming/Foo_Design_Decision_Tree.md +0 -0
  196. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/mixed-naming/Foo_Domain_Spec.md +0 -0
  197. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/mixed-naming/Project_Status_Update.md +0 -0
  198. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/mixed-naming/User Guide - Operator Manual.md +0 -0
  199. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/mixed-naming/feature-rollout-plan.md +0 -0
  200. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/mixed-naming/incident-runbook.md +0 -0
  201. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/mixed-naming/release-notes.md +0 -0
  202. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_API_Spec.md +0 -0
  203. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Architecture.md +0 -0
  204. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Cards.md +0 -0
  205. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Charter.md +0 -0
  206. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Component_10_Spec.md +0 -0
  207. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Component_11_Spec.md +0 -0
  208. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Component_12_Spec.md +0 -0
  209. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Component_13_Spec.md +0 -0
  210. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Component_14_Spec.md +0 -0
  211. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Component_15_Spec.md +0 -0
  212. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Component_1_Spec.md +0 -0
  213. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Component_2_Spec.md +0 -0
  214. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Component_3_Spec.md +0 -0
  215. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Component_4_Spec.md +0 -0
  216. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Component_5_Spec.md +0 -0
  217. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Component_6_Spec.md +0 -0
  218. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Component_7_Spec.md +0 -0
  219. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Component_8_Spec.md +0 -0
  220. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Component_9_Spec.md +0 -0
  221. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Constraints.md +0 -0
  222. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Decision_Tree.md +0 -0
  223. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Design_Sketch.md +0 -0
  224. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Discovery_Plan.md +0 -0
  225. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Domain_Plan.md +0 -0
  226. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Handoff.md +0 -0
  227. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_M1.md +0 -0
  228. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_M10.md +0 -0
  229. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_M10_Implementation.md +0 -0
  230. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_M1_Implementation.md +0 -0
  231. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_M2.md +0 -0
  232. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_M2_Implementation.md +0 -0
  233. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_M3.md +0 -0
  234. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_M3_Implementation.md +0 -0
  235. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_M4.md +0 -0
  236. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_M4_Implementation.md +0 -0
  237. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_M5.md +0 -0
  238. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_M5_Implementation.md +0 -0
  239. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_M6.md +0 -0
  240. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_M6_Implementation.md +0 -0
  241. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_M7.md +0 -0
  242. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_M7_Implementation.md +0 -0
  243. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_M8.md +0 -0
  244. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_M8_Implementation.md +0 -0
  245. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_M9.md +0 -0
  246. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_M9_Implementation.md +0 -0
  247. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Migration_Plan.md +0 -0
  248. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Module_Spec.md +0 -0
  249. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Plan.md +0 -0
  250. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Plan_Draft.md +0 -0
  251. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Plan_v3.md +0 -0
  252. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Pricing_Memo.md +0 -0
  253. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Provider_Spec.md +0 -0
  254. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Service_Spec.md +0 -0
  255. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Status.md +0 -0
  256. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Strategy_Outline.md +0 -0
  257. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Strategy_v2.md +0 -0
  258. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Task_10_Plan.md +0 -0
  259. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Task_11_Plan.md +0 -0
  260. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Task_12_Plan.md +0 -0
  261. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Task_13_Plan.md +0 -0
  262. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Task_14_Plan.md +0 -0
  263. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Task_15_Plan.md +0 -0
  264. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Task_1_Plan.md +0 -0
  265. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Task_2_Plan.md +0 -0
  266. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Task_3_Plan.md +0 -0
  267. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Task_4_Plan.md +0 -0
  268. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Task_5_Plan.md +0 -0
  269. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Task_6_Plan.md +0 -0
  270. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Task_7_Plan.md +0 -0
  271. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Task_8_Plan.md +0 -0
  272. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Task_9_Plan.md +0 -0
  273. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-large/Foo_Vendor_Brief.md +0 -0
  274. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-medium/Foo_Architecture.md +0 -0
  275. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-medium/Foo_Brief.md +0 -0
  276. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-medium/Foo_Charter.md +0 -0
  277. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-medium/Foo_Implementation.md +0 -0
  278. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-medium/Foo_Log.md +0 -0
  279. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-medium/Foo_M1.md +0 -0
  280. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-medium/Foo_M1_Implementation.md +0 -0
  281. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-medium/Foo_M2.md +0 -0
  282. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-medium/Foo_M2_Implementation.md +0 -0
  283. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-medium/Foo_M3.md +0 -0
  284. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-medium/Foo_M4.md +0 -0
  285. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-medium/Foo_Memo.md +0 -0
  286. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-medium/Foo_Outline.md +0 -0
  287. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-medium/Foo_Plan.md +0 -0
  288. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-medium/Foo_Sketch.md +0 -0
  289. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-medium/Foo_Status.md +0 -0
  290. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees/snake-medium/Foo_Strategy_v2.md +0 -0
  291. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/.docs.toml +0 -0
  292. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_API_Spec.md +0 -0
  293. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Architecture.md +0 -0
  294. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Cards.md +0 -0
  295. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Charter.md +0 -0
  296. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Component_10_Spec.md +0 -0
  297. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Component_11_Spec.md +0 -0
  298. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Component_12_Spec.md +0 -0
  299. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Component_13_Spec.md +0 -0
  300. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Component_14_Spec.md +0 -0
  301. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Component_15_Spec.md +0 -0
  302. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Component_1_Spec.md +0 -0
  303. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Component_2_Spec.md +0 -0
  304. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Component_3_Spec.md +0 -0
  305. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Component_4_Spec.md +0 -0
  306. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Component_5_Spec.md +0 -0
  307. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Component_6_Spec.md +0 -0
  308. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Component_7_Spec.md +0 -0
  309. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Component_8_Spec.md +0 -0
  310. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Component_9_Spec.md +0 -0
  311. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Constraints.md +0 -0
  312. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Decision_Tree.md +0 -0
  313. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Design_Sketch.md +0 -0
  314. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Discovery_Plan.md +0 -0
  315. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Domain_Plan.md +0 -0
  316. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Handoff.md +0 -0
  317. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_M1.md +0 -0
  318. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_M10.md +0 -0
  319. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_M10_Implementation.md +0 -0
  320. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_M1_Implementation.md +0 -0
  321. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_M2.md +0 -0
  322. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_M2_Implementation.md +0 -0
  323. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_M3.md +0 -0
  324. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_M3_Implementation.md +0 -0
  325. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_M4.md +0 -0
  326. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_M4_Implementation.md +0 -0
  327. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_M5.md +0 -0
  328. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_M5_Implementation.md +0 -0
  329. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_M6.md +0 -0
  330. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_M6_Implementation.md +0 -0
  331. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_M7.md +0 -0
  332. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_M7_Implementation.md +0 -0
  333. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_M8.md +0 -0
  334. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_M8_Implementation.md +0 -0
  335. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_M9.md +0 -0
  336. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_M9_Implementation.md +0 -0
  337. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Migration_Plan.md +0 -0
  338. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Module_Spec.md +0 -0
  339. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Plan.md +0 -0
  340. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Plan_Draft.md +0 -0
  341. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Plan_v3.md +0 -0
  342. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Pricing_Memo.md +0 -0
  343. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Provider_Spec.md +0 -0
  344. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Service_Spec.md +0 -0
  345. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Status.md +0 -0
  346. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Strategy_Outline.md +0 -0
  347. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Strategy_v2.md +0 -0
  348. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Task_10_Plan.md +0 -0
  349. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Task_11_Plan.md +0 -0
  350. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Task_12_Plan.md +0 -0
  351. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Task_13_Plan.md +0 -0
  352. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Task_14_Plan.md +0 -0
  353. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Task_15_Plan.md +0 -0
  354. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Task_1_Plan.md +0 -0
  355. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Task_2_Plan.md +0 -0
  356. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Task_3_Plan.md +0 -0
  357. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Task_4_Plan.md +0 -0
  358. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Task_5_Plan.md +0 -0
  359. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Task_6_Plan.md +0 -0
  360. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Task_7_Plan.md +0 -0
  361. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Task_8_Plan.md +0 -0
  362. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Task_9_Plan.md +0 -0
  363. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/Foo_Vendor_Brief.md +0 -0
  364. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-large/INDEX.md +0 -0
  365. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-medium/.docs.toml +0 -0
  366. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-medium/Foo_Architecture.md +0 -0
  367. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-medium/Foo_Brief.md +0 -0
  368. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-medium/Foo_Charter.md +0 -0
  369. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-medium/Foo_Implementation.md +0 -0
  370. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-medium/Foo_Log.md +0 -0
  371. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-medium/Foo_M1.md +0 -0
  372. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-medium/Foo_M1_Implementation.md +0 -0
  373. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-medium/Foo_M2.md +0 -0
  374. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-medium/Foo_M2_Implementation.md +0 -0
  375. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-medium/Foo_M3.md +0 -0
  376. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-medium/Foo_M4.md +0 -0
  377. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-medium/Foo_Memo.md +0 -0
  378. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-medium/Foo_Outline.md +0 -0
  379. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-medium/Foo_Plan.md +0 -0
  380. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-medium/Foo_Sketch.md +0 -0
  381. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-medium/Foo_Status.md +0 -0
  382. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-medium/Foo_Strategy_v2.md +0 -0
  383. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/real-trees-adopted/snake-medium/INDEX.md +0 -0
  384. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/with-archive/.docs.toml +0 -0
  385. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/with-archive/.hidden-file +0 -0
  386. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/with-archive/.private/should-not-be-walked.md +0 -0
  387. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/with-archive/alpha.md +0 -0
  388. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/with-archive/archive/2026-01-01/INDEX.md +0 -0
  389. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/with-archive/archive/2026-01-01/old-plan.md +0 -0
  390. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/with-archive/beta.md +0 -0
  391. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/fixtures/trees/with-archive/notes.txt +0 -0
  392. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/manual/m7_success_criteria.py +0 -0
  393. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/test_archive_normalisation.py +0 -0
  394. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/test_body_from.py +0 -0
  395. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/test_cli_archive.py +0 -0
  396. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/test_cli_index.py +0 -0
  397. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/test_cli_list.py +0 -0
  398. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/test_cli_mv.py +0 -0
  399. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/test_cli_new.py +0 -0
  400. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/test_edit.py +0 -0
  401. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/test_exclude.py +0 -0
  402. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/test_index.py +0 -0
  403. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/test_model.py +0 -0
  404. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/test_multi_project_hints.py +0 -0
  405. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/test_non_md_surfacing.py +0 -0
  406. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/test_project_normalisation.py +0 -0
  407. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/test_query.py +0 -0
  408. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/test_skill.py +0 -0
  409. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/test_skill_refs.py +0 -0
  410. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/test_triage_flags.py +0 -0
  411. {docs_cli-1.3.0 → docs_cli-1.4.0}/tests/test_walker.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: docs-cli
3
- Version: 1.3.0
3
+ Version: 1.4.0
4
4
  Summary: Prescriptive CLI for managing trees of structured Markdown docs.
5
5
  Project-URL: Homepage, https://github.com/ArtRichards/docs-cli
6
6
  Project-URL: Repository, https://github.com/ArtRichards/docs-cli
@@ -124,20 +124,22 @@ python3 -m venv .venv
124
124
 
125
125
  ## Status
126
126
 
127
- **v1 complete; M8 shipped locally as 1.3.0 (publish DEFERRED to M9 batched 1.3.0).** Milestone history:
127
+ **docs-cli 1.3.0 shipped 2026-05-25** the first public release. Install with `pip install docs-cli`. **docs-cli 1.4.0 is ready locally** (M10 adoption-flow polish); the M11 publish milestone will lift it onto PyPI. Milestone history:
128
128
 
129
129
  - M1 — Parser and `docs index` (shipped 2026-05-20)
130
130
  - M2 — Mutating verbs `new`, `archive`, `mv`, `touch` (shipped 2026-05-21)
131
131
  - M3 — Validation and query `check`, `list` (shipped 2026-05-22)
132
132
  - M4 — Migration helper `docs migrate` (shipped 2026-05-22)
133
133
  - M5 — Claude Code skill — drives the verbs automatically when an agent does documentation work in a `docs`-managed tree, with self-contained convention and CLI references bundled alongside (shipped 2026-05-22)
134
- - M6 — PyPI distribution preparation as `docs-cli`; relocates the CLI to a proper package at `src/docs_cli/`, ships the skill inside the wheel as package data, and adds `docs install-skill` for one-shot host materialisation (closed 2026-05-24 as preparation-only no publish)
135
- - M7 — Migration accuracy: `Status:` → `Lifecycle:` controlled-vocab rename, broadened role inference (H1 / section-header / sibling-set / word-boundary / `_M\d+` / non-role-suffix strip), `medium` confidence level, project-name normalisation, per-file mtime archive dates, multi-project hints, `--config-project` override, `[migrate]`-only sidecar (closed 2026-05-25 as 1.2.0 locally; publish DEFERRED to M9)
136
- - M8 — Adoption workflow agent-driveable: tree-wide `--exclude` + `[exclude]` + `.docsignore`; migrate triage flags (`--summary`, `--only ambiguous`, `--group-by`); default plan footer summary; non-md sibling surfacing; `docs new --body-from` for one-call atomic doc authoring; substantial skill-reference rewrite (adoption playbook + `.docs.toml` template) (closed 2026-05-25 as 1.3.0 locally; publish DEFERRED to M9)
134
+ - M6 — PyPI distribution preparation as `docs-cli`; relocates the CLI to a proper package at `src/docs_cli/`, ships the skill inside the wheel as package data, and adds `docs install-skill` for one-shot host materialisation (closed 2026-05-24 as preparation-only; publish landed at M9 batched 1.3.0)
135
+ - M7 — Migration accuracy: `Status:` → `Lifecycle:` controlled-vocab rename, broadened role inference (H1 / section-header / sibling-set / word-boundary / `_M\d+` / non-role-suffix strip), `medium` confidence level, project-name normalisation, per-file mtime archive dates, multi-project hints, `--config-project` override, `[migrate]`-only sidecar (shipped 2026-05-25; the version-internal 1.2.0 was published at M9 batched 1.3.0)
136
+ - M8 — Adoption workflow agent-driveable: tree-wide `--exclude` + `[exclude]` + `.docsignore`; migrate triage flags (`--summary`, `--only ambiguous`, `--group-by`); default plan footer summary; non-md sibling surfacing; `docs new --body-from` for one-call atomic doc authoring; substantial skill-reference rewrite (adoption playbook + `.docs.toml` template) (shipped 2026-05-25; the version-internal 1.3.0 is the published number)
137
+ - M9 — PyPI publish (shipped 2026-05-25). `docs-cli==1.3.0` is live at [pypi.org/project/docs-cli/1.3.0/](https://pypi.org/project/docs-cli/1.3.0/); source tag at [github.com/ArtRichards/docs-cli/releases/tag/v1.3.0](https://github.com/ArtRichards/docs-cli/releases/tag/v1.3.0).
138
+ - M10 — Adoption-flow polish + 1.3.0 carry-overs (ready locally as 1.4.0): multi-file atomic `docs touch <file>...`; `docs migrate --apply` writes/extends `.docs.toml` automatically + opportunistically removes empty archive-style parents; `docs migrate --apply --quiet` suppresses the per-file plan block; `[vocabulary] add_fields` allowlist + `docs check` `unknown-field` warning; `Confidence` enum replacing the M4 `bool | str` tri-value (JSON wire format byte-stable); `MigrationPlan.excluded_count` removed (set but never read); adoption playbook restructured to 4 steps (plan / triage / apply / verify). Publish deferred to M11.
137
139
 
138
- **Publish strategy.** v1.1.0, v1.2.0, and v1.3.0 were never published to PyPI. M9 batches the post-M8 tree into the first PyPI release as 1.3.0 one publish event covering M6 + M7 + M8 surface together (per operator OQ-C). The on-disk Markdown convention is otherwise stable; the M7 `Lifecycle:` rename is a one-time keyword change with no backward-compat alias.
140
+ **Publish strategy.** v1.1.0 and v1.2.0 never reached PyPI by design; M9 batched the M6 + M7 + M8 surface into a single public release at version 1.3.0 (one publish event, per operator OQ-C). The on-disk Markdown convention is otherwise stable; the M7 `Lifecycle:` rename is a one-time keyword change with no backward-compat alias.
139
141
 
140
- See [`docs/status.md`](https://github.com/ArtRichards/docs-cli/blob/main/docs/status.md) for per-milestone summaries and [`docs/plan.md`](https://github.com/ArtRichards/docs-cli/blob/main/docs/plan.md) for the v1.x backlog. The [CHANGELOG](https://github.com/ArtRichards/docs-cli/blob/main/CHANGELOG.md) tracks every release.
142
+ See [`docs/status.md`](https://github.com/ArtRichards/docs-cli/blob/main/docs/status.md) for per-milestone summaries, [`docs/plan.md`](https://github.com/ArtRichards/docs-cli/blob/main/docs/plan.md) for the roadmap, and [`docs/m9-pypi-publish.md`](https://github.com/ArtRichards/docs-cli/blob/main/docs/m9-pypi-publish.md) for the publish record (artifact sha256, deviations recorded for future releases). The [CHANGELOG](https://github.com/ArtRichards/docs-cli/blob/main/CHANGELOG.md) tracks every release.
141
143
 
142
144
  ## License
143
145
 
@@ -78,20 +78,22 @@ python3 -m venv .venv
78
78
 
79
79
  ## Status
80
80
 
81
- **v1 complete; M8 shipped locally as 1.3.0 (publish DEFERRED to M9 batched 1.3.0).** Milestone history:
81
+ **docs-cli 1.3.0 shipped 2026-05-25** the first public release. Install with `pip install docs-cli`. **docs-cli 1.4.0 is ready locally** (M10 adoption-flow polish); the M11 publish milestone will lift it onto PyPI. Milestone history:
82
82
 
83
83
  - M1 — Parser and `docs index` (shipped 2026-05-20)
84
84
  - M2 — Mutating verbs `new`, `archive`, `mv`, `touch` (shipped 2026-05-21)
85
85
  - M3 — Validation and query `check`, `list` (shipped 2026-05-22)
86
86
  - M4 — Migration helper `docs migrate` (shipped 2026-05-22)
87
87
  - M5 — Claude Code skill — drives the verbs automatically when an agent does documentation work in a `docs`-managed tree, with self-contained convention and CLI references bundled alongside (shipped 2026-05-22)
88
- - M6 — PyPI distribution preparation as `docs-cli`; relocates the CLI to a proper package at `src/docs_cli/`, ships the skill inside the wheel as package data, and adds `docs install-skill` for one-shot host materialisation (closed 2026-05-24 as preparation-only no publish)
89
- - M7 — Migration accuracy: `Status:` → `Lifecycle:` controlled-vocab rename, broadened role inference (H1 / section-header / sibling-set / word-boundary / `_M\d+` / non-role-suffix strip), `medium` confidence level, project-name normalisation, per-file mtime archive dates, multi-project hints, `--config-project` override, `[migrate]`-only sidecar (closed 2026-05-25 as 1.2.0 locally; publish DEFERRED to M9)
90
- - M8 — Adoption workflow agent-driveable: tree-wide `--exclude` + `[exclude]` + `.docsignore`; migrate triage flags (`--summary`, `--only ambiguous`, `--group-by`); default plan footer summary; non-md sibling surfacing; `docs new --body-from` for one-call atomic doc authoring; substantial skill-reference rewrite (adoption playbook + `.docs.toml` template) (closed 2026-05-25 as 1.3.0 locally; publish DEFERRED to M9)
88
+ - M6 — PyPI distribution preparation as `docs-cli`; relocates the CLI to a proper package at `src/docs_cli/`, ships the skill inside the wheel as package data, and adds `docs install-skill` for one-shot host materialisation (closed 2026-05-24 as preparation-only; publish landed at M9 batched 1.3.0)
89
+ - M7 — Migration accuracy: `Status:` → `Lifecycle:` controlled-vocab rename, broadened role inference (H1 / section-header / sibling-set / word-boundary / `_M\d+` / non-role-suffix strip), `medium` confidence level, project-name normalisation, per-file mtime archive dates, multi-project hints, `--config-project` override, `[migrate]`-only sidecar (shipped 2026-05-25; the version-internal 1.2.0 was published at M9 batched 1.3.0)
90
+ - M8 — Adoption workflow agent-driveable: tree-wide `--exclude` + `[exclude]` + `.docsignore`; migrate triage flags (`--summary`, `--only ambiguous`, `--group-by`); default plan footer summary; non-md sibling surfacing; `docs new --body-from` for one-call atomic doc authoring; substantial skill-reference rewrite (adoption playbook + `.docs.toml` template) (shipped 2026-05-25; the version-internal 1.3.0 is the published number)
91
+ - M9 — PyPI publish (shipped 2026-05-25). `docs-cli==1.3.0` is live at [pypi.org/project/docs-cli/1.3.0/](https://pypi.org/project/docs-cli/1.3.0/); source tag at [github.com/ArtRichards/docs-cli/releases/tag/v1.3.0](https://github.com/ArtRichards/docs-cli/releases/tag/v1.3.0).
92
+ - M10 — Adoption-flow polish + 1.3.0 carry-overs (ready locally as 1.4.0): multi-file atomic `docs touch <file>...`; `docs migrate --apply` writes/extends `.docs.toml` automatically + opportunistically removes empty archive-style parents; `docs migrate --apply --quiet` suppresses the per-file plan block; `[vocabulary] add_fields` allowlist + `docs check` `unknown-field` warning; `Confidence` enum replacing the M4 `bool | str` tri-value (JSON wire format byte-stable); `MigrationPlan.excluded_count` removed (set but never read); adoption playbook restructured to 4 steps (plan / triage / apply / verify). Publish deferred to M11.
91
93
 
92
- **Publish strategy.** v1.1.0, v1.2.0, and v1.3.0 were never published to PyPI. M9 batches the post-M8 tree into the first PyPI release as 1.3.0 one publish event covering M6 + M7 + M8 surface together (per operator OQ-C). The on-disk Markdown convention is otherwise stable; the M7 `Lifecycle:` rename is a one-time keyword change with no backward-compat alias.
94
+ **Publish strategy.** v1.1.0 and v1.2.0 never reached PyPI by design; M9 batched the M6 + M7 + M8 surface into a single public release at version 1.3.0 (one publish event, per operator OQ-C). The on-disk Markdown convention is otherwise stable; the M7 `Lifecycle:` rename is a one-time keyword change with no backward-compat alias.
93
95
 
94
- See [`docs/status.md`](https://github.com/ArtRichards/docs-cli/blob/main/docs/status.md) for per-milestone summaries and [`docs/plan.md`](https://github.com/ArtRichards/docs-cli/blob/main/docs/plan.md) for the v1.x backlog. The [CHANGELOG](https://github.com/ArtRichards/docs-cli/blob/main/CHANGELOG.md) tracks every release.
96
+ See [`docs/status.md`](https://github.com/ArtRichards/docs-cli/blob/main/docs/status.md) for per-milestone summaries, [`docs/plan.md`](https://github.com/ArtRichards/docs-cli/blob/main/docs/plan.md) for the roadmap, and [`docs/m9-pypi-publish.md`](https://github.com/ArtRichards/docs-cli/blob/main/docs/m9-pypi-publish.md) for the publish record (artifact sha256, deviations recorded for future releases). The [CHANGELOG](https://github.com/ArtRichards/docs-cli/blob/main/CHANGELOG.md) tracks every release.
95
97
 
96
98
  ## License
97
99
 
@@ -5,13 +5,13 @@ This directory is the docs root for the `docs` CLI itself. We eat our own dog fo
5
5
  The hand-written preamble (this paragraph, and anything outside the marker block) is preserved by the tool. Only content between `<!-- docs:generated start -->` and `<!-- docs:generated end -->` is rewritten.
6
6
 
7
7
  <!-- docs:generated start -->
8
- _Generated 2026-05-25. 29 docs active, 0 archived._
8
+ _Generated 2026-05-27. 32 docs active, 1 archived._
9
9
 
10
10
  ## Project — docs
11
11
 
12
12
  ### Active — Status
13
13
 
14
- - [status.md](status.md) — _status_ — **This is the single source of truth for project progress. Update only this file when milestones complete or phases…. Updated 2026-05-25.
14
+ - [status.md](status.md) — _status_ — **This is the single source of truth for project progress. Update only this file when milestones complete or phases…. Updated 2026-05-27.
15
15
 
16
16
  ### Active — Charter
17
17
 
@@ -19,15 +19,16 @@ _Generated 2026-05-25. 29 docs active, 0 archived._
19
19
 
20
20
  ### Active — Plan
21
21
 
22
- - [plan.md](plan.md) — _plan_ — Three milestones to v1, then a migration helper, then a Claude Code skill wrapper. v1.1 picks up with packaging, then…. Updated 2026-05-25.
22
+ - [plan.md](plan.md) — _plan_ — Three milestones to v1, then a migration helper, then a Claude Code skill wrapper. v1.1 picks up with packaging, then…. Updated 2026-05-27.
23
23
 
24
24
  ### Active — Spec
25
25
 
26
- - [cli.md](cli.md) — _spec_ — This spec defines the `docs` command-line surface: subcommands, flags, output formats, and exit codes. The on-disk…. Updated 2026-05-25.
27
- - [convention.md](convention.md) — _spec_ — This spec defines the on-disk convention that `docs` reads and writes. It is the portable, tool-independent part: any…. Updated 2026-05-25.
26
+ - [cli.md](cli.md) — _spec_ — This spec defines the `docs` command-line surface: subcommands, flags, output formats, and exit codes. The on-disk…. Updated 2026-05-27.
27
+ - [convention.md](convention.md) — _spec_ — This spec defines the on-disk convention that `docs` reads and writes. It is the portable, tool-independent part: any…. Updated 2026-05-27.
28
28
 
29
29
  ### Active — Milestone
30
30
 
31
+ - [m11-pypi-publish.md](m11-pypi-publish.md) — _milestone_ — > **Stub-drafted 2026-05-27, post M10 closeout.** M11 enters > active state immediately — the M10 wheel + sdist already…. Updated 2026-05-27.
31
32
  - [m7-migration-accuracy.md](m7-migration-accuracy.md) — _milestone_ — - Milestone: M7 (v1.1) - Title: Migration plan accuracy - Surface: extensions to `docs migrate`'s inference…. Updated 2026-05-25.
32
33
  - [m8-adoption-workflow.md](m8-adoption-workflow.md) — _milestone_ — - Milestone: M8 (v1.1) - Title: Adoption workflow — agent-driveable - Surface: new CLI flags + verbs (`--exclude`,…. Updated 2026-05-25.
33
34
  - [m9-pypi-publish.md](m9-pypi-publish.md) — _milestone_ — > **Stub-drafted 2026-05-24, post M6 scope reframe.** M9 enters > active state once M8 ships. The operative checklist…. Updated 2026-05-25.
@@ -40,9 +41,11 @@ _Generated 2026-05-25. 29 docs active, 0 archived._
40
41
 
41
42
  ### Active — Log
42
43
 
44
+ - [m10-adoption-polish-impl.md](m10-adoption-polish-impl.md) — _log_ — Chronological log of work on M10 — Adoption-flow polish + 1.3.0 carry-overs. Append a section per phase with objective,…. Updated 2026-05-27.
45
+ - [m11-pypi-publish-impl.md](m11-pypi-publish-impl.md) — _log_ — Chronological log of work on M11 — PyPI publish `docs-cli` 1.4.0. Append a section per phase (Operator prep →…. Updated 2026-05-27.
43
46
  - [m7-migration-accuracy-log.md](m7-migration-accuracy-log.md) — _log_ — - Project: docs - Milestone: M7 — Migration plan accuracy - Started: 2026-05-24 - Progress: **Phase 1 complete; Phase 2…. Updated 2026-05-25.
44
47
  - [m8-adoption-workflow-log.md](m8-adoption-workflow-log.md) — _log_ — - Project: docs - Milestone: M8 — Adoption workflow (agent-driveable) - Started: 2026-05-24 - Progress: **All 10 TDD…. Updated 2026-05-25.
45
- - [m9-pypi-publish-log.md](m9-pypi-publish-log.md) — _log_ — Per-phase log for M9. Entries get appended as the operator walks [release-runbook.md](release-runbook.md) post-M8.. Updated 2026-05-24.
48
+ - [m9-pypi-publish-log.md](m9-pypi-publish-log.md) — _log_ — Per-phase log for M9. Entries appended as the operator walked [release-runbook.md](release-runbook.md) post-M8.. Updated 2026-05-25.
46
49
  - [m5-claude-code-skill-log.md](m5-claude-code-skill-log.md) — _log_ — - Project: docs - Milestone: M5 — Claude Code skill - Started: 2026-05-22 - Progress: **M5 complete — shipped…. Updated 2026-05-23.
47
50
  - [m6-pypi-distribution-log.md](m6-pypi-distribution-log.md) — _log_ — - Project: docs - Milestone: M6 — PyPI distribution as `docs-cli` - Started: 2026-05-23 - Progress: **Milestone-setup…. Updated 2026-05-23.
48
51
  - [m3-validation-and-query-log.md](m3-validation-and-query-log.md) — _log_ — - Project: docs - Milestone: M3 — Validation and query (`check`, `list`) - Started: 2026-05-22 - Progress: Complete —…. Updated 2026-05-22.
@@ -57,15 +60,15 @@ _Generated 2026-05-25. 29 docs active, 0 archived._
57
60
 
58
61
  ### Active — Runbook
59
62
 
60
- - [release-runbook.md](release-runbook.md) — _runbook_ — The operator-driven checklist for shipping `docs-cli` to PyPI. This runbook is **M9's operative artifact** — every…. Updated 2026-05-25.
63
+ - [release-runbook.md](release-runbook.md) — _runbook_ — The operator-driven checklist for shipping `docs-cli` to PyPI. This runbook drove **M9 `docs-cli==1.3.0`** (shipped…. Updated 2026-05-25.
61
64
 
62
65
  ### Active — Reference
63
66
 
64
- - [architecture.md](architecture.md) — _reference_ — Single Python module at `src/docs_cli/cli.py`, exposed as the `docs` console-script via the `docs_cli.cli:main` entry…. Updated 2026-05-25.
67
+ - [architecture.md](architecture.md) — _reference_ — Single Python module at `src/docs_cli/cli.py`, exposed as the `docs` console-script via the `docs_cli.cli:main` entry…. Updated 2026-05-27.
65
68
  - [definition-of-ready.md](definition-of-ready.md) — _reference_ — Gate-check before implementation begins. Implementation does not start until every item is green.. Updated 2026-05-22.
66
69
  - [test-strategy.md](test-strategy.md) — _reference_ — | Layer | Tool | Scope | |---|---|---| | Unit | pytest | Parser, walker, render, vocab loading. Pure-function focus. |…. Updated 2026-05-20.
67
70
 
68
71
  ## Archived
69
72
 
70
- _None._
73
+ - [archive/2026-05-27/m10-adoption-polish.md](archive/2026-05-27/m10-adoption-polish.md) — _milestone_ — - Milestone: M10 (v1.4.0) - Title: Adoption-flow polish + 1.3.0 carry-overs - Surface: two new CLI features (`docs…. Updated 2026-05-27.
71
74
  <!-- docs:generated end -->
@@ -3,7 +3,7 @@
3
3
  Lifecycle: active
4
4
  Role: reference
5
5
  Project: docs
6
- Updated: 2026-05-25
6
+ Updated: 2026-05-27
7
7
 
8
8
  Related:
9
9
  - implements: charter.md
@@ -24,7 +24,7 @@ inside the same wheel as package data.
24
24
  src/docs_cli/ (Python 3.11+, stdlib only)
25
25
  ├── __init__.py ─ lazy re-export of `main`
26
26
  ├── cli.py ─ the CLI module (~3.8k lines)
27
- │ ├── dunder version (__version__ = "1.3.0")
27
+ │ ├── dunder version (__version__ = "1.4.0")
28
28
  │ ├── config — TOML load, Vocab merging, archive-dir resolution,
29
29
  │ │ `[migrate]` per-tree overrides (M7),
30
30
  │ │ `[exclude]` + `.docsignore` (M8)
@@ -201,7 +201,11 @@ the marker block and the derived content.
201
201
  (low). Word-boundary tolerance: tokeniser splits on `-`/`_`/whitespace
202
202
  AND case-transition (`MyPlan` → suffix `plan`). Optional `config`
203
203
  extends the built-in suffix map with `config.role_suffixes`.
204
- Confidence is `True`/`"medium"`/`False`.
204
+ Confidence is a `Confidence(enum.Enum)` member (`HIGH | MEDIUM |
205
+ LOW`) — M10 replaces the legacy `True | "medium" | False` tri-value.
206
+ The enum's `value` strings (`"high"`/`"medium"`/`"low"`) match the
207
+ M4 JSON wire format byte-for-byte; `migration_to_json` crosses
208
+ enum→string via `fm.confidence.value` at the boundary.
205
209
  - `infer_project(filenames, dir_name) -> str` — the longest common
206
210
  `-`/`_`-delimited filename prefix, or the directory name.
207
211
  - `normalise_project_name(name) -> str` (M7 — F11) — splits on case
@@ -254,20 +258,41 @@ the marker block and the derived content.
254
258
  (F5) emits `MigrationPlan.multi_project_hints` via
255
259
  `_multi_project_hints` unless `cli_config_project` is set.
256
260
  `apply_migration(plan)` executes it: `insert_metadata_block` +
257
- `atomic_write` per file, plus the archive moves.
261
+ `atomic_write` per file, plus the archive moves. After each
262
+ archive-move it calls `_opportunistic_rmdir(old_parent, plan.root)`
263
+ to clear the now-empty source dir (M10 — OQ-G; swallows OSError on
264
+ a non-empty parent so non-migrating siblings survive). After the
265
+ file loop it calls `_ensure_docs_toml(plan)` which writes (or
266
+ extends) the root `.docs.toml` sidecar so the adopted tree is
267
+ immediately self-describing — absent sidecar gets a minimal
268
+ `[project] name = "<resolved>"` + `[archive] date_format` block;
269
+ existing sidecar without `[project]` gets the new block appended
270
+ under a `# Added by docs migrate --apply` provenance comment;
271
+ existing `[project]` is never overwritten (M10 — OQ-A).
258
272
  `migration_to_json(plan)` serialises the whole plan to the `--json`
259
273
  schema pinned in [cli.md](cli.md).
260
274
  - **Models** — `FileMigration` (frozen) carries one per-file decision: the
261
275
  inferred `role`/`project`/`lifecycle` (M7-renamed)/`updated`,
262
- `confidence` (`"high"|"medium"|"low"` M7 widens to three values per
263
- OQ-D; `medium` requires empty `ambiguities`), `ambiguities`,
264
- `synthesized_h1`, `reconciled_metadata`, and an optional
265
- `archive_move` destination. `MigrationPlan` (frozen) holds the `root`,
266
- the tuple of `FileMigration`s in root-relative path order,
267
- `project_original: str | None` (M7 the pre-normalisation project
268
- name when F11 changed the value, else `None`), and
269
- `multi_project_hints: tuple[str, ...]` (M7 — F5 advisory hints, empty
270
- when none apply or when the CLI override is in force).
276
+ `confidence: Confidence` (a `Confidence` enum member M10 replaces
277
+ the M7 tri-string with the enum; `Confidence.MEDIUM` requires empty
278
+ `ambiguities`), `ambiguities`, `synthesized_h1`,
279
+ `reconciled_metadata`, and an optional `archive_move` destination.
280
+ `MigrationPlan` (frozen) holds the `root`, the tuple of
281
+ `FileMigration`s in root-relative path order, `project_original:
282
+ str | None` (M7 the pre-normalisation project name when F11
283
+ changed the value, else `None`), and `multi_project_hints:
284
+ tuple[str, ...]` (M7 F5 advisory hints, empty when none apply or
285
+ when the CLI override is in force). M10 — OQ-D — drops the unused
286
+ `excluded_count: int` field (set in `plan_migration` but read
287
+ nowhere in shipped code); consumers that need the total compute it
288
+ from `excluded_breakdown`.
289
+ - **Config** — `Config` (frozen) carries the resolved configuration
290
+ for a docs root. M10 — OQ-H — adds `fields: frozenset[str]` (sourced
291
+ from `[vocabulary] add_fields`, case-sensitive exact match;
292
+ defaults to the empty set) which widens the `unknown-field` check's
293
+ allowlist on top of the built-in always-allowed metadata labels
294
+ (`_BUILTIN_METADATA_FIELDS`). The rule is opt-in: an empty
295
+ `Config.fields` switches the warning OFF entirely.
271
296
  - **Scope boundary** — the active-tree directory layout is left untouched;
272
297
  `--apply` adds metadata in place and only ever moves docs out of detected
273
298
  archive-style subdirs. No role-bucket flattening or project re-foldering.
@@ -0,0 +1,268 @@
1
+ # M10 — Adoption-flow polish + 1.3.0 carry-overs
2
+
3
+ Lifecycle: archived
4
+ Role: milestone
5
+ Project: docs
6
+ Updated: 2026-05-27
7
+ Archived-reason: M10 complete (1.4.0 ready locally)
8
+
9
+ Related:
10
+ - parent-of: m10-adoption-polish-impl.md
11
+ - child-of: plan.md
12
+ - implements: charter.md
13
+ - pairs-with: status.md
14
+
15
+ ## Overview
16
+
17
+ - Milestone: M10 (v1.4.0)
18
+ - Title: Adoption-flow polish + 1.3.0 carry-overs
19
+ - Surface: two new CLI features (`docs touch <file...>`, `docs migrate --apply` writes `.docs.toml`), one behaviour fix (`migrate --apply --quiet` actually suppresses per-file output), one new check rule (`unknown-field` warning via `[vocabulary] add_fields`), one internal cleanup (`Confidence` enum replacing `bool | str`), one API tidy (`MigrationPlan.excluded_count` removal), and a sweep of the M8 adoption playbook to absorb the friction the fresh-subagent gate surfaced.
20
+ - Progress: Stub-drafted 2026-05-25; active once Phase 1 lands and OPEN QUESTIONS resolve.
21
+
22
+ ### Goal
23
+
24
+ Close the highest-leverage follow-ons from M1-M9 so the M8 adoption loop ships truly hands-off. The two user-suggested features (`touch` multi-file + `migrate --apply` writes `.docs.toml`) collapse the M8 playbook's three-pattern ordering note and remove the last steps every fresh M8 subagent had to perform manually. The cleanup items (`Confidence` enum, `excluded_count` removal, `add_fields` allowlist) discharge M3/M7/M8 carry-overs that have accumulated in plan.md's Open questions.
25
+
26
+ ### Requirements
27
+
28
+ - `docs touch` accepts one or more positional file paths; atomic semantics (all-or-nothing on errors); INDEX refreshes once at end, not per file.
29
+ - `docs migrate --apply` writes a minimal `.docs.toml` at the resolved root when one is absent, carrying `[project] name = "<resolved-project>"` + `[archive] date_format`. If a sidecar `.docs.toml` exists (M8 OQ1 carve-out: `[exclude]`-only or `[migrate]`-only), add `[project]` in place; never silently overwrite an existing `[project]` block.
30
+ - `docs migrate --apply --quiet` suppresses the per-file plan output (not just the trailing stderr success line). Dry-run / `--summary` / `--json` modes are requested outputs and stay unaffected.
31
+ - `docs check` learns a new `unknown-field` warning rule (exit 1, never 2) gated by an opt-in `[vocabulary] add_fields = [...]` allowlist in `.docs.toml`. Trees without the section see no change.
32
+ - Internal: `infer_role` returns a `Confidence` enum (`HIGH | MEDIUM | LOW`) instead of `bool | str`. JSON `--json confidence` field stays a string for wire-format stability.
33
+ - Internal: `MigrationPlan.excluded_count` removed; consumers (the human plan footer) use `sum(c for _, c in excluded_breakdown)`. CHANGELOG note; no known external consumer.
34
+ - Bundled `references/adoption-playbook.md` swept to reflect the new `--apply` semantics — the three-pattern ordering note in Step 3 collapses to "run `--apply`, then commit"; Steps 5/6 lose the manual `.docs.toml` authoring.
35
+ - `cli.md`, `convention.md`, `architecture.md`, README, CHANGELOG, bundled skill references all updated in lockstep.
36
+ - Version bumps: `pyproject.toml` + `__version__` 1.3.0 → 1.4.0.
37
+
38
+ ### Deliverables
39
+
40
+ - [x] `docs touch` accepts `file...` positional (`nargs="+"`); atomic semantics; single end-of-batch INDEX refresh.
41
+ - [x] `docs migrate --apply` writes / extends `.docs.toml` at the resolved root.
42
+ - [x] `docs migrate --apply --quiet` suppresses per-file plan output.
43
+ - [x] `[vocabulary] add_fields` allowlist + `check_doc` `unknown-field` warning rule.
44
+ - [x] `Confidence` enum + `infer_role` return-type tightening.
45
+ - [x] `MigrationPlan.excluded_count` removed.
46
+ - [x] `references/adoption-playbook.md` rewritten for the new `--apply` semantics.
47
+ - [x] `cli.md`, `convention.md`, `architecture.md`, README updated; CHANGELOG `## 1.4.0` entry.
48
+ - [x] Bundled skill references resynced.
49
+ - [x] M10 dogfooded against the M7/M8 sanitised fixtures end-to-end (Phase 9) — confirm a fresh subagent adopts `kebab-tiny` without any manual `.docs.toml` write.
50
+
51
+ ## OPEN QUESTIONS
52
+
53
+ Surfaced 2026-05-25 while drafting M10. Operator-resolution requested before Phase 2 starts; recommendations in brackets.
54
+
55
+ 1. **OQ-A — `migrate --apply` and existing `.docs.toml` shape.** When `--apply` finds a sidecar with `[migrate]` or `[exclude]` but no `[project]`, options: (a) add `[project]` in place (preserving the sidecar), (b) leave the file untouched and print a hint, (c) refuse with exit 2. **[Recommendation: (a)]** — append a `[project]` block after any existing sections; use a comment header `# Added by docs migrate --apply` so the provenance is visible. Preserving `[migrate]` / `[exclude]` honours the M8 OQ1 carve-out (operator-explicit "use migrate on this tree" signal).
56
+
57
+ 2. **OQ-B — `--quiet` scope.** Today `--quiet` only suppresses the trailing stderr success line. **[Recommendation: extend to suppress the per-file plan block on `--apply` only; keep dry-run / `--summary` / `--json` outputs unchanged]** since those are explicitly requested outputs, not status chatter.
58
+
59
+ 3. **OQ-C — `docs touch` error semantics on a missing/unreadable file.** Options: (a) atomic — exit nonzero, write nothing; (b) best-effort — skip and continue, report skipped count. **[Recommendation: (a) atomic]** — mirrors `migrate --apply`'s edit-then-move atomicity and the project's atomic-write discipline. Validate all paths first; refuse with exit 1 + named-bad-path if any fail validation; then mutate.
60
+
61
+ 4. **OQ-D — `MigrationPlan.excluded_count` removal as 1.4.0 breaking note.** The field is set in `plan_migration` but read nowhere in shipped code (the human footer iterates `excluded_breakdown` directly; `migration_to_json` omits it). No known external consumer. **[Recommendation: remove in 1.4.0 with CHANGELOG entry under Changed]**; deferring to a 2.0 buys nothing.
62
+
63
+ 5. **OQ-E — `Confidence` enum and the JSON wire format.** `migration_to_json` currently emits `"confidence": "high" | "medium" | "low"` (strings). **[Recommendation: keep emitting strings via `enum.value`]** so the wire format is byte-identical and no JSON consumer breaks. Internal code switches to the enum; serialisation crosses back to strings at the boundary.
64
+
65
+ 6. **OQ-F — `unknown-field` rule message shape.** Allowlist source (`[vocabulary] add_fields`) is the canonical example; the warning should name the field name encountered and the doc path. **[Recommendation: `Finding(severity="warning", rule="unknown-field", message="metadata field '<Label>:' not in [vocabulary] add_fields allowlist", path=<rel>)`]** — mirrors M3's existing rule-message shape. Exit 1 only (warning), never exit 2.
66
+
67
+ 7. **OQ-G — Empty `archive-style/` subdir cleanup after `migrate --apply`.** M4 left this deferred: `archived/old-doc.md` moves to `archive/<date>/old-doc.md` but the now-empty `archived/` stays. Adding `rmdir` is one line. **[Recommendation: include in M10 — `apply_migration` `try: parent.rmdir(); except OSError: pass`]** after each archive move. Opportunistic, behaviour-neutral.
68
+
69
+ 8. **OQ-H — `[vocabulary] add_fields` field-name canonicalisation.** Should the allowlist values be matched case-sensitively or case-insensitively against doc metadata labels? **[Recommendation: case-sensitive — exact match]**, matching how `add_lifecycles` and `add_roles` already work. The on-disk convention is `Capital:` (`Owner:`, `Tags:`); `owner:` is malformed (the parser already rejects it).
70
+
71
+ 9. **OQ-I — Playbook scope for the `references/adoption-playbook.md` rewrite.** Items #1-#3 collapse Steps 3/5/6 substantially. Options: (a) minimal edit — keep the playbook structure, drop the obsolete patterns; (b) restructure into "Step 1 plan → Step 2 triage → Step 3 apply → Step 4 verify" (4 steps not 6). **[Recommendation: (b) restructure]** — the playbook gets shorter and clearer; the M8 fresh-subagent gate's friction items dissolve into the simpler structure.
72
+
73
+ ## Current State Analysis
74
+
75
+ - **Existing code (1.3.0):**
76
+ - `_cmd_touch` (`src/docs_cli/cli.py:3238`) — single positional `file`; refreshes INDEX per call.
77
+ - `apply_migration` (`src/docs_cli/cli.py:2471`) — writes metadata blocks + archives; does NOT write `.docs.toml`.
78
+ - `_cmd_migrate --quiet` — only suppresses success line, not per-file plan output (M8 simplify deferred).
79
+ - `infer_role` returns `tuple[str, bool | str]` where `True | "medium" | False` encodes confidence.
80
+ - `MigrationPlan.excluded_count: int` — set, never read.
81
+ - `check_doc` rules: `missing-field`, `malformed`, `bad-vocab`, `bad-date`, `status-drift`, `broken-ref`, `medium-confidence-inference`. No `unknown-field`.
82
+ - `Config.fields` does not exist; `load_config` knows `add_lifecycles` / `add_roles`, not `add_fields`.
83
+ - **Missing for M10:**
84
+ - Multi-file touch surface + atomic batching.
85
+ - `apply_migration` `.docs.toml` writer (honouring M8 OQ1 sidecar carve-out).
86
+ - `--quiet` plan-output suppression.
87
+ - `Confidence` enum + JSON-boundary string serialisation.
88
+ - `MigrationPlan.excluded_count` removal + footer code update.
89
+ - `[vocabulary] add_fields` schema + `Config.fields` + `load_config` branch + `unknown-field` `check_doc` rule.
90
+ - Empty-archive-subdir `rmdir` in `apply_migration` (OQ-G).
91
+ - **Known gotchas:**
92
+ - Bundled skill references at `src/docs_cli/skill/references/{cli,convention}.md` enforce byte-equality with `docs/{cli,convention}.md` via `tests/test_skill_refs.py`. Spec edits must be mirrored in the same commit.
93
+ - The dogfood snapshot at `tests/fixtures/expected/docs-INDEX.md` must stay in lockstep with `docs/INDEX.md`.
94
+ - `MigrationPlan` is part of the importable surface (`from docs import MigrationPlan` via the M6 conftest alias); removing `excluded_count` is technically breaking even without known consumers.
95
+
96
+ ## Files to Create / Modify
97
+
98
+ | File | Action | Phase | Notes |
99
+ |---|---|---|---|
100
+ | `docs/m10-adoption-polish.md` | Create | 1 | This task plan. |
101
+ | `docs/m10-adoption-polish-impl.md` | Create | 1 | This milestone's impl log. |
102
+ | `docs/plan.md` | Modify | 1 | Add M10 row; flip the parked `[vocabulary] add_fields` Open question to "Scheduled in M10". |
103
+ | `docs/status.md` | Modify | 1, …, 10 | Phase 1: "Current milestone" → M10. Phase 10: M10 → Complete. |
104
+ | `tests/test_cli_touch.py` | Modify | 2 | Multi-file happy path, atomic-failure semantics, single-INDEX-refresh observation. |
105
+ | `tests/test_cli_migrate.py` | Modify | 2 | `--apply` writes `.docs.toml`; `--apply` extends existing sidecar; `--apply` does NOT overwrite existing `[project]`; `--apply --quiet` suppresses per-file output; empty `archived/` rmdir (OQ-G). |
106
+ | `tests/test_check.py` + `tests/test_cli_check.py` | Modify | 2 | `unknown-field` warning rule; `[vocabulary] add_fields` allowlist suppresses it; exit-1 wiring. |
107
+ | `tests/test_config.py` | Modify | 2 | `add_fields` TOML key parses; `Config.fields` defaults to empty frozenset. |
108
+ | `tests/test_migrate.py` | Modify | 2 | `Confidence` enum return; identity assertions widened. |
109
+ | `tests/test_packaging.py` | Modify | 7 | Version 1.3.0 → 1.4.0 (3 spots: A3 + B1/B2 wheel-name + C2 `--version`). |
110
+ | `src/docs_cli/cli.py` | Modify | 5, 6, 7 | Phase 5: `Confidence` enum, `Config.fields`, `MigrationPlan.excluded_count` removed, `touch` argparse `nargs="+"`, `unknown-field` rule scaffolding, `--quiet` argparse plumbed to `_print_migration_plan`. Phase 6: implementation — multi-file `_cmd_touch` (atomic), `apply_migration` writes `.docs.toml` + OQ-G rmdir, `_cmd_migrate --quiet` suppression, `check_doc` `unknown-field` rule. Phase 7: `__version__` → 1.4.0. |
111
+ | `docs/cli.md` | Modify | 7 | `docs touch` synopsis: `<file>...`. `docs migrate --apply` documents `.docs.toml` write + `--quiet` semantics. `docs check` rule list gains `unknown-field`. `[vocabulary]` section gains `add_fields`. |
112
+ | `docs/convention.md` | Modify | 7 | `[vocabulary] add_fields` documented in the Per-tree `[migrate]` config section neighbour. |
113
+ | `docs/architecture.md` | Modify | 7 | `Confidence` enum + `MigrationPlan` field-list update + `check_doc` rule list update + `apply_migration` `.docs.toml` writer note. |
114
+ | `README.md` | Modify | 7 | Status section gains M10 row + 1.4.0 narrative. |
115
+ | `CHANGELOG.md` | Modify | 7, 10 | Phase 7: `## 1.4.0 — UNRELEASED` (Added / Changed / Notes). Phase 10: dated. |
116
+ | `pyproject.toml` | Modify | 7 | `version = "1.4.0"`. |
117
+ | `src/docs_cli/skill/references/adoption-playbook.md` | Rewrite | 7 | OQ-I — restructure to 4 steps (plan / triage / apply / verify); remove the three-pattern ordering note. |
118
+ | `src/docs_cli/skill/references/cli.md` + `convention.md` | Resync | 7 | Byte-identical mirrors after `docs/{cli,convention}.md` edits. |
119
+ | `docs/INDEX.md` + `tests/fixtures/expected/docs-INDEX.md` | Regenerate | 1, 5, 7, 10 | Lockstep after every doc-touching phase. |
120
+
121
+ ## TDD Implementation Plan
122
+
123
+ ### Phase 1 — Define Contract
124
+ - Objective: Land the milestone-doc + log skeleton, register M10 in plan.md, flip status.md "Current milestone" to M10. No code change. Surface the OPEN QUESTIONS for operator review before Phase 2 starts.
125
+ - Files: `docs/m10-adoption-polish.md`, `docs/m10-adoption-polish-impl.md`, `docs/plan.md`, `docs/status.md`, `docs/INDEX.md` + snapshot.
126
+ - Exit: M10 docs created, lifecycle `active`; `docs check docs --stale 14` exit 0; 369 tests still GREEN.
127
+
128
+ ### Phase 2 — Write Tests (RED)
129
+ - Objective: Express every M10 deliverable as a failing test before any implementation.
130
+ - Files: `tests/test_cli_touch.py` (multi-file + atomic), `tests/test_cli_migrate.py` (apply-writes-toml + apply-extends-sidecar + apply-quiet-suppresses + empty-archive-rmdir), `tests/test_check.py` + `tests/test_cli_check.py` (unknown-field rule), `tests/test_config.py` (add_fields), `tests/test_migrate.py` (Confidence enum); minor regression-lock additions for `excluded_count` removal and JSON wire-format stability.
131
+ - Exit: Suite collects cleanly; RED count matches deliverable count; M9's 369 GREEN preserved.
132
+
133
+ ### Phase 3 — Create Data/Fixtures
134
+ - Objective: Stage fixtures the Phase-2 tests reference. Reuse M8's `body-from/` + M7's `real-trees/` heavily; new fixtures only for `add_fields` (1-2 small `.docs.toml` + doc pairs).
135
+ - Files: `tests/fixtures/add-fields/{allowlist-empty,allowlist-populated}/`.
136
+ - Exit: Every Phase-2 fixture path resolves; sanitisation grep zero hits.
137
+
138
+ ### Phase 4 — Run Tests (RED Baseline)
139
+ - Objective: Capture verbatim RED baseline; confirm every failure traces to its intended unimplemented surface.
140
+ - Files: log only (`/tmp/m10-phase-4-baseline.txt`).
141
+ - Exit: Per-test attribution table in impl log; no RED-for-wrong-reason; quality gate clean.
142
+
143
+ ### Phase 5 — Update Base Interfaces
144
+ - Objective: Schema + argparse + scaffolding. `Confidence` enum; `Config.fields`; `MigrationPlan.excluded_count` removed; `touch` argparse `nargs="+"`; `migrate --quiet` plumbed; `_cmd_check` wiring for `unknown-field`.
145
+ - Files: `src/docs_cli/cli.py`; possibly `tests/_typing/docs.pyi` re-export adjustments.
146
+ - Exit: M9 + Phase 5 GREEN where the bare scaffolding flips REDs without implementation; remaining REDs all behaviour-side for Phase 6.
147
+
148
+ ### Phase 6 — Implement Offline/Core Path
149
+ - Objective: All business logic for the M10 deliverables.
150
+ - Files: `src/docs_cli/cli.py` (`_cmd_touch`, `apply_migration`, `_print_migration_plan`, `check_doc`).
151
+ - Exit: Every M10 RED → GREEN; M9 baseline still GREEN.
152
+
153
+ ### Phase 7 — Update Tool/Wrapper Layer
154
+ - Objective: Spec sweep + version bump + skill-references resync.
155
+ - Files: `docs/{cli,convention,architecture}.md`, `README.md`, `CHANGELOG.md`, `pyproject.toml`, `src/docs_cli/cli.py` (`__version__`), `tests/test_packaging.py` (version pins), `src/docs_cli/skill/references/{cli,convention,adoption-playbook}.md`.
156
+ - Exit: All 369 + M10 new tests GREEN at 1.4.0; bundled skill references byte-equal to source.
157
+
158
+ ### Phase 8 — Run Tests (GREEN)
159
+ - Objective: Capture verbatim GREEN gate at `/tmp/m10-phase-8-green.txt`.
160
+ - Files: log only.
161
+ - Exit: pytest 0 RED; ruff / format / mypy / `docs check docs` / `docs index --dry-run` / `python -m build` / `twine check` all clean.
162
+
163
+ ### Phase 9 — Implement Online/Integration (dogfood)
164
+ - Objective: Re-run the M8 fresh-subagent gate against the M10-built wheel on `kebab-tiny`. Confirm the agent adopts the tree end-to-end with NO manual `.docs.toml` write and NO `--apply --quiet` per-file output. Update `tests/fixtures/trees/real-trees-adopted/` if behaviour delta is observable.
165
+ - Files: log entry; possibly refreshed `real-trees-adopted/` fixtures.
166
+ - Exit: 1/1 PASS unattended (single tree is enough — M8 proved the loop; M10 proves the polish).
167
+
168
+ ### Phase 10 — Quality, Docs, Refactor
169
+ - Objective: Milestone-completion summary on both docs; flip status.md M10 → Complete; date CHANGELOG; build artefacts locally. Per the M7/M8 pattern, NO publish at this phase — publish to PyPI deferred to a separate M11 milestone (or batched into a future release).
170
+ - Files: `docs/m10-adoption-polish.md`, `docs/m10-adoption-polish-impl.md`, `docs/status.md`, `CHANGELOG.md`, `dist/docs_cli-1.4.0-*`.
171
+ - Exit: Full gate green; milestone ready to archive.
172
+
173
+ ## Phase Checklist
174
+
175
+ - [x] Phase 1 — Define Contract (2026-05-25; OQ closeout 2026-05-26)
176
+ - [x] Phase 2 — Write Tests (RED) (2026-05-26)
177
+ - [x] Phase 3 — Create Data/Fixtures (2026-05-26 — no-op; tests use inline `tmp_path`)
178
+ - [x] Phase 4 — Run Tests (RED Baseline) (2026-05-26)
179
+ - [x] Phase 5 — Update Base Interfaces (2026-05-27)
180
+ - [x] Phase 6 — Implement Offline/Core Path (2026-05-27)
181
+ - [x] Phase 7 — Update Tool/Wrapper Layer (2026-05-27)
182
+ - [x] Phase 8 — Run Tests (GREEN) (2026-05-27)
183
+ - [x] Phase 9 — Implement Online/Integration (2026-05-27)
184
+ - [x] Phase 10 — Quality, Docs, Refactor (2026-05-27)
185
+
186
+ ## Decisions
187
+
188
+ _Recorded as the milestone progresses. Initial decisions inherited from the OPEN QUESTIONS block above will be promoted here as the operator confirms each one._
189
+
190
+ - **OQ-A — `migrate --apply` sidecar handling** (operator-confirmed 2026-05-26): append `[project]` in place after any existing sections; prefix with comment header `# Added by docs migrate --apply`; never overwrite an existing `[project]`.
191
+ - **OQ-B — `--quiet` scope** (operator-confirmed 2026-05-26): `migrate --apply --quiet` suppresses per-file plan block AND trailing success line. `--dry-run` / `--summary` / `--json` unaffected.
192
+ - **OQ-C — `docs touch` atomic semantics** (operator-confirmed 2026-05-26): validate all paths first, exit 1 + named-bad-path if any fail, then mutate; single end-of-batch INDEX refresh.
193
+ - **OQ-D — `MigrationPlan.excluded_count` removal** (operator-confirmed 2026-05-26): removed at 1.4.0; CHANGELOG entry under Changed.
194
+ - **OQ-E — `Confidence` enum + JSON wire format** (operator-confirmed 2026-05-26): `Confidence(HIGH, MEDIUM, LOW)` enum internally; JSON wire format keeps strings via `enum.value`.
195
+ - **OQ-F — `unknown-field` rule shape** (operator-confirmed 2026-05-26): `Finding(severity="warning", rule="unknown-field", message="metadata field '<Label>:' not in [vocabulary] add_fields allowlist", path=<rel>)`. Exit 1 only.
196
+ - **OQ-G — `apply_migration` empty-archive rmdir** (operator-confirmed 2026-05-26): opportunistically `rmdir`s the now-empty parent after each archive move.
197
+ - **OQ-H — `[vocabulary] add_fields` matching** (operator-confirmed 2026-05-26): case-sensitive exact match.
198
+ - **OQ-I — `references/adoption-playbook.md` rewrite** (operator-confirmed 2026-05-26): restructured to 4 steps (plan / triage / apply / verify); three-pattern ordering note dropped.
199
+ - **Carries from prior milestones:** M3 (`unknown-field` allowlist), M7 NIT 1 (`Confidence` enum), M8 (`--quiet` behaviour fix, `MigrationPlan.excluded_count` tidy, playbook polish), M4 (empty-archive-subdir rmdir under OQ-G).
200
+ - **Conscious deferrals (NOT in M10):** LLM-assisted classification (M7), `--propose-excludes` heuristic (M8 OQ-A), `docs init --template` verb (M8 OQ-D), per-verb file split (M2), Trusted Publishing OIDC (M6), `importlib.metadata` `__version__` (M6 Q1), mechanical test-file rewrite from `docs` alias (M6), multi-line `Status:` prose continuation (M7 OQ-3), `Migrated-<Label>` rename rule review (M4), mtime-derived `Updated:` snapshot test (M4), M3 `malformed` rule expansion, M1 `Vocab` dataclass, M1 empty-body description cosmetics, PyPI token re-scope (M9), `explainer`/`architecture` roles into core vocab (M7).
201
+ - **Version**: 1.4.0 — minor bump. `MigrationPlan.excluded_count` removal called out in CHANGELOG under Changed; no known external consumers.
202
+
203
+ ## Success Criteria
204
+
205
+ - All Deliverables ticked.
206
+ - Quality gate green at every phase boundary (`pytest`, `ruff`, `ruff format`, `mypy`, `docs check docs`).
207
+ - `docs touch a.md b.md c.md` writes all three and refreshes the INDEX exactly once; failure on any path leaves all files untouched.
208
+ - `docs migrate --apply <foreign-tree>` (no pre-existing `.docs.toml`) produces a tree that `docs check` accepts without any additional operator action.
209
+ - `docs migrate --apply --quiet <foreign-tree>` produces no per-file plan output on stdout (errors still on stderr).
210
+ - `docs check <tree>` against a tree with an `Owner:` field and no `[vocabulary] add_fields` allowlist exits 0 (no warning); with `add_fields = ["Owner"]` exits 0 (allowed); with `add_fields = ["Tags"]` exits 1 (warning for unknown `Owner:`).
211
+ - M10's dogfood subagent (Phase 9) adopts `kebab-tiny` end-to-end with zero manual `.docs.toml` editing.
212
+ - `CHANGELOG.md` `## 1.4.0` entry covers every M10 surface change.
213
+ - All bundled skill references byte-equal to source after Phase 7.
214
+
215
+ ## Milestone-completion summary (2026-05-27)
216
+
217
+ - **Version**: 1.4.0 — ready locally; not on PyPI (publish
218
+ deferred to M11 per the M7/M8 pattern).
219
+ - **All Deliverables checked.** Multi-file atomic `docs touch
220
+ <file>...`; `docs migrate --apply` writes / extends
221
+ `.docs.toml` (OQ-A) + opportunistic empty-archive-parent
222
+ rmdir (OQ-G); `docs migrate --apply --quiet` suppresses
223
+ per-file plan output (OQ-B); `[vocabulary] add_fields`
224
+ allowlist + `docs check` `unknown-field` warning rule (OQ-F
225
+ + OQ-H); `Confidence` enum replacing the M4 `bool | str`
226
+ tri-value (OQ-E; JSON wire format byte-stable);
227
+ `MigrationPlan.excluded_count` removed (OQ-D); adoption
228
+ playbook restructured to 4 steps (OQ-I); cli.md /
229
+ convention.md / architecture.md / README / CHANGELOG
230
+ updated in lockstep; bundled skill references byte-equal
231
+ to source.
232
+ - **All Success Criteria met.** 400/400 pytest; ruff / ruff
233
+ format / mypy / `docs check docs --stale 14` clean
234
+ tree-wide; multi-file `docs touch` writes all-or-nothing
235
+ + single INDEX refresh; foreign-tree `--apply` produces a
236
+ tree `docs check` accepts with zero manual steps; `--apply
237
+ --quiet` empty stdout + empty stderr; `unknown-field` rule
238
+ is opt-in (clean by default; case-sensitive exact match
239
+ against `add_fields`); Phase 9 kebab-tiny dogfood PASS.
240
+ - **Carry-overs absorbed**: M3 (`[vocabulary] add_fields` —
241
+ the long-parked Open question now closes); M7 NIT 1
242
+ (`Confidence` enum); M8 (`MigrationPlan.excluded_count`
243
+ removal, `--quiet` per-file output, playbook polish);
244
+ M4 (empty-archive-parent rmdir under OQ-G).
245
+ - **Conscious deferrals**: PyPI publish (M11); `docs project
246
+ rename` verb (the project-rename TODO at the bottom of
247
+ this doc); + the 16 items in the Decisions block's
248
+ "Conscious deferrals" list. None block the 1.4.0 local
249
+ ship.
250
+ - **Artefacts**: `dist/docs_cli-1.4.0-py3-none-any.whl` +
251
+ `dist/docs_cli-1.4.0.tar.gz` both pass `twine check`.
252
+
253
+ ## Follow-on TODOs
254
+
255
+ ### Project rename (deferred — likely M11)
256
+
257
+ Surfaced 2026-05-26 while adopting an existing tree into the docs convention.
258
+
259
+ **Gap.** Renaming a docs-managed tree's `[project] name` today requires a re-`migrate` with a `[migrate] project_name = "..."` sidecar **plus** an `[exclude]` section in `.docs.toml` to waive the managed-tree refusal (the M8 carve-out). That is currently the only way to rewrite an already-conformant file's `Project:` line without hand-editing. Operators (and sub-agents) re-invent this sidecar dance each time.
260
+
261
+ **Recommendation.** Build a first-class `docs project rename <new-name>` verb (or equivalent) that:
262
+ - Rewrites `[project] name` in `.docs.toml`.
263
+ - Rewrites every conformant `Project:` line across the tree atomically.
264
+ - Refreshes the INDEX once at end.
265
+ - Does **not** require the operator to add an `[exclude]` carve-out or a `[migrate]` sidecar.
266
+ - Errors out cleanly if any path can't be rewritten (atomic semantics, mirroring `migrate --apply` and `touch`).
267
+
268
+ **Why deferred from M10:** M10 scope is locked on adoption-flow polish + 1.3.0 carry-overs; a `project rename` verb is new surface, not polish. Captured here so it does not get lost.
@@ -3,7 +3,7 @@
3
3
  Lifecycle: active
4
4
  Role: spec
5
5
  Project: docs
6
- Updated: 2026-05-25
6
+ Updated: 2026-05-27
7
7
 
8
8
  Related:
9
9
  - pairs-with: convention.md
@@ -122,6 +122,15 @@ Validate the tree. Reports (and exits nonzero on) any of:
122
122
  trailing-word signal or a section-header pattern produces a
123
123
  medium-confidence inference — `severity: warning`, rule
124
124
  `medium-confidence-inference`, exit code 1.
125
+ - (M10 — OQ-F + OQ-H) An extra metadata label that is neither on the
126
+ built-in always-allowed set (`Lifecycle` / `Role` / `Project` /
127
+ `Updated` / `Related` / `Archived-reason`) NOR on the
128
+ `[vocabulary] add_fields = [...]` allowlist in `.docs.toml`
129
+ produces `severity: warning`, rule `unknown-field`, exit code 1.
130
+ The rule is **opt-in**: an absent or empty `add_fields` switches
131
+ it off entirely (trees without the allowlist see no change).
132
+ Matching is case-sensitive exact match — `add_fields = ["Owner"]`
133
+ allows `Owner:` but not `owner:`.
125
134
 
126
135
  Output is grouped by file; one line per finding. `--json` emits an array of records, one per finding. Schema — **stable from M3 onward**:
127
136
 
@@ -129,17 +138,38 @@ Output is grouped by file; one line per finding. `--json` emits an array of reco
129
138
  |---|---|---|
130
139
  | `path` | string | Root-relative POSIX path of the doc. |
131
140
  | `severity` | string | `error` or `warning`. |
132
- | `rule` | string | Stable rule id: `missing-field`, `bad-vocab`, `bad-date`, `malformed`, `status-drift`, `broken-ref`, `stale`, or `medium-confidence-inference` (M7). |
141
+ | `rule` | string | Stable rule id: `missing-field`, `bad-vocab`, `bad-date`, `malformed`, `status-drift`, `broken-ref`, `stale`, `medium-confidence-inference` (M7), or `unknown-field` (M10). |
133
142
  | `message` | string | Human-readable description of the finding. |
134
143
 
135
144
  Exit codes:
136
145
  - 0 — clean.
137
- - 1 — warnings only (stale docs; medium-confidence inferences).
146
+ - 1 — warnings only (stale docs; medium-confidence inferences; unknown-field warnings).
138
147
  - 2 — errors (missing required fields, invalid vocab, malformed structure, lifecycle/location drift, broken refs).
139
148
 
140
- ### `docs touch <file>`
149
+ ### `docs touch <file>...`
141
150
 
142
- Bump `Updated:` to today in `<file>`. No other changes. INDEX regenerated.
151
+ Bump `Updated:` to today in one or more docs. Accepts one or more
152
+ positional file paths. INDEX regenerated **exactly once** at end of
153
+ batch, not once per file.
154
+
155
+ The batch is **atomic** (M10 — OQ-C). `touch` validates every input
156
+ path first — if any path is missing, isn't a regular file, or resolves
157
+ outside the resolved docs root, the command exits 1 + a named-bad-path
158
+ message on stderr and writes nothing. Otherwise every rewrite is
159
+ prepared in memory (any `MetadataError` aborts the batch before any
160
+ disk write), then `atomic_write` is run per file followed by a single
161
+ end-of-batch INDEX refresh. A failure during the validate-or-prepare
162
+ phase leaves every file byte-identical to its pre-call state.
163
+
164
+ `--dry-run` prints one `docs: would touch <path>` per file on stderr
165
+ (gated on `not --quiet`) and writes nothing. The success run prints
166
+ one `docs: touched <path>` per file on stderr (gated on `not
167
+ --quiet`).
168
+
169
+ Multi-root invocation (`docs touch a.md b.md` where `a.md` and `b.md`
170
+ resolve to different docs roots) is **undefined behaviour and out of
171
+ M10 scope** — the validate-all-first pass refuses with exit 1 + an
172
+ "outside the resolved docs root" message.
143
173
 
144
174
  ### `docs install-skill [--dest DIR] [--copy|--symlink] [--force] [--quiet]`
145
175
 
@@ -218,8 +248,23 @@ see before it runs.)
218
248
  - Without `--apply`, `migrate` writes nothing — it prints the plan (human, or
219
249
  `--json`) and exits.
220
250
  - With `--apply`, `migrate` inserts the inferred metadata block into each file
221
- atomically and performs any archive-normalising moves. The result is a tree
222
- `docs check` accepts.
251
+ atomically and performs any archive-normalising moves. After the file loop
252
+ it also writes (or extends) the root `.docs.toml` sidecar (M10 — OQ-A): an
253
+ absent sidecar gets a minimal `[project] name = "<resolved>"` + `[archive]
254
+ date_format = "%Y-%m-%d"` block (no redundant `dir = "archive"`); a sidecar
255
+ that already carries a `[migrate]` or `[exclude]` block but no `[project]`
256
+ gets `[project]` appended at the bottom under a
257
+ `# Added by docs migrate --apply` provenance comment header; a sidecar that
258
+ already carries `[project]` is left untouched. After every archive-move the
259
+ now-empty source parent directory is opportunistically removed (M10 — OQ-G;
260
+ swallows `OSError(ENOTEMPTY)` so a non-migrating sibling survives). The
261
+ result is a tree `docs check` accepts with no further operator action
262
+ required.
263
+ - With `--apply --quiet` (M10 — OQ-B), the per-file plan block on stdout is
264
+ suppressed in addition to the trailing `docs: migrated <N> file(s) …`
265
+ success line on stderr. Empty stdout + empty stderr on a clean run. The
266
+ dry-run plan, `--summary` output, and `--json` array are **requested
267
+ outputs** and are NEVER suppressed — `--quiet` is scoped to chatter only.
223
268
  - `--date YYYY-MM-DD` sets the archive date used when normalising
224
269
  archive-style subdirectories into `archive/<date>/`. When set, the
225
270
  flag overrides every per-file date globally (M4 semantics