pactkit 2.11.0__tar.gz → 2.13.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 (578) hide show
  1. {pactkit-2.11.0 → pactkit-2.13.0}/.opencode/pactkit.yaml +12 -6
  2. {pactkit-2.11.0 → pactkit-2.13.0}/CHANGELOG.md +17 -0
  3. {pactkit-2.11.0 → pactkit-2.13.0}/PKG-INFO +1 -2
  4. {pactkit-2.11.0 → pactkit-2.13.0}/README.md +0 -1
  5. {pactkit-2.11.0 → pactkit-2.13.0}/docs/architecture/governance/archive/lessons_archive_202603.md +8 -0
  6. {pactkit-2.11.0 → pactkit-2.13.0}/docs/architecture/governance/lessons.md +3 -8
  7. {pactkit-2.11.0 → pactkit-2.13.0}/docs/architecture/governance/rules.md +1 -1
  8. pactkit-2.13.0/docs/e2e/journey.md +243 -0
  9. {pactkit-2.11.0 → pactkit-2.13.0}/docs/product/archive/archive_202604.md +18 -0
  10. pactkit-2.13.0/docs/product/archive/archive_202605.md +47 -0
  11. pactkit-2.13.0/docs/product/context.md +29 -0
  12. pactkit-2.13.0/docs/specs/BUG-slim-107.md +12 -0
  13. pactkit-2.13.0/docs/specs/STORY-slim-107.md +134 -0
  14. pactkit-2.13.0/docs/specs/STORY-slim-108.md +97 -0
  15. pactkit-2.13.0/docs/specs/STORY-slim-109.md +106 -0
  16. pactkit-2.13.0/docs/specs/STORY-slim-110.md +96 -0
  17. pactkit-2.13.0/docs/specs/STORY-slim-111.md +100 -0
  18. pactkit-2.13.0/docs/specs/STORY-slim-112.md +255 -0
  19. pactkit-2.13.0/docs/specs/STORY-slim-113.md +175 -0
  20. pactkit-2.13.0/docs/specs/STORY-slim-114.md +158 -0
  21. {pactkit-2.11.0 → pactkit-2.13.0}/pyproject.toml +1 -1
  22. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/__init__.py +1 -1
  23. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/cli.py +25 -0
  24. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/config.py +9 -11
  25. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/generators/deployer.py +59 -9
  26. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/lazy_visualize.py +1 -1
  27. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/prompts/__init__.py +3 -0
  28. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/prompts/commands.py +61 -5
  29. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/prompts/rules.py +148 -22
  30. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/prompts/skills.py +12 -1
  31. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/prompts/workflows.py +16 -1
  32. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/skills/board.py +26 -18
  33. pactkit-2.13.0/src/pactkit/skills/interface_summary.py +199 -0
  34. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/skills/visualize.py +26 -8
  35. {pactkit-2.11.0 → pactkit-2.13.0}/tests/e2e/cli/test_cli_e2e.py +42 -5
  36. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug004_dead_set.py +8 -5
  37. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_config.py +2 -2
  38. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_config_auto_merge.py +3 -2
  39. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_constitution_sharpening.py +29 -15
  40. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_deployer_plugin.py +11 -3
  41. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_design_command.py +105 -0
  42. pactkit-2.13.0/tests/unit/test_interface_summary.py +207 -0
  43. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_mcp_integration.py +18 -10
  44. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_modular_constitution.py +7 -11
  45. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_prompt_structural_invariants.py +2 -2
  46. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_rules_enrichment.py +19 -8
  47. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_selective_deploy.py +29 -15
  48. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_solution_design_rule.py +16 -10
  49. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story028_rule_scoping.py +23 -10
  50. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story063_prompt_slimming.py +7 -1
  51. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim009_lazy_rules.py +41 -19
  52. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim011_command_rules.py +40 -20
  53. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim021.py +11 -7
  54. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim023.py +5 -2
  55. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim026.py +2 -2
  56. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim028.py +19 -11
  57. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim083.py +4 -2
  58. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim098_pdca_nudge.py +22 -17
  59. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim102_version_marker.py +2 -1
  60. pactkit-2.13.0/tests/unit/test_story_slim107.py +145 -0
  61. pactkit-2.13.0/tests/unit/test_story_slim109_journey_spec.py +112 -0
  62. pactkit-2.13.0/tests/unit/test_story_slim111_playwright_assertion.py +144 -0
  63. pactkit-2.13.0/tests/unit/test_story_slim112_rules_split.py +394 -0
  64. pactkit-2.13.0/tests/unit/test_story_slim114_journey_sync.py +130 -0
  65. pactkit-2.11.0/docs/product/context.md +0 -28
  66. {pactkit-2.11.0 → pactkit-2.13.0}/.github/workflows/pactkit.yml +0 -0
  67. {pactkit-2.11.0 → pactkit-2.13.0}/.github/workflows/publish.yml +0 -0
  68. {pactkit-2.11.0 → pactkit-2.13.0}/.gitignore +0 -0
  69. {pactkit-2.11.0 → pactkit-2.13.0}/AGENTS.md +0 -0
  70. {pactkit-2.11.0 → pactkit-2.13.0}/CODE_OF_CONDUCT.md +0 -0
  71. {pactkit-2.11.0 → pactkit-2.13.0}/CONTRIBUTING.md +0 -0
  72. {pactkit-2.11.0 → pactkit-2.13.0}/LICENSE +0 -0
  73. {pactkit-2.11.0 → pactkit-2.13.0}/SECURITY.md +0 -0
  74. {pactkit-2.11.0 → pactkit-2.13.0}/docs/architecture/governance/archive/lessons_archive_202602.md +0 -0
  75. {pactkit-2.11.0 → pactkit-2.13.0}/docs/architecture/governance/harness_audit.json +0 -0
  76. {pactkit-2.11.0 → pactkit-2.13.0}/docs/architecture/governance/philosophy.md +0 -0
  77. {pactkit-2.11.0 → pactkit-2.13.0}/docs/assets/logo.png +0 -0
  78. {pactkit-2.11.0 → pactkit-2.13.0}/docs/guides/codex-integration-preresearch.md +0 -0
  79. {pactkit-2.11.0 → pactkit-2.13.0}/docs/guides/tool-integration-checklist.md +0 -0
  80. {pactkit-2.11.0 → pactkit-2.13.0}/docs/product/archive/archive_202602.md +0 -0
  81. {pactkit-2.11.0 → pactkit-2.13.0}/docs/product/archive/archive_202603.md +0 -0
  82. {pactkit-2.11.0 → pactkit-2.13.0}/docs/product/friction-log.md +0 -0
  83. {pactkit-2.11.0 → pactkit-2.13.0}/docs/product/prd.md +0 -0
  84. {pactkit-2.11.0 → pactkit-2.13.0}/docs/product/sprint_board.md +0 -0
  85. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-001.md +0 -0
  86. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-002.md +0 -0
  87. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-003.md +0 -0
  88. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-004.md +0 -0
  89. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-005.md +0 -0
  90. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-006.md +0 -0
  91. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-007.md +0 -0
  92. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-008.md +0 -0
  93. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-009.md +0 -0
  94. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-010.md +0 -0
  95. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-011.md +0 -0
  96. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-012.md +0 -0
  97. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-013.md +0 -0
  98. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-014.md +0 -0
  99. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-015.md +0 -0
  100. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-016.md +0 -0
  101. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-017.md +0 -0
  102. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-018.md +0 -0
  103. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-019.md +0 -0
  104. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-020.md +0 -0
  105. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-021.md +0 -0
  106. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-022.md +0 -0
  107. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-023.md +0 -0
  108. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-024.md +0 -0
  109. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-025.md +0 -0
  110. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-026.md +0 -0
  111. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-027.md +0 -0
  112. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-028.md +0 -0
  113. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-029.md +0 -0
  114. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-030.md +0 -0
  115. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-031.md +0 -0
  116. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-032.md +0 -0
  117. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-033.md +0 -0
  118. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-034.md +0 -0
  119. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-035.md +0 -0
  120. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-slim-001.md +0 -0
  121. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-slim-002.md +0 -0
  122. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-slim-003.md +0 -0
  123. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-slim-004.md +0 -0
  124. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-slim-005.md +0 -0
  125. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-slim-006.md +0 -0
  126. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/BUG-slim-089.md +0 -0
  127. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/HOTFIX-slim-023.md +0 -0
  128. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/HOTFIX-slim-049.md +0 -0
  129. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/HOTFIX-slim-050.md +0 -0
  130. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/HOTFIX-slim-051.md +0 -0
  131. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/HOTFIX-slim-052.md +0 -0
  132. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/HOTFIX-slim-061.md +0 -0
  133. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/HOTFIX-slim-062.md +0 -0
  134. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/HOTFIX-slim-067.md +0 -0
  135. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/HOTFIX-slim-069.md +0 -0
  136. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/HOTFIX-slim-070.md +0 -0
  137. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/HOTFIX-slim-085.md +0 -0
  138. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/HOTFIX-slim-087.md +0 -0
  139. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/HOTFIX-slim-096.md +0 -0
  140. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/HOTFIX-slim-099.md +0 -0
  141. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/HOTFIX-slim-107.md +0 -0
  142. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-001.md +0 -0
  143. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-002.md +0 -0
  144. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-003.md +0 -0
  145. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-004.md +0 -0
  146. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-005.md +0 -0
  147. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-006.md +0 -0
  148. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-007.md +0 -0
  149. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-008.md +0 -0
  150. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-009.md +0 -0
  151. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-010.md +0 -0
  152. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-011.md +0 -0
  153. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-012.md +0 -0
  154. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-013.md +0 -0
  155. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-014.md +0 -0
  156. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-015.md +0 -0
  157. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-016.md +0 -0
  158. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-017.md +0 -0
  159. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-018.md +0 -0
  160. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-019.md +0 -0
  161. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-020.md +0 -0
  162. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-021.md +0 -0
  163. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-022.md +0 -0
  164. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-023.md +0 -0
  165. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-024.md +0 -0
  166. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-025.md +0 -0
  167. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-026.md +0 -0
  168. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-027.md +0 -0
  169. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-028.md +0 -0
  170. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-029.md +0 -0
  171. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-030.md +0 -0
  172. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-031.md +0 -0
  173. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-032.md +0 -0
  174. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-033.md +0 -0
  175. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-034.md +0 -0
  176. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-035.md +0 -0
  177. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-036.md +0 -0
  178. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-037.md +0 -0
  179. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-038.md +0 -0
  180. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-039.md +0 -0
  181. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-040.md +0 -0
  182. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-041.md +0 -0
  183. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-042.md +0 -0
  184. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-043.md +0 -0
  185. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-044.md +0 -0
  186. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-045.md +0 -0
  187. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-046.md +0 -0
  188. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-047.md +0 -0
  189. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-048.md +0 -0
  190. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-049.md +0 -0
  191. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-050.md +0 -0
  192. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-051.md +0 -0
  193. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-052.md +0 -0
  194. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-053.md +0 -0
  195. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-054.md +0 -0
  196. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-055.md +0 -0
  197. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-056.md +0 -0
  198. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-057.md +0 -0
  199. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-058.md +0 -0
  200. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-059.md +0 -0
  201. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-060.md +0 -0
  202. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-061.md +0 -0
  203. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-062.md +0 -0
  204. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-063.md +0 -0
  205. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-064.md +0 -0
  206. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-065.md +0 -0
  207. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-069.md +0 -0
  208. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-070.md +0 -0
  209. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-071.md +0 -0
  210. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-072.md +0 -0
  211. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-073.md +0 -0
  212. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-001.md +0 -0
  213. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-005.md +0 -0
  214. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-006.md +0 -0
  215. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-007.md +0 -0
  216. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-009.md +0 -0
  217. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-010.md +0 -0
  218. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-011.md +0 -0
  219. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-012.md +0 -0
  220. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-013.md +0 -0
  221. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-014.md +0 -0
  222. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-015.md +0 -0
  223. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-016.md +0 -0
  224. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-017.md +0 -0
  225. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-018.md +0 -0
  226. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-019.md +0 -0
  227. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-020.md +0 -0
  228. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-021.md +0 -0
  229. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-022.md +0 -0
  230. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-023.md +0 -0
  231. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-024.md +0 -0
  232. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-028.md +0 -0
  233. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-029.md +0 -0
  234. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-030.md +0 -0
  235. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-031.md +0 -0
  236. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-032.md +0 -0
  237. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-033.md +0 -0
  238. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-034.md +0 -0
  239. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-035.md +0 -0
  240. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-036.md +0 -0
  241. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-037.md +0 -0
  242. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-038.md +0 -0
  243. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-039.md +0 -0
  244. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-040.md +0 -0
  245. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-041.md +0 -0
  246. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-042.md +0 -0
  247. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-043.md +0 -0
  248. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-044.md +0 -0
  249. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-045.md +0 -0
  250. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-046.md +0 -0
  251. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-047.md +0 -0
  252. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-048.md +0 -0
  253. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-049.md +0 -0
  254. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-050.md +0 -0
  255. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-051.md +0 -0
  256. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-052.md +0 -0
  257. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-053.md +0 -0
  258. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-054.md +0 -0
  259. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-055.md +0 -0
  260. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-056.md +0 -0
  261. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-057.md +0 -0
  262. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-058.md +0 -0
  263. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-059.md +0 -0
  264. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-060.md +0 -0
  265. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-063.md +0 -0
  266. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-066.md +0 -0
  267. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-067.md +0 -0
  268. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-068.md +0 -0
  269. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-069.md +0 -0
  270. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-070.md +0 -0
  271. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-071.md +0 -0
  272. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-072.md +0 -0
  273. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-073.md +0 -0
  274. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-074.md +0 -0
  275. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-075.md +0 -0
  276. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-076.md +0 -0
  277. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-077.md +0 -0
  278. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-078.md +0 -0
  279. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-079.md +0 -0
  280. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-080.md +0 -0
  281. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-081.md +0 -0
  282. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-082.md +0 -0
  283. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-083.md +0 -0
  284. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-084.md +0 -0
  285. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-086.md +0 -0
  286. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-088.md +0 -0
  287. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-089.md +0 -0
  288. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-090.md +0 -0
  289. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-091.md +0 -0
  290. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-092.md +0 -0
  291. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-093.md +0 -0
  292. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-094.md +0 -0
  293. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-095.md +0 -0
  294. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-097.md +0 -0
  295. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-098.md +0 -0
  296. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-099.md +0 -0
  297. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-100.md +0 -0
  298. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-101.md +0 -0
  299. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-102.md +0 -0
  300. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-103.md +0 -0
  301. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-104.md +0 -0
  302. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-105.md +0 -0
  303. {pactkit-2.11.0 → pactkit-2.13.0}/docs/specs/STORY-slim-106.md +0 -0
  304. {pactkit-2.11.0 → pactkit-2.13.0}/docs/test_cases/BUG-001_case.md +0 -0
  305. {pactkit-2.11.0 → pactkit-2.13.0}/docs/test_cases/BUG-002_case.md +0 -0
  306. {pactkit-2.11.0 → pactkit-2.13.0}/docs/test_cases/STORY-slim-028_case.md +0 -0
  307. {pactkit-2.11.0 → pactkit-2.13.0}/docs/test_cases/STORY-slim-029_case.md +0 -0
  308. {pactkit-2.11.0 → pactkit-2.13.0}/docs/test_cases/STORY-slim-031_case.md +0 -0
  309. {pactkit-2.11.0 → pactkit-2.13.0}/docs/test_cases/STORY-slim-032_case.md +0 -0
  310. {pactkit-2.11.0 → pactkit-2.13.0}/docs/test_cases/STORY-slim-033_case.md +0 -0
  311. {pactkit-2.11.0 → pactkit-2.13.0}/docs/test_cases/STORY-slim-034_case.md +0 -0
  312. {pactkit-2.11.0 → pactkit-2.13.0}/opencode.json +0 -0
  313. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/__main__.py +0 -0
  314. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/audit.py +0 -0
  315. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/backfill.py +0 -0
  316. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/cleaners.py +0 -0
  317. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/context_gen.py +0 -0
  318. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/coverage_gate.py +0 -0
  319. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/doctor.py +0 -0
  320. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/garden.py +0 -0
  321. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/generators/__init__.py +0 -0
  322. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/generators/adapter.py +0 -0
  323. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/generators/deploy_base.py +0 -0
  324. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/guards.py +0 -0
  325. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/id_generator.py +0 -0
  326. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/invariants.py +0 -0
  327. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/issue_sync.py +0 -0
  328. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/lessons.py +0 -0
  329. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/lint_runner.py +0 -0
  330. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/observe.py +0 -0
  331. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/profiles.py +0 -0
  332. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/prompts/agents.py +0 -0
  333. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/prompts/references.py +0 -0
  334. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/regression.py +0 -0
  335. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/schemas.py +0 -0
  336. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/scripts.py +0 -0
  337. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/sec_scope.py +0 -0
  338. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/skills/__init__.py +0 -0
  339. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/skills/analyzers/__init__.py +0 -0
  340. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/skills/analyzers/go_analyzer.py +0 -0
  341. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/skills/analyzers/java_analyzer.py +0 -0
  342. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/skills/analyzers/python_analyzer.py +0 -0
  343. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/skills/analyzers/ts_analyzer.py +0 -0
  344. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/skills/report.py +0 -0
  345. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/skills/scaffold.py +0 -0
  346. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/skills/spec_linter.py +0 -0
  347. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/spec_status.py +0 -0
  348. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/test_mapper.py +0 -0
  349. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/utils.py +0 -0
  350. {pactkit-2.11.0 → pactkit-2.13.0}/src/pactkit/validators.py +0 -0
  351. {pactkit-2.11.0 → pactkit-2.13.0}/tests/conftest.py +0 -0
  352. {pactkit-2.11.0 → pactkit-2.13.0}/tests/e2e/__init__.py +0 -0
  353. {pactkit-2.11.0 → pactkit-2.13.0}/tests/e2e/cli/__init__.py +0 -0
  354. {pactkit-2.11.0 → pactkit-2.13.0}/tests/fixtures/agent_parser/agents_dir/researcher.yaml +0 -0
  355. {pactkit-2.11.0 → pactkit-2.13.0}/tests/fixtures/agent_parser/agents_dir/writer.yaml +0 -0
  356. {pactkit-2.11.0 → pactkit-2.13.0}/tests/fixtures/agent_parser/langgraph_app.py +0 -0
  357. {pactkit-2.11.0 → pactkit-2.13.0}/tests/fixtures/agent_parser/mcp_settings.json +0 -0
  358. {pactkit-2.11.0 → pactkit-2.13.0}/tests/fixtures/api_call_parser/axios_style.tsx +0 -0
  359. {pactkit-2.11.0 → pactkit-2.13.0}/tests/fixtures/api_call_parser/dynamic.tsx +0 -0
  360. {pactkit-2.11.0 → pactkit-2.13.0}/tests/fixtures/api_call_parser/page.tsx +0 -0
  361. {pactkit-2.11.0 → pactkit-2.13.0}/tests/integration/__init__.py +0 -0
  362. {pactkit-2.11.0 → pactkit-2.13.0}/tests/integration/test_deploy_classic.py +0 -0
  363. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_agent_features.py +0 -0
  364. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_agent_frontmatter.py +0 -0
  365. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_agents_enrichment.py +0 -0
  366. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_audit.py +0 -0
  367. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_blast_radius.py +0 -0
  368. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_board_bug027.py +0 -0
  369. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_board_sections.py +0 -0
  370. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug001_skill_path.py +0 -0
  371. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug002_plugin_paths.py +0 -0
  372. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug003_multi_import.py +0 -0
  373. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug005_archive_taskless.py +0 -0
  374. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug006_scan_excludes.py +0 -0
  375. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug007_stale_trace_refs.py +0 -0
  376. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug008_stale_command_refs.py +0 -0
  377. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug009_project_config_backfill.py +0 -0
  378. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug010_rewrite_yaml.py +0 -0
  379. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug011_stale_refs.py +0 -0
  380. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug012_call_graph_filter.py +0 -0
  381. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug013_config_single_source.py +0 -0
  382. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug014_version_hygiene.py +0 -0
  383. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug017_project_init_playbook.py +0 -0
  384. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug018_issue_tracker_verification.py +0 -0
  385. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug019_venv_deployment.py +0 -0
  386. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug020_claude_md_backup.py +0 -0
  387. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug025_release_delegation.py +0 -0
  388. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug026_version_sync.py +0 -0
  389. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug028_ghost_refs.py +0 -0
  390. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug029_stack_detection_fallback.py +0 -0
  391. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug030_spec_lint_cli.py +0 -0
  392. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug031_docstring_accuracy.py +0 -0
  393. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug034_plan_metadata_template.py +0 -0
  394. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug_021.py +0 -0
  395. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug_022.py +0 -0
  396. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug_023.py +0 -0
  397. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug_024.py +0 -0
  398. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug_slim001_env_detection.py +0 -0
  399. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug_slim002_instruction_collision.py +0 -0
  400. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug_slim003.py +0 -0
  401. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug_slim004.py +0 -0
  402. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug_slim005.py +0 -0
  403. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug_slim006.py +0 -0
  404. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_bug_slim089_global_claude_md.py +0 -0
  405. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_check_command.py +0 -0
  406. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_check_extensions_072_073.py +0 -0
  407. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_check_playbook_072_073.py +0 -0
  408. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_command_frontmatter.py +0 -0
  409. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_command_visualize_modes.py +0 -0
  410. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_complexity.py +0 -0
  411. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_context_gen.py +0 -0
  412. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_create_skill.py +0 -0
  413. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_cross_flow_matrix.py +0 -0
  414. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_deploy_base.py +0 -0
  415. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_deployer_cleanup.py +0 -0
  416. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_done_gates.py +0 -0
  417. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_draw_prompt.py +0 -0
  418. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_draw_references.py +0 -0
  419. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_drawio_mcp.py +0 -0
  420. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_garden.py +0 -0
  421. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_home_path_fix.py +0 -0
  422. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_hotfix_command.py +0 -0
  423. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_init_guard.py +0 -0
  424. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_init_playbook_074.py +0 -0
  425. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_lang_profiles.py +0 -0
  426. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_layer_violations.py +0 -0
  427. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_lessons_rotation_075.py +0 -0
  428. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_list_stories.py +0 -0
  429. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_model_config.py +0 -0
  430. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_monorepo_detect.py +0 -0
  431. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_multi_prefix.py +0 -0
  432. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_observe.py +0 -0
  433. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_pdca_slim.py +0 -0
  434. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_profiles.py +0 -0
  435. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_project_visibility.py +0 -0
  436. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_prompt_cli_refs.py +0 -0
  437. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_prompt_quality_075.py +0 -0
  438. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_prompts_package.py +0 -0
  439. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_release.py +0 -0
  440. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_release_field.py +0 -0
  441. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_release_v110.py +0 -0
  442. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_render_prompt.py +0 -0
  443. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_report_parser.py +0 -0
  444. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_report_unified.py +0 -0
  445. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_review_command.py +0 -0
  446. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_scaffold.py +0 -0
  447. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_scaffold_developer_prefix.py +0 -0
  448. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_schemas.py +0 -0
  449. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_script_extraction.py +0 -0
  450. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_session_context.py +0 -0
  451. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_skill_structure.py +0 -0
  452. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_skills_enrichment.py +0 -0
  453. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_slim_deps_088.py +0 -0
  454. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_smart_regression.py +0 -0
  455. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_sprint_command.py +0 -0
  456. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_stack_references.py +0 -0
  457. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_status_command.py +0 -0
  458. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_statusline.py +0 -0
  459. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story014_release.py +0 -0
  460. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story015_ci_lint_gate.py +0 -0
  461. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story016_claude_md.py +0 -0
  462. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story017_init_claude_md.py +0 -0
  463. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story018_arch_staleness.py +0 -0
  464. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story019_bailout.py +0 -0
  465. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story020_horizon.py +0 -0
  466. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story021_rfc.py +0 -0
  467. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story022_decision_tree.py +0 -0
  468. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story023_test_quality.py +0 -0
  469. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story024_native_agent.py +0 -0
  470. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story025_ci_pipeline.py +0 -0
  471. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story026_issue_tracker.py +0 -0
  472. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story029_doctor.py +0 -0
  473. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story030_lint.py +0 -0
  474. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story031_git_init_guard.py +0 -0
  475. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story032_greenfield_redirect.py +0 -0
  476. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story033_config_backfill.py +0 -0
  477. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story034_plan_config_refresh.py +0 -0
  478. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story035_readme_docs.py +0 -0
  479. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story037_regression_fix.py +0 -0
  480. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story038_call_graph_update.py +0 -0
  481. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story039_venv_config.py +0 -0
  482. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story040_layered_claude_md.py +0 -0
  483. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story042_spec_linter.py +0 -0
  484. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story043_active_clarify.py +0 -0
  485. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story044_consistency_check.py +0 -0
  486. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story045_auto_pr.py +0 -0
  487. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story046_agent_adapter.py +0 -0
  488. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story047_enterprise_flags.py +0 -0
  489. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story048_worktree_isolation.py +0 -0
  490. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story049_community_standards.py +0 -0
  491. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story050_doc_only_shortcut.py +0 -0
  492. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story051_workflow_streamlining.py +0 -0
  493. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story052_conditional_github_release.py +0 -0
  494. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story053_impact_regression.py +0 -0
  495. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story055_commands.py +0 -0
  496. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story055_config.py +0 -0
  497. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story055_spec_linter.py +0 -0
  498. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story056_commands.py +0 -0
  499. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story056_config.py +0 -0
  500. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story057_implicit_cleanup.py +0 -0
  501. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story058_opencode_extraction.py +0 -0
  502. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story058_routing_fix.py +0 -0
  503. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story059_codex_removal.py +0 -0
  504. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story060_init_hang.py +0 -0
  505. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story061_remove_thinking.py +0 -0
  506. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story062_mcp_recommendations.py +0 -0
  507. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story064_venv_local_md.py +0 -0
  508. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story065_sprint_model.py +0 -0
  509. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story072_developer_prefix.py +0 -0
  510. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story106_lateral_scan.py +0 -0
  511. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim010_dry_refactor.py +0 -0
  512. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim012_ci.py +0 -0
  513. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim014_clean.py +0 -0
  514. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim014_context.py +0 -0
  515. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim014_guard.py +0 -0
  516. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim014_lazy_viz.py +0 -0
  517. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim014_next_id.py +0 -0
  518. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim014_regression.py +0 -0
  519. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim014_sec_scope.py +0 -0
  520. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim014_validators.py +0 -0
  521. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim015_doctor.py +0 -0
  522. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim016_testmap_lint.py +0 -0
  523. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim017.py +0 -0
  524. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim018.py +0 -0
  525. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim019_plan_subphases.py +0 -0
  526. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim020_explore_stall_fix.py +0 -0
  527. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim022.py +0 -0
  528. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim024.py +0 -0
  529. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim025.py +0 -0
  530. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim027.py +0 -0
  531. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim029.py +0 -0
  532. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim030.py +0 -0
  533. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim031.py +0 -0
  534. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim032.py +0 -0
  535. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim033.py +0 -0
  536. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim034.py +0 -0
  537. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim035.py +0 -0
  538. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim036.py +0 -0
  539. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim037.py +0 -0
  540. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim038.py +0 -0
  541. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim039.py +0 -0
  542. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim040.py +0 -0
  543. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim041.py +0 -0
  544. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim042.py +0 -0
  545. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim043.py +0 -0
  546. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim044.py +0 -0
  547. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim045.py +0 -0
  548. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim046.py +0 -0
  549. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim047.py +0 -0
  550. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim048.py +0 -0
  551. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim049.py +0 -0
  552. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim051.py +0 -0
  553. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim052.py +0 -0
  554. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim053.py +0 -0
  555. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim054.py +0 -0
  556. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim055.py +0 -0
  557. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim056.py +0 -0
  558. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim060_codex_profile.py +0 -0
  559. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim063.py +0 -0
  560. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim065.py +0 -0
  561. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim076_multistack.py +0 -0
  562. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim077_monorepo_stack.py +0 -0
  563. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim078.py +0 -0
  564. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim079.py +0 -0
  565. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim080.py +0 -0
  566. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim081.py +0 -0
  567. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim082.py +0 -0
  568. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim084.py +0 -0
  569. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim095.py +0 -0
  570. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim099_act_context_ref.py +0 -0
  571. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_story_slim104_should_semantics.py +0 -0
  572. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_tools.py +0 -0
  573. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_topology_parsers_066.py +0 -0
  574. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_update_task.py +0 -0
  575. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_visualize_call_nested.py +0 -0
  576. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_visualize_chain_fix.py +0 -0
  577. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_visualize_modes.py +0 -0
  578. {pactkit-2.11.0 → pactkit-2.13.0}/tests/unit/test_visualize_multilang_chain.py +0 -0
