pactkit 2.10.1__tar.gz → 2.10.2__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 (548) hide show
  1. {pactkit-2.10.1 → pactkit-2.10.2}/.github/workflows/pactkit.yml +1 -1
  2. {pactkit-2.10.1 → pactkit-2.10.2}/.opencode/pactkit.yaml +2 -1
  3. {pactkit-2.10.1 → pactkit-2.10.2}/CHANGELOG.md +9 -0
  4. {pactkit-2.10.1 → pactkit-2.10.2}/PKG-INFO +1 -1
  5. {pactkit-2.10.1 → pactkit-2.10.2}/docs/architecture/governance/archive/lessons_archive_202603.md +3 -0
  6. {pactkit-2.10.1 → pactkit-2.10.2}/docs/architecture/governance/lessons.md +3 -3
  7. {pactkit-2.10.1 → pactkit-2.10.2}/docs/architecture/governance/rules.md +1 -1
  8. {pactkit-2.10.1 → pactkit-2.10.2}/docs/product/archive/archive_202604.md +20 -0
  9. {pactkit-2.10.1 → pactkit-2.10.2}/docs/product/context.md +4 -4
  10. pactkit-2.10.2/docs/specs/HOTFIX-slim-099.md +14 -0
  11. pactkit-2.10.2/docs/specs/STORY-slim-098.md +143 -0
  12. pactkit-2.10.2/docs/specs/STORY-slim-099.md +87 -0
  13. {pactkit-2.10.1 → pactkit-2.10.2}/pyproject.toml +1 -1
  14. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/__init__.py +1 -1
  15. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/cli.py +0 -1
  16. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/config.py +1 -0
  17. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/guards.py +25 -2
  18. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/prompts/rules.py +50 -2
  19. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_config.py +2 -2
  20. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_constitution_sharpening.py +2 -2
  21. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_prompt_structural_invariants.py +2 -2
  22. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_selective_deploy.py +1 -1
  23. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim011_command_rules.py +3 -0
  24. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim021.py +2 -2
  25. pactkit-2.10.2/tests/unit/test_story_slim098_pdca_nudge.py +108 -0
  26. pactkit-2.10.2/tests/unit/test_story_slim099_act_context_ref.py +45 -0
  27. {pactkit-2.10.1 → pactkit-2.10.2}/.github/workflows/publish.yml +0 -0
  28. {pactkit-2.10.1 → pactkit-2.10.2}/.gitignore +0 -0
  29. {pactkit-2.10.1 → pactkit-2.10.2}/AGENTS.md +0 -0
  30. {pactkit-2.10.1 → pactkit-2.10.2}/CODE_OF_CONDUCT.md +0 -0
  31. {pactkit-2.10.1 → pactkit-2.10.2}/CONTRIBUTING.md +0 -0
  32. {pactkit-2.10.1 → pactkit-2.10.2}/LICENSE +0 -0
  33. {pactkit-2.10.1 → pactkit-2.10.2}/README.md +0 -0
  34. {pactkit-2.10.1 → pactkit-2.10.2}/SECURITY.md +0 -0
  35. {pactkit-2.10.1 → pactkit-2.10.2}/docs/architecture/governance/archive/lessons_archive_202602.md +0 -0
  36. {pactkit-2.10.1 → pactkit-2.10.2}/docs/architecture/governance/harness_audit.json +0 -0
  37. {pactkit-2.10.1 → pactkit-2.10.2}/docs/architecture/governance/philosophy.md +0 -0
  38. {pactkit-2.10.1 → pactkit-2.10.2}/docs/assets/logo.png +0 -0
  39. {pactkit-2.10.1 → pactkit-2.10.2}/docs/guides/codex-integration-preresearch.md +0 -0
  40. {pactkit-2.10.1 → pactkit-2.10.2}/docs/guides/tool-integration-checklist.md +0 -0
  41. {pactkit-2.10.1 → pactkit-2.10.2}/docs/product/archive/archive_202602.md +0 -0
  42. {pactkit-2.10.1 → pactkit-2.10.2}/docs/product/archive/archive_202603.md +0 -0
  43. {pactkit-2.10.1 → pactkit-2.10.2}/docs/product/friction-log.md +0 -0
  44. {pactkit-2.10.1 → pactkit-2.10.2}/docs/product/prd.md +0 -0
  45. {pactkit-2.10.1 → pactkit-2.10.2}/docs/product/sprint_board.md +0 -0
  46. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-001.md +0 -0
  47. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-002.md +0 -0
  48. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-003.md +0 -0
  49. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-004.md +0 -0
  50. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-005.md +0 -0
  51. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-006.md +0 -0
  52. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-007.md +0 -0
  53. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-008.md +0 -0
  54. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-009.md +0 -0
  55. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-010.md +0 -0
  56. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-011.md +0 -0
  57. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-012.md +0 -0
  58. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-013.md +0 -0
  59. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-014.md +0 -0
  60. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-015.md +0 -0
  61. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-016.md +0 -0
  62. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-017.md +0 -0
  63. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-018.md +0 -0
  64. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-019.md +0 -0
  65. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-020.md +0 -0
  66. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-021.md +0 -0
  67. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-022.md +0 -0
  68. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-023.md +0 -0
  69. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-024.md +0 -0
  70. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-025.md +0 -0
  71. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-026.md +0 -0
  72. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-027.md +0 -0
  73. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-028.md +0 -0
  74. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-029.md +0 -0
  75. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-030.md +0 -0
  76. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-031.md +0 -0
  77. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-032.md +0 -0
  78. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-033.md +0 -0
  79. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-034.md +0 -0
  80. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-035.md +0 -0
  81. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-slim-001.md +0 -0
  82. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-slim-002.md +0 -0
  83. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-slim-003.md +0 -0
  84. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-slim-004.md +0 -0
  85. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-slim-005.md +0 -0
  86. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-slim-006.md +0 -0
  87. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/BUG-slim-089.md +0 -0
  88. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/HOTFIX-slim-023.md +0 -0
  89. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/HOTFIX-slim-049.md +0 -0
  90. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/HOTFIX-slim-050.md +0 -0
  91. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/HOTFIX-slim-051.md +0 -0
  92. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/HOTFIX-slim-052.md +0 -0
  93. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/HOTFIX-slim-061.md +0 -0
  94. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/HOTFIX-slim-062.md +0 -0
  95. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/HOTFIX-slim-067.md +0 -0
  96. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/HOTFIX-slim-069.md +0 -0
  97. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/HOTFIX-slim-070.md +0 -0
  98. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/HOTFIX-slim-085.md +0 -0
  99. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/HOTFIX-slim-087.md +0 -0
  100. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/HOTFIX-slim-096.md +0 -0
  101. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-001.md +0 -0
  102. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-002.md +0 -0
  103. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-003.md +0 -0
  104. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-004.md +0 -0
  105. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-005.md +0 -0
  106. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-006.md +0 -0
  107. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-007.md +0 -0
  108. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-008.md +0 -0
  109. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-009.md +0 -0
  110. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-010.md +0 -0
  111. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-011.md +0 -0
  112. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-012.md +0 -0
  113. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-013.md +0 -0
  114. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-014.md +0 -0
  115. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-015.md +0 -0
  116. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-016.md +0 -0
  117. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-017.md +0 -0
  118. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-018.md +0 -0
  119. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-019.md +0 -0
  120. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-020.md +0 -0
  121. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-021.md +0 -0
  122. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-022.md +0 -0
  123. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-023.md +0 -0
  124. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-024.md +0 -0
  125. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-025.md +0 -0
  126. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-026.md +0 -0
  127. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-027.md +0 -0
  128. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-028.md +0 -0
  129. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-029.md +0 -0
  130. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-030.md +0 -0
  131. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-031.md +0 -0
  132. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-032.md +0 -0
  133. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-033.md +0 -0
  134. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-034.md +0 -0
  135. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-035.md +0 -0
  136. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-036.md +0 -0
  137. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-037.md +0 -0
  138. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-038.md +0 -0
  139. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-039.md +0 -0
  140. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-040.md +0 -0
  141. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-041.md +0 -0
  142. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-042.md +0 -0
  143. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-043.md +0 -0
  144. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-044.md +0 -0
  145. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-045.md +0 -0
  146. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-046.md +0 -0
  147. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-047.md +0 -0
  148. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-048.md +0 -0
  149. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-049.md +0 -0
  150. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-050.md +0 -0
  151. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-051.md +0 -0
  152. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-052.md +0 -0
  153. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-053.md +0 -0
  154. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-054.md +0 -0
  155. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-055.md +0 -0
  156. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-056.md +0 -0
  157. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-057.md +0 -0
  158. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-058.md +0 -0
  159. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-059.md +0 -0
  160. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-060.md +0 -0
  161. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-061.md +0 -0
  162. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-062.md +0 -0
  163. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-063.md +0 -0
  164. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-064.md +0 -0
  165. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-065.md +0 -0
  166. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-069.md +0 -0
  167. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-070.md +0 -0
  168. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-071.md +0 -0
  169. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-072.md +0 -0
  170. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-073.md +0 -0
  171. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-001.md +0 -0
  172. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-005.md +0 -0
  173. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-006.md +0 -0
  174. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-007.md +0 -0
  175. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-009.md +0 -0
  176. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-010.md +0 -0
  177. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-011.md +0 -0
  178. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-012.md +0 -0
  179. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-013.md +0 -0
  180. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-014.md +0 -0
  181. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-015.md +0 -0
  182. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-016.md +0 -0
  183. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-017.md +0 -0
  184. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-018.md +0 -0
  185. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-019.md +0 -0
  186. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-020.md +0 -0
  187. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-021.md +0 -0
  188. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-022.md +0 -0
  189. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-023.md +0 -0
  190. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-024.md +0 -0
  191. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-028.md +0 -0
  192. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-029.md +0 -0
  193. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-030.md +0 -0
  194. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-031.md +0 -0
  195. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-032.md +0 -0
  196. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-033.md +0 -0
  197. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-034.md +0 -0
  198. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-035.md +0 -0
  199. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-036.md +0 -0
  200. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-037.md +0 -0
  201. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-038.md +0 -0
  202. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-039.md +0 -0
  203. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-040.md +0 -0
  204. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-041.md +0 -0
  205. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-042.md +0 -0
  206. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-043.md +0 -0
  207. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-044.md +0 -0
  208. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-045.md +0 -0
  209. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-046.md +0 -0
  210. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-047.md +0 -0
  211. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-048.md +0 -0
  212. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-049.md +0 -0
  213. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-050.md +0 -0
  214. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-051.md +0 -0
  215. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-052.md +0 -0
  216. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-053.md +0 -0
  217. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-054.md +0 -0
  218. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-055.md +0 -0
  219. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-056.md +0 -0
  220. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-057.md +0 -0
  221. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-058.md +0 -0
  222. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-059.md +0 -0
  223. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-060.md +0 -0
  224. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-063.md +0 -0
  225. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-066.md +0 -0
  226. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-067.md +0 -0
  227. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-068.md +0 -0
  228. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-069.md +0 -0
  229. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-070.md +0 -0
  230. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-071.md +0 -0
  231. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-072.md +0 -0
  232. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-073.md +0 -0
  233. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-074.md +0 -0
  234. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-075.md +0 -0
  235. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-076.md +0 -0
  236. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-077.md +0 -0
  237. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-078.md +0 -0
  238. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-079.md +0 -0
  239. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-080.md +0 -0
  240. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-081.md +0 -0
  241. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-082.md +0 -0
  242. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-083.md +0 -0
  243. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-084.md +0 -0
  244. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-086.md +0 -0
  245. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-088.md +0 -0
  246. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-089.md +0 -0
  247. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-090.md +0 -0
  248. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-091.md +0 -0
  249. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-092.md +0 -0
  250. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-093.md +0 -0
  251. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-094.md +0 -0
  252. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-095.md +0 -0
  253. {pactkit-2.10.1 → pactkit-2.10.2}/docs/specs/STORY-slim-097.md +0 -0
  254. {pactkit-2.10.1 → pactkit-2.10.2}/docs/test_cases/BUG-001_case.md +0 -0
  255. {pactkit-2.10.1 → pactkit-2.10.2}/docs/test_cases/BUG-002_case.md +0 -0
  256. {pactkit-2.10.1 → pactkit-2.10.2}/docs/test_cases/STORY-slim-028_case.md +0 -0
  257. {pactkit-2.10.1 → pactkit-2.10.2}/docs/test_cases/STORY-slim-029_case.md +0 -0
  258. {pactkit-2.10.1 → pactkit-2.10.2}/docs/test_cases/STORY-slim-031_case.md +0 -0
  259. {pactkit-2.10.1 → pactkit-2.10.2}/docs/test_cases/STORY-slim-032_case.md +0 -0
  260. {pactkit-2.10.1 → pactkit-2.10.2}/docs/test_cases/STORY-slim-033_case.md +0 -0
  261. {pactkit-2.10.1 → pactkit-2.10.2}/docs/test_cases/STORY-slim-034_case.md +0 -0
  262. {pactkit-2.10.1 → pactkit-2.10.2}/opencode.json +0 -0
  263. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/__main__.py +0 -0
  264. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/audit.py +0 -0
  265. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/backfill.py +0 -0
  266. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/cleaners.py +0 -0
  267. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/context_gen.py +0 -0
  268. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/coverage_gate.py +0 -0
  269. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/doctor.py +0 -0
  270. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/garden.py +0 -0
  271. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/generators/__init__.py +0 -0
  272. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/generators/adapter.py +0 -0
  273. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/generators/deploy_base.py +0 -0
  274. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/generators/deployer.py +0 -0
  275. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/id_generator.py +0 -0
  276. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/invariants.py +0 -0
  277. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/issue_sync.py +0 -0
  278. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/lazy_visualize.py +0 -0
  279. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/lessons.py +0 -0
  280. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/lint_runner.py +0 -0
  281. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/observe.py +0 -0
  282. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/profiles.py +0 -0
  283. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/prompts/__init__.py +0 -0
  284. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/prompts/agents.py +0 -0
  285. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/prompts/commands.py +0 -0
  286. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/prompts/references.py +0 -0
  287. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/prompts/skills.py +0 -0
  288. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/prompts/workflows.py +0 -0
  289. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/regression.py +0 -0
  290. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/schemas.py +0 -0
  291. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/scripts.py +0 -0
  292. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/sec_scope.py +0 -0
  293. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/skills/__init__.py +0 -0
  294. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/skills/analyzers/__init__.py +0 -0
  295. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/skills/analyzers/go_analyzer.py +0 -0
  296. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/skills/analyzers/java_analyzer.py +0 -0
  297. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/skills/analyzers/python_analyzer.py +0 -0
  298. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/skills/analyzers/ts_analyzer.py +0 -0
  299. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/skills/board.py +0 -0
  300. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/skills/report.py +0 -0
  301. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/skills/scaffold.py +0 -0
  302. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/skills/spec_linter.py +0 -0
  303. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/skills/visualize.py +0 -0
  304. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/spec_status.py +0 -0
  305. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/test_mapper.py +0 -0
  306. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/utils.py +0 -0
  307. {pactkit-2.10.1 → pactkit-2.10.2}/src/pactkit/validators.py +0 -0
  308. {pactkit-2.10.1 → pactkit-2.10.2}/tests/conftest.py +0 -0
  309. {pactkit-2.10.1 → pactkit-2.10.2}/tests/e2e/__init__.py +0 -0
  310. {pactkit-2.10.1 → pactkit-2.10.2}/tests/e2e/cli/__init__.py +0 -0
  311. {pactkit-2.10.1 → pactkit-2.10.2}/tests/e2e/cli/test_cli_e2e.py +0 -0
  312. {pactkit-2.10.1 → pactkit-2.10.2}/tests/fixtures/agent_parser/agents_dir/researcher.yaml +0 -0
  313. {pactkit-2.10.1 → pactkit-2.10.2}/tests/fixtures/agent_parser/agents_dir/writer.yaml +0 -0
  314. {pactkit-2.10.1 → pactkit-2.10.2}/tests/fixtures/agent_parser/langgraph_app.py +0 -0
  315. {pactkit-2.10.1 → pactkit-2.10.2}/tests/fixtures/agent_parser/mcp_settings.json +0 -0
  316. {pactkit-2.10.1 → pactkit-2.10.2}/tests/fixtures/api_call_parser/axios_style.tsx +0 -0
  317. {pactkit-2.10.1 → pactkit-2.10.2}/tests/fixtures/api_call_parser/dynamic.tsx +0 -0
  318. {pactkit-2.10.1 → pactkit-2.10.2}/tests/fixtures/api_call_parser/page.tsx +0 -0
  319. {pactkit-2.10.1 → pactkit-2.10.2}/tests/integration/__init__.py +0 -0
  320. {pactkit-2.10.1 → pactkit-2.10.2}/tests/integration/test_deploy_classic.py +0 -0
  321. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_agent_features.py +0 -0
  322. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_agent_frontmatter.py +0 -0
  323. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_agents_enrichment.py +0 -0
  324. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_audit.py +0 -0
  325. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_blast_radius.py +0 -0
  326. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_board_bug027.py +0 -0
  327. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_board_sections.py +0 -0
  328. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug001_skill_path.py +0 -0
  329. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug002_plugin_paths.py +0 -0
  330. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug003_multi_import.py +0 -0
  331. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug004_dead_set.py +0 -0
  332. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug005_archive_taskless.py +0 -0
  333. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug006_scan_excludes.py +0 -0
  334. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug007_stale_trace_refs.py +0 -0
  335. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug008_stale_command_refs.py +0 -0
  336. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug009_project_config_backfill.py +0 -0
  337. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug010_rewrite_yaml.py +0 -0
  338. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug011_stale_refs.py +0 -0
  339. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug012_call_graph_filter.py +0 -0
  340. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug013_config_single_source.py +0 -0
  341. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug014_version_hygiene.py +0 -0
  342. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug017_project_init_playbook.py +0 -0
  343. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug018_issue_tracker_verification.py +0 -0
  344. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug019_venv_deployment.py +0 -0
  345. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug020_claude_md_backup.py +0 -0
  346. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug025_release_delegation.py +0 -0
  347. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug026_version_sync.py +0 -0
  348. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug028_ghost_refs.py +0 -0
  349. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug029_stack_detection_fallback.py +0 -0
  350. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug030_spec_lint_cli.py +0 -0
  351. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug031_docstring_accuracy.py +0 -0
  352. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug034_plan_metadata_template.py +0 -0
  353. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug_021.py +0 -0
  354. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug_022.py +0 -0
  355. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug_023.py +0 -0
  356. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug_024.py +0 -0
  357. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug_slim001_env_detection.py +0 -0
  358. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug_slim002_instruction_collision.py +0 -0
  359. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug_slim003.py +0 -0
  360. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug_slim004.py +0 -0
  361. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug_slim005.py +0 -0
  362. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug_slim006.py +0 -0
  363. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_bug_slim089_global_claude_md.py +0 -0
  364. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_check_command.py +0 -0
  365. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_check_extensions_072_073.py +0 -0
  366. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_check_playbook_072_073.py +0 -0
  367. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_command_frontmatter.py +0 -0
  368. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_command_visualize_modes.py +0 -0
  369. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_complexity.py +0 -0
  370. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_config_auto_merge.py +0 -0
  371. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_context_gen.py +0 -0
  372. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_create_skill.py +0 -0
  373. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_cross_flow_matrix.py +0 -0
  374. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_deploy_base.py +0 -0
  375. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_deployer_cleanup.py +0 -0
  376. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_deployer_plugin.py +0 -0
  377. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_design_command.py +0 -0
  378. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_done_gates.py +0 -0
  379. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_draw_prompt.py +0 -0
  380. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_draw_references.py +0 -0
  381. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_drawio_mcp.py +0 -0
  382. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_garden.py +0 -0
  383. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_home_path_fix.py +0 -0
  384. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_hotfix_command.py +0 -0
  385. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_init_guard.py +0 -0
  386. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_init_playbook_074.py +0 -0
  387. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_lang_profiles.py +0 -0
  388. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_layer_violations.py +0 -0
  389. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_lessons_rotation_075.py +0 -0
  390. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_list_stories.py +0 -0
  391. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_mcp_integration.py +0 -0
  392. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_model_config.py +0 -0
  393. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_modular_constitution.py +0 -0
  394. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_monorepo_detect.py +0 -0
  395. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_multi_prefix.py +0 -0
  396. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_observe.py +0 -0
  397. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_pdca_slim.py +0 -0
  398. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_profiles.py +0 -0
  399. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_project_visibility.py +0 -0
  400. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_prompt_cli_refs.py +0 -0
  401. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_prompt_quality_075.py +0 -0
  402. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_prompts_package.py +0 -0
  403. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_release.py +0 -0
  404. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_release_field.py +0 -0
  405. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_release_v110.py +0 -0
  406. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_render_prompt.py +0 -0
  407. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_report_parser.py +0 -0
  408. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_report_unified.py +0 -0
  409. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_review_command.py +0 -0
  410. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_rules_enrichment.py +0 -0
  411. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_scaffold.py +0 -0
  412. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_scaffold_developer_prefix.py +0 -0
  413. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_schemas.py +0 -0
  414. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_script_extraction.py +0 -0
  415. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_session_context.py +0 -0
  416. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_skill_structure.py +0 -0
  417. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_skills_enrichment.py +0 -0
  418. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_slim_deps_088.py +0 -0
  419. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_smart_regression.py +0 -0
  420. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_sprint_command.py +0 -0
  421. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_stack_references.py +0 -0
  422. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_status_command.py +0 -0
  423. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_statusline.py +0 -0
  424. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story014_release.py +0 -0
  425. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story015_ci_lint_gate.py +0 -0
  426. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story016_claude_md.py +0 -0
  427. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story017_init_claude_md.py +0 -0
  428. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story018_arch_staleness.py +0 -0
  429. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story019_bailout.py +0 -0
  430. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story020_horizon.py +0 -0
  431. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story021_rfc.py +0 -0
  432. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story022_decision_tree.py +0 -0
  433. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story023_test_quality.py +0 -0
  434. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story024_native_agent.py +0 -0
  435. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story025_ci_pipeline.py +0 -0
  436. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story026_issue_tracker.py +0 -0
  437. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story027_hooks.py +0 -0
  438. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story028_rule_scoping.py +0 -0
  439. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story029_doctor.py +0 -0
  440. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story030_lint.py +0 -0
  441. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story031_git_init_guard.py +0 -0
  442. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story032_greenfield_redirect.py +0 -0
  443. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story033_config_backfill.py +0 -0
  444. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story034_plan_config_refresh.py +0 -0
  445. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story035_readme_docs.py +0 -0
  446. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story037_regression_fix.py +0 -0
  447. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story038_call_graph_update.py +0 -0
  448. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story039_venv_config.py +0 -0
  449. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story040_layered_claude_md.py +0 -0
  450. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story042_spec_linter.py +0 -0
  451. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story043_active_clarify.py +0 -0
  452. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story044_consistency_check.py +0 -0
  453. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story045_auto_pr.py +0 -0
  454. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story046_agent_adapter.py +0 -0
  455. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story047_enterprise_flags.py +0 -0
  456. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story048_worktree_isolation.py +0 -0
  457. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story049_community_standards.py +0 -0
  458. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story050_doc_only_shortcut.py +0 -0
  459. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story051_workflow_streamlining.py +0 -0
  460. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story052_conditional_github_release.py +0 -0
  461. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story053_impact_regression.py +0 -0
  462. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story055_commands.py +0 -0
  463. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story055_config.py +0 -0
  464. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story055_spec_linter.py +0 -0
  465. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story056_commands.py +0 -0
  466. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story056_config.py +0 -0
  467. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story057_implicit_cleanup.py +0 -0
  468. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story058_opencode_extraction.py +0 -0
  469. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story058_routing_fix.py +0 -0
  470. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story059_codex_removal.py +0 -0
  471. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story060_init_hang.py +0 -0
  472. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story061_remove_thinking.py +0 -0
  473. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story062_mcp_recommendations.py +0 -0
  474. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story063_prompt_slimming.py +0 -0
  475. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story064_venv_local_md.py +0 -0
  476. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story065_sprint_model.py +0 -0
  477. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story072_developer_prefix.py +0 -0
  478. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim009_lazy_rules.py +0 -0
  479. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim010_dry_refactor.py +0 -0
  480. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim012_ci.py +0 -0
  481. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim014_clean.py +0 -0
  482. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim014_context.py +0 -0
  483. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim014_guard.py +0 -0
  484. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim014_lazy_viz.py +0 -0
  485. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim014_next_id.py +0 -0
  486. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim014_regression.py +0 -0
  487. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim014_sec_scope.py +0 -0
  488. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim014_validators.py +0 -0
  489. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim015_doctor.py +0 -0
  490. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim016_testmap_lint.py +0 -0
  491. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim017.py +0 -0
  492. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim018.py +0 -0
  493. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim019_plan_subphases.py +0 -0
  494. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim020_explore_stall_fix.py +0 -0
  495. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim022.py +0 -0
  496. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim023.py +0 -0
  497. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim024.py +0 -0
  498. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim025.py +0 -0
  499. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim026.py +0 -0
  500. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim027.py +0 -0
  501. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim028.py +0 -0
  502. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim029.py +0 -0
  503. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim030.py +0 -0
  504. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim031.py +0 -0
  505. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim032.py +0 -0
  506. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim033.py +0 -0
  507. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim034.py +0 -0
  508. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim035.py +0 -0
  509. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim036.py +0 -0
  510. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim037.py +0 -0
  511. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim038.py +0 -0
  512. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim039.py +0 -0
  513. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim040.py +0 -0
  514. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim041.py +0 -0
  515. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim042.py +0 -0
  516. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim043.py +0 -0
  517. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim044.py +0 -0
  518. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim045.py +0 -0
  519. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim046.py +0 -0
  520. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim047.py +0 -0
  521. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim048.py +0 -0
  522. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim049.py +0 -0
  523. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim051.py +0 -0
  524. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim052.py +0 -0
  525. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim053.py +0 -0
  526. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim054.py +0 -0
  527. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim055.py +0 -0
  528. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim056.py +0 -0
  529. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim060_codex_profile.py +0 -0
  530. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim063.py +0 -0
  531. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim065.py +0 -0
  532. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim076_multistack.py +0 -0
  533. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim077_monorepo_stack.py +0 -0
  534. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim078.py +0 -0
  535. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim079.py +0 -0
  536. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim080.py +0 -0
  537. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim081.py +0 -0
  538. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim082.py +0 -0
  539. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim083.py +0 -0
  540. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim084.py +0 -0
  541. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_story_slim095.py +0 -0
  542. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_tools.py +0 -0
  543. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_topology_parsers_066.py +0 -0
  544. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_update_task.py +0 -0
  545. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_visualize_call_nested.py +0 -0
  546. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_visualize_chain_fix.py +0 -0
  547. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_visualize_modes.py +0 -0
  548. {pactkit-2.10.1 → pactkit-2.10.2}/tests/unit/test_visualize_multilang_chain.py +0 -0
