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