@@ -72,6 +72,14 @@ rules:
72
72
  - 09-sectional-write
73
73
  - 11-pdca-nudge
74
74
  - 12-solution-design
75
+ - 05-principles
76
+ - 01-workflow-conventions
77
+ - 02-mcp-integration
78
+ - 03-shared-protocols
79
+ - 04-architecture-principles
80
+ - 05-sectional-write
81
+ - 06-solution-design
82
+ - pactkit
75
83
 
76
84
  # CI/CD — set provider to github or gitlab to generate pipeline config
77
85
  ci:
@@ -85,12 +93,6 @@ ci:
85
93
  issue_tracker:
86
94
  provider: github
87
95
 
88
- # Hooks — safe, report-only hook templates (command-type only)
89
- hooks:
90
- post_test_coverage: false
91
- pre_commit_lint: false
92
- pre_push_check: false
93
-
94
96
  # Lint — configure lint behavior in /project-done
95
97
  lint_blocking: false
96
98
  auto_fix: false
@@ -163,3 +165,7 @@ e2e:
163
165
  env_file: .env.test
164
166
  test_dir: tests/e2e
165
167
  type: none
168
+ hooks:
169
+ post_test_coverage: false
170
+ pre_commit_lint: false
171
+ pre_push_check: false
@@ -4,6 +4,23 @@ 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.13.0] - 2026-05-07
8
+
9
+ ### Added
10
+ - **`pactkit interface-summary` CLI** (STORY-slim-113) — AST-based interface extraction that physically outputs only signatures, types, and docstrings. Enforces "Code Enforces, Prompt Instructs" for Act Phase 1 layered loading — AI receives truncated content by design.
11
+ - **Journey Sync in Act Phase 4** (STORY-slim-114) — Conditional step that updates `docs/e2e/journey.md` when a Story modifies journey-relevant steps. Closes the create→consume→update lifecycle gap.
12
+ - **Journey Segment in Plan Phase 3.2a** (STORY-slim-114) — Conditional Spec annotation that links Stories to journey steps, enabling Act Phase 4 auto-detection.
13
+
14
+ ## [2.12.0] - 2026-05-06
15
+
16
+ ### Changed
17
+ - **Rules architecture refactor** (STORY-slim-112) — Merged 6 global core rules into single `pactkit.md`; on-demand rules renumbered 01-06 and moved to `~/.claude/skills/_rules/`. Reduces context window usage by ~60% per conversation.
18
+ - **Auto-deploy on version mismatch** — After `pipx upgrade pactkit`, the next CLI command auto-syncs deployed files without requiring explicit `pactkit init`.
19
+
20
+ ### Fixed
21
+ - **Hardcoded paths in deployer** — `_build_command_rules_header()` now uses `FormatProfile.rules_dir` / `skills_dir` instead of hardcoded `~/.claude/` paths.
22
+ - **Stale filename references** — Updated cross-references in visualize.py, commands.py, lazy_visualize.py, and test files to match new rule filenames.
23
+
7
24
  ## [2.11.0] - 2026-04-25
