pactkit 2.9.13__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 (550) hide show
  1. pactkit-2.10.2/.github/workflows/pactkit.yml +31 -0
  2. {pactkit-2.9.13 → pactkit-2.10.2}/.gitignore +8 -0
  3. {pactkit-2.9.13 → pactkit-2.10.2}/.opencode/pactkit.yaml +77 -1
  4. {pactkit-2.9.13 → pactkit-2.10.2}/CHANGELOG.md +20 -0
  5. {pactkit-2.9.13 → pactkit-2.10.2}/PKG-INFO +1 -1
  6. {pactkit-2.9.13 → pactkit-2.10.2}/docs/architecture/governance/archive/lessons_archive_202603.md +11 -0
  7. pactkit-2.10.2/docs/architecture/governance/harness_audit.json +197 -0
  8. {pactkit-2.9.13 → pactkit-2.10.2}/docs/architecture/governance/lessons.md +11 -11
  9. {pactkit-2.9.13 → pactkit-2.10.2}/docs/architecture/governance/rules.md +1 -1
  10. pactkit-2.10.2/docs/product/archive/archive_202604.md +207 -0
  11. pactkit-2.10.2/docs/product/context.md +28 -0
  12. pactkit-2.10.2/docs/specs/BUG-slim-089.md +121 -0
  13. pactkit-2.10.2/docs/specs/HOTFIX-slim-096.md +24 -0
  14. pactkit-2.10.2/docs/specs/HOTFIX-slim-099.md +14 -0
  15. pactkit-2.10.2/docs/specs/STORY-slim-089.md +207 -0
  16. pactkit-2.10.2/docs/specs/STORY-slim-090.md +202 -0
  17. pactkit-2.10.2/docs/specs/STORY-slim-091.md +274 -0
  18. pactkit-2.10.2/docs/specs/STORY-slim-092.md +185 -0
  19. pactkit-2.10.2/docs/specs/STORY-slim-093.md +270 -0
  20. pactkit-2.10.2/docs/specs/STORY-slim-094.md +177 -0
  21. pactkit-2.10.2/docs/specs/STORY-slim-095.md +124 -0
  22. pactkit-2.10.2/docs/specs/STORY-slim-097.md +156 -0
  23. pactkit-2.10.2/docs/specs/STORY-slim-098.md +143 -0
  24. pactkit-2.10.2/docs/specs/STORY-slim-099.md +87 -0
  25. {pactkit-2.9.13 → pactkit-2.10.2}/pyproject.toml +1 -1
  26. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/__init__.py +1 -1
  27. pactkit-2.10.2/src/pactkit/audit.py +1296 -0
  28. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/cli.py +46 -1
  29. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/config.py +3 -0
  30. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/generators/deployer.py +55 -8
  31. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/guards.py +25 -2
  32. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/prompts/__init__.py +3 -0
  33. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/prompts/commands.py +1 -0
  34. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/prompts/rules.py +50 -2
  35. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/prompts/skills.py +115 -0
  36. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/skills/analyzers/__init__.py +109 -5
  37. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/skills/analyzers/go_analyzer.py +8 -3
  38. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/skills/analyzers/java_analyzer.py +8 -3
  39. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/skills/analyzers/python_analyzer.py +40 -4
  40. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/skills/analyzers/ts_analyzer.py +8 -3
  41. pactkit-2.10.2/src/pactkit/skills/report.py +993 -0
  42. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/skills/visualize.py +491 -9
  43. {pactkit-2.9.13 → pactkit-2.10.2}/tests/e2e/cli/test_cli_e2e.py +1 -1
  44. pactkit-2.10.2/tests/unit/test_audit.py +684 -0
  45. pactkit-2.10.2/tests/unit/test_blast_radius.py +125 -0
  46. pactkit-2.10.2/tests/unit/test_bug_slim089_global_claude_md.py +85 -0
  47. pactkit-2.10.2/tests/unit/test_complexity.py +203 -0
  48. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_config.py +4 -4
  49. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_constitution_sharpening.py +2 -2
  50. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_deployer_plugin.py +1 -1
  51. pactkit-2.10.2/tests/unit/test_layer_violations.py +180 -0
  52. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_modular_constitution.py +5 -5
  53. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_pdca_slim.py +5 -7
  54. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_prompt_cli_refs.py +1 -1
  55. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_prompt_structural_invariants.py +4 -4
  56. pactkit-2.10.2/tests/unit/test_report_parser.py +213 -0
  57. pactkit-2.10.2/tests/unit/test_report_unified.py +157 -0
  58. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_selective_deploy.py +8 -9
  59. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_session_context.py +3 -3
  60. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story040_layered_claude_md.py +6 -7
  61. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story049_community_standards.py +4 -0
  62. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story059_codex_removal.py +1 -1
  63. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story063_prompt_slimming.py +3 -1
  64. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim011_command_rules.py +5 -2
  65. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim021.py +2 -2
  66. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim026.py +1 -1
  67. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim063.py +2 -2
  68. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim077_monorepo_stack.py +2 -1
  69. pactkit-2.10.2/tests/unit/test_story_slim095.py +88 -0
  70. pactkit-2.10.2/tests/unit/test_story_slim098_pdca_nudge.py +108 -0
  71. pactkit-2.10.2/tests/unit/test_story_slim099_act_context_ref.py +45 -0
  72. pactkit-2.9.13/docs/product/archive/archive_202604.md +0 -90
  73. pactkit-2.9.13/docs/product/context.md +0 -28
  74. {pactkit-2.9.13 → pactkit-2.10.2}/.github/workflows/publish.yml +0 -0
  75. {pactkit-2.9.13 → pactkit-2.10.2}/AGENTS.md +0 -0
  76. {pactkit-2.9.13 → pactkit-2.10.2}/CODE_OF_CONDUCT.md +0 -0
  77. {pactkit-2.9.13 → pactkit-2.10.2}/CONTRIBUTING.md +0 -0
  78. {pactkit-2.9.13 → pactkit-2.10.2}/LICENSE +0 -0
  79. {pactkit-2.9.13 → pactkit-2.10.2}/README.md +0 -0
  80. {pactkit-2.9.13 → pactkit-2.10.2}/SECURITY.md +0 -0
  81. {pactkit-2.9.13 → pactkit-2.10.2}/docs/architecture/governance/archive/lessons_archive_202602.md +0 -0
  82. {pactkit-2.9.13 → pactkit-2.10.2}/docs/architecture/governance/philosophy.md +0 -0
  83. {pactkit-2.9.13 → pactkit-2.10.2}/docs/assets/logo.png +0 -0
  84. {pactkit-2.9.13 → pactkit-2.10.2}/docs/guides/codex-integration-preresearch.md +0 -0
  85. {pactkit-2.9.13 → pactkit-2.10.2}/docs/guides/tool-integration-checklist.md +0 -0
  86. {pactkit-2.9.13 → pactkit-2.10.2}/docs/product/archive/archive_202602.md +0 -0
  87. {pactkit-2.9.13 → pactkit-2.10.2}/docs/product/archive/archive_202603.md +0 -0
  88. {pactkit-2.9.13 → pactkit-2.10.2}/docs/product/friction-log.md +0 -0
  89. {pactkit-2.9.13 → pactkit-2.10.2}/docs/product/prd.md +0 -0
  90. {pactkit-2.9.13 → pactkit-2.10.2}/docs/product/sprint_board.md +0 -0
  91. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-001.md +0 -0
  92. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-002.md +0 -0
  93. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-003.md +0 -0
  94. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-004.md +0 -0
  95. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-005.md +0 -0
  96. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-006.md +0 -0
  97. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-007.md +0 -0
  98. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-008.md +0 -0
  99. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-009.md +0 -0
  100. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-010.md +0 -0
  101. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-011.md +0 -0
  102. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-012.md +0 -0
  103. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-013.md +0 -0
  104. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-014.md +0 -0
  105. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-015.md +0 -0
  106. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-016.md +0 -0
  107. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-017.md +0 -0
  108. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-018.md +0 -0
  109. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-019.md +0 -0
  110. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-020.md +0 -0
  111. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-021.md +0 -0
  112. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-022.md +0 -0
  113. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-023.md +0 -0
  114. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-024.md +0 -0
  115. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-025.md +0 -0
  116. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-026.md +0 -0
  117. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-027.md +0 -0
  118. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-028.md +0 -0
  119. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-029.md +0 -0
  120. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-030.md +0 -0
  121. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-031.md +0 -0
  122. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-032.md +0 -0
  123. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-033.md +0 -0
  124. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-034.md +0 -0
  125. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-035.md +0 -0
  126. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-slim-001.md +0 -0
  127. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-slim-002.md +0 -0
  128. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-slim-003.md +0 -0
  129. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-slim-004.md +0 -0
  130. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-slim-005.md +0 -0
  131. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/BUG-slim-006.md +0 -0
  132. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/HOTFIX-slim-023.md +0 -0
  133. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/HOTFIX-slim-049.md +0 -0
  134. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/HOTFIX-slim-050.md +0 -0
  135. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/HOTFIX-slim-051.md +0 -0
  136. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/HOTFIX-slim-052.md +0 -0
  137. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/HOTFIX-slim-061.md +0 -0
  138. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/HOTFIX-slim-062.md +0 -0
  139. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/HOTFIX-slim-067.md +0 -0
  140. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/HOTFIX-slim-069.md +0 -0
  141. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/HOTFIX-slim-070.md +0 -0
  142. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/HOTFIX-slim-085.md +0 -0
  143. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/HOTFIX-slim-087.md +0 -0
  144. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-001.md +0 -0
  145. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-002.md +0 -0
  146. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-003.md +0 -0
  147. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-004.md +0 -0
  148. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-005.md +0 -0
  149. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-006.md +0 -0
  150. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-007.md +0 -0
  151. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-008.md +0 -0
  152. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-009.md +0 -0
  153. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-010.md +0 -0
  154. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-011.md +0 -0
  155. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-012.md +0 -0
  156. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-013.md +0 -0
  157. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-014.md +0 -0
  158. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-015.md +0 -0
  159. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-016.md +0 -0
  160. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-017.md +0 -0
  161. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-018.md +0 -0
  162. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-019.md +0 -0
  163. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-020.md +0 -0
  164. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-021.md +0 -0
  165. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-022.md +0 -0
  166. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-023.md +0 -0
  167. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-024.md +0 -0
  168. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-025.md +0 -0
  169. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-026.md +0 -0
  170. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-027.md +0 -0
  171. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-028.md +0 -0
  172. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-029.md +0 -0
  173. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-030.md +0 -0
  174. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-031.md +0 -0
  175. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-032.md +0 -0
  176. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-033.md +0 -0
  177. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-034.md +0 -0
  178. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-035.md +0 -0
  179. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-036.md +0 -0
  180. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-037.md +0 -0
  181. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-038.md +0 -0
  182. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-039.md +0 -0
  183. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-040.md +0 -0
  184. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-041.md +0 -0
  185. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-042.md +0 -0
  186. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-043.md +0 -0
  187. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-044.md +0 -0
  188. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-045.md +0 -0
  189. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-046.md +0 -0
  190. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-047.md +0 -0
  191. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-048.md +0 -0
  192. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-049.md +0 -0
  193. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-050.md +0 -0
  194. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-051.md +0 -0
  195. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-052.md +0 -0
  196. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-053.md +0 -0
  197. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-054.md +0 -0
  198. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-055.md +0 -0
  199. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-056.md +0 -0
  200. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-057.md +0 -0
  201. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-058.md +0 -0
  202. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-059.md +0 -0
  203. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-060.md +0 -0
  204. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-061.md +0 -0
  205. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-062.md +0 -0
  206. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-063.md +0 -0
  207. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-064.md +0 -0
  208. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-065.md +0 -0
  209. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-069.md +0 -0
  210. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-070.md +0 -0
  211. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-071.md +0 -0
  212. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-072.md +0 -0
  213. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-073.md +0 -0
  214. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-001.md +0 -0
  215. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-005.md +0 -0
  216. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-006.md +0 -0
  217. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-007.md +0 -0
  218. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-009.md +0 -0
  219. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-010.md +0 -0
  220. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-011.md +0 -0
  221. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-012.md +0 -0
  222. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-013.md +0 -0
  223. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-014.md +0 -0
  224. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-015.md +0 -0
  225. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-016.md +0 -0
  226. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-017.md +0 -0
  227. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-018.md +0 -0
  228. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-019.md +0 -0
  229. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-020.md +0 -0
  230. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-021.md +0 -0
  231. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-022.md +0 -0
  232. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-023.md +0 -0
  233. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-024.md +0 -0
  234. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-028.md +0 -0
  235. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-029.md +0 -0
  236. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-030.md +0 -0
  237. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-031.md +0 -0
  238. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-032.md +0 -0
  239. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-033.md +0 -0
  240. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-034.md +0 -0
  241. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-035.md +0 -0
  242. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-036.md +0 -0
  243. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-037.md +0 -0
  244. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-038.md +0 -0
  245. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-039.md +0 -0
  246. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-040.md +0 -0
  247. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-041.md +0 -0
  248. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-042.md +0 -0
  249. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-043.md +0 -0
  250. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-044.md +0 -0
  251. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-045.md +0 -0
  252. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-046.md +0 -0
  253. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-047.md +0 -0
  254. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-048.md +0 -0
  255. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-049.md +0 -0
  256. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-050.md +0 -0
  257. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-051.md +0 -0
  258. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-052.md +0 -0
  259. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-053.md +0 -0
  260. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-054.md +0 -0
  261. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-055.md +0 -0
  262. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-056.md +0 -0
  263. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-057.md +0 -0
  264. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-058.md +0 -0
  265. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-059.md +0 -0
  266. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-060.md +0 -0
  267. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-063.md +0 -0
  268. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-066.md +0 -0
  269. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-067.md +0 -0
  270. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-068.md +0 -0
  271. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-069.md +0 -0
  272. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-070.md +0 -0
  273. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-071.md +0 -0
  274. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-072.md +0 -0
  275. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-073.md +0 -0
  276. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-074.md +0 -0
  277. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-075.md +0 -0
  278. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-076.md +0 -0
  279. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-077.md +0 -0
  280. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-078.md +0 -0
  281. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-079.md +0 -0
  282. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-080.md +0 -0
  283. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-081.md +0 -0
  284. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-082.md +0 -0
  285. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-083.md +0 -0
  286. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-084.md +0 -0
  287. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-086.md +0 -0
  288. {pactkit-2.9.13 → pactkit-2.10.2}/docs/specs/STORY-slim-088.md +0 -0
  289. {pactkit-2.9.13 → pactkit-2.10.2}/docs/test_cases/BUG-001_case.md +0 -0
  290. {pactkit-2.9.13 → pactkit-2.10.2}/docs/test_cases/BUG-002_case.md +0 -0
  291. {pactkit-2.9.13 → pactkit-2.10.2}/docs/test_cases/STORY-slim-028_case.md +0 -0
  292. {pactkit-2.9.13 → pactkit-2.10.2}/docs/test_cases/STORY-slim-029_case.md +0 -0
  293. {pactkit-2.9.13 → pactkit-2.10.2}/docs/test_cases/STORY-slim-031_case.md +0 -0
  294. {pactkit-2.9.13 → pactkit-2.10.2}/docs/test_cases/STORY-slim-032_case.md +0 -0
  295. {pactkit-2.9.13 → pactkit-2.10.2}/docs/test_cases/STORY-slim-033_case.md +0 -0
  296. {pactkit-2.9.13 → pactkit-2.10.2}/docs/test_cases/STORY-slim-034_case.md +0 -0
  297. {pactkit-2.9.13 → pactkit-2.10.2}/opencode.json +0 -0
  298. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/__main__.py +0 -0
  299. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/backfill.py +0 -0
  300. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/cleaners.py +0 -0
  301. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/context_gen.py +0 -0
  302. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/coverage_gate.py +0 -0
  303. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/doctor.py +0 -0
  304. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/garden.py +0 -0
  305. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/generators/__init__.py +0 -0
  306. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/generators/adapter.py +0 -0
  307. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/generators/deploy_base.py +0 -0
  308. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/id_generator.py +0 -0
  309. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/invariants.py +0 -0
  310. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/issue_sync.py +0 -0
  311. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/lazy_visualize.py +0 -0
  312. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/lessons.py +0 -0
  313. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/lint_runner.py +0 -0
  314. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/observe.py +0 -0
  315. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/profiles.py +0 -0
  316. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/prompts/agents.py +0 -0
  317. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/prompts/references.py +0 -0
  318. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/prompts/workflows.py +0 -0
  319. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/regression.py +0 -0
  320. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/schemas.py +0 -0
  321. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/scripts.py +0 -0
  322. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/sec_scope.py +0 -0
  323. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/skills/__init__.py +0 -0
  324. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/skills/board.py +0 -0
  325. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/skills/scaffold.py +0 -0
  326. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/skills/spec_linter.py +0 -0
  327. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/spec_status.py +0 -0
  328. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/test_mapper.py +0 -0
  329. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/utils.py +0 -0
  330. {pactkit-2.9.13 → pactkit-2.10.2}/src/pactkit/validators.py +0 -0
  331. {pactkit-2.9.13 → pactkit-2.10.2}/tests/conftest.py +0 -0
  332. {pactkit-2.9.13 → pactkit-2.10.2}/tests/e2e/__init__.py +0 -0
  333. {pactkit-2.9.13 → pactkit-2.10.2}/tests/e2e/cli/__init__.py +0 -0
  334. {pactkit-2.9.13 → pactkit-2.10.2}/tests/fixtures/agent_parser/agents_dir/researcher.yaml +0 -0
  335. {pactkit-2.9.13 → pactkit-2.10.2}/tests/fixtures/agent_parser/agents_dir/writer.yaml +0 -0
  336. {pactkit-2.9.13 → pactkit-2.10.2}/tests/fixtures/agent_parser/langgraph_app.py +0 -0
  337. {pactkit-2.9.13 → pactkit-2.10.2}/tests/fixtures/agent_parser/mcp_settings.json +0 -0
  338. {pactkit-2.9.13 → pactkit-2.10.2}/tests/fixtures/api_call_parser/axios_style.tsx +0 -0
  339. {pactkit-2.9.13 → pactkit-2.10.2}/tests/fixtures/api_call_parser/dynamic.tsx +0 -0
  340. {pactkit-2.9.13 → pactkit-2.10.2}/tests/fixtures/api_call_parser/page.tsx +0 -0
  341. {pactkit-2.9.13 → pactkit-2.10.2}/tests/integration/__init__.py +0 -0
  342. {pactkit-2.9.13 → pactkit-2.10.2}/tests/integration/test_deploy_classic.py +0 -0
  343. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_agent_features.py +0 -0
  344. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_agent_frontmatter.py +0 -0
  345. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_agents_enrichment.py +0 -0
  346. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_board_bug027.py +0 -0
  347. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_board_sections.py +0 -0
  348. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug001_skill_path.py +0 -0
  349. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug002_plugin_paths.py +0 -0
  350. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug003_multi_import.py +0 -0
  351. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug004_dead_set.py +0 -0
  352. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug005_archive_taskless.py +0 -0
  353. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug006_scan_excludes.py +0 -0
  354. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug007_stale_trace_refs.py +0 -0
  355. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug008_stale_command_refs.py +0 -0
  356. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug009_project_config_backfill.py +0 -0
  357. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug010_rewrite_yaml.py +0 -0
  358. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug011_stale_refs.py +0 -0
  359. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug012_call_graph_filter.py +0 -0
  360. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug013_config_single_source.py +0 -0
  361. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug014_version_hygiene.py +0 -0
  362. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug017_project_init_playbook.py +0 -0
  363. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug018_issue_tracker_verification.py +0 -0
  364. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug019_venv_deployment.py +0 -0
  365. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug020_claude_md_backup.py +0 -0
  366. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug025_release_delegation.py +0 -0
  367. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug026_version_sync.py +0 -0
  368. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug028_ghost_refs.py +0 -0
  369. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug029_stack_detection_fallback.py +0 -0
  370. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug030_spec_lint_cli.py +0 -0
  371. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug031_docstring_accuracy.py +0 -0
  372. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug034_plan_metadata_template.py +0 -0
  373. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug_021.py +0 -0
  374. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug_022.py +0 -0
  375. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug_023.py +0 -0
  376. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug_024.py +0 -0
  377. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug_slim001_env_detection.py +0 -0
  378. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug_slim002_instruction_collision.py +0 -0
  379. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug_slim003.py +0 -0
  380. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug_slim004.py +0 -0
  381. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug_slim005.py +0 -0
  382. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_bug_slim006.py +0 -0
  383. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_check_command.py +0 -0
  384. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_check_extensions_072_073.py +0 -0
  385. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_check_playbook_072_073.py +0 -0
  386. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_command_frontmatter.py +0 -0
  387. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_command_visualize_modes.py +0 -0
  388. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_config_auto_merge.py +0 -0
  389. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_context_gen.py +0 -0
  390. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_create_skill.py +0 -0
  391. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_cross_flow_matrix.py +0 -0
  392. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_deploy_base.py +0 -0
  393. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_deployer_cleanup.py +0 -0
  394. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_design_command.py +0 -0
  395. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_done_gates.py +0 -0
  396. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_draw_prompt.py +0 -0
  397. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_draw_references.py +0 -0
  398. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_drawio_mcp.py +0 -0
  399. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_garden.py +0 -0
  400. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_home_path_fix.py +0 -0
  401. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_hotfix_command.py +0 -0
  402. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_init_guard.py +0 -0
  403. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_init_playbook_074.py +0 -0
  404. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_lang_profiles.py +0 -0
  405. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_lessons_rotation_075.py +0 -0
  406. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_list_stories.py +0 -0
  407. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_mcp_integration.py +0 -0
  408. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_model_config.py +0 -0
  409. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_monorepo_detect.py +0 -0
  410. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_multi_prefix.py +0 -0
  411. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_observe.py +0 -0
  412. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_profiles.py +0 -0
  413. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_project_visibility.py +0 -0
  414. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_prompt_quality_075.py +0 -0
  415. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_prompts_package.py +0 -0
  416. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_release.py +0 -0
  417. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_release_field.py +0 -0
  418. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_release_v110.py +0 -0
  419. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_render_prompt.py +0 -0
  420. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_review_command.py +0 -0
  421. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_rules_enrichment.py +0 -0
  422. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_scaffold.py +0 -0
  423. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_scaffold_developer_prefix.py +0 -0
  424. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_schemas.py +0 -0
  425. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_script_extraction.py +0 -0
  426. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_skill_structure.py +0 -0
  427. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_skills_enrichment.py +0 -0
  428. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_slim_deps_088.py +0 -0
  429. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_smart_regression.py +0 -0
  430. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_sprint_command.py +0 -0
  431. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_stack_references.py +0 -0
  432. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_status_command.py +0 -0
  433. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_statusline.py +0 -0
  434. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story014_release.py +0 -0
  435. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story015_ci_lint_gate.py +0 -0
  436. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story016_claude_md.py +0 -0
  437. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story017_init_claude_md.py +0 -0
  438. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story018_arch_staleness.py +0 -0
  439. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story019_bailout.py +0 -0
  440. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story020_horizon.py +0 -0
  441. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story021_rfc.py +0 -0
  442. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story022_decision_tree.py +0 -0
  443. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story023_test_quality.py +0 -0
  444. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story024_native_agent.py +0 -0
  445. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story025_ci_pipeline.py +0 -0
  446. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story026_issue_tracker.py +0 -0
  447. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story027_hooks.py +0 -0
  448. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story028_rule_scoping.py +0 -0
  449. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story029_doctor.py +0 -0
  450. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story030_lint.py +0 -0
  451. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story031_git_init_guard.py +0 -0
  452. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story032_greenfield_redirect.py +0 -0
  453. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story033_config_backfill.py +0 -0
  454. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story034_plan_config_refresh.py +0 -0
  455. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story035_readme_docs.py +0 -0
  456. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story037_regression_fix.py +0 -0
  457. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story038_call_graph_update.py +0 -0
  458. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story039_venv_config.py +0 -0
  459. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story042_spec_linter.py +0 -0
  460. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story043_active_clarify.py +0 -0
  461. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story044_consistency_check.py +0 -0
  462. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story045_auto_pr.py +0 -0
  463. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story046_agent_adapter.py +0 -0
  464. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story047_enterprise_flags.py +0 -0
  465. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story048_worktree_isolation.py +0 -0
  466. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story050_doc_only_shortcut.py +0 -0
  467. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story051_workflow_streamlining.py +0 -0
  468. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story052_conditional_github_release.py +0 -0
  469. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story053_impact_regression.py +0 -0
  470. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story055_commands.py +0 -0
  471. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story055_config.py +0 -0
  472. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story055_spec_linter.py +0 -0
  473. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story056_commands.py +0 -0
  474. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story056_config.py +0 -0
  475. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story057_implicit_cleanup.py +0 -0
  476. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story058_opencode_extraction.py +0 -0
  477. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story058_routing_fix.py +0 -0
  478. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story060_init_hang.py +0 -0
  479. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story061_remove_thinking.py +0 -0
  480. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story062_mcp_recommendations.py +0 -0
  481. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story064_venv_local_md.py +0 -0
  482. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story065_sprint_model.py +0 -0
  483. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story072_developer_prefix.py +0 -0
  484. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim009_lazy_rules.py +0 -0
  485. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim010_dry_refactor.py +0 -0
  486. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim012_ci.py +0 -0
  487. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim014_clean.py +0 -0
  488. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim014_context.py +0 -0
  489. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim014_guard.py +0 -0
  490. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim014_lazy_viz.py +0 -0
  491. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim014_next_id.py +0 -0
  492. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim014_regression.py +0 -0
  493. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim014_sec_scope.py +0 -0
  494. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim014_validators.py +0 -0
  495. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim015_doctor.py +0 -0
  496. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim016_testmap_lint.py +0 -0
  497. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim017.py +0 -0
  498. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim018.py +0 -0
  499. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim019_plan_subphases.py +0 -0
  500. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim020_explore_stall_fix.py +0 -0
  501. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim022.py +0 -0
  502. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim023.py +0 -0
  503. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim024.py +0 -0
  504. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim025.py +0 -0
  505. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim027.py +0 -0
  506. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim028.py +0 -0
  507. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim029.py +0 -0
  508. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim030.py +0 -0
  509. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim031.py +0 -0
  510. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim032.py +0 -0
  511. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim033.py +0 -0
  512. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim034.py +0 -0
  513. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim035.py +0 -0
  514. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim036.py +0 -0
  515. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim037.py +0 -0
  516. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim038.py +0 -0
  517. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim039.py +0 -0
  518. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim040.py +0 -0
  519. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim041.py +0 -0
  520. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim042.py +0 -0
  521. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim043.py +0 -0
  522. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim044.py +0 -0
  523. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim045.py +0 -0
  524. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim046.py +0 -0
  525. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim047.py +0 -0
  526. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim048.py +0 -0
  527. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim049.py +0 -0
  528. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim051.py +0 -0
  529. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim052.py +0 -0
  530. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim053.py +0 -0
  531. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim054.py +0 -0
  532. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim055.py +0 -0
  533. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim056.py +0 -0
  534. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim060_codex_profile.py +0 -0
  535. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim065.py +0 -0
  536. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim076_multistack.py +0 -0
  537. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim078.py +0 -0
  538. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim079.py +0 -0
  539. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim080.py +0 -0
  540. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim081.py +0 -0
  541. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim082.py +0 -0
  542. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim083.py +0 -0
  543. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_story_slim084.py +0 -0
  544. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_tools.py +0 -0
  545. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_topology_parsers_066.py +0 -0
  546. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_update_task.py +0 -0
  547. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_visualize_call_nested.py +0 -0
  548. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_visualize_chain_fix.py +0 -0
  549. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_visualize_modes.py +0 -0
  550. {pactkit-2.9.13 → pactkit-2.10.2}/tests/unit/test_visualize_multilang_chain.py +0 -0