@@ -20,7 +20,7 @@ jobs:
20
20
  - name: Install dependencies
21
21
  run: |
22
22
  python -m pip install --upgrade pip
23
- pip install -e ".[all]"
23
+ pip install -e .
24
24
  pip install pytest ruff
25
25
  pactkit init
26
26
 
@@ -2,7 +2,7 @@
2
2
  # Edit this file to customize which components are deployed.
3
3
  # Remove items from a list to disable them. Default: all enabled.
4
4
 
5
- version: "2.10.1"
5
+ version: "2.10.2"
6
6
  stack: python
7
7
  root: .
8
8
  developer: "slim"
@@ -71,6 +71,7 @@ rules:
71
71
  - 07-shared-protocols
72
72
  - 08-architecture-principles
73
73
  - 09-sectional-write
74
+ - 11-pdca-nudge
74
75
 
75
76
  # CI/CD — set provider to github or gitlab to generate pipeline config
76
77
  ci:
@@ -4,6 +4,15 @@ All notable changes to PactKit will be documented in this file.
4
4
 
5
5
  Format follows [Keep a Changelog](https://keepachangelog.com/).
6
6
 
7
+ ## [2.10.2] - 2026-04-20
8
+
9
+ ### Added
10
+ - **PDCA Nudge Protocol** (STORY-slim-098) — AI proactively recommends PDCA commands when free conversation yields actionable conclusions. Trigger matrix maps signals to commands; suppression rules prevent noise.
11
+
12
+ ### Fixed
13
+ - **Shared Protocols Context.md reference** (STORY-slim-099) — Added missing `Act Phase 4` to the Context.md Canonical Format "Referenced by" line. Ensures context.md reflects Act progress for session continuity.
14
+ - **Semantic version comparison** (HOTFIX-slim-099) — Version mismatch warning now uses tuple comparison instead of string equality, giving correct upgrade/downgrade direction.
15
+
7
16
  ## [2.10.1] - 2026-04-16
8
17
 
9
18
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pactkit
3
- Version: 2.10.1
3
+ Version: 2.10.2
4
4
  Summary: Spec-driven agentic DevOps toolkit for AI coding assistants
5
5
  Project-URL: Homepage, https://pactkit.dev
6
6
  Project-URL: Repository, https://github.com/pactkit/pactkit-public
@@ -43,3 +43,6 @@
43
43
  | 2026-03-23 | code-explorer maxTurns reduced from 50 to 15 in agents.py; Plan Phase 1 now requires bounded Explore prompts with target/scope/limit/output via Delegation Template in commands.py | src/pactkit/prompts/agents.py:code-explorer.maxTurns,src/pactkit/prompts/commands.py:Phase1.DelegationTemplate |
44
44
  | 2026-03-23 | Added 09-sectional-write as core rule in src/pactkit/prompts/rules.py RULES_MODULES. Threshold 300 lines based on P75-P90 analysis of specs/source/tests. Applies to any file type. | src/pactkit/prompts/rules.py:RULES_MODULES |
45
45
  | 2026-03-23 | When adding a new pactkit.yaml config section, 4 touch points needed: get_default_config, DEEP_MERGE_KEYS, validate_config, generate_default_yaml. Table format in prompts saves chars vs individual sections. | config.py:get_default_config |
46
+ | 2026-03-24 | Plan Phase 3.2a scaffold-first: replaced AI freeform Write with {SCAFFOLD_CMD} create_spec + Read + Edit in src/pactkit/prompts/commands.py. Removed 3 inline format examples (~240 chars). Pre-existing tests (test_bug034, test_story055_commands, test_story_slim019) needed updates for new checkpoint wording. | src/pactkit/prompts/commands.py:Phase3.2a |
47
+ | 2026-03-24 | spec_linter.py _check_acceptance_criteria: per-subsection GWT check must use raw_text (with code blocks) not stripped text, because specs legitimately wrap Gherkin in fenced blocks | spec_linter.py:_check_acceptance_criteria |
48
+ | 2026-03-24 | Standalone scripts (visualize.py) need try/except ImportError guards for yaml.safe_load when reading pactkit.yaml — they cannot import from pactkit library | visualize.py:_load_scan_excludes |
@@ -2,9 +2,6 @@
2
2
 
3
3
  | Date | Lesson | Context |
4
4
  |------|--------|---------|
5
- | 2026-03-24 | Plan Phase 3.2a scaffold-first: replaced AI freeform Write with {SCAFFOLD_CMD} create_spec + Read + Edit in src/pactkit/prompts/commands.py. Removed 3 inline format examples (~240 chars). Pre-existing tests (test_bug034, test_story055_commands, test_story_slim019) needed updates for new checkpoint wording. | src/pactkit/prompts/commands.py:Phase3.2a |
6
- | 2026-03-24 | spec_linter.py _check_acceptance_criteria: per-subsection GWT check must use raw_text (with code blocks) not stripped text, because specs legitimately wrap Gherkin in fenced blocks | spec_linter.py:_check_acceptance_criteria |
7
- | 2026-03-24 | Standalone scripts (visualize.py) need try/except ImportError guards for yaml.safe_load when reading pactkit.yaml — they cannot import from pactkit library | visualize.py:_load_scan_excludes |
8
5
  | 2026-03-24 | Inline data in standalone scripts must have canonical-source comments pointing to the library module (e.g. _STACK_MARKERS → cleaners.py, _LANG_FILE_EXT → workflows.py) per Architecture Principle 1 | visualize.py:_STACK_MARKERS |
9
6
  | 2026-03-24 | Worktree isolation diverges from working-tree: verify visualize.py _scan_files() signature is preserved across stories to avoid breaking callers | visualize.py:_scan_files |
10
7
  | 2026-03-24 | Extracting _detect_stack() from _detect_file_ext() enables both file discovery and test mapping to share stack detection — DRY refactoring | visualize.py:_detect_stack |
@@ -53,3 +50,6 @@
53
50
  | 2026-04-16 | File-level hotspot aggregation (complexity_avg × blast_pct × fan_in) reduces 141 per-function findings to ~10 actionable items; _suggest_action() maps dominant signal to Split/Stabilize/Isolate/Decompose verb | src/pactkit/audit.py:_compute_hotspots,_suggest_action |
54
51
  | 2026-04-16 | Weighted hotspot formula (complexity 25% + docstring 15% + smells 15% + layers 10% + test 20% + blast 15%) gives meaningful scores across different project profiles; _generate_suggested_tasks auto-scaffolds BUG/HOTFIX specs with Done-completed filter for idempotency | src/pactkit/audit.py:_compute_hotspots,_generate_suggested_tasks |
55
52
  | 2026-04-16 | Dual-dimension audit (config+code 50/50) gives accurate project health picture; scanning ~/.claude/ global config catches harness setup invisible at project level | audit.py:_all_config_dirs |
53
+ | 2026-04-17 | Dual-anchor pattern: declare principle in RULES_MODULES['core'] (01-core-protocol.md), detail in dedicated module (11-pdca-nudge.md). Prevents attention dilution when rules/ has 10+ files — Core Protocol acts as behavioral constitution anchor. | src/pactkit/prompts/rules.py:RULES_MODULES |
54
+ | 2026-04-18 | Version comparison guards must use semantic (tuple) comparison, not string equality — string != treats 2.10.1 != 2.5.0 without direction, giving wrong upgrade advice | guards.py:check_version_mismatch |
55
+ | 2026-04-20 | Plugin deployer (_deploy_commands in deployer.py:952-954) uses _rewrite_skills_prefix instead of _render_prompt, keeping raw placeholders like {BOARD_CMD} — not a deploy drift bug but by-design template behavior | src/pactkit/generators/deployer.py:_deploy_commands |
@@ -15,7 +15,7 @@
15
15
 
16
16
  ## Invariants
17
17
 
18
- 1. All 3734+ tests must pass before any commit to `main`.
18
+ 1. All 3752+ tests must pass before any commit to `main`.
19
19
  2. Specs (`docs/specs/`) are the source of truth — code conforms to specs, not the reverse.
20
20
  3. CLI entry point is `pactkit` via `src/pactkit/cli.py:main`.
21
21
  4. No runtime dependencies beyond `pyyaml`.
@@ -185,3 +185,23 @@
185
185
  - [x] R1: Fix focus filter in _build_call_graph
186
186
  - [x] R2: Report empty Tab placeholder
187
187
  - [x] R3: Skip empty .mmd in unified report
188
+
189
+ ### [STORY-slim-098] PDCA Nudge Protocol — AI主动推荐PDCA命令
190
+ > Spec: docs/specs/STORY-slim-098.md
191
+
192
+ - [x] 创建11-pdca-nudge.md规则模板
193
+ - [x] 在VALID_RULES注册新规则
194
+ - [x] 添加部署测试
195
+ - [x] 运行deploy验证
196
+
197
+ ### [HOTFIX-slim-099] Fix version mismatch guard semantic comparison
198
+ > Spec: docs/specs/HOTFIX-slim-099.md
199
+
200
+ - [x] Use packaging.version for directional version comparison in guards.py
201
+
202
+ ### [STORY-slim-099] Add Act Phase reference to Shared Protocols Context.md section
203
+ > Spec: docs/specs/STORY-slim-099.md
204
+
205
+ - [x] Update Shared Protocols Referenced-by line
206
+ - [x] Redeploy via pactkit update
207
+ - [x] Verify deployed plugin sync
@@ -1,5 +1,5 @@
1
1
  # Project Context (Auto-generated)
2
- > Last updated: 2026-04-16T19:13:31+08:00 by pactkit context
2
+ > Last updated: 2026-04-20T10:21:11+08:00 by pactkit context
3
3
 
4
4
  ## Sprint Status
5
5
  Backlog: 0 | In Progress: 0 | Done: 0 stories
@@ -15,11 +15,11 @@ develop
15
15
  * main
16
16
 
17
17
  ## Key Decisions
18
- - D3 force graph selectNode() computes blast radius via in-browser BFS — no backend needed; folder-based coloring via d3.scaleOrdinal on path prefix gives CodeFlow-quality visuals
19
- - H1-H7 harness audit aggregator pattern: each _check_hN() function is self-contained with its own L0-L3 criteria, making it easy to add new checks per layer without touching scoring logic
20
- - File-level hotspot aggregation (complexity_avg × blast_pct × fan_in) reduces 141 per-function findings to ~10 actionable items; _suggest_action() maps dominant signal to Split/Stabilize/Isolate/Decompose verb
21
18
  - Weighted hotspot formula (complexity 25% + docstring 15% + smells 15% + layers 10% + test 20% + blast 15%) gives meaningful scores across different project profiles; _generate_suggested_tasks auto-scaffolds BUG/HOTFIX specs with Done-completed filter for idempotency
22
19
  - Dual-dimension audit (config+code 50/50) gives accurate project health picture; scanning ~/.claude/ global config catches harness setup invisible at project level
20
+ - Dual-anchor pattern: declare principle in RULES_MODULES['core'] (01-core-protocol.md), detail in dedicated module (11-pdca-nudge.md). Prevents attention dilution when rules/ has 10+ files — Core Protocol acts as behavioral constitution anchor.
21
+ - Version comparison guards must use semantic (tuple) comparison, not string equality — string != treats 2.10.1 != 2.5.0 without direction, giving wrong upgrade advice
22
+ - Plugin deployer (_deploy_commands in deployer.py:952-954) uses _rewrite_skills_prefix instead of _render_prompt, keeping raw placeholders like {BOARD_CMD} — not a deploy drift bug but by-design template behavior
23
23
 
24
24
  ## Next Recommended Action
25
25
  `/project-design`
@@ -0,0 +1,14 @@
1
+ # HOTFIX-slim-099: Fix version mismatch guard to use semantic comparison
2
+
3
+ ## Background
4
+ `check_version_mismatch()` in `guards.py` uses string `!=` to compare yaml version vs installed version. This gives a misleading "Run `pactkit update` to sync" message even when yaml version is **newer** than installed — in which case the user should upgrade pactkit, not downgrade the yaml.
5
+
6
+ ## Target
7
+ - **File**: `src/pactkit/guards.py`
8
+ - **Function**: `check_version_mismatch()` (line 71-85)
9
+
10
+ ## Fix
11
+ - Use `packaging.version.Version` for semantic comparison
12
+ - yaml > installed → suggest `pipx upgrade pactkit`
13
+ - yaml < installed → suggest `pactkit update`
14
+ - equal → no warning (existing behavior)
@@ -0,0 +1,143 @@
1
+ # STORY-slim-098: PDCA Nudge Protocol — AI主动推荐PDCA命令
2
+
3
+ | Field | Value |
4
+ |-------|-------|
5
+ | ID | STORY-slim-098 |
6
+ | Status | Done |
7
+ | Priority | P1 |
8
+ | Release | 2.11.0 |
9
+
10
+ ## Background
11
+
12
+ 当用户与 AI 进行自由对话(非 PDCA 命令上下文)时,AI 经常分析出 bug、架构改进点、新功能需求等结论,但不会主动提示用户使用对应的 PDCA 命令来跟踪和实现这些结论。用户聊着聊着就忘了 PDCA 的存在,导致有价值的分析结果停留在对话中,没有进入 Spec → Act → Check → Done 的可追溯流程。
13
+
14
+ **现状**:
15
+ - `context.md` 的 `Next Recommended Action` 仅在用户主动查看时可见(被动)
16
+ - Routing Table (`04-routing-table.md`) 只描述"When NOT to use",没有正向触发逻辑
17
+ - Core Protocol 仅在 Session Context 中建议 `/project-init`,对话中无 nudge 机制
18
+
19
+ **目标**: 新增 `11-pdca-nudge.md` 规则文件,定义 AI 在自由对话中检测到可行动结论时主动推荐 PDCA 命令的协议。
20
+
21
+ ## Requirements
22
+
23
+ ### R0: Core Protocol 锚定 (MUST)
24
+
25
+ 在 `01-core-protocol.md` 中新增 `## PDCA Nudge` 小节(紧随 `## Session Context` 之后),声明原则:
26
+
27
+ ```markdown
28
+ ## PDCA Nudge
29
+ When AI analysis in free conversation (outside PDCA command context) yields actionable conclusions — bugs, architecture improvements, new feature needs — SHOULD recommend the appropriate PDCA command at the end of the reply. See `11-pdca-nudge.md` for trigger matrix and suppression rules.
30
+ ```
31
+
32
+ **Why**: Core Protocol 是 AI 行为的"宪法",是 system prompt 中最早被阅读的锚点。仅放 rules/ 会被 12+ 个规则平铺稀释;在 Core Protocol 中声明原则确保 nudge 被视为核心行为而非可选建议。
33
+
34
+ ### R1: PDCA Nudge 触发矩阵 (MUST)
35
+
36
+ AI 在自由对话中(非 PDCA 命令执行上下文)检测到以下信号时,MUST 在回复末尾附加 PDCA 推荐提示:
37
+
38
+ | 信号类型 | 推荐命令 | 判断条件 |
39
+ |----------|----------|----------|
40
+ | 发现 bug / 错误行为 | `/project-hotfix` | 单文件修复,无设计决策 |
41
+ | 发现 bug + 涉及设计变更 | `/project-plan` | 多文件或需求不明确 |
42
+ | 识别出架构改进 | `/project-plan` | 涉及 2+ 文件修改 |
43
+ | 识别出新功能需求 | `/project-plan` | 单功能 |
44
+ | 识别出新产品/多功能需求 | `/project-design` | 3+ 个独立 story 的绿地项目 |
45
+ | 已有 Spec 的待实现需求 | `/project-act STORY-XXX` | Board 上有对应 story |
46
+ | 3+ 个独立改进项 | `/project-sprint` | 多个 story 可并行 |
47
+ | 代码质量问题(可快速修复) | `/project-hotfix` | 不涉及行为变更 |
48
+
49
+ ### R2: Nudge 格式 (MUST)
50
+
51
+ 推荐提示 MUST 使用以下固定格式,置于回复末尾(分析内容之后):
52
+
53
+ ```
54
+ 💡 这个分析结果可以通过 `{command}` 来跟踪实现:
55
+ > {一句话说明为什么推荐这个命令}
56
+ ```
57
+
58
+ ### R3: 抑制条件 (MUST)
59
+
60
+ 以下场景 MUST NOT 触发 nudge:
61
+ - 当前已在 PDCA 命令执行上下文中(Plan/Act/Check/Done/Sprint 等)
62
+ - 用户明确表示只想聊天、不想走流程
63
+ - 分析结论是对现有实现的确认(没有发现问题)
64
+ - 用户在同一对话中已经收到过相同命令的 nudge(去重)
65
+
66
+ ### R4: 非阻塞 (SHOULD)
67
+
68
+ Nudge SHOULD 是非阻塞的建议,不改变 AI 当前回复的内容结构。AI 完整回答用户问题后,在末尾附加 nudge。用户可以忽略 nudge 继续对话。
69
+
70
+ ## Acceptance Criteria
71
+
72
+ ### AC1: Bug 分析触发 hotfix 推荐 (R1, R2)
73
+
74
+ - **Given** 用户在自由对话中请求分析某段代码
75
+ - **When** AI 发现一个单文件 bug(如逻辑错误、边界条件缺失)
76
+ - **Then** AI 回复完整分析后,末尾附加 `/project-hotfix` nudge
77
+
78
+ ### AC2: 架构建议触发 plan 推荐 (R1, R2)
79
+
80
+ - **Given** 用户在自由对话中讨论代码结构
81
+ - **When** AI 识别出涉及 2+ 文件的架构改进建议
82
+ - **Then** AI 回复完整分析后,末尾附加 `/project-plan` nudge
83
+
84
+ ### AC3: PDCA 上下文内不触发 (R3)
85
+
86
+ - **Given** 用户正在执行 `/project-act STORY-XXX`
87
+ - **When** AI 在实现过程中发现额外的改进点
88
+ - **Then** AI 不附加 nudge(当前已在 PDCA 上下文中)
89
+
90
+ ### AC4: 去重抑制 (R3)
91
+
92
+ - **Given** AI 在同一对话中已推荐过 `/project-plan`
93
+ - **When** AI 再次发现可以走 `/project-plan` 的结论
94
+ - **Then** AI 不重复推荐相同命令
95
+
96
+ ### AC5: 非阻塞体验 (R4)
97
+
98
+ - **Given** 用户提问 "这段代码有什么问题?"
99
+ - **When** AI 分析完成并附加 nudge
100
+ - **Then** nudge 在回复末尾,不打断分析内容的完整性;用户可直接继续下一个问题而无需回应 nudge
101
+
102
+ ### AC6: 双层锚定部署验证 (R0)
103
+
104
+ - **Given** 运行 `pactkit deploy`
105
+ - **When** 检查部署产物 `~/.claude/rules/01-core-protocol.md`
106
+ - **Then** 文件包含 `## PDCA Nudge` 小节,且内容引用 `11-pdca-nudge.md`
107
+
108
+ ## Target Call Chain
109
+
110
+ 无代码调用链。本 Story 变更的是 prompt 规则文件(`~/.claude/rules/11-pdca-nudge.md`),属于 PactKit 部署产物。
111
+ - 规则文件通过 `pactkit deploy` 部署到 `~/.claude/rules/` 目录
112
+ - 规则文件被 Claude Code 在 session 启动时自动加载
113
+ - 规则内容直接影响 AI 行为,无代码执行路径
114
+
115
+ ## Implementation Steps
116
+
117
+ | Step | File | Action | Dependencies | Risk |
118
+ |------|------|--------|-------------|------|
119
+ | 1 | `src/pactkit/templates/rules/01-core-protocol.md` | 在 `## Session Context` 之后新增 `## PDCA Nudge` 小节(3-4 行原则声明 + 指向 11-pdca-nudge.md) | None | Low |
120
+ | 2 | `src/pactkit/templates/rules/11-pdca-nudge.md` | 新建规则模板,定义完整触发矩阵、格式模板、抑制条件 | None | Low |
121
+ | 3 | `src/pactkit/config.py` | 在 `VALID_RULES` 列表中添加 `11-pdca-nudge` | Step 2 | Low |
122
+ | 4 | `tests/unit/test_deploy_rules.py` | 添加测试:验证新规则被 deploy 包含 | Step 2-3 | Low |
123
+ | 5 | `pactkit deploy` (验证) | 运行 deploy,确认 01-core-protocol.md 含 PDCA Nudge 节 + 11-pdca-nudge.md 出现在 `~/.claude/rules/` | Step 1-4 | Low |
124
+
125
+ ## Security Scope
126
+
127
+ | Check | Applicable | Reason |
128
+ |-------|------------|--------|
129
+ | SEC-1 | N/A | 变更仅为 prompt 规则文本,不涉及可执行代码逻辑 |
130
+ | SEC-2 | N/A | 无用户输入处理 |
131
+ | SEC-3 | N/A | 无数据库操作 |
132
+ | SEC-4 | N/A | 无前端文件 |
133
+ | SEC-5 | N/A | 无认证逻辑 |
134
+ | SEC-6 | N/A | 无 API/路由 |
135
+ | SEC-7 | N/A | 无错误处理变更(config.py 仅增加列表项) |
136
+ | SEC-8 | N/A | 无依赖变更 |
137
+
138
+ ## Out of Scope
139
+
140
+ - 不修改任何 PDCA 命令的 playbook(Plan/Act/Check/Done 等)
141
+ - 不修改 Routing Table (`04-routing-table.md`) — nudge 是补充,不改变现有路由逻辑
142
+ - 不实现自动执行 PDCA 命令 — nudge 仅推荐,由用户决定是否执行
143
+ - 不修改 `context.md` 的 `Next Recommended Action` 机制 — 两者互补(context.md 是 session 级,nudge 是对话级)
@@ -0,0 +1,87 @@
1
+ # STORY-slim-099: Add Act Phase reference to Shared Protocols Context.md section
2
+
3
+ | Field | Value |
4
+ |-------|-------|
5
+ | ID | STORY-slim-099 |
6
+ | Status | Done |
7
+ | Priority | P1 |
8
+ | Release | 2.10.2 |
9
+
10
+ ## Background
11
+
12
+ The Shared Protocols rule `07-shared-protocols.md` defines the Context.md Canonical Format and lists which PDCA phases reference it: `Init Phase 6, Plan Phase 3, Done Phase 4.5`. However, `/project-act` Phase 4 also updates context.md via `pactkit context --continuation` (source template in `commands.py:202`), but this reference is missing from the Shared Protocols listing.
13
+
14
+ Additionally, the deployed plugin version (`pactkit-plugin/commands/project-act.md`) is missing Act Phase 4 step 3 (`pactkit context --continuation`), which exists in the source template. This causes context.md to not reflect Act progress when a session is interrupted before `/project-done`.
15
+
16
+ **Impact**: When a user runs `/project-plan` → `/project-act` and exits without running `/project-done`, context.md remains frozen at the Plan snapshot. New sessions cold-start with stale state.
17
+
18
+ ## Requirements
19
+
20
+ ### R1: Shared Protocols Reference Update (MUST)
21
+
22
+ The `Context.md Canonical Format` section in `07-shared-protocols.md` MUST include `Act Phase 4` in its "Referenced by" line, alongside the existing `Init Phase 6, Plan Phase 3, Done Phase 4.5`.
23
+
24
+ ### R2: Deployed Plugin Sync (MUST)
25
+
26
+ The deployed `pactkit-plugin/commands/project-act.md` MUST include Act Phase 4 step 3 (`pactkit context --continuation`) matching the source template in `commands.py`. This is achieved by running `pactkit update` (redeploy).
27
+
28
+ ## Acceptance Criteria
29
+
30
+ ### AC1: Shared Protocols includes Act Phase 4 (R1)
31
+
32
+ - **Given** the file `~/.claude/rules/07-shared-protocols.md` exists
33
+ - **When** reading the `Context.md Canonical Format` section's "Referenced by" line
34
+ - **Then** it contains `Act Phase 4` alongside `Init Phase 6, Plan Phase 3, Done Phase 4.5`
35
+
36
+ ### AC2: Deployed Act playbook includes context update step (R2)
37
+
38
+ - **Given** `pactkit update` has been run after this change
39
+ - **When** reading `pactkit-plugin/commands/project-act.md` Phase 4
40
+ - **Then** step 3 contains `pactkit context --continuation --last-command "/project-act {STORY_ID}" --phase "Phase 4: complete"`
41
+
42
+ ### AC3: Source template consistency (R2)
43
+
44
+ - **Given** the source template in `src/pactkit/prompts/commands.py`
45
+ - **When** comparing Act Phase 4 steps between source and deployed
46
+ - **Then** the deployed version matches the source template (no drift)
47
+
48
+ ## Target Call Chain
49
+
50
+ ```
51
+ User runs /project-act STORY-XXX
52
+ → Act Phase 4 (Sync & Document)
53
+ → pactkit context --continuation --last-command "/project-act STORY-XXX" --phase "Phase 4: complete"
54
+ → context_gen.generate_context(continuation_args={...})
55
+ → writes docs/product/context.md (full regeneration + Agent Continuation section)
56
+ ```
57
+
58
+ Source template: `src/pactkit/prompts/commands.py:199-202`
59
+ Shared Protocols: `~/.claude/rules/07-shared-protocols.md:14` (referenced by list)
60
+ Deployed plugin: `pactkit-plugin/commands/project-act.md:68-70`
61
+
62
+ ## Implementation Steps
63
+
64
+ | Step | File | Action | Dependencies | Risk |
65
+ |------|------|--------|-------------|------|
66
+ | 1 | `src/pactkit/prompts/rules.py` | Add `Act Phase 4` to Context.md Canonical Format "Referenced by" line | None | Low |
67
+ | 2 | Run `pactkit update` | Redeploy to sync `pactkit-plugin/commands/project-act.md` | Step 1 | Low |
68
+ | 3 | Verify deployed file | Confirm Act Phase 4 step 3 present in deployed playbook | Step 2 | Low |
69
+
70
+ ## Security Scope
71
+
72
+ | Check | Applicable | Reason |
73
+ |-------|------------|--------|
74
+ | SEC-1 | N/A | docs/prompt-only change, no user input handling |
75
+ | SEC-2 | N/A | docs/prompt-only change, no input validation |
76
+ | SEC-3 | N/A | no database interaction |
77
+ | SEC-4 | N/A | no frontend files |
78
+ | SEC-5 | N/A | no auth/session changes |
79
+ | SEC-6 | N/A | no API endpoints |
80
+ | SEC-7 | N/A | no error handling changes |
81
+ | SEC-8 | N/A | no dependency changes |
82
+
83
+ ## Out of Scope
84
+
85
+ - Changing the `pactkit context` CLI behavior or `context_gen.py` logic
86
+ - Adding new context.md sections or changing the canonical format
87
+ - Modifying other PDCA commands' context update behavior
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "pactkit"
7
- version = "2.10.1"
7
+ version = "2.10.2"
8
8
  description = "Spec-driven agentic DevOps toolkit for AI coding assistants"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -1,3 +1,3 @@
1
1
  """PactKit - Spec-driven agentic DevOps toolkit."""
2
2
 
3
- __version__ = "2.10.1"
3
+ __version__ = "2.10.2"
@@ -407,7 +407,6 @@ def main():
407
407
  version_warn = check_version_mismatch(project_root)
408
408
  if version_warn:
409
409
  print(f" ⚠️ {version_warn}")
410
- print(" Run `pactkit update` to sync")
411
410
  else:
412
411
  for m in missing:
413
412
  print(f" ✗ {m}")
@@ -87,6 +87,7 @@ VALID_RULES = frozenset(
87
87
  "07-shared-protocols",
88
88
  "08-architecture-principles",
89
89
  "09-sectional-write",
90
+ "11-pdca-nudge",
90
91
  }
91
92
  )