8
25
 
9
26
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pactkit
3
- Version: 2.11.0
3
+ Version: 2.13.0
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
@@ -369,7 +369,6 @@ docs/
369
369
  | Field | Type | Default | Description |
370
370
  |-------|------|---------|-------------|
371
371
  | `stack` | string | auto-detected | Project stack (`python`, `node`, `go`, `java`) |
372
- | `version` | string | current | PactKit version that generated the config |
373
372
  | `developer` | string | `""` | Developer prefix for Story IDs (multi-developer collaboration) |
374
373
  | `agents` | list | all 9 | Agent definitions to deploy |
375
374
  | `commands` | list | all 11 | Command playbooks to deploy |
@@ -327,7 +327,6 @@ docs/
327
327
  | Field | Type | Default | Description |
328
328
  |-------|------|---------|-------------|
329
329
  | `stack` | string | auto-detected | Project stack (`python`, `node`, `go`, `java`) |
330
- | `version` | string | current | PactKit version that generated the config |
331
330
  | `developer` | string | `""` | Developer prefix for Story IDs (multi-developer collaboration) |
332
331
  | `agents` | list | all 9 | Agent definitions to deploy |
333
332
  | `commands` | list | all 11 | Command playbooks to deploy |
@@ -54,3 +54,11 @@
54
54
  | 2026-03-24 | _scan_hooks() only accepts files with 'use' prefix in hook dirs (src/hooks/, composables/) to prevent utility files from becoming hook nodes | visualize.py:_scan_hooks |