@@ -0,0 +1,31 @@
1
+ name: PactKit CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v4
14
+
15
+ - name: Set up Python
16
+ uses: actions/setup-python@v5
17
+ with:
18
+ python-version: "3.11"
19
+
20
+ - name: Install dependencies
21
+ run: |
22
+ python -m pip install --upgrade pip
23
+ pip install -e .
24
+ pip install pytest ruff
25
+ pactkit init
26
+
27
+ - name: Lint
28
+ run: ruff check src/ tests/
29
+
30
+ - name: Test
31
+ run: pytest tests/ -v
@@ -38,9 +38,17 @@ docs/architecture/snapshots/
38
38
  # Codex CLI local config
39
39
  .codex/
40
40
 
41
+ # GitHub Copilot deployment artifacts (generated by pactkit update)
42
+ .github/
43
+ !.github/workflows/
44
+
41
45
  # Plugin deployment artifacts (generated by pactkit update)
42
46
  pactkit-plugin/
43
47
 
48
+ # Office files
49
+ ~$*
50
+ *.pptx
51
+
44
52
  # Secrets
45
53
  .pypirc
46
54
 
@@ -2,11 +2,77 @@
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.9.13"
5
+ version: "2.10.2"
6
6
  stack: python
7
7
  root: .
8
8
  developer: "slim"
