pactkit 2.10.4__tar.gz → 2.10.5__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.4 → pactkit-2.10.5}/.github/workflows/pactkit.yml +1 -1
- {pactkit-2.10.4 → pactkit-2.10.5}/CHANGELOG.md +8 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/PKG-INFO +1 -1
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/architecture/governance/archive/lessons_archive_202603.md +1 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/architecture/governance/lessons.md +1 -1
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/architecture/governance/rules.md +1 -1
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/product/archive/archive_202604.md +15 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/product/context.md +2 -2
- pactkit-2.10.5/docs/specs/STORY-slim-101.md +155 -0
- pactkit-2.10.5/docs/specs/STORY-slim-102.md +135 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/pyproject.toml +1 -1
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/__init__.py +1 -1
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/cli.py +5 -9
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/config.py +5 -9
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/generators/deployer.py +4 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/guards.py +18 -14
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/prompts/commands.py +6 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/prompts/rules.py +132 -3
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/e2e/cli/test_cli_e2e.py +13 -15
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug013_config_single_source.py +2 -1
- pactkit-2.10.5/tests/unit/test_bug026_version_sync.py +186 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_config.py +8 -6
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_config_auto_merge.py +3 -5
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_deployer_cleanup.py +10 -5
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_prompt_structural_invariants.py +2 -2
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_release_v110.py +3 -3
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_selective_deploy.py +2 -1
- pactkit-2.10.5/tests/unit/test_solution_design_rule.py +137 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story014_release.py +3 -6
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story033_config_backfill.py +3 -3
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story063_prompt_slimming.py +2 -1
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim010_dry_refactor.py +4 -5
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim011_command_rules.py +2 -2
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim021.py +2 -2
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim023.py +25 -8
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim026.py +2 -2
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim077_monorepo_stack.py +4 -3
- pactkit-2.10.5/tests/unit/test_story_slim102_version_marker.py +146 -0
- pactkit-2.10.4/tests/unit/test_bug026_version_sync.py +0 -153
- {pactkit-2.10.4 → pactkit-2.10.5}/.github/workflows/publish.yml +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/.gitignore +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/.opencode/pactkit.yaml +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/AGENTS.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/CODE_OF_CONDUCT.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/CONTRIBUTING.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/LICENSE +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/README.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/SECURITY.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/architecture/governance/archive/lessons_archive_202602.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/architecture/governance/harness_audit.json +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/architecture/governance/philosophy.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/assets/logo.png +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/guides/codex-integration-preresearch.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/guides/tool-integration-checklist.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/product/archive/archive_202602.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/product/archive/archive_202603.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/product/friction-log.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/product/prd.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/product/sprint_board.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-001.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-002.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-003.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-004.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-005.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-006.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-007.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-008.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-009.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-010.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-011.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-012.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-013.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-014.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-015.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-016.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-017.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-018.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-019.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-020.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-021.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-022.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-023.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-024.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-025.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-026.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-027.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-028.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-029.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-030.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-031.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-032.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-033.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-034.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-035.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-slim-001.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-slim-002.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-slim-003.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-slim-004.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-slim-005.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-slim-006.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-slim-089.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/HOTFIX-slim-023.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/HOTFIX-slim-049.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/HOTFIX-slim-050.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/HOTFIX-slim-051.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/HOTFIX-slim-052.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/HOTFIX-slim-061.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/HOTFIX-slim-062.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/HOTFIX-slim-067.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/HOTFIX-slim-069.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/HOTFIX-slim-070.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/HOTFIX-slim-085.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/HOTFIX-slim-087.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/HOTFIX-slim-096.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/HOTFIX-slim-099.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-001.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-002.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-003.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-004.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-005.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-006.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-007.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-008.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-009.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-010.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-011.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-012.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-013.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-014.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-015.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-016.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-017.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-018.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-019.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-020.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-021.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-022.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-023.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-024.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-025.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-026.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-027.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-028.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-029.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-030.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-031.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-032.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-033.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-034.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-035.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-036.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-037.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-038.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-039.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-040.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-041.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-042.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-043.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-044.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-045.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-046.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-047.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-048.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-049.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-050.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-051.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-052.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-053.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-054.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-055.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-056.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-057.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-058.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-059.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-060.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-061.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-062.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-063.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-064.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-065.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-069.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-070.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-071.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-072.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-073.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-001.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-005.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-006.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-007.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-009.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-010.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-011.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-012.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-013.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-014.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-015.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-016.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-017.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-018.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-019.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-020.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-021.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-022.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-023.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-024.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-028.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-029.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-030.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-031.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-032.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-033.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-034.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-035.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-036.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-037.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-038.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-039.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-040.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-041.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-042.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-043.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-044.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-045.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-046.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-047.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-048.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-049.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-050.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-051.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-052.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-053.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-054.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-055.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-056.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-057.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-058.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-059.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-060.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-063.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-066.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-067.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-068.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-069.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-070.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-071.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-072.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-073.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-074.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-075.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-076.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-077.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-078.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-079.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-080.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-081.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-082.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-083.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-084.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-086.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-088.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-089.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-090.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-091.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-092.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-093.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-094.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-095.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-097.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-098.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-099.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-100.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/test_cases/BUG-001_case.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/test_cases/BUG-002_case.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/test_cases/STORY-slim-028_case.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/test_cases/STORY-slim-029_case.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/test_cases/STORY-slim-031_case.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/test_cases/STORY-slim-032_case.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/test_cases/STORY-slim-033_case.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/docs/test_cases/STORY-slim-034_case.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/opencode.json +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/__main__.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/audit.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/backfill.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/cleaners.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/context_gen.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/coverage_gate.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/doctor.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/garden.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/generators/__init__.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/generators/adapter.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/generators/deploy_base.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/id_generator.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/invariants.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/issue_sync.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/lazy_visualize.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/lessons.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/lint_runner.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/observe.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/profiles.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/prompts/__init__.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/prompts/agents.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/prompts/references.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/prompts/skills.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/prompts/workflows.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/regression.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/schemas.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/scripts.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/sec_scope.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/skills/__init__.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/skills/analyzers/__init__.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/skills/analyzers/go_analyzer.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/skills/analyzers/java_analyzer.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/skills/analyzers/python_analyzer.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/skills/analyzers/ts_analyzer.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/skills/board.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/skills/report.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/skills/scaffold.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/skills/spec_linter.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/skills/visualize.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/spec_status.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/test_mapper.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/utils.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/validators.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/conftest.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/e2e/__init__.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/e2e/cli/__init__.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/fixtures/agent_parser/agents_dir/researcher.yaml +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/fixtures/agent_parser/agents_dir/writer.yaml +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/fixtures/agent_parser/langgraph_app.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/fixtures/agent_parser/mcp_settings.json +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/fixtures/api_call_parser/axios_style.tsx +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/fixtures/api_call_parser/dynamic.tsx +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/fixtures/api_call_parser/page.tsx +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/integration/__init__.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/integration/test_deploy_classic.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_agent_features.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_agent_frontmatter.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_agents_enrichment.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_audit.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_blast_radius.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_board_bug027.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_board_sections.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug001_skill_path.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug002_plugin_paths.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug003_multi_import.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug004_dead_set.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug005_archive_taskless.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug006_scan_excludes.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug007_stale_trace_refs.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug008_stale_command_refs.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug009_project_config_backfill.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug010_rewrite_yaml.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug011_stale_refs.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug012_call_graph_filter.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug014_version_hygiene.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug017_project_init_playbook.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug018_issue_tracker_verification.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug019_venv_deployment.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug020_claude_md_backup.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug025_release_delegation.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug028_ghost_refs.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug029_stack_detection_fallback.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug030_spec_lint_cli.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug031_docstring_accuracy.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug034_plan_metadata_template.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug_021.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug_022.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug_023.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug_024.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug_slim001_env_detection.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug_slim002_instruction_collision.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug_slim003.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug_slim004.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug_slim005.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug_slim006.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug_slim089_global_claude_md.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_check_command.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_check_extensions_072_073.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_check_playbook_072_073.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_command_frontmatter.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_command_visualize_modes.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_complexity.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_constitution_sharpening.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_context_gen.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_create_skill.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_cross_flow_matrix.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_deploy_base.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_deployer_plugin.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_design_command.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_done_gates.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_draw_prompt.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_draw_references.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_drawio_mcp.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_garden.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_home_path_fix.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_hotfix_command.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_init_guard.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_init_playbook_074.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_lang_profiles.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_layer_violations.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_lessons_rotation_075.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_list_stories.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_mcp_integration.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_model_config.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_modular_constitution.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_monorepo_detect.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_multi_prefix.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_observe.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_pdca_slim.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_profiles.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_project_visibility.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_prompt_cli_refs.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_prompt_quality_075.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_prompts_package.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_release.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_release_field.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_render_prompt.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_report_parser.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_report_unified.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_review_command.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_rules_enrichment.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_scaffold.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_scaffold_developer_prefix.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_schemas.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_script_extraction.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_session_context.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_skill_structure.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_skills_enrichment.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_slim_deps_088.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_smart_regression.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_sprint_command.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_stack_references.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_status_command.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_statusline.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story015_ci_lint_gate.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story016_claude_md.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story017_init_claude_md.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story018_arch_staleness.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story019_bailout.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story020_horizon.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story021_rfc.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story022_decision_tree.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story023_test_quality.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story024_native_agent.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story025_ci_pipeline.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story026_issue_tracker.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story027_hooks.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story028_rule_scoping.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story029_doctor.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story030_lint.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story031_git_init_guard.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story032_greenfield_redirect.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story034_plan_config_refresh.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story035_readme_docs.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story037_regression_fix.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story038_call_graph_update.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story039_venv_config.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story040_layered_claude_md.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story042_spec_linter.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story043_active_clarify.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story044_consistency_check.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story045_auto_pr.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story046_agent_adapter.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story047_enterprise_flags.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story048_worktree_isolation.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story049_community_standards.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story050_doc_only_shortcut.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story051_workflow_streamlining.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story052_conditional_github_release.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story053_impact_regression.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story055_commands.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story055_config.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story055_spec_linter.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story056_commands.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story056_config.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story057_implicit_cleanup.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story058_opencode_extraction.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story058_routing_fix.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story059_codex_removal.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story060_init_hang.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story061_remove_thinking.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story062_mcp_recommendations.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story064_venv_local_md.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story065_sprint_model.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story072_developer_prefix.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim009_lazy_rules.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim012_ci.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim014_clean.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim014_context.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim014_guard.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim014_lazy_viz.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim014_next_id.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim014_regression.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim014_sec_scope.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim014_validators.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim015_doctor.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim016_testmap_lint.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim017.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim018.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim019_plan_subphases.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim020_explore_stall_fix.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim022.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim024.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim025.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim027.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim028.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim029.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim030.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim031.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim032.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim033.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim034.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim035.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim036.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim037.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim038.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim039.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim040.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim041.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim042.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim043.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim044.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim045.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim046.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim047.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim048.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim049.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim051.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim052.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim053.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim054.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim055.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim056.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim060_codex_profile.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim063.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim065.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim076_multistack.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim078.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim079.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim080.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim081.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim082.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim083.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim084.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim095.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim098_pdca_nudge.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim099_act_context_ref.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_tools.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_topology_parsers_066.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_update_task.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_visualize_call_nested.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_visualize_chain_fix.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_visualize_modes.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_visualize_multilang_chain.py +0 -0
|
@@ -4,6 +4,14 @@ 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.5] - 2026-04-21
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
- **Solution Design Protocol** (STORY-slim-101) — New rule `12-solution-design.md` requires capability delta assessment before implementation. Prevents framework blindness, project blindness, and hardcoded coupling. Includes Implementation Constraints (no magic values, OCP, SRP, dependency direction). Integrated into Plan Phase 1 and Act Phase 1.
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
- **Global version tracking** (STORY-slim-102) — Version tracking moved from project-level `pactkit.yaml` to global `~/.claude/.pactkit-version` marker. Eliminates cross-project desync when PactKit is upgraded. `auto_merge_config_file()` now removes stale `version` field from existing project yamls.
|
|
14
|
+
|
|
7
15
|
## [2.10.4] - 2026-04-20
|
|
8
16
|
|
|
9
17
|
### Added
|
{pactkit-2.10.4 → pactkit-2.10.5}/docs/architecture/governance/archive/lessons_archive_202603.md
RENAMED
|
@@ -48,3 +48,4 @@
|
|
|
48
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 |
|
|
49
49
|
| 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 |
|
|
50
50
|
| 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 |
|
|
51
|
+
| 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 |
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
| Date | Lesson | Context |
|
|
4
4
|
|------|--------|---------|
|
|
5
|
-
| 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 |
|
|
6
5
|
| 2026-03-24 | Standalone skill scripts using exec() require all imports in _SHARED_HEADER; new stdlib imports (dataclass) must be added to skills/__init__.py _SHARED_HEADER, not just the standalone header section | skills/__init__.py:_SHARED_HEADER |
|
|
7
6
|
| 2026-03-24 | detect_topology() must delegate to _TOPOLOGY_PARSERS parser.detect() first, not _TOPOLOGY_MARKERS alone — parsers and markers can diverge silently causing empty graphs | visualize.py:detect_topology |
|
|
8
7
|
| 2026-03-24 | _scan_hooks() only accepts files with 'use' prefix in hook dirs (src/hooks/, composables/) to prevent utility files from becoming hook nodes | visualize.py:_scan_hooks |
|
|
@@ -53,3 +52,4 @@
|
|
|
53
52
|
| 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 |
|
|
54
53
|
| 2026-04-20 | pactkit clean rglob patterns must exclude protected parent dirs (node_modules, .git) — recursive pattern matching deletes dependency internals | cleaners.py:_inside_protected |
|
|
55
54
|
| 2026-04-20 | Hotfix playbook lacked data-driven impact awareness — AI-only 'no side effects' checks miss high-fan-in functions. Adding lightweight .mmd graph reads makes the advisory concrete without blocking the fast-fix path. | workflows.py:HOTFIX_PROMPT |
|
|
55
|
+
| 2026-04-21 | Version tracking in pactkit.yaml caused cross-project desync — moved to ~/.claude/.pactkit-version as single source of truth for deploy state. config.py get_default_config() no longer includes version field. | STORY-slim-102 |
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
## Invariants
|
|
17
17
|
|
|
18
|
-
1. All
|
|
18
|
+
1. All 3787+ 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`.
|
|
@@ -212,3 +212,18 @@
|
|
|
212
212
|
- [x] Add Phase 0.5 Impact Check to HOTFIX_PROMPT
|
|
213
213
|
- [x] Add tests for new phase
|
|
214
214
|
- [x] Deploy verification
|
|
215
|
+
|
|
216
|
+
### [STORY-slim-101] Solution Design Protocol Rule
|
|
217
|
+
> Spec: docs/specs/STORY-slim-101.md
|
|
218
|
+
|
|
219
|
+
- [x] Add RULE_12_SOLUTION_DESIGN to rules.py
|
|
220
|
+
- [x] Add to VALID_RULES in config.py
|
|
221
|
+
- [x] Add unit test
|
|
222
|
+
|
|
223
|
+
### [STORY-slim-102] Move version tracking to global deploy marker
|
|
224
|
+
> Spec: docs/specs/STORY-slim-102.md
|
|
225
|
+
|
|
226
|
+
- [x] Write .pactkit-version in deployer
|
|
227
|
+
- [x] Update --if-needed to read global marker
|
|
228
|
+
- [x] Remove version from project yaml
|
|
229
|
+
- [x] Update tests
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# Project Context (Auto-generated)
|
|
2
|
-
> Last updated: 2026-04-
|
|
2
|
+
> Last updated: 2026-04-21T17:13:02+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
|
-
- 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.
|
|
19
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
|
|
20
19
|
- 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
|
|
21
20
|
- pactkit clean rglob patterns must exclude protected parent dirs (node_modules, .git) — recursive pattern matching deletes dependency internals
|
|
22
21
|
- Hotfix playbook lacked data-driven impact awareness — AI-only 'no side effects' checks miss high-fan-in functions. Adding lightweight .mmd graph reads makes the advisory concrete without blocking the fast-fix path.
|
|
22
|
+
- Version tracking in pactkit.yaml caused cross-project desync — moved to ~/.claude/.pactkit-version as single source of truth for deploy state. config.py get_default_config() no longer includes version field.
|
|
23
23
|
|
|
24
24
|
## Next Recommended Action
|
|
25
25
|
`/project-design`
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# STORY-slim-101: Solution Design Protocol Rule
|
|
2
|
+
|
|
3
|
+
| Field | Value |
|
|
4
|
+
|-------|-------|
|
|
5
|
+
| ID | STORY-slim-101 |
|
|
6
|
+
| Status | Done |
|
|
7
|
+
| Priority | P1 |
|
|
8
|
+
| Release | 2.10.5 |
|
|
9
|
+
|
|
10
|
+
## Background
|
|
11
|
+
|
|
12
|
+
LLM tends to implement features using "quick and dirty" approaches that work but have poor maintainability, robustness, and extensibility. Three core anti-patterns observed:
|
|
13
|
+
|
|
14
|
+
1. **Framework Blindness**: LLM doesn't know what native capabilities the framework provides, so it reinvents the wheel (e.g., writing custom context storage when LangGraph has memory store)
|
|
15
|
+
2. **Project Blindness**: LLM doesn't check what the project has already encapsulated, so it bypasses existing abstractions (e.g., instantiating AzureChatOpenAI directly instead of using `get_precise_llm()`)
|
|
16
|
+
3. **Hardcoded Dependencies**: LLM couples directly to framework internals instead of using project abstraction layers
|
|
17
|
+
|
|
18
|
+
Root cause: No protocol requires LLM to evaluate capability delta (framework native + project existing) before implementation. Information exists (Context7 for framework docs, grep for project code, call chain for dependencies) but LLM is not required to use it.
|
|
19
|
+
|
|
20
|
+
## Requirements
|
|
21
|
+
|
|
22
|
+
### R1: Rule File Creation (MUST)
|
|
23
|
+
|
|
24
|
+
Create `~/.claude/rules/12-solution-design.md` containing the Solution Design Protocol that defines capability assessment before implementation.
|
|
25
|
+
|
|
26
|
+
### R2: Framework Capability Query (MUST)
|
|
27
|
+
|
|
28
|
+
The protocol MUST define a prioritized query path for framework native capabilities:
|
|
29
|
+
1. Context7 MCP (if available) — real-time, authoritative
|
|
30
|
+
2. WebFetch official docs (if network available) — real-time, requires parsing
|
|
31
|
+
3. AI training data (fallback) — must declare framework version to avoid outdated APIs
|
|
32
|
+
|
|
33
|
+
### R3: Project Capability Discovery (MUST)
|
|
34
|
+
|
|
35
|
+
The protocol MUST define methods to discover project existing capabilities:
|
|
36
|
+
- Grep import statements to find framework usage
|
|
37
|
+
- Grep factory function patterns (`get_*`, `build_*`, `create_*`) to find encapsulated capabilities
|
|
38
|
+
- Pattern match wiring layer files (`wiring.py`, `deps.py`, `container.*`, `di.*`, `providers.*`)
|
|
39
|
+
- Use call chain visualization for dependency analysis
|
|
40
|
+
|
|
41
|
+
### R4: Delta Assessment Matrix (MUST)
|
|
42
|
+
|
|
43
|
+
The protocol MUST define a decision matrix based on capability delta:
|
|
44
|
+
- Framework has & project not used → prefer enabling framework capability
|
|
45
|
+
- Framework has & project encapsulated → reuse project abstraction, do not bypass
|
|
46
|
+
- Neither has → only then implement new
|
|
47
|
+
|
|
48
|
+
### R5: Decision Constraints (MUST)
|
|
49
|
+
|
|
50
|
+
The protocol MUST enforce:
|
|
51
|
+
- MUST NOT bypass project abstraction layer to use framework directly
|
|
52
|
+
- SHOULD prefer framework native over custom implementation
|
|
53
|
+
- MUST state reasoning if not using available framework capability
|
|
54
|
+
|
|
55
|
+
### R6: Output Format (SHOULD)
|
|
56
|
+
|
|
57
|
+
The protocol SHOULD define output format for:
|
|
58
|
+
- Plan phase: Technical Design section in Spec
|
|
59
|
+
- Act phase: Brief assessment output before implementation
|
|
60
|
+
|
|
61
|
+
### R7: Stack-Agnostic Design (MUST)
|
|
62
|
+
|
|
63
|
+
The protocol MUST be stack-agnostic, supporting dependency files for:
|
|
64
|
+
- Python: `pyproject.toml`, `requirements.txt`
|
|
65
|
+
- Node: `package.json`
|
|
66
|
+
- Go: `go.mod`
|
|
67
|
+
- Java: `pom.xml`, `build.gradle`
|
|
68
|
+
- Rust: `Cargo.toml`
|
|
69
|
+
|
|
70
|
+
### R8: Playbook Integration (MUST)
|
|
71
|
+
|
|
72
|
+
The rule MUST be integrated into PDCA playbooks:
|
|
73
|
+
- `project-plan.md`: Add `@~/.claude/rules/12-solution-design.md` import and reference protocol in Phase 1
|
|
74
|
+
- `project-act.md`: Add `@~/.claude/rules/12-solution-design.md` import and reference protocol in Phase 1
|
|
75
|
+
|
|
76
|
+
## Acceptance Criteria
|
|
77
|
+
|
|
78
|
+
### AC1: Rule File Exists (R1)
|
|
79
|
+
|
|
80
|
+
- **Given** PactKit rules directory at `~/.claude/rules/`
|
|
81
|
+
- **When** `pactkit init` or `pactkit deploy` is run
|
|
82
|
+
- **Then** `12-solution-design.md` is deployed with full protocol content
|
|
83
|
+
|
|
84
|
+
### AC2: Framework Query Fallback Chain (R2)
|
|
85
|
+
|
|
86
|
+
- **Given** A requirement involving a framework (e.g., LangGraph)
|
|
87
|
+
- **When** Solution Design Protocol is executed
|
|
88
|
+
- **Then** Framework capabilities are queried via Context7 → WebFetch → Training Data fallback chain
|
|
89
|
+
|
|
90
|
+
### AC3: Project Capability Discovery (R3)
|
|
91
|
+
|
|
92
|
+
- **Given** A project with `pyproject.toml` listing `langgraph>=0.4`
|
|
93
|
+
- **When** Solution Design Protocol Step 3 is executed
|
|
94
|
+
- **Then** Protocol identifies: (a) framework imports in src/, (b) factory functions like `get_*`/`build_*`, (c) wiring layer files
|
|
95
|
+
|
|
96
|
+
### AC4: Delta Assessment Decision (R4)
|
|
97
|
+
|
|
98
|
+
- **Given** Framework has memory store capability, project has checkpointer but not memory
|
|
99
|
+
- **When** Requirement is "add cross-session context"
|
|
100
|
+
- **Then** Protocol recommends "enable framework capability" not "implement custom"
|
|
101
|
+
|
|
102
|
+
### AC5: Abstraction Bypass Prevention (R5)
|
|
103
|
+
|
|
104
|
+
- **Given** Project has `get_precise_llm()` in wiring.py
|
|
105
|
+
- **When** LLM attempts to directly instantiate AzureChatOpenAI
|
|
106
|
+
- **Then** Protocol constraint blocks this and directs to use existing encapsulation
|
|
107
|
+
|
|
108
|
+
### AC6: Output Format in Spec (R6)
|
|
109
|
+
|
|
110
|
+
- **Given** Plan phase executes Solution Design Protocol
|
|
111
|
+
- **When** Capability assessment is complete
|
|
112
|
+
- **Then** Output is written to `## Technical Design` section with: capability table, reuse points, new implementation list
|
|
113
|
+
|
|
114
|
+
### AC7: Multi-Stack Support (R7)
|
|
115
|
+
|
|
116
|
+
- **Given** A Node.js project with `package.json`
|
|
117
|
+
- **When** Solution Design Protocol Step 1 is executed
|
|
118
|
+
- **Then** Protocol correctly reads dependencies from `package.json` not `pyproject.toml`
|
|
119
|
+
|
|
120
|
+
### AC8: Playbook References Protocol (R8)
|
|
121
|
+
|
|
122
|
+
- **Given** User runs `/project-plan` or `/project-act`
|
|
123
|
+
- **When** Phase 1 executes
|
|
124
|
+
- **Then** Solution Design Protocol is triggered for requirements involving frameworks
|
|
125
|
+
|
|
126
|
+
## Target Call Chain
|
|
127
|
+
|
|
128
|
+
Not applicable — this is a new rule file, not modifying existing code.
|
|
129
|
+
|
|
130
|
+
## Implementation Steps
|
|
131
|
+
|
|
132
|
+
| Step | File | Action | Dependencies | Risk |
|
|
133
|
+
|------|------|--------|-------------|------|
|
|
134
|
+
| 1 | `src/pactkit/prompts/rules.py` | Add `RULE_12_SOLUTION_DESIGN` constant with full protocol content | None | Low |
|
|
135
|
+
| 2 | `src/pactkit/config.py` | Add `12-solution-design` to `VALID_RULES` | Step 1 | Low |
|
|
136
|
+
| 3 | `src/pactkit/prompts/commands.py` | Update `COMMAND_PLAN` and `COMMAND_ACT` to import rule and reference protocol in Phase 1 | Step 1 | Medium |
|
|
137
|
+
| 4 | `tests/unit/test_rules.py` | Add test for new rule deployment | Steps 1-3 | Low |
|
|
138
|
+
|
|
139
|
+
## Security Scope
|
|
140
|
+
|
|
141
|
+
| Check | Applicable | Reason |
|
|
142
|
+
|-------|------------|--------|
|
|
143
|
+
| SEC-1 | N/A | No secrets — rule file contains only protocol text |
|
|
144
|
+
| SEC-2 | N/A | No user input handling — rule file is static content |
|
|
145
|
+
| SEC-3 | N/A | No database operations |
|
|
146
|
+
| SEC-4 | N/A | No frontend code |
|
|
147
|
+
| SEC-5 | N/A | No authentication logic |
|
|
148
|
+
| SEC-6 | N/A | No API endpoints |
|
|
149
|
+
| SEC-7 | N/A | No error handling code |
|
|
150
|
+
| SEC-8 | N/A | No dependency changes |
|
|
151
|
+
|
|
152
|
+
## Out of Scope
|
|
153
|
+
|
|
154
|
+
- Auto-generation of capability index files — protocol uses dynamic discovery
|
|
155
|
+
- Framework-specific capability lists — protocol relies on Context7/WebFetch for real-time data
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# STORY-slim-102: Move version tracking from project yaml to global deploy marker
|
|
2
|
+
|
|
3
|
+
| Field | Value |
|
|
4
|
+
|-------|-------|
|
|
5
|
+
| ID | STORY-slim-102 |
|
|
6
|
+
| Status | Done |
|
|
7
|
+
| Priority | P1 |
|
|
8
|
+
| Release | 2.10.5 |
|
|
9
|
+
|
|
10
|
+
## Background
|
|
11
|
+
|
|
12
|
+
The `version` field in project-level `pactkit.yaml` tracks which PactKit version last deployed. When PactKit is upgraded via `pipx upgrade pactkit`, running `pactkit update` in one project updates that project's yaml, but all other projects remain stale. This causes `pactkit update --if-needed` (triggered every session by Core Protocol) to report mismatch and run a full redeploy in every other project — even though the global deployment directory (`~/.claude/`) is already up to date.
|
|
13
|
+
|
|
14
|
+
Root cause: version tracking is in the wrong place. Project yaml's role is **configuration** (which agents/skills/rules to deploy). Deployment **state** (which version last deployed) should live in the global deployment directory alongside the deployed files.
|
|
15
|
+
|
|
16
|
+
### Current Flow (broken cross-project)
|
|
17
|
+
```
|
|
18
|
+
pipx upgrade pactkit → __version__ = 2.10.5
|
|
19
|
+
cd projectA → pactkit update → projectA yaml = 2.10.5, ~/.claude/ = 2.10.5 ✓
|
|
20
|
+
cd projectB → pactkit update --if-needed → projectB yaml = 2.10.1 ≠ 2.10.5 → full redeploy (unnecessary)
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Target Flow
|
|
24
|
+
```
|
|
25
|
+
pipx upgrade pactkit → __version__ = 2.10.5
|
|
26
|
+
cd projectA → pactkit update → ~/.claude/.pactkit-version = 2.10.5 ✓
|
|
27
|
+
cd projectB → pactkit update --if-needed → reads ~/.claude/.pactkit-version = 2.10.5 → skip ✓
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Requirements
|
|
31
|
+
|
|
32
|
+
### R1: Global Version Marker (MUST)
|
|
33
|
+
|
|
34
|
+
Classic deployer MUST write `~/.claude/.pactkit-version` containing `__version__` after successful deployment. This is the single source of truth for "which version is currently deployed globally."
|
|
35
|
+
|
|
36
|
+
### R2: Update --if-needed Reads Global Marker (MUST)
|
|
37
|
+
|
|
38
|
+
`pactkit update --if-needed` MUST read `~/.claude/.pactkit-version` (not project yaml) to decide whether to skip. If the marker matches `__version__`, skip. If missing or mismatched, proceed to deploy.
|
|
39
|
+
|
|
40
|
+
### R3: Remove version from Project YAML (MUST)
|
|
41
|
+
|
|
42
|
+
- `get_default_config()` MUST NOT include a `version` key
|
|
43
|
+
- `auto_merge_config_file()` MUST NOT sync version — and MUST remove existing `version` field if present (cleanup migration)
|
|
44
|
+
- `_rewrite_yaml()` MUST NOT write a version line
|
|
45
|
+
- `load_config()` MUST NOT break if `version` key is absent
|
|
46
|
+
|
|
47
|
+
### R4: Guard Version Check Uses Global Marker (MUST)
|
|
48
|
+
|
|
49
|
+
`check_version_mismatch()` in `guards.py` MUST read the global marker instead of project yaml version.
|
|
50
|
+
|
|
51
|
+
## Acceptance Criteria
|
|
52
|
+
|
|
53
|
+
### AC1: Global Marker Written on Deploy (R1)
|
|
54
|
+
|
|
55
|
+
- **Given** `~/.claude/.pactkit-version` does not exist or has old version
|
|
56
|
+
- **When** `pactkit update` runs successfully
|
|
57
|
+
- **Then** `~/.claude/.pactkit-version` contains `__version__` (e.g., `2.10.5`)
|
|
58
|
+
|
|
59
|
+
### AC2: Skip When Global Marker Matches (R2)
|
|
60
|
+
|
|
61
|
+
- **Given** `~/.claude/.pactkit-version` contains `2.10.5` and `__version__ == 2.10.5`
|
|
62
|
+
- **When** `pactkit update --if-needed` is run from any project directory
|
|
63
|
+
- **Then** Output is `"PactKit 2.10.5 up-to-date — skipping redeploy"` and exit code 0
|
|
64
|
+
|
|
65
|
+
### AC3: Deploy When Global Marker Mismatches (R2)
|
|
66
|
+
|
|
67
|
+
- **Given** `~/.claude/.pactkit-version` contains `2.10.1` and `__version__ == 2.10.5`
|
|
68
|
+
- **When** `pactkit update --if-needed` is run
|
|
69
|
+
- **Then** Full deploy executes and marker is updated to `2.10.5`
|
|
70
|
+
|
|
71
|
+
### AC4: Default Config Has No Version (R3)
|
|
72
|
+
|
|
73
|
+
- **Given** `get_default_config()` is called
|
|
74
|
+
- **When** Result is inspected
|
|
75
|
+
- **Then** No `version` key exists in the returned dict
|
|
76
|
+
|
|
77
|
+
### AC5: Auto-merge Removes Stale Version (R3)
|
|
78
|
+
|
|
79
|
+
- **Given** A project yaml with `version: "2.10.1"` and stale components
|
|
80
|
+
- **When** `auto_merge_config_file()` is called
|
|
81
|
+
- **Then** New components are added AND `version` field is removed from the yaml file
|
|
82
|
+
|
|
83
|
+
### AC6: Guard Uses Global Marker (R4)
|
|
84
|
+
|
|
85
|
+
- **Given** `~/.claude/.pactkit-version` matches `__version__`
|
|
86
|
+
- **When** `pactkit guard` is run from a project with stale yaml version
|
|
87
|
+
- **Then** No version mismatch warning is printed
|
|
88
|
+
|
|
89
|
+
### AC7: Old YAML With Version Still Loads (R3)
|
|
90
|
+
|
|
91
|
+
- **Given** A project yaml containing `version: "2.10.1"` (legacy field not yet cleaned)
|
|
92
|
+
- **When** `load_config()` is called
|
|
93
|
+
- **Then** Config loads without error
|
|
94
|
+
|
|
95
|
+
## Target Call Chain
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
pactkit update --if-needed
|
|
99
|
+
→ cli.py: read ~/.claude/.pactkit-version (R2)
|
|
100
|
+
→ if match: skip, exit 0
|
|
101
|
+
→ if mismatch: deploy() → _deploy_classic()
|
|
102
|
+
→ deployer.py: write ~/.claude/.pactkit-version (R1)
|
|
103
|
+
|
|
104
|
+
pactkit guard
|
|
105
|
+
→ guards.py: check_version_mismatch()
|
|
106
|
+
→ read ~/.claude/.pactkit-version (R4)
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Implementation Steps
|
|
110
|
+
|
|
111
|
+
| Step | File | Action | Dependencies | Risk |
|
|
112
|
+
|------|------|--------|-------------|------|
|
|
113
|
+
| 1 | `src/pactkit/generators/deployer.py` | Write `.pactkit-version` at end of `_deploy_classic()` | None | Low |
|
|
114
|
+
| 2 | `src/pactkit/cli.py` | Change `--if-needed` to read global marker | Step 1 | Low |
|
|
115
|
+
| 3 | `src/pactkit/guards.py` | Change `check_version_mismatch()` to read global marker | Step 1 | Low |
|
|
116
|
+
| 4 | `src/pactkit/config.py` | Remove `version` from `get_default_config()`, `auto_merge`, `_rewrite_yaml` | None | Medium |
|
|
117
|
+
| 5 | `tests/unit/` | Update version-related tests | Steps 1-4 | Low |
|
|
118
|
+
|
|
119
|
+
## Security Scope
|
|
120
|
+
|
|
121
|
+
| Check | Applicable | Reason |
|
|
122
|
+
|-------|------------|--------|
|
|
123
|
+
| SEC-1 | N/A | No secrets |
|
|
124
|
+
| SEC-2 | N/A | No user input handling |
|
|
125
|
+
| SEC-3 | N/A | No database operations |
|
|
126
|
+
| SEC-4 | N/A | No frontend code |
|
|
127
|
+
| SEC-5 | N/A | No authentication logic |
|
|
128
|
+
| SEC-6 | N/A | No API endpoints |
|
|
129
|
+
| SEC-7 | N/A | No error handling code |
|
|
130
|
+
| SEC-8 | N/A | No dependency changes |
|
|
131
|
+
|
|
132
|
+
## Out of Scope
|
|
133
|
+
|
|
134
|
+
- Adapter packages (codex, copilot, opencode) — they already have their own `.pactkit-version` mechanism
|
|
135
|
+
- Plugin/marketplace manifests — `version` in `plugin.json` and `marketplace.json` is package metadata, not deployment state
|
|
@@ -350,20 +350,16 @@ def main():
|
|
|
350
350
|
args = parser.parse_args()
|
|
351
351
|
|
|
352
352
|
if args.command in ("init", "update", "upgrade"):
|
|
353
|
-
# STORY-slim-
|
|
353
|
+
# STORY-slim-102: --if-needed checks global deploy marker, not project yaml
|
|
354
354
|
if args.command == "update" and getattr(args, "if_needed", False):
|
|
355
355
|
from pathlib import Path
|
|
356
356
|
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
cfg = load_config(yaml_path)
|
|
362
|
-
yaml_version = cfg.get("version", "")
|
|
363
|
-
if yaml_version == __version__:
|
|
357
|
+
marker = Path.home() / ".claude" / ".pactkit-version"
|
|
358
|
+
if marker.exists():
|
|
359
|
+
deployed_version = marker.read_text().strip()
|
|
360
|
+
if deployed_version == __version__:
|
|
364
361
|
print(f"PactKit {__version__} up-to-date — skipping redeploy")
|
|
365
362
|
raise SystemExit(0)
|
|
366
|
-
print(f"PactKit version mismatch: {yaml_version} → {__version__}. Updating...")
|
|
367
363
|
else:
|
|
368
364
|
print("No pactkit.yaml found. Running first-time setup...")
|
|
369
365
|
|
|
@@ -9,8 +9,6 @@ from typing import Union
|
|
|
9
9
|
|
|
10
10
|
import yaml
|
|
11
11
|
|
|
12
|
-
from pactkit import __version__
|
|
13
|
-
|
|
14
12
|
# ---------------------------------------------------------------------------
|
|
15
13
|
# Valid identifiers (the registry of all known components)
|
|
16
14
|
# ---------------------------------------------------------------------------
|
|
@@ -88,6 +86,7 @@ VALID_RULES = frozenset(
|
|
|
88
86
|
"08-architecture-principles",
|
|
89
87
|
"09-sectional-write",
|
|
90
88
|
"11-pdca-nudge",
|
|
89
|
+
"12-solution-design",
|
|
91
90
|
}
|
|
92
91
|
)
|
|
93
92
|
|
|
@@ -154,7 +153,6 @@ class PactKitConfig:
|
|
|
154
153
|
def get_default_config() -> dict:
|
|
155
154
|
"""Return the default config with all components enabled."""
|
|
156
155
|
return {
|
|
157
|
-
"version": __version__,
|
|
158
156
|
"stack": "auto",
|
|
159
157
|
"root": ".",
|
|
160
158
|
"developer": "",
|
|
@@ -511,10 +509,10 @@ def auto_merge_config_file(path: Union[Path, str]) -> list[str]:
|
|
|
511
509
|
user_data[key] = defaults[key]
|
|
512
510
|
added.append(f"section: {key}")
|
|
513
511
|
|
|
514
|
-
#
|
|
515
|
-
if
|
|
516
|
-
user_data["version"]
|
|
517
|
-
added.append(
|
|
512
|
+
# STORY-slim-102: Remove stale version field from project yaml
|
|
513
|
+
if "version" in user_data:
|
|
514
|
+
del user_data["version"]
|
|
515
|
+
added.append("removed: version (now tracked globally)")
|
|
518
516
|
|
|
519
517
|
if added:
|
|
520
518
|
_rewrite_yaml(path, user_data)
|
|
@@ -582,7 +580,6 @@ def _rewrite_yaml(path: Path, data: dict) -> None:
|
|
|
582
580
|
"# Edit this file to customize which components are deployed.",
|
|
583
581
|
"# Remove items from a list to disable them. Default: all enabled.",
|
|
584
582
|
"",
|
|
585
|
-
f'version: "{__version__}"',
|
|
586
583
|
_render_stack_line(data.get('stack', 'auto')),
|
|
587
584
|
f"root: {data.get('root', '.')}",
|
|
588
585
|
f'developer: "{data.get("developer", "")}"',
|
|
@@ -996,7 +993,6 @@ def generate_default_yaml(stack=None) -> str:
|
|
|
996
993
|
"# All agents, commands, skills, and rules are deployed by default.",
|
|
997
994
|
"# To exclude specific items, add an exclude list (e.g., exclude_skills: [pactkit-draw]).",
|
|
998
995
|
"",
|
|
999
|
-
f'version: "{cfg["version"]}"',
|
|
1000
996
|
_render_stack_line(cfg['stack']),
|
|
1001
997
|
f"root: {cfg['root']}",
|
|
1002
998
|
f'developer: "{cfg["developer"]}"',
|
|
@@ -397,6 +397,10 @@ def _deploy_classic(config=None, target=None):
|
|
|
397
397
|
f"({n_skills} embedded + {n_commands} commands), "
|
|
398
398
|
f"{n_rules}/{total_rules} Rules"
|
|
399
399
|
)
|
|
400
|
+
|
|
401
|
+
# STORY-slim-102: Write global version marker
|
|
402
|
+
atomic_write(claude_root / ".pactkit-version", f"{__version__}\n")
|
|
403
|
+
|
|
400
404
|
_print_mcp_recommendations()
|
|
401
405
|
|
|
402
406
|
|
|
@@ -7,7 +7,7 @@ from __future__ import annotations
|
|
|
7
7
|
from pathlib import Path
|
|
8
8
|
|
|
9
9
|
from pactkit import __version__
|
|
10
|
-
from pactkit.config import find_pactkit_yaml
|
|
10
|
+
from pactkit.config import find_pactkit_yaml
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
def check_init_markers(project_root: Path) -> tuple[bool, list[str]]:
|
|
@@ -76,33 +76,37 @@ def _parse_version(v: str) -> tuple[int, ...]:
|
|
|
76
76
|
return ()
|
|
77
77
|
|
|
78
78
|
|
|
79
|
+
def _get_global_version_marker() -> Path:
|
|
80
|
+
"""Return path to the global deploy version marker."""
|
|
81
|
+
return Path.home() / ".claude" / ".pactkit-version"
|
|
82
|
+
|
|
83
|
+
|
|
79
84
|
def check_version_mismatch(project_root: Path) -> str | None:
|
|
80
|
-
"""Check if
|
|
85
|
+
"""Check if global deploy marker version differs from installed __version__.
|
|
81
86
|
|
|
82
87
|
Returns:
|
|
83
|
-
Warning message if mismatch, None if versions match or
|
|
88
|
+
Warning message if mismatch, None if versions match or marker not found.
|
|
84
89
|
"""
|
|
85
|
-
|
|
86
|
-
if
|
|
90
|
+
marker = _get_global_version_marker()
|
|
91
|
+
if not marker.exists():
|
|
87
92
|
return None
|
|
88
93
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
if not yaml_version or yaml_version == __version__:
|
|
94
|
+
deployed_version = marker.read_text().strip()
|
|
95
|
+
if not deployed_version or deployed_version == __version__:
|
|
92
96
|
return None
|
|
93
97
|
|
|
94
|
-
|
|
98
|
+
deployed_v = _parse_version(deployed_version)
|
|
95
99
|
installed_v = _parse_version(__version__)
|
|
96
100
|
|
|
97
|
-
if not
|
|
98
|
-
return f"Version mismatch:
|
|
101
|
+
if not deployed_v or not installed_v:
|
|
102
|
+
return f"Version mismatch: deployed {deployed_version} vs installed {__version__}"
|
|
99
103
|
|
|
100
|
-
if
|
|
104
|
+
if deployed_v > installed_v:
|
|
101
105
|
return (
|
|
102
|
-
f"Version mismatch:
|
|
106
|
+
f"Version mismatch: deployed {deployed_version} > installed {__version__}\n"
|
|
103
107
|
f" Run `pipx upgrade pactkit` to update the CLI"
|
|
104
108
|
)
|
|
105
109
|
return (
|
|
106
|
-
f"Version mismatch:
|
|
110
|
+
f"Version mismatch: deployed {deployed_version} < installed {__version__}\n"
|
|
107
111
|
f" Run `pactkit update` to sync"
|
|
108
112
|
)
|
|
@@ -79,6 +79,9 @@ allowed-tools: [Read, Write, Edit, Bash, Glob, Grep]
|
|
|
79
79
|
3. **Topology-Aware Trace (Conditional)** — if `detect_topology(root)` includes `api_call` or `agent`:
|
|
80
80
|
- For **api_call**: Run `api_convention_summary(root)` and include path prefixes, fetch function names, and total call count in the Archaeologist Report. This prevents API path convention bugs in downstream implementation.
|
|
81
81
|
- For **agent**: Note orchestration edges from AgentParser (LangGraph/YAML/MCP) in the report so downstream changes respect agent flow.
|
|
82
|
+
4. **Solution Design Protocol (Conditional)** — if the requirement involves frameworks already used by the project:
|
|
83
|
+
- Execute the **Solution Design Protocol** from `12-solution-design.md` to evaluate capability delta (framework native + project existing vs. needs implementation).
|
|
84
|
+
- Include the Capability Assessment output in Phase 2 Spec writing.
|
|
82
85
|
|
|
83
86
|
## 🎬 Phase 2: Design & Impact
|
|
84
87
|
1. **Diff**: Compare User Request vs Current Reality (from Phase 1).
|
|
@@ -175,6 +178,9 @@ allowed-tools: [Read, Write, Edit, Bash, Glob, Grep]
|
|
|
175
178
|
3. **Topology-Aware Trace (Conditional)** — if `detect_topology(root)` includes `api_call` or `agent`:
|
|
176
179
|
- For **api_call**: Run `api_convention_summary(root)` to check API path prefixes and fetch function conventions. Use these conventions when writing new API calls to maintain consistency.
|
|
177
180
|
- For **agent**: Check AgentParser output for orchestration edges so new code doesn't break agent flow.
|
|
181
|
+
4. **Solution Design Protocol (Conditional)** — if the implementation involves frameworks already used by the project:
|
|
182
|
+
- Execute the **Solution Design Protocol** from `12-solution-design.md` to evaluate capability delta before writing code.
|
|
183
|
+
- Output brief capability assessment before proceeding to Phase 2.
|
|
178
184
|
|
|
179
185
|
## 🎬 Phase 2: Test Scaffolding (TDD)
|
|
180
186
|
1. **Constraint**: NEVER write source code in this phase — doing so breaks TDD causality: tests must exist before the code they verify.
|