55
55
  | 2026-03-24 | regression_workflow_impact hook/store matching uses node.id substring of changed file path, not reverse — e.g. 'useAuth' in 'src/hooks/useAuth.ts' | visualize.py:regression_workflow_impact |
56
56
  | 2026-03-25 | export_focus_graphs() in visualize.py uses forward_reach() (not reverse_reach()) because entry points (command/service/page) are graph roots that invoke downward — forward BFS shows their dependency tree | src/pactkit/skills/visualize.py:export_focus_graphs |
57
+ | 2026-03-26 | board.py update_task: added 3-tier fuzzy fallback (single-task auto-mark, substring match, numeric index) to handle real-world callers that don't know exact task names on the board | src/pactkit/skills/board.py:update_task |
58
+ | 2026-03-26 | Position-based block removal (start, end tuples) is safer than str.find() for board operations — prevents substring false matches on similar story IDs | board.py:_parse_story_blocks |
59
+ | 2026-03-26 | Fixing _parse_story_blocks to return adjusted_end (len match) inherently fixed fix_board offset compensation — root cause fix in board.py:_parse_story_blocks eliminated downstream R2 symptom in board.py:fix_board | board.py:_parse_story_blocks,board.py:fix_board |
60
+ | 2026-03-26 | Helpers added to visualize.py standalone header get stripped by load_script(); always place new functions below the SCRIPT BODY marker | visualize.py:_mermaid_escape |
61
+ | 2026-03-26 | dict.pop() in shared config references causes caller mutation; use .get() for read-only access to avoid breaking multi-call scenarios | deployer.py:_deploy_ci |
62
+ | 2026-03-26 | _atomic_mmd_write() in visualize.py prevents truncated .mmd on crash via tmp+rename; all 4 write sites converted | visualize.py:_atomic_mmd_write |
63
+ | 2026-03-26 | test_story_slim056.py _init_project() helper creates realistic pactkit project fixture for subprocess E2E tests; 60 tests cover all 25 subcommands | test_story_slim056.py:_init_project |
64
+ | 2026-03-26 | entry_points auto-discovery with _load_entry_point_deployers() enables pip install pactkit-opencode to self-register; pre-existing tests referencing extracted functions must be updated to import from adapter package | deployer.py:_load_entry_point_deployers |
@@ -2,14 +2,6 @@
2
2
 