9
9
 
10
+ # Agents — AI role definitions
11
+ agents:
12
+ - code-explorer
13
+ - product-designer
14
+ - qa-engineer
15
+ - repo-maintainer
16
+ - security-auditor
17
+ - senior-developer
18
+ - system-architect
19
+ - system-medic
20
+ - visual-architect
21
+
22
+ # Commands — PDCA playbooks
23
+ commands:
24
+ - project-act
25
+ - project-check
26
+ - project-clarify
27
+ - project-design
28
+ - project-done
29
+ - project-hotfix
30
+ - project-init
31
+ - project-plan
32
+ - project-pr
33
+ - project-release
34
+ - project-sprint
35
+
36
+ # Skills — tool scripts
37
+ skills:
38
+ - pactkit-analyze
39
+ - pactkit-board
40
+ - pactkit-doctor
41
+ - pactkit-draw
42
+ - pactkit-release
43
+ - pactkit-review
44
+ - pactkit-scaffold
45
+ - pactkit-status
46
+ - pactkit-trace
47
+ - pactkit-visualize
48
+ - pactkit-garden
49
+ - project-act
50
+ - project-check
51
+ - project-clarify
52
+ - project-design
53
+ - project-done
54
+ - project-hotfix
55
+ - project-init
56
+ - project-plan
57
+ - project-pr
58
+ - project-release
59
+ - project-sprint
60
+ - pactkit-audit
61
+ - pactkit-report
62
+
63
+ # Rules — constitution modules
64
+ rules:
65
+ - 01-core-protocol
66
+ - 02-hierarchy-of-truth
67
+ - 03-file-atlas
68
+ - 04-routing-table
69
+ - 05-workflow-conventions
70
+ - 06-mcp-integration
71
+ - 07-shared-protocols
72
+ - 08-architecture-principles
73
+ - 09-sectional-write
74
+ - 11-pdca-nudge
75
+
10
76
  # CI/CD — set provider to github or gitlab to generate pipeline config