92
93
 
@@ -68,6 +68,14 @@ def check_config_completeness(project_root: Path) -> list[str]:
68
68
  return warnings
69
69
 
70
70
 
71
+ def _parse_version(v: str) -> tuple[int, ...]:
72
+ """Parse dotted version string into comparable tuple."""
73
+ try:
74
+ return tuple(int(x) for x in v.split("."))
75
+ except (ValueError, AttributeError):
76
+ return ()
77
+
78
+
71
79
  def check_version_mismatch(project_root: Path) -> str | None:
72
80
  """Check if pactkit.yaml version differs from installed __version__.
73
81
 
@@ -80,6 +88,21 @@ def check_version_mismatch(project_root: Path) -> str | None:
80
88
 
81
89
  cfg = load_config(yaml_path)
82
90
  yaml_version = cfg.get("version", "")
83
- if yaml_version and yaml_version != __version__:
91
+ if not yaml_version or yaml_version == __version__:
92
+ return None
93
+
94
+ yaml_v = _parse_version(yaml_version)
95
+ installed_v = _parse_version(__version__)
96
+
97
+ if not yaml_v or not installed_v:
84
98
  return f"Version mismatch: pactkit.yaml {yaml_version} vs installed {__version__}"
85
- return None
99
+
100
+ if yaml_v > installed_v:
101
+ return (
102
+ f"Version mismatch: pactkit.yaml {yaml_version} > installed {__version__}\n"
103
+ f" Run `pipx upgrade pactkit` to update the CLI"
104
+ )
105
+ return (
106
+ f"Version mismatch: pactkit.yaml {yaml_version} < installed {__version__}\n"
107
+ f" Run `pactkit update` to sync"
108
+ )
@@ -10,6 +10,9 @@ Then read `docs/product/context.md` to understand project state before taking ac
10
10
  If the file is missing, suggest `/project-init` to bootstrap the project.
11
11
  If "Last updated" date is before today, suggest running `$daily-retro`.
12
12
 
13
+ ## PDCA Nudge
14
+ When AI analysis in free conversation (outside PDCA command context) yields actionable conclusions — bugs, architecture improvements, new feature needs — SHOULD recommend the appropriate PDCA command at the end of the reply. See `11-pdca-nudge.md` for trigger matrix and suppression rules.
15
+
13
16
  ## Visual First
14
17
  Before modifying code:
15
18
  - Run `visualize` to view file dependency graph
@@ -274,7 +277,7 @@ If source files changed (per `LANG_PROFILES[stack].source_dirs`) OR `code_graph.
274
277
  Map changed source files to test files via `LANG_PROFILES[stack].test_map_pattern`. If no mapping can be determined, fall back to the full test suite.
275
278
 
276
279
  ## Context.md Canonical Format
277
- > Referenced by: Init Phase 6, Plan Phase 3, Done Phase 4.5
280
+ > Referenced by: Init Phase 6, Plan Phase 3, Act Phase 4, Done Phase 4.5
278
281
 
279
282
  Write `docs/product/context.md` using this format:
280
283
  ```markdown
@@ -402,6 +405,50 @@ Compose entire file in head → one Write call at the end
402
405
  ```
403
406
  Write skeleton → Edit block 1 → checkpoint → Edit block 2 → checkpoint → ...
404
407
  ```
408
+ """,
409
+ "nudge": """# PDCA Nudge Protocol
410
+
411
+ > **Signal Level**: L3 Recommended (SHOULD) — non-blocking suggestion.
412
+
413
+ ## When to Nudge
414
+
415
+ When AI analysis in **free conversation** (outside any PDCA command context) produces actionable conclusions, SHOULD append a PDCA command recommendation at the end of the reply.
416
+
417
+ ## Trigger Matrix
418
+
419
+ | Signal | Command | Condition |
420
+ |--------|---------|-----------|
421
+ | Bug / error found (single file) | `/project-hotfix` | Single-file fix, no design decision needed |
422
+ | Bug + design change needed | `/project-plan` | Multi-file or unclear requirements |
423
+ | Architecture improvement identified | `/project-plan` | Involves 2+ file changes |
424
+ | New feature need identified | `/project-plan` | Single feature |
425
+ | New product / multi-feature need | `/project-design` | 3+ independent stories, greenfield |
426
+ | Existing Spec ready to implement | `/project-act STORY-XXX` | Story is on the Board |
427
+ | 3+ independent improvement items | `/project-sprint` | Multiple stories can run in parallel |
428
+ | Code quality issue (quick fix) | `/project-hotfix` | No behavior change |
429
+
430
+ ## Nudge Format
431
+
432
+ Place at the **end** of the reply, after all analysis content:
433
+
434
+ ```
435
+ 💡 This analysis can be tracked via `{command}`:
436
+ > {one-sentence reason why this command fits}
437
+ ```
438
+
439
+ When replying in Chinese, use:
440
+
441
+ ```
442
+ 💡 这个分析结果可以通过 `{command}` 来跟踪实现:
443
+ > {一句话说明为什么推荐这个命令}
444
+ ```
445
+
446
+ ## Suppression Rules (MUST NOT nudge when)
447
+
448
+ - **In PDCA context**: A PDCA command is already active (Plan/Act/Check/Done/Sprint/Hotfix/Design)
449
+ - **User opted out**: User explicitly said they just want to chat, not follow a workflow
450
+ - **No issue found**: Analysis confirms the current implementation is correct
451
+ - **Dedup**: The same command was already nudged earlier in this conversation
405
452
  """,