3
3
  | Date | Lesson | Context |
4
4
  |------|--------|---------|
5
- | 2026-03-26 | board.py update_task: added 3-tier fuzzy fallback (single-task auto-mark, substring match, numeric index) to handle real-world callers that don't know exact task names on the board | src/pactkit/skills/board.py:update_task |
6
- | 2026-03-26 | Position-based block removal (start, end tuples) is safer than str.find() for board operations — prevents substring false matches on similar story IDs | board.py:_parse_story_blocks |
7
- | 2026-03-26 | Fixing _parse_story_blocks to return adjusted_end (len match) inherently fixed fix_board offset compensation — root cause fix in board.py:_parse_story_blocks eliminated downstream R2 symptom in board.py:fix_board | board.py:_parse_story_blocks,board.py:fix_board |
8
- | 2026-03-26 | Helpers added to visualize.py standalone header get stripped by load_script(); always place new functions below the SCRIPT BODY marker | visualize.py:_mermaid_escape |
9
- | 2026-03-26 | dict.pop() in shared config references causes caller mutation; use .get() for read-only access to avoid breaking multi-call scenarios | deployer.py:_deploy_ci |
10
- | 2026-03-26 | _atomic_mmd_write() in visualize.py prevents truncated .mmd on crash via tmp+rename; all 4 write sites converted | visualize.py:_atomic_mmd_write |
11
- | 2026-03-26 | test_story_slim056.py _init_project() helper creates realistic pactkit project fixture for subprocess E2E tests; 60 tests cover all 25 subcommands | test_story_slim056.py:_init_project |
12
- | 2026-03-26 | entry_points auto-discovery with _load_entry_point_deployers() enables pip install pactkit-opencode to self-register; pre-existing tests referencing extracted functions must be updated to import from adapter package | deployer.py:_load_entry_point_deployers |
13
5
  | 2026-03-26 | VALID_FORMATS auto-derives from FORMAT_PROFILES.keys() — removing a profile cascades to config, CLI, and deployer with zero manual sync | profiles.py:FORMAT_PROFILES |
14
6
  | 2026-03-26 | DeployerBase static methods use lazy imports to avoid circular dependencies between deploy_base.py and deployer.py | deploy_base.py:DeployerBase.render_prompt |
15
7
  | 2026-03-26 | Thin adapter conversion: pactkit-codex reduced from 15,356 lines (full fork) to 668 lines (thin adapter) by importing core via DeployerBase. Key: deploy_codex_playbooks needs explicit path replacement for ALL format prefixes (~/.claude/, ~/.config/opencode/ → ~/.codex/) | pactkit_codex/deployer.py:deploy_codex_playbooks |
@@ -53,3 +45,6 @@
53
45
  | 2026-04-23 | Rule files deploy from src/pactkit/prompts/rules.py via pactkit deploy — never edit ~/.claude/rules/ directly | src/pactkit/prompts/rules.py:RULES_MODULES |
54
46
  | 2026-04-24 | Plan Phase横向扫描(Lateral Scan)比纵向trace更重要——PactSearch的10个技术债中60%源于缺少水平重复检测。修复方向是改Plan playbook引导Architect用已有工具(LSP/visualize/grep)做横向扫描,而非新建CLI | commands.py:Plan_Phase_1 |
55
47
  | 2026-04-24 | When migrating functionality (e.g., version checking from pactkit.yaml to global marker), grep all references across source, prompts, tests, and CLI help text — partial migration leaves ghost behavior | board.py:update_version |
48
+ | 2026-04-27 | When extracting project-specific rules into a framework, generalize by removing project names, library references, and spec IDs — keep only the anti-pattern/fix-pattern structure that applies to any codebase | rules.py:RULES_MODULES |
49
+ | 2026-05-07 | Code Enforces implementation: pactkit interface-summary uses ast.parse() to physically output only signatures—AI receives truncated content, not a prompt instruction to self-truncate. Pattern: CLI tool as enforcement layer (interface_summary.py:generate_summary) | src/pactkit/skills/interface_summary.py:generate_summary |
50
+ | 2026-05-07 | Lifecycle gap pattern: when artifact has create+consume but no update mechanism, add conditional sync in the modifying command. Applied: Act Phase 4 Journey Sync step in commands.py COMMANDS_CONTENT['project-act.md'] | src/pactkit/prompts/commands.py:COMMANDS_CONTENT |
@@ -15,7 +15,7 @@
15
15
 
16
16
  ## Invariants
17
17
 