11
77
  ci:
12
78
  provider: github
@@ -46,6 +112,16 @@ regression:
46
112
  check:
47
113
  security_checklist: true
48
114
  security_scope_override: none
115
+ pactguard:
116
+ enabled: false
117
+ mode: all
118
+ ruleset: ""
119
+ blocking: false
120
+ observe:
121
+ enabled: false
122
+ sources: auto
123
+ max_console: 100
124
+ max_network: 200
49
125
 
50
126
  # Done — configure commit and lesson quality behavior
51
127
  done:
@@ -4,6 +4,26 @@ 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
+
16
+ ## [2.10.1] - 2026-04-16
17
+
18
+ ### Added
19
+ - **Dual-dimension Harness Audit** (STORY-slim-097) — Audit now scores two dimensions: Config (project + global `~/.claude/` config, 50pts) and Code (tests, lint, complexity, git hygiene, 50pts). Score went from 52 to 97/100 for PactKit itself. JSON output includes `dimensions` breakdown field.
20
+ - **Unified HTML Report Dashboard** (STORY-slim-094) — Single `report.html` with tab switching, D3 force-directed graph, harness score ring, layer bars, and hotspot panel. Self-contained offline HTML with inline D3.js.
21
+
22
+ ### Fixed
23
+ - **Focus call graph empty output** (STORY-slim-095) — Fixed focus resolution to use `LANG_PROFILES[stack].source_dirs` instead of hardcoded `src/` prefix. Added subdirectory and single-root-module fallback.
24
+ - **Report --all tab overload** (HOTFIX-slim-096) — Filtered unified dashboard to core PDCA graphs only (code_graph, class_graph, call_graph, system_design). Reduced from 9 tabs to 4.
25
+ - **Mermaid `<br/>` tag rendering** (HOTFIX-slim-096) — Strip Mermaid `<br/>` tags from node labels before HTML escape, preventing `&lt;br/&gt;` raw text in SVG.
26
+
7
27
  ## [2.9.13] - 2026-04-15