406
453
  }
407
454
 
@@ -427,6 +474,7 @@ RULES_ONDEMAND_FILES = {
427
474
  "mcp": "06-mcp-integration.md",
428
475
  "shared": "07-shared-protocols.md",
429
476
  "architecture": "08-architecture-principles.md",
477
+ "nudge": "11-pdca-nudge.md",
430
478
  }
431
479
 
432
480
  # Full set of PactKit-MANAGED rules (used for deployment + CLAUDE_MD_TEMPLATE)
@@ -469,7 +517,7 @@ COMMAND_RULES_MAP = {
469
517
  }
470
518
 
471
519
  # Managed file prefixes (deployer will clean these, leave user files intact)
472
- RULES_MANAGED_PREFIXES = ["01-", "02-", "03-", "04-", "05-", "06-", "07-", "08-", "09-"]
520
+ RULES_MANAGED_PREFIXES = ["01-", "02-", "03-", "04-", "05-", "06-", "07-", "08-", "09-", "11-"]
473
521
 
474
522
  # CLAUDE_MD_TEMPLATE: auto-generated from RULES_FILES (STORY-slim-007: DRY principle)
475
523
  # Classic mode uses @import syntax — all rules included (Claude Code @import is lazy-loaded natively)
@@ -49,9 +49,9 @@ class TestGetDefaultConfig:
49
49
  assert len(cfg["skills"]) == 24