18
- 1. All 3796+ tests must pass before any commit to `main`.
18
+ 1. All 3937+ 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`.
@@ -0,0 +1,243 @@
1
+ # User Journey Format Specification
2
+
3
+ > This document defines the canonical format for `docs/e2e/journey.md` in PactKit-managed projects.
4
+ > It is a **format specification template** -- projects copy and fill this structure with their own journeys.
5
+
6
+ ## Purpose
7
+
8
+ A user journey describes an end-to-end flow that spans multiple stories. While individual stories
9
+ have their own acceptance criteria (in `docs/test_cases/`), journeys capture the cross-story
10
+ integration path that a real user follows.
11
+
12
+ **Relationship to other artifacts:**
13
+ - `docs/test_cases/{ID}_case.md` -- single-story acceptance (Gherkin scenarios)
14
+ - `docs/e2e/journey.md` -- cross-story user flows (this document)
15
+ - `tests/e2e/` -- executable E2E test code implementing journey segments
16
+
17
+ ---
18
+
19
+ ## Journey Structure
20
+
21
+ Each journey follows this format:
22
+
23
+ ```markdown
24
+ ## Journey: {Journey Name}
25
+
26
+ > {One-line description of the user goal}
27
+
28
+ ### Pre-conditions (Fixtures)
29
+
30
+ | Fixture | Description | Setup Method |
31
+ |---------|-------------|--------------|
32
+ | {name} | {what it provides} | {seed script / API call / fixture function} |
33
+
34
+ ### Steps
35
+
36
+ #### Step 1: {Step Title} [client]
37
+
38
+ **Action**: {What the user does}
39
+
40
+ **Assertions**:
41
+ - STRUCTURE: {element/component} exists on page
42
+ - STRUCTURE: {data container} is non-empty
43
+ - BEHAVIOR: {interaction} triggers {expected response}
44
+
45
+ #### Step 2: {Step Title} [server]
46
+
47
+ **Action**: {What the system processes}
48
+
49
+ **Assertions**:
50
+ - STRUCTURE: {database record / API response} contains expected fields
51
+ - STRUCTURE: {response payload} is non-empty
52
+ - BEHAVIOR: {side effect} is observable (log entry, event emitted, etc.)
53
+
54
+ #### Step 3: {Step Title} [server+client]
55
+
56
+ **Action**: {Full-stack interaction}
57
+
58
+ **Assertions**:
59
+ - STRUCTURE: {UI element} renders with data from server
60
+ - STRUCTURE: {response} matches expected schema shape
61
+ - BEHAVIOR: {round-trip} completes within timeout
62
+ ```
63
+
64
+ ---
65
+
66
+ ## Execution Layer Annotations
67
+
68
+ Each step MUST be annotated with its execution layer:
69
+
70
+ | Annotation | Meaning | Test Tooling |
71
+ |------------|---------|--------------|
72
+ | `[client]` | Browser/UI interaction only | Playwright, Cypress |
73
+ | `[server]` | Backend/API processing only | pytest + httpx, curl |
74
+ | `[server+client]` | Full-stack round-trip | Playwright + API assertions |
75
+
76
+ ---
77
+
78
+ ## Assertion Types
79
+
80
+ Assertions are classified into two categories with different enforcement rules:
81
+
82
+ ### Structure Assertions (MUST)
83
+
84
+ Structure assertions verify that the expected elements, fields, or components **exist** and are
85
+ **non-empty**. These are deterministic and safe to assert in any context.
86
+
87
+ Examples:
88
+ - "SQL code block element exists on page"
89
+ - "Chart component is rendered"
90
+ - "API response contains `data` field"
91
+ - "Answer container has text content (length > 0)"
92
+
93
+ ### Content Assertions (MUST NOT for AI-generated content)
94
+
95
+ Content assertions verify specific text values, numbers, or exact strings. These are appropriate
96
+ for deterministic outputs but MUST NOT be used for AI-generated content.
97
+
98
+ **When content is deterministic** (e.g., user profile display, static labels):
99
+ - Exact text matching is acceptable
100
+ - Numeric value assertions are acceptable
101
+
102
+ **When content is AI-generated** (e.g., chatbot responses, generated analysis):
103
+ - MUST NOT assert specific text content
104
+ - MUST NOT assert exact numeric values in generated output
105
+ - MUST NOT assert specific word choices or phrasing
106
+
107
+ ---
108
+
109
+ ## AI Content Assertion Strategy
110
+
111
+ > This section provides guidance for projects that include AI-generated content in their user journeys
112
+ > (e.g., chatbots, AI assistants, generated reports, analysis tools).
113
+
114
+ ### What to Assert (MUST)
115
+
116
+ | Category | Example Assertion |
117
+ |----------|------------------|
118
+ | Structure exists | "SQL code block element is present in the response area" |
119
+ | Non-empty | "Response container has text content with length > 0" |
120
+ | Component renders | "Chart component is mounted and visible" |
121
+ | Schema shape | "API response has `answer` field of type string" |
122
+ | Timing | "Response arrives within N seconds" |
123
+ | State transition | "Loading spinner disappears after response" |
124
+
125
+ ### What NOT to Assert (MUST NOT)
126
+
127
+ | Anti-Pattern | Why It Fails |
128
+ |--------------|--------------|
129
+ | `assert response.text == "The answer is 42"` | AI output is non-deterministic |
130
+ | `assert chart.data_points == [1.5, 2.3, 4.1]` | Generated values vary per run |
131
+ | `assert sql_block.contains("SELECT * FROM users")` | AI may generate equivalent but different SQL |
132
+ | `assert summary.word_count == 150` | Length varies with model/prompt |
133
+
134
+ ### Correct Pattern
135
+
136
+ ```python
137
+ # STRUCTURE: verify element exists
138
+ assert page.locator(".sql-code-block").is_visible()
139
+
140
+ # NON-EMPTY: verify content was generated
141
+ sql_content = page.locator(".sql-code-block").text_content()
142
+ assert len(sql_content.strip()) > 0
143
+
144
+ # SCHEMA: verify response shape, not content
145
+ response = api_client.get("/chat/answer")
146
+ assert "answer" in response.json()
147
+ assert isinstance(response.json()["answer"], str)
148
+ assert len(response.json()["answer"]) > 0
149
+
150
+ # BEHAVIOR: verify state transition occurred
151
+ assert page.locator(".loading-spinner").is_hidden()
152
+ assert page.locator(".answer-area").is_visible()
153
+ ```
154
+
155
+ ---
156
+
157
+ ## Pre-condition Fixtures
158
+
159
+ Each journey MUST declare its pre-conditions as named fixtures:
160
+
161
+ ```markdown
162
+ ### Pre-conditions (Fixtures)
163
+
164
+ | Fixture | Description | Setup Method |
165
+ |---------|-------------|--------------|
166
+ | authenticated_user | Logged-in user session | `conftest.py::auth_fixture` |
167
+ | sample_dataset | Pre-loaded test data | `scripts/seed_test_data.py` |
168
+ | clean_state | Empty database with schema | `pytest fixture: db_reset` |
169
+ ```
170
+
171
+ Fixtures are referenced by name in step pre-conditions, enabling:
172
+ - Test isolation (each journey starts from a known state)
173
+ - Parallelization (independent journeys can run concurrently)
174
+ - Debugging (reproduce failures by loading specific fixtures)
175
+
176
+ ---
177
+
178
+ ## Example: Complete Journey
179
+
180
+ ```markdown
181
+ ## Journey: First Question to Answer
182
+
183
+ > New user asks their first question and receives an AI-generated answer.
184
+
185
+ ### Pre-conditions (Fixtures)
186
+
187
+ | Fixture | Description | Setup Method |
188
+ |---------|-------------|--------------|
189
+ | authenticated_user | Logged-in user with valid session | `conftest.py::auth_user` |
190
+ | connected_datasource | At least one data source configured | `seed/datasource.sql` |
191
+
192
+ ### Steps
193
+
194
+ #### Step 1: Navigate to Chat [client]
195
+
196
+ **Action**: User opens the chat interface from dashboard.
197
+
198
+ **Assertions**:
199
+ - STRUCTURE: Chat input field is visible
200
+ - STRUCTURE: Message history area exists (may be empty)
201
+ - BEHAVIOR: Input field accepts text input
202
+
203
+ #### Step 2: Submit Question [server+client]
204
+
205
+ **Action**: User types a question and presses Enter.
206
+
207
+ **Assertions**:
208
+ - STRUCTURE: Loading indicator appears
209
+ - STRUCTURE: User message appears in history
210
+ - BEHAVIOR: API call to `/api/chat` is triggered
211
+
212
+ #### Step 3: Receive Answer [server+client]
213
+
214
+ **Action**: Server processes the question and streams response.
215
+
216
+ **Assertions**:
217
+ - STRUCTURE: Answer area becomes visible
218
+ - STRUCTURE: Answer text content is non-empty
219
+ - STRUCTURE: SQL code block is present (if query was data-related)
220
+ - BEHAVIOR: Loading indicator disappears
221
+ - MUST NOT: Assert specific answer text content (AI-generated)
222
+ - MUST NOT: Assert exact SQL query string (AI-generated)
223
+
224
+ #### Step 4: View Generated Visualization [client]
225
+
226
+ **Action**: User clicks on the chart tab to see generated visualization.
227
+
228
+ **Assertions**:
229
+ - STRUCTURE: Chart component is rendered
230
+ - STRUCTURE: Chart has at least one data series
231
+ - BEHAVIOR: Chart responds to hover interaction
232
+ - MUST NOT: Assert specific chart data values (AI-generated)
233
+ ```
234
+
235
+ ---
236
+
237
+ ## Usage in Check Phase 4
238
+
239
+ When `/project-check` Phase 4 (E2E Execution) runs:
240
+
241
+ 1. If `docs/e2e/journey.md` exists, read it to identify journey segments affected by the current story
242
+ 2. E2E tests SHOULD cover the affected segments (not the full journey)
243
+ 3. Journey definitions inform test scope; `docs/test_cases/` informs acceptance criteria
@@ -269,3 +269,21 @@
269
269
  - [x] Update CLI help text
270
270
  - [x] Clean prompt references
271
271
  - [x] Update agent docs
272
+
273
+ ### [STORY-slim-107] Integrate tech debt prevention patterns into framework rules
274
+ > Spec: docs/specs/STORY-slim-107.md
275
+
276
+ - [x] Expand architecture §1 DRY with dual-write
277
+ - [x] Expand architecture §6 Security (deny-by-default, input validation, timing)
278
+ - [x] Add architecture §10 Code Enforces / LLM≠Calculator
279
+ - [x] Add architecture §11 Concurrency & Async Safety
280
+ - [x] Add architecture §12 Cache Lifecycle
281
+ - [x] Add architecture §13 Dead Code Hygiene
282
+ - [x] Add String→Enum to solution module
283
+ - [x] Run test suite
284
+
285
+ ### [BUG-slim-107] Fix scan_excludes replacing defaults and hidden root module
286
+ > Spec: docs/specs/BUG-slim-107.md
287
+
288
+ - [x] Merge custom excludes with defaults
289
+ - [x] Show root module in available list
@@ -0,0 +1,47 @@
1
+
2
+ ### [STORY-slim-113] pactkit interface-summary CLI — Code Enforce 接口摘要
3
+ > Spec: docs/specs/STORY-slim-113.md
4
+
5
+ - [x] 新建 interface_summary.py 提取逻辑
6
+ - [x] CLI 注册 interface-summary 命令
7
+ - [x] Act Phase 1 改为显式步骤
8
+ - [x] pactkit-trace 更新输出指引
9
+ - [x] 单元测试
10
+
11
+ ### [STORY-slim-112] Rules 架构重构:全局原则 vs 按需操作规程
12
+ > Spec: docs/specs/STORY-slim-112.md
13
+
14
+ - [x] 拆分 RULES_CORE/ONDEMAND + 新建 05-principles
15
+ - [x] 更新 deployer 双目录部署
16
+ - [x] 更新所有 skill @import 路径
17
+ - [x] 更新测试断言
18
+
19
+ ### [STORY-slim-111] Check Phase 4 Playwright 断言策略指南
20
+ > Spec: docs/specs/STORY-slim-111.md
21
+
22
+ - [x] 修改 project-check SKILL.md Phase 4 增加断言策略
23
+
24
+ ### [STORY-slim-110] project-design 集成 User Journey 生成
25
+ > Spec: docs/specs/STORY-slim-110.md
26
+
27
+ - [x] 修改 project-design SKILL.md Phase 1 Group B
28
+
29
+ ### [STORY-slim-109] E2E journey.md 规范定义与 File Atlas 集成
30
+ > Spec: docs/specs/STORY-slim-109.md
31
+
32
+ - [x] 注册 File Atlas
33
+ - [x] 创建 journey.md 格式规范
34
+ - [x] 修改 project-check Phase 4
35
+
36
+ ### [STORY-slim-108] pactkit-trace --summary 模式:接口摘要输出
37
+ > Spec: docs/specs/STORY-slim-108.md
38
+
39
+ - [x] 修改 pactkit-trace SKILL.md Phase 3
40
+ - [x] 修改 project-act SKILL.md Phase 1
41
+
42
+ ### [STORY-slim-114] Act Phase 4 Journey Sync — journey.md 维护闭环
43
+ > Spec: docs/specs/STORY-slim-114.md
44
+
45
+ - [x] Act Phase 4 新增 Journey Sync 步骤
46
+ - [x] Plan Phase 3.2a 条件 Journey Segment
47
+ - [x] 单元测试
@@ -0,0 +1,29 @@
1
+ # Project Context (Auto-generated)
2
+ > Last updated: 2026-05-07T10:33:00+08:00 by pactkit context
3
+
4
+ ## Sprint Status
5
+ Backlog: 0 | In Progress: 0 | Done: 0 stories
6
+
7
+ ## Current Stories
8
+ None
9
+
10
+ ## Recent Completions
11
+ None
12
+
13
+ ## Active Branches
14
+ + claude/naughty-euclid-e6a787
15
+ develop
16
+ * main
17
+
18
+ ## Key Decisions
19
+ - Plan Phase横向扫描(Lateral Scan)比纵向trace更重要——PactSearch的10个技术债中60%源于缺少水平重复检测。修复方向是改Plan playbook引导Architect用已有工具(LSP/visualize/grep)做横向扫描,而非新建CLI
20
+ - When migrating functionality (e.g., version checking from pactkit.yaml to global marker), grep all references across source, prompts, tests, and CLI help text — partial migration leaves ghost behavior
21
+ - When extracting project-specific rules into a framework, generalize by removing project names, library references, and spec IDs — keep only the anti-pattern/fix-pattern structure that applies to any codebase
22
+ - Code Enforces implementation: pactkit interface-summary uses ast.parse() to physically output only signatures—AI receives truncated content, not a prompt instruction to self-truncate. Pattern: CLI tool as enforcement layer (interface_summary.py:generate_summary)
23
+ - Lifecycle gap pattern: when artifact has create+consume but no update mechanism, add conditional sync in the modifying command. Applied: Act Phase 4 Journey Sync step in commands.py COMMANDS_CONTENT['project-act.md']
24
+
25
+ ## Next Recommended Action
26
+ `/project-design`
27
+
28
+ ## Agent Continuation
29
+ No active work session.
@@ -0,0 +1,12 @@
1
+ # BUG-slim-107: Custom scan_excludes replaces defaults, leaking .next as modules
2
+
3
+ ## Background
4
+ When a project's `pactkit.yaml` defines custom `visualize.scan_excludes`, it completely replaces the built-in `SCAN_EXCLUDES` set. Projects lose critical exclusions like `.next`, causing build artifacts to be detected as modules. Combined with the root module `.` being hidden from the "Available modules" error message, this misleads AI into concluding "visual scan not applicable to Python projects".
5
+
6
+ ## Target
7
+ - `src/pactkit/skills/visualize.py:280` — merge custom excludes with defaults instead of replacing
8
+ - `src/pactkit/skills/visualize.py:1180` — include root module in available list with descriptive label
9
+
10
+ ## Fix
11
+ 1. `_detect_modules`: union custom scan_excludes with SCAN_EXCLUDES
12
+ 2. Available modules list: show root module as `"." (project root)` instead of filtering it out
@@ -0,0 +1,134 @@
1
+ # STORY-slim-107: Integrate tech debt prevention patterns into framework rules
2
+
3
+ | Field | Value |
4
+ |-------|-------|
5
+ | ID | STORY-slim-107 |
6
+ | Status | Done |
7
+ | Priority | P1 |
8
+ | Release | 2.12.0 |
9
+
10
+ ## Background
11
+
12
+ A tech debt cleanup across the pactsearch project (BUG-172~191, STORY-182~209) yielded 12 recurring anti-patterns. These were captured in a personal rules file (`13-tech-debt-patterns.md`) but are not yet available to PactKit framework users. The valuable, language-agnostic patterns should be integrated into the existing deployed rule modules (`architecture` and `solution`) so all PactKit users benefit from these lessons.
13
+
14
+ **Source material**: `~/.claude/rules/13-tech-debt-patterns.md` (12 rules derived from real tech debt specs)
15
+
16
+ **Integration targets** (no new rule files — enrich existing ones):
17
+ - `architecture` module (`08-architecture-principles.md`): expand §1 DRY, expand §6 Security, add §10–§13
18
+ - `solution` module (`12-solution-design.md`): add String→Enum pattern to Implementation Constraints
19
+
20
+ ## Requirements
21
+
22
+ ### R1: Expand Architecture §1 DRY with Dual-Write Prevention (MUST)
23
+
24
+ Add a "No Dual-Write" sub-section to §1 Single Source of Truth (DRY) with:
25
+ - Anti-pattern table (Memory+DB, Cache+Source, Frontend+Backend enums, File+DB)
26
+ - Fix pattern (choose ONE truth source; others become read-cache or projection)
27
+ - Keep language-agnostic (no owlready2/rdflib references)
28
+
29
+ ### R2: Expand Architecture §6 Security with Deny-by-Default, Input Validation, and Timing Consistency (MUST)
30
+
31
+ Extend §6 Defense-in-Depth with three new sub-sections:
32
+ - **Deny-by-Default**: Sensitive endpoints MUST require auth by default; empty config = denied
33
+ - **Input Validation**: User input entering URLs, commands, SQL, file paths MUST be validated/escaped (table by destination type)
34
+ - **Timing Consistency**: Security-sensitive branches MUST have consistent timing to prevent side-channel attacks
35
+
36
+ ### R3: Add Architecture §10 Code Enforces, Prompt Instructs (MUST)
37
+
38
+ New principle with litmus test: "If the LLM ignores the prompt instruction, does the constraint still hold?" Includes anti-pattern table (SQL limit, input length, output format, date freshness) and LLM≠Calculator decision matrix.
39
+
40
+ ### R4: Add Architecture §11 Concurrency & Async Safety (SHOULD)
41
+
42
+ New principle covering:
43
+ - Fire-and-forget tasks MUST NOT silently fail (error visibility, backpressure, shutdown awareness)
44
+ - Request-scoped state (ContextVar or equivalent) MUST be cleaned up in finally blocks
45
+ - Shared mutable state MUST be protected (lock, semaphore lazy-init)
46
+
47
+ ### R5: Add Architecture §12 Cache Lifecycle (SHOULD)
48
+
49
+ New principle: every cache MUST be registered in a central invalidation function. Write operations MUST declare which caches they affect.
50
+
51
+ ### R6: Add Architecture §13 Dead Code Hygiene (SHOULD)
52
+
53
+ New principle: unused functions, empty middleware, unwired components MUST be deleted or activated. Categories table (dead function, empty middleware, unwired component, commented code).
54
+
55
+ ### R7: Add String→Enum Pattern to Solution Design (SHOULD)
56
+
57
+ In `solution` module under Implementation Constraints (after No Magic Values), add a `String Literal → Enum` sub-section:
58
+ - Rule: any string value appearing in 3+ places SHOULD be promoted to a typed enum
59
+ - Language-agnostic pattern (Python `str, Enum`; TypeScript `as const`; etc.)
60
+ - Migration checklist (define enum, replace literals, verify with grep)
61
+
62
+ ## Acceptance Criteria
63
+
64
+ ### AC1: Architecture module deploys with new principles (R1, R2, R3, R4, R5, R6)
65
+
66
+ - **Given** PactKit v2.12.0 is deployed via `pactkit deploy`
67
+ - **When** the `08-architecture-principles.md` file is generated
68
+ - **Then** it contains §1 with dual-write sub-section, §6 with 3 security sub-sections, §10 Code Enforces, §11 Concurrency Safety, §12 Cache Lifecycle, §13 Dead Code Hygiene
69
+
70
+ ### AC2: Solution module deploys with String→Enum pattern (R7)
71
+
72
+ - **Given** PactKit v2.12.0 is deployed via `pactkit deploy`
73
+ - **When** the `12-solution-design.md` file is generated
74
+ - **Then** it contains a "String Literal → Enum" sub-section under Implementation Constraints
75
+
76
+ ### AC3: All rules are language-agnostic (R1-R7)
77
+
78
+ - **Given** the new rule content in `rules.py`
79
+ - **When** reviewed for project-specific references
80
+ - **Then** no pactsearch-specific terms (owlready2, rdflib, pactsearch, BUG-172, STORY-182, etc.) appear — only generic patterns
81
+
82
+ ### AC4: Existing tests pass (R1-R7)
83
+
84
+ - **Given** the modified `rules.py`
85
+ - **When** `pytest tests/ -v` is run
86
+ - **Then** all existing tests pass with 0 failures
87
+
88
+ ### AC5: RULES_MANAGED_PREFIXES unchanged (R1-R7)
89
+
90
+ - **Given** no new rule files are created
91
+ - **When** `RULES_MANAGED_PREFIXES` is inspected
92
+ - **Then** it is identical to the pre-change value (no new prefix added)
93
+
94
+ ## Target Call Chain
95
+
96
+ ```
97
+ rules.py:RULES_MODULES["architecture"] → deployer._deploy_rules() → atomic_write(08-architecture-principles.md)
98
+ rules.py:RULES_MODULES["solution"] → deployer._deploy_rules() → atomic_write(12-solution-design.md)
99
+ ```
100
+ No new modules, no new files, no new keys — only content changes within existing string values.
101
+
102
+ ## Implementation Steps
103
+
104
+ | Step | File | Action | Dependencies | Risk |
105
+ |------|------|--------|-------------|------|
106
+ | 1 | `src/pactkit/prompts/rules.py` | Expand `architecture` §1 with dual-write sub-section | None | Low |
107
+ | 2 | `src/pactkit/prompts/rules.py` | Expand `architecture` §6 with deny-by-default, input validation, timing consistency | Step 1 | Low |
108
+ | 3 | `src/pactkit/prompts/rules.py` | Add `architecture` §10 Code Enforces / LLM≠Calculator | Step 2 | Low |
109
+ | 4 | `src/pactkit/prompts/rules.py` | Add `architecture` §11 Concurrency & Async Safety | Step 3 | Low |
110
+ | 5 | `src/pactkit/prompts/rules.py` | Add `architecture` §12 Cache Lifecycle | Step 4 | Low |
111
+ | 6 | `src/pactkit/prompts/rules.py` | Add `architecture` §13 Dead Code Hygiene | Step 5 | Low |
112
+ | 7 | `src/pactkit/prompts/rules.py` | Add String→Enum pattern to `solution` Implementation Constraints | None | Low |
113
+ | 8 | `tests/` | Run full test suite, verify 0 failures | Steps 1-7 | Low |
114
+
115
+ ## Security Scope
116
+
117
+ | Check | Applicable | Reason |
118
+ |-------|------------|--------|
119
+ | SEC-1 | N/A | Prompt content only, no credentials |
120
+ | SEC-2 | N/A | No file path handling changes |
121
+ | SEC-3 | N/A | No user input processing |
122
+ | SEC-4 | N/A | No network calls |
123
+ | SEC-5 | N/A | No shell commands |
124
+ | SEC-6 | N/A | No config file writes |
125
+ | SEC-7 | N/A | No dependency changes |
126
+ | SEC-8 | N/A | No API endpoints |
127
+
128
+ ## Out of Scope
129
+
130
+ - Creating new rule files (no `13-*.md` or `14-*.md` in PactKit framework)
131
+ - `pactkit audit` CLI integration (future story)
132
+ - Modifying `RULES_MANAGED_PREFIXES`, `RULES_FILES`, or `COMMAND_RULES_MAP`
133
+ - P.A.C.T. philosophy rules (personal, not framework-level)
134
+ - Project-specific examples (pactsearch owlready2, rdflib, etc.)