8
28
 
9
29
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pactkit
3
- Version: 2.9.13
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
@@ -35,3 +35,14 @@
35
35
  | 2026-03-21 | Migrating ~25 deterministic rules from MD prompts to Python CLI subcommands (8 new modules: guards.py, id_generator.py, cleaners.py, regression.py, context_gen.py, validators.py, sec_scope.py, lazy_visualize.py) — the hardest part is backward compatibility: 2500+ pre-existing tests assert specific keywords in prompt text, so slimmed prompts must preserve every keyword even when replacing verbose blocks with single CLI invocations; build a keyword constraint map from failing tests incrementally rather than trying to predict all constraints up-front | STORY-slim-014 |
36
36
  | 2026-03-21 | Config resolution in CLI modules must use `find_pactkit_yaml(project_root)` → `load_config(yaml_path)` two-step pattern — `load_config(project_root)` alone fails because pactkit.yaml lives in `.claude/` subdirectory, not project root; lint_runner.py and test_mapper.py both reuse `LANG_PROFILES` from workflows.py as canonical source for stack-specific patterns (test_map_pattern, lint_command), keeping DRY with the CI pipeline profiles | STORY-slim-016 |
37
37
  | 2026-03-21 | Cross-flow integrity audits (comparing all PDCA commands end-to-end) catch gaps that per-command reviews miss — CLI subcommands with zero prompt references are dead code (`lint-context`, `lint-lessons`, `lint-testcase`); argparser flags without `deploy()` signature parity (`upgrade` missing `--agent`) fail silently; adding a new parameter to `deploy()` must use a default value to avoid breaking 24+ existing callers that don't pass it | BUG-slim-004 |