50
50
 
51
51
  def test_default_rules_count(self):
52
- """9 rule modules (added 09-sectional-write)."""
52
+ """10 rule modules (added 11-pdca-nudge)."""
53
53
  cfg = _config().get_default_config()
54
- assert len(cfg["rules"]) == 9
54
+ assert len(cfg["rules"]) == 10
55
55
 
56
56
  def test_default_stack_is_auto(self):
57
57
  cfg = _config().get_default_config()
@@ -113,8 +113,8 @@ class TestTokenReduction:
113
113
 
114
114
  # Baseline updated: 400 words (post-STORY-008 reduction + subagent section).
115
115
  # 30% headroom → max words. Increase baseline if adding valuable content.
116
- # Raised from 400 to 600 for STORY-slim-086: Signal Strength Convention table added.
117
- BASELINE_WORD_COUNT = 600
116
+ # Raised from 600 to 660 for STORY-slim-098: PDCA Nudge anchor section added.
117
+ BASELINE_WORD_COUNT = 660
118
118
 
119
119
  def test_core_protocol_within_limit(self):
120
120
  p = _prompts()
@@ -114,8 +114,8 @@ class TestPromptModuleCounts:
114
114
  """Verify expected counts of prompt modules."""
115
115
 
116
116
  def test_rule_count(self):