38
+ | 2026-03-22 | Done Phase deterministic operations (lessons dedup, invariants regex, coverage parsing) are pure text/regex/subprocess with zero AI judgment — `lessons.py` uses Jaccard similarity on word sets (threshold < 0.5) for dedup, `invariants.py` uses `re.sub()` for test count replacement, `coverage_gate.py` uses list-form `subprocess.run()` for pytest-cov (SEC-7 safe); prompt delegation must preserve fallback instructions ("if pactkit X unavailable, fall back to manual") so LLM can still operate without CLI installed | STORY-slim-017 |
39
+ | 2026-03-22 | Iterative cross-flow audits find deeper gaps each pass — BUG-slim-004 found 6 gaps, BUG-slim-005 found 5 more; dict keys defined but never consumed (`LANG_PROFILES.test_dir/package_file/e2e_test_pattern`) are invisible to grep-based prompt audits because they only exist in data structures; board update instructions must reference `{BOARD_CMD} update_task` script (not vague "mark as done") for deterministic execution; every CLI subcommand must have at least one prompt reference or it's dead code (`lint-testcase` had zero) | BUG-slim-005 |
40
+ | 2026-03-21 | cli.py visualize --lazy was a decision-only tool that printed guidance but never called lazy_visualize.run_visualize_graphs(); always trace the execution path from CLI handler to actual side-effect to confirm end-to-end behavior | BUG-slim-006 |
41
+ | 2026-03-21 | 5 test files independently hardcoded LANG_PROFILES required keys — define canonical key sets as frozenset in schemas.py (LANG_PROFILE_REQUIRED_KEYS) so all consumers import from one source; when adding test assertions on dict keys, always check schemas.py first | STORY-slim-018 |
42
+ | 2026-03-23 | Monolithic prompt Phase 3.2 in commands.py caused AI thinking stalls; splitting into 4 sub-phases (3.2a-3.2d) with output checkpoints forces incremental generation and eliminates the bottleneck | src/pactkit/prompts/commands.py:COMMAND_PROMPTS[project-plan.md] |
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
+ | 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
+ | 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 |
@@ -0,0 +1,197 @@
1
+ {
2
+ "timestamp": "2026-04-16T12:48:17Z",
3
+ "commit": "517b0d0",
4
+ "story_id": "",
5
+ "score": 97,
6
+ "ready": true,
7
+ "weakest": null,
8
+ "layers": {
9
+ "H1": {
10
+ "level": 3,
11
+ "name": "Advanced"
12
+ },
13
+ "H2": {
14
+ "level": 3,
15
+ "name": "Advanced"
16
+ },
17
+ "H3": {
18
+ "level": 3,
19
+ "name": "Advanced"
20
+ },
21
+ "H4": {
22
+ "level": 2,
23
+ "name": "Structured"
24
+ },
25
+ "H5": {
26
+ "level": 3,
27
+ "name": "Advanced"
28
+ },
29
+ "H6": {
30
+ "level": 3,
31
+ "name": "Advanced"
32
+ },
33
+ "H7": {
34
+ "level": 3,
35
+ "name": "Advanced"
36
+ }
37
+ },
38
+ "dimensions": {
39
+ "config": {
40
+ "score": 50,
41
+ "passed": 13,
42
+ "total": 13
43
+ },
44
+ "code": {
45
+ "score": 47,
46
+ "passed": 16,
47
+ "total": 17
48
+ }
49
+ },
50
+ "hotspots": [
51
+ {
52
+ "file": ".github/skills/pactkit-visualize/scripts/visualize.py",
53
+ "score": 29,
54
+ "complexity_avg": 9.5,
55
+ "blast_pct": 0,
56
+ "fan_in": 0,
57
+ "function_count": 140,
58
+ "has_test": false,
59
+ "docstring_pct": 67,
60
+ "long_funcs": 19,
61
+ "deep_nesting": 34,
62
+ "layer_violations": 0,
63
+ "action": "Add tests: no test file found + Refactor: 19 long functions, 34 deeply nested"
64
+ },
65
+ {
66
+ "file": "src/pactkit/skills/visualize.py",
67
+ "score": 20,
68
+ "complexity_avg": 10.8,
69
+ "blast_pct": 0,
70
+ "fan_in": 0,
71
+ "function_count": 85,
72
+ "has_test": false,
73
+ "docstring_pct": 73,
74
+ "long_funcs": 14,
75
+ "deep_nesting": 18,
76
+ "layer_violations": 0,
77
+ "action": "Add tests: no test file found + Refactor: 14 long functions, 18 deeply nested"
78
+ },
79
+ {
80
+ "file": "src/pactkit/cli.py",
81
+ "score": 16,
82
+ "complexity_avg": 50.0,
83
+ "blast_pct": 2,
84
+ "fan_in": 1,
85
+ "function_count": 2,
86
+ "has_test": false,
87
+ "docstring_pct": 50,
88
+ "long_funcs": 1,
89
+ "deep_nesting": 1,
90
+ "layer_violations": 0,
91
+ "action": "Add tests: no test file found + Split: extract high-complexity functions"
92
+ },
93
+ {
94
+ "file": "pactkit-plugin/skills/pactkit-visualize/scripts/visualize.py",
95
+ "score": 13,
96
+ "complexity_avg": 7.4,
97
+ "blast_pct": 0,
98
+ "fan_in": 0,
99
+ "function_count": 80,
100
+ "has_test": false,
101
+ "docstring_pct": 65,
102
+ "long_funcs": 7,
103
+ "deep_nesting": 13,
104
+ "layer_violations": 0,
105
+ "action": "Add tests: no test file found + Refactor: 7 long functions, 13 deeply nested"
106
+ },
107
+ {
108
+ "file": "src/pactkit/config.py",
109
+ "score": 9,
110
+ "complexity_avg": 15.6,
111
+ "blast_pct": 16,
112
+ "fan_in": 7,
113
+ "function_count": 12,
114
+ "has_test": true,
115
+ "docstring_pct": 100,
116
+ "long_funcs": 6,
117
+ "deep_nesting": 2,
118
+ "layer_violations": 0,
119
+ "action": "Refactor: 6 long functions, 2 deeply nested + Stabilize: 7 dependents"
120
+ },
121
+ {
122
+ "file": "src/pactkit/audit.py",
123
+ "score": 8,
124
+ "complexity_avg": 10.9,
125
+ "blast_pct": 2,
126
+ "fan_in": 1,
127
+ "function_count": 26,
128
+ "has_test": true,
129
+ "docstring_pct": 96,
130
+ "long_funcs": 5,
131
+ "deep_nesting": 6,
132
+ "layer_violations": 0,
133
+ "action": "Refactor: 5 long functions, 6 deeply nested + Decompose: 26 functions"
134
+ },
135
+ {
136
+ "file": "src/pactkit/skills/analyzers/go_analyzer.py",
137
+ "score": 8,
138
+ "complexity_avg": 9.5,
139
+ "blast_pct": 0,
140
+ "fan_in": 0,
141
+ "function_count": 11,
142
+ "has_test": false,
143
+ "docstring_pct": 36,
144
+ "long_funcs": 2,
145
+ "deep_nesting": 3,
146
+ "layer_violations": 0,
147
+ "action": "Add tests: no test file found + Refactor: 2 long functions, 3 deeply nested"
148
+ },
149
+ {
150
+ "file": "src/pactkit/skills/report.py",
151
+ "score": 7,
152
+ "complexity_avg": 9.1,
153
+ "blast_pct": 2,
154
+ "fan_in": 1,
155
+ "function_count": 11,
156
+ "has_test": false,
157
+ "docstring_pct": 100,
158
+ "long_funcs": 5,
159
+ "deep_nesting": 0,
160
+ "layer_violations": 0,
161
+ "action": "Add tests: no test file found + Refactor: 5 long functions"
162
+ },
163
+ {
164
+ "file": "src/pactkit/generators/deployer.py",
165
+ "score": 7,
166
+ "complexity_avg": 5.5,
167
+ "blast_pct": 5,
168
+ "fan_in": 2,
169
+ "function_count": 41,
170
+ "has_test": false,
171
+ "docstring_pct": 95,
172
+ "long_funcs": 8,
173
+ "deep_nesting": 0,
174
+ "layer_violations": 0,
175
+ "action": "Add tests: no test file found + Refactor: 8 long functions"
176
+ },
177
+ {
178
+ "file": "src/pactkit/skills/analyzers/java_analyzer.py",
179
+ "score": 7,
180
+ "complexity_avg": 7.1,
181
+ "blast_pct": 0,
182
+ "fan_in": 0,
183
+ "function_count": 11,
184
+ "has_test": false,
185
+ "docstring_pct": 36,
186
+ "long_funcs": 1,
187
+ "deep_nesting": 3,
188
+ "layer_violations": 0,
189
+ "action": "Add tests: no test file found + Refactor: 1 long functions, 3 deeply nested"
190
+ }
191
+ ],
192
+ "suggested_tasks": [],
193
+ "dependency_health": {
194
+ "vulns": -1,
195
+ "error": "pip-audit not installed"
196
+ }
197
+ }
@@ -2,17 +2,6 @@
2
2
 
3
3
  | Date | Lesson | Context |
4
4
  |------|--------|---------|
5
- | 2026-03-22 | Done Phase deterministic operations (lessons dedup, invariants regex, coverage parsing) are pure text/regex/subprocess with zero AI judgment — `lessons.py` uses Jaccard similarity on word sets (threshold < 0.5) for dedup, `invariants.py` uses `re.sub()` for test count replacement, `coverage_gate.py` uses list-form `subprocess.run()` for pytest-cov (SEC-7 safe); prompt delegation must preserve fallback instructions ("if pactkit X unavailable, fall back to manual") so LLM can still operate without CLI installed | STORY-slim-017 |
6
- | 2026-03-22 | Iterative cross-flow audits find deeper gaps each pass — BUG-slim-004 found 6 gaps, BUG-slim-005 found 5 more; dict keys defined but never consumed (`LANG_PROFILES.test_dir/package_file/e2e_test_pattern`) are invisible to grep-based prompt audits because they only exist in data structures; board update instructions must reference `{BOARD_CMD} update_task` script (not vague "mark as done") for deterministic execution; every CLI subcommand must have at least one prompt reference or it's dead code (`lint-testcase` had zero) | BUG-slim-005 |
7
- | 2026-03-21 | cli.py visualize --lazy was a decision-only tool that printed guidance but never called lazy_visualize.run_visualize_graphs(); always trace the execution path from CLI handler to actual side-effect to confirm end-to-end behavior | BUG-slim-006 |
8
- | 2026-03-21 | 5 test files independently hardcoded LANG_PROFILES required keys — define canonical key sets as frozenset in schemas.py (LANG_PROFILE_REQUIRED_KEYS) so all consumers import from one source; when adding test assertions on dict keys, always check schemas.py first | STORY-slim-018 |
9
- | 2026-03-23 | Monolithic prompt Phase 3.2 in commands.py caused AI thinking stalls; splitting into 4 sub-phases (3.2a-3.2d) with output checkpoints forces incremental generation and eliminates the bottleneck | src/pactkit/prompts/commands.py:COMMAND_PROMPTS[project-plan.md] |
10
- | 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 |
11
- | 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 |
12
- | 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 |
13
- | 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 |
14
- | 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 |
15
- | 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 |
16
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 |
17
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 |
18
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 +42,14 @@
53
42
  | 2026-04-02 | validate_deployed_content() guard caught real adapter bugs (missing _replace_slash_commands in copilot agents, missing _replace_cli_with_scripts in codex rules) — static analysis on deploy output is high-value for multi-adapter systems | deploy_base.py:validate_deployed_content |
54
43
  | 2026-04-02 | Borrowed Claude Code P3 (graduated safety language) + P6 (NO_TOOLS) patterns; applied to 01-core-protocol.md, 02-hierarchy-of-truth.md, 10-safety.md, project-act.md, project-check.md | src/pactkit/prompts/rules.py:Signal Strength Convention |
55
44
  | 2026-04-15 | pyproject.toml [project].dependencies must only include packages needed for core CLI startup (pyyaml); adapter and tree-sitter packages go in [project.optional-dependencies] with extras (opencode, codex, visualize, all) | pyproject.toml:[project.optional-dependencies] |