117
- """9 rule modules (added 09-sectional-write)."""
118
- assert len(prompts.RULES_MODULES) == 9
117
+ """10 rule modules (added 11-pdca-nudge)."""
118
+ assert len(prompts.RULES_MODULES) == 10
119
119
 
120
120
  def test_command_count(self):
121
121
  """STORY-051: Should have 11 command playbooks (added project-release, project-pr)."""
@@ -247,7 +247,7 @@ class TestDeploymentSummary:
247
247
  assert "24/24 Skills" in output
248
248
  assert "13 embedded" in output
249
249
  assert "11 commands" in output
250
- assert "8/8 Rules" in output or "9/9 Rules" in output # 9 rules after 09-sectional-write
250
+ assert "10/10 Rules" in output
251
251
 
252
252
  def test_summary_printed_partial(self, tmp_path, capsys):
253
253
  # +pactkit-audit, +pactkit-report = 24 total (13 embedded + 11 commands)
@@ -85,6 +85,9 @@ class TestAC8AllRulesMapped:
85
85
  # credential is special (not in RULES_FILES) — exclude from check
86
86
  mapped_keys.discard("credential")
87
87
 
88
+ # nudge is conversation-scoped (suppressed inside PDCA context) — not command-mapped
89
+ all_rule_keys.discard("nudge")
90
+
88
91
  unmapped = all_rule_keys - mapped_keys
89
92
  assert not unmapped, f"Rules not mapped to any command: {unmapped}"
90
93
 
@@ -25,8 +25,8 @@ class TestR6RuleExists:
25
25
  def test_valid_rules_contains_sectional_write(self):
26
26
  assert "09-sectional-write" in VALID_RULES
27
27
 
28
- def test_valid_rules_count_is_9(self):
29
- assert len(VALID_RULES) == 9
28
+ def test_valid_rules_count_is_10(self):
29
+ assert len(VALID_RULES) == 10
30
30
 
31
31
  def test_rules_modules_contains_sectional(self):
32
32
  assert "sectional" in RULES_MODULES