45
+ | 2026-04-15 | _deploy_claude_md must read-before-write: user-modified global CLAUDE.md was silently destroyed on every pactkit init/update. Project-level _generate_project_claude_md had 3 protection layers; global had zero. | deployer.py:_deploy_claude_md |
46
+ | 2026-04-16 | TreeSitterAnalyzer._compute_complexity() can serve as a universal base for all tree-sitter languages; only PythonAnalyzer needs a separate implementation using stdlib ast | analyzers/__init__.py:_compute_complexity |
47
+ | 2026-04-16 | Parsing Mermaid .mmd files to JSON (nodes+edges) is straightforward with regex; the D3 force-directed HTML template works well as a single-file self-contained skill | report.py:_parse_mmd,_render_html |
48
+ | 2026-04-16 | 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 | src/pactkit/skills/report.py:selectNode |
49
+ | 2026-04-16 | 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 | src/pactkit/audit.py:_check_h1 |
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 |
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 |
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 3631+ 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`.
@@ -0,0 +1,207 @@
1
+
2
+ ### [STORY-slim-075] Prompt engineering quality: graduated safety language, tool call guidance, routing disambiguation, lessons rotation
3
+ > Spec: docs/specs/STORY-slim-075.md
4
+
5
+ - [x] Audit safety language,Add parallel/serial tool guidance,Add routing When NOT to use,Implement lessons rotation,Add prompt quality tests
6
+
7
+ ### [STORY-slim-076] Multi-stack visualize: class mode + multi-language file scanning
8
+ > Spec: docs/specs/STORY-slim-076.md
9
+
10
+ - [x] R1: _detect_stacks multi-stack detection
11
+ - [x] R2: Multi-stack file scanning
12
+ - [x] R3: extract_classes ABC
13
+ - [x] R4: _build_class_graph refactor
14
+ - [x] R5: _select_analyzers
15
+ - [x] R6: Backward compat tests
16
+
17
+ ### [STORY-slim-077] Monorepo stack detection + redetect-stack CLI
18
+ > Spec: docs/specs/STORY-slim-077.md
19
+
20
+ - [x] Extend detect_stacks depth-1,Add redetect-stack CLI,Update init flow,Tests
21
+
22
+ ### [STORY-slim-078] Multi-language module resolution for file-mode dependency graph
23
+ > Spec: docs/specs/STORY-slim-078.md
24
+
25
+ - [x] Per-lang module keys,Per-lang import normalization,Multi-analyzer file graph,Fix src-strip,Go module prefix,Tests
26
+
27
+ ### [STORY-slim-079] TS/JS path alias resolution for file-mode dependency graph
28
+ > Spec: docs/specs/STORY-slim-079.md
29
+
30
+ - [x] Read tsconfig paths,Resolve alias imports,Wildcard patterns,Tests
31
+
32
+ ### [STORY-slim-082] Sync prompt templates for --mode module and --focus scoping
33
+ > Spec: docs/specs/STORY-slim-082.md
34
+
35
+ - [x] Update SKILL_VISUALIZE_MD
36
+ - [x] Update Visual First rule
37
+ - [x] Update release snapshot
38
+ - [x] Update init Phase 3
39
+ - [x] Deploy and verify
40
+
41
+ ### [STORY-slim-081] Two-tier module graph with scoped focus for large codebases
42
+ > Spec: docs/specs/STORY-slim-081.md
43
+
44
+ - [x] R1: _detect_modules boundary detection,R2: _build_module_graph with weighted edges,R3: Auto-degradation when files > MAX_SCAN_FILES,R4: Scoped focus scan (resolve module → directory),R5: .tsx/.jsx regression test,R6: Backward compat for small projects
45
+
46
+ ### [STORY-slim-080] Deep monorepo scanning: nearest-ancestor config discovery for all analyzers
47
+ > Spec: docs/specs/STORY-slim-080.md
48
+
49
+ - [x] Extend _detect_stacks depth,TS nearest-ancestor tsconfig,Go nearest-ancestor go.mod,Plumb consumer_path,Tests
50
+
51
+ ### [STORY-slim-083] Copilot deployer adapter package (pactkit-copilot)
52
+ > Spec: docs/specs/STORY-slim-083.md
53
+
54
+ - [x] CopilotDeployer class + entry_point registration + deploy to .github/ + OCP fix for rules_import_style dispatch
55
+
56
+ ### [STORY-slim-084] Adapter deploy-output validation guard
57
+ > Spec: docs/specs/STORY-slim-084.md
58
+
59
+ - [x] R2: has_pactkit_cli field,R1: validate_deployed_content(),R3: Core deploy integration,R6: Core unit tests,R4: Copilot integration test,R5: Codex integration test
60
+
61
+ ### [STORY-slim-086] Prompt Writing Quality — Signal Strength, Consequence Language, NO_TOOLS Mode
62
+ > Spec: docs/specs/STORY-slim-086.md
63
+
64
+ - [x] R1: Signal Strength Convention 追加到 01-core-protocol.md
65
+ - [x] R2: 校准现有规则文件信号词 (01, 02, 10)
66
+ - [x] R3: 7 条关键禁止规则添加后果语言
67
+ - [x] R4: project-check.md 添加 NO_TOOLS restriction
68
+
69
+ ## ✅ Done
70
+
71
+ - **STORY-slim-059**: Remove dead codex profile and slim down core package
72
+ - **STORY-slim-058**: Extract pactkit-opencode as independent adapter package
73
+ - **STORY-slim-057**: Refactor deployer.py: extract DeployerProtocol and DeployerBase
74
+
75
+ ### [HOTFIX-slim-085] Add Duplication Audit to Plan phase
76
+ > Spec: docs/specs/HOTFIX-slim-085.md
77
+
78
+ - [x] system-architect agent + Plan playbook
79
+
80
+ ### [STORY-slim-088] Slim dependencies and robust CLI fallback
81
+ > Spec: docs/specs/STORY-slim-088.md
82
+
83
+ - [x] Move adapters+tree-sitter to optional-dependencies
84
+ - [x] Add python3 -m fallback for spec-lint in playbooks
85
+ - [x] Fix add_story call signature in Plan playbook
86
+
87
+ ### [HOTFIX-slim-087] guard 添加 -C 参数
88
+ > Spec: docs/specs/HOTFIX-slim-087.md
89
+
90
+ - [x] Fix guard CWD false alarm in subagent
91
+
92
+ ### [BUG-slim-089] Global CLAUDE.md overwritten on every deploy
93
+ > Spec: docs/specs/BUG-slim-089.md
94
+
95
+ - [x] Add _is_pactkit_managed_global_md helper
96
+ - [x] Refactor _deploy_claude_md with read-before-write guard
97
+ - [x] Add unit tests for AC1-AC5
98
+
99
+ ### [STORY-slim-090] Interactive HTML Report Skill (D3 Force Graph)
100
+ > Spec: docs/specs/STORY-slim-090.md
101
+
102
+ - [x] Implement MMD parser (graph TD + classDiagram)
103
+ - [x] Create D3 HTML template with force simulation
104
+ - [x] Implement render_html with zoom/pan/drag/hover/search/theme
105
+ - [x] Add overlay support (blast radius, complexity, layers)
106
+ - [x] Create skill entry point + CLI
107
+ - [x] Write unit tests
108
+
109
+ ### [STORY-slim-089] Enterprise Code Analysis: Blast Radius, Cyclomatic Complexity, Layer Violations
110
+ > Spec: docs/specs/STORY-slim-089.md
111
+
112
+ - [x] Add complexity counting to LanguageAnalyzer interface
113
+ - [x] Implement Python complexity in PythonAnalyzer
114
+ - [x] Implement TS/Go/Java complexity in TreeSitterAnalyzer subclasses
115
+ - [x] Add blast_radius() with bidirectional BFS
116
+ - [x] Add complexity() report function
117
+ - [x] Add layers() with configurable layer model
118
+ - [x] Add CLI subcommands (blast_radius, complexity, layers)
119
+ - [x] Write unit tests for all 3 features
120
+
121
+ ### [STORY-slim-091] Harness Audit Skill: H1-H7 AI Readiness Assessment
122
+ > Spec: docs/specs/STORY-slim-091.md
123
+
124
+ - [x] Implement H1-H7 layer checks
125
+ - [x] Implement scoring model (sum/21 + min≥L1)
126
+ - [x] Implement findings aggregator
127
+ - [x] Implement insights (fan-in, blast top10, circular deps, god objects)
128
+ - [x] Register CLI subcommand (audit --json/--layer/--append)
129
+ - [x] Integrate into Done Phase 3.x
130
+ - [x] Integrate into Plan Phase 1 (optional read)
131
+ - [x] Write unit tests
132
+
133
+ ### [STORY-slim-092] Audit Findings: File-Level Hotspot Aggregation
134
+ > Spec: docs/specs/STORY-slim-092.md
135
+
136
+ - [x] Add _compute_hotspots() file-level aggregation
137
+ - [x] Add _suggest_action() actionable suggestions
138
+ - [x] Slim _write_audit_json() to scorecard + hotspots only
139
+ - [x] Add --verbose flag for full details
140
+ - [x] Update tests for hotspot + slim JSON
141
+
142
+ ### [STORY-slim-093] Audit: Multi-Signal Hotspots + Suggested Tasks Generation
143
+ > Spec: docs/specs/STORY-slim-093.md
144
+
145
+ - [x] Add test coverage signal (_check_test_coverage)
146
+ - [x] Add docstring coverage signal (_check_docstring_coverage)
147
+ - [x] Add code smell signal (_check_code_smells)
148
+ - [x] Add layer violation signal (_count_layer_violations)
149
+ - [x] Add dependency health check (_check_dependency_health)
150
+ - [x] Update hotspot score formula (weighted multi-dimensional)
151
+ - [x] Update action suggestions (7-level priority)
152
+ - [x] Add suggested tasks generation (_generate_suggested_tasks)
153
+ - [x] Update JSON schema (suggested_tasks + dependency_health)
154
+ - [x] Write unit tests for all new signals + tasks
155
+
156
+ ### [STORY-slim-097] Dual-dimension Harness Audit: Config + Code
157
+ > Spec: docs/specs/STORY-slim-097.md
158
+
159
+ - [x] R1: _all_config_dirs helper
160
+ - [x] R2: Code dimension checks
161
+ - [x] R3: Dual scoring formula
162
+ - [x] R4: Layer level both dimensions
163
+ - [x] R5: JSON dimensions breakdown
164
+ - [x] R6: Global config scan
165
+
166
+ ### [HOTFIX-slim-096] Report --all filter core graphs only
167
+ > Spec: docs/specs/HOTFIX-slim-096.md
168
+
169
+ - [x] Filter unified dashboard to core PDCA graphs, exclude focus/reverse/workflow
170
+
171
+ ### [STORY-slim-094] Unified HTML Report — single aggregated dashboard
172
+ > Spec: docs/specs/STORY-slim-094.md
173
+
174
+ - [x] R1: Unified single HTML with Tab switching
175
+ - [x] R2: Left panel audit dashboard
176
+ - [x] R3: Right panel hotspot details
177
+ - [x] R4: Single file backward compat
178
+ - [x] R5: Self-contained offline HTML
179
+ - [x] R6: Overlay auto-detect
180
+ - [x] R7: CLI pactkit report subcommand
181
+
182
+ ### [STORY-slim-095] Fix visualize focus call graph + report empty tab
183
+ > Spec: docs/specs/STORY-slim-095.md
184
+
185
+ - [x] R1: Fix focus filter in _build_call_graph
186
+ - [x] R2: Report empty Tab placeholder
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