pactkit 2.10.4__tar.gz → 2.10.6__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.6}/.github/workflows/pactkit.yml +1 -1
- {pactkit-2.10.4 → pactkit-2.10.6}/CHANGELOG.md +13 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/PKG-INFO +3 -3
- {pactkit-2.10.4 → pactkit-2.10.6}/README.md +2 -2
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/architecture/governance/archive/lessons_archive_202603.md +2 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/architecture/governance/lessons.md +3 -3
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/architecture/governance/rules.md +1 -1
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/product/archive/archive_202604.md +29 -0
- pactkit-2.10.6/docs/product/context.md +28 -0
- pactkit-2.10.6/docs/specs/STORY-slim-101.md +155 -0
- pactkit-2.10.6/docs/specs/STORY-slim-102.md +135 -0
- pactkit-2.10.6/docs/specs/STORY-slim-103.md +100 -0
- pactkit-2.10.6/docs/specs/STORY-slim-104.md +77 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/pyproject.toml +1 -1
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/__init__.py +1 -1
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/cli.py +5 -9
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/config.py +5 -9
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/generators/deployer.py +4 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/guards.py +18 -14
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/prompts/commands.py +6 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/prompts/rules.py +162 -7
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/e2e/cli/test_cli_e2e.py +13 -15
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug013_config_single_source.py +2 -1
- pactkit-2.10.6/tests/unit/test_bug026_version_sync.py +186 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_config.py +8 -6
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_config_auto_merge.py +3 -5
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_deployer_cleanup.py +10 -5
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_prompt_structural_invariants.py +2 -2
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_release_v110.py +3 -3
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_selective_deploy.py +2 -1
- pactkit-2.10.6/tests/unit/test_solution_design_rule.py +137 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story014_release.py +3 -6
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story033_config_backfill.py +3 -3
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story063_prompt_slimming.py +2 -1
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim010_dry_refactor.py +4 -5
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim011_command_rules.py +2 -2
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim021.py +2 -2
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim023.py +25 -8
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim026.py +2 -2
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim077_monorepo_stack.py +4 -3
- pactkit-2.10.6/tests/unit/test_story_slim102_version_marker.py +146 -0
- pactkit-2.10.6/tests/unit/test_story_slim104_should_semantics.py +29 -0
- pactkit-2.10.4/docs/product/context.md +0 -28
- pactkit-2.10.4/tests/unit/test_bug026_version_sync.py +0 -153
- {pactkit-2.10.4 → pactkit-2.10.6}/.github/workflows/publish.yml +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/.gitignore +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/.opencode/pactkit.yaml +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/AGENTS.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/CODE_OF_CONDUCT.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/CONTRIBUTING.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/LICENSE +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/SECURITY.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/architecture/governance/archive/lessons_archive_202602.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/architecture/governance/harness_audit.json +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/architecture/governance/philosophy.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/assets/logo.png +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/guides/codex-integration-preresearch.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/guides/tool-integration-checklist.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/product/archive/archive_202602.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/product/archive/archive_202603.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/product/friction-log.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/product/prd.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/product/sprint_board.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-001.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-002.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-003.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-004.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-005.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-006.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-007.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-008.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-009.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-010.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-011.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-012.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-013.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-014.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-015.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-016.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-017.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-018.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-019.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-020.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-021.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-022.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-023.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-024.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-025.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-026.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-027.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-028.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-029.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-030.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-031.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-032.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-033.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-034.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-035.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-slim-001.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-slim-002.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-slim-003.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-slim-004.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-slim-005.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-slim-006.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-slim-089.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/HOTFIX-slim-023.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/HOTFIX-slim-049.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/HOTFIX-slim-050.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/HOTFIX-slim-051.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/HOTFIX-slim-052.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/HOTFIX-slim-061.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/HOTFIX-slim-062.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/HOTFIX-slim-067.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/HOTFIX-slim-069.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/HOTFIX-slim-070.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/HOTFIX-slim-085.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/HOTFIX-slim-087.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/HOTFIX-slim-096.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/HOTFIX-slim-099.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-001.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-002.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-003.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-004.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-005.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-006.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-007.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-008.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-009.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-010.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-011.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-012.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-013.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-014.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-015.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-016.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-017.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-018.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-019.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-020.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-021.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-022.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-023.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-024.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-025.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-026.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-027.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-028.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-029.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-030.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-031.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-032.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-033.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-034.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-035.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-036.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-037.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-038.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-039.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-040.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-041.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-042.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-043.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-044.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-045.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-046.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-047.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-048.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-049.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-050.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-051.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-052.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-053.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-054.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-055.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-056.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-057.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-058.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-059.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-060.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-061.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-062.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-063.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-064.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-065.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-069.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-070.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-071.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-072.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-073.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-001.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-005.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-006.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-007.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-009.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-010.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-011.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-012.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-013.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-014.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-015.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-016.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-017.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-018.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-019.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-020.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-021.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-022.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-023.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-024.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-028.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-029.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-030.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-031.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-032.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-033.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-034.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-035.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-036.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-037.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-038.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-039.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-040.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-041.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-042.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-043.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-044.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-045.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-046.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-047.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-048.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-049.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-050.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-051.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-052.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-053.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-054.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-055.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-056.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-057.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-058.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-059.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-060.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-063.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-066.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-067.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-068.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-069.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-070.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-071.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-072.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-073.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-074.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-075.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-076.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-077.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-078.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-079.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-080.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-081.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-082.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-083.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-084.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-086.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-088.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-089.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-090.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-091.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-092.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-093.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-094.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-095.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-097.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-098.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-099.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-100.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/test_cases/BUG-001_case.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/test_cases/BUG-002_case.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/test_cases/STORY-slim-028_case.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/test_cases/STORY-slim-029_case.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/test_cases/STORY-slim-031_case.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/test_cases/STORY-slim-032_case.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/test_cases/STORY-slim-033_case.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/docs/test_cases/STORY-slim-034_case.md +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/opencode.json +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/__main__.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/audit.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/backfill.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/cleaners.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/context_gen.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/coverage_gate.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/doctor.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/garden.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/generators/__init__.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/generators/adapter.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/generators/deploy_base.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/id_generator.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/invariants.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/issue_sync.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/lazy_visualize.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/lessons.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/lint_runner.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/observe.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/profiles.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/prompts/__init__.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/prompts/agents.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/prompts/references.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/prompts/skills.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/prompts/workflows.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/regression.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/schemas.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/scripts.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/sec_scope.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/skills/__init__.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/skills/analyzers/__init__.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/skills/analyzers/go_analyzer.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/skills/analyzers/java_analyzer.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/skills/analyzers/python_analyzer.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/skills/analyzers/ts_analyzer.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/skills/board.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/skills/report.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/skills/scaffold.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/skills/spec_linter.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/skills/visualize.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/spec_status.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/test_mapper.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/utils.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/validators.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/conftest.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/e2e/__init__.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/e2e/cli/__init__.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/fixtures/agent_parser/agents_dir/researcher.yaml +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/fixtures/agent_parser/agents_dir/writer.yaml +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/fixtures/agent_parser/langgraph_app.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/fixtures/agent_parser/mcp_settings.json +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/fixtures/api_call_parser/axios_style.tsx +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/fixtures/api_call_parser/dynamic.tsx +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/fixtures/api_call_parser/page.tsx +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/integration/__init__.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/integration/test_deploy_classic.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_agent_features.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_agent_frontmatter.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_agents_enrichment.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_audit.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_blast_radius.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_board_bug027.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_board_sections.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug001_skill_path.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug002_plugin_paths.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug003_multi_import.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug004_dead_set.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug005_archive_taskless.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug006_scan_excludes.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug007_stale_trace_refs.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug008_stale_command_refs.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug009_project_config_backfill.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug010_rewrite_yaml.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug011_stale_refs.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug012_call_graph_filter.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug014_version_hygiene.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug017_project_init_playbook.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug018_issue_tracker_verification.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug019_venv_deployment.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug020_claude_md_backup.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug025_release_delegation.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug028_ghost_refs.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug029_stack_detection_fallback.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug030_spec_lint_cli.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug031_docstring_accuracy.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug034_plan_metadata_template.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug_021.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug_022.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug_023.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug_024.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug_slim001_env_detection.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug_slim002_instruction_collision.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug_slim003.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug_slim004.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug_slim005.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug_slim006.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug_slim089_global_claude_md.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_check_command.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_check_extensions_072_073.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_check_playbook_072_073.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_command_frontmatter.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_command_visualize_modes.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_complexity.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_constitution_sharpening.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_context_gen.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_create_skill.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_cross_flow_matrix.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_deploy_base.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_deployer_plugin.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_design_command.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_done_gates.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_draw_prompt.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_draw_references.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_drawio_mcp.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_garden.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_home_path_fix.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_hotfix_command.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_init_guard.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_init_playbook_074.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_lang_profiles.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_layer_violations.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_lessons_rotation_075.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_list_stories.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_mcp_integration.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_model_config.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_modular_constitution.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_monorepo_detect.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_multi_prefix.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_observe.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_pdca_slim.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_profiles.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_project_visibility.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_prompt_cli_refs.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_prompt_quality_075.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_prompts_package.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_release.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_release_field.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_render_prompt.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_report_parser.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_report_unified.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_review_command.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_rules_enrichment.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_scaffold.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_scaffold_developer_prefix.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_schemas.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_script_extraction.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_session_context.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_skill_structure.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_skills_enrichment.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_slim_deps_088.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_smart_regression.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_sprint_command.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_stack_references.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_status_command.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_statusline.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story015_ci_lint_gate.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story016_claude_md.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story017_init_claude_md.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story018_arch_staleness.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story019_bailout.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story020_horizon.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story021_rfc.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story022_decision_tree.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story023_test_quality.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story024_native_agent.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story025_ci_pipeline.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story026_issue_tracker.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story027_hooks.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story028_rule_scoping.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story029_doctor.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story030_lint.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story031_git_init_guard.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story032_greenfield_redirect.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story034_plan_config_refresh.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story035_readme_docs.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story037_regression_fix.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story038_call_graph_update.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story039_venv_config.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story040_layered_claude_md.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story042_spec_linter.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story043_active_clarify.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story044_consistency_check.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story045_auto_pr.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story046_agent_adapter.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story047_enterprise_flags.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story048_worktree_isolation.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story049_community_standards.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story050_doc_only_shortcut.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story051_workflow_streamlining.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story052_conditional_github_release.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story053_impact_regression.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story055_commands.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story055_config.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story055_spec_linter.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story056_commands.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story056_config.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story057_implicit_cleanup.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story058_opencode_extraction.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story058_routing_fix.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story059_codex_removal.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story060_init_hang.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story061_remove_thinking.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story062_mcp_recommendations.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story064_venv_local_md.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story065_sprint_model.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story072_developer_prefix.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim009_lazy_rules.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim012_ci.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim014_clean.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim014_context.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim014_guard.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim014_lazy_viz.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim014_next_id.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim014_regression.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim014_sec_scope.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim014_validators.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim015_doctor.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim016_testmap_lint.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim017.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim018.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim019_plan_subphases.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim020_explore_stall_fix.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim022.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim024.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim025.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim027.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim028.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim029.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim030.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim031.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim032.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim033.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim034.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim035.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim036.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim037.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim038.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim039.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim040.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim041.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim042.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim043.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim044.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim045.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim046.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim047.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim048.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim049.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim051.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim052.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim053.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim054.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim055.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim056.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim060_codex_profile.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim063.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim065.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim076_multistack.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim078.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim079.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim080.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim081.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim082.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim083.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim084.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim095.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim098_pdca_nudge.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim099_act_context_ref.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_tools.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_topology_parsers_066.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_update_task.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_visualize_call_nested.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_visualize_chain_fix.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_visualize_modes.py +0 -0
- {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_visualize_multilang_chain.py +0 -0
|
@@ -4,6 +4,19 @@ 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.6] - 2026-04-22
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
- **L3 SHOULD semantics** (STORY-slim-104) — Signal Strength Convention L3 Recommended changed from "Violation = warning, non-blocking" to "Default required — skip only with stated reason" (RFC 2119). Added clarification bullet that SHOULD is not optional. Prevents AI from systematically deferring SHOULD tasks.
|
|
11
|
+
|
|
12
|
+
## [2.10.5] - 2026-04-21
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
- **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.
|
|
16
|
+
|
|
17
|
+
### Changed
|
|
18
|
+
- **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.
|
|
19
|
+
|
|
7
20
|
## [2.10.4] - 2026-04-20
|
|
8
21
|
|
|
9
22
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pactkit
|
|
3
|
-
Version: 2.10.
|
|
3
|
+
Version: 2.10.6
|
|
4
4
|
Summary: Spec-driven agentic DevOps toolkit for AI coding assistants
|
|
5
5
|
Project-URL: Homepage, https://pactkit.dev
|
|
6
6
|
Project-URL: Repository, https://github.com/pactkit/pactkit-public
|
|
@@ -41,13 +41,13 @@ Requires-Dist: tree-sitter>=0.25; extra == 'visualize'
|
|
|
41
41
|
Description-Content-Type: text/markdown
|
|
42
42
|
|
|
43
43
|
<p align="center">
|
|
44
|
-
<img src="https://raw.githubusercontent.com/pactkit/pactkit/main/docs/assets/logo.png" alt="PactKit" width="480" />
|
|
44
|
+
<img src="https://raw.githubusercontent.com/pactkit/pactkit-src/main/docs/assets/logo.png" alt="PactKit" width="480" />
|
|
45
45
|
</p>
|
|
46
46
|
|
|
47
47
|
<p align="center">
|
|
48
48
|
<a href="https://pypi.org/project/pactkit/"><img src="https://img.shields.io/pypi/v/pactkit" alt="PyPI version" /></a>
|
|
49
49
|
<a href="https://pypi.org/project/pactkit/"><img src="https://img.shields.io/pypi/pyversions/pactkit" alt="Python" /></a>
|
|
50
|
-
<a href="https://github.com/pactkit/pactkit/actions
|
|
50
|
+
<a href="https://github.com/pactkit/pactkit-src/actions"><img src="https://github.com/pactkit/pactkit-src/actions/workflows/pactkit.yml/badge.svg" alt="CI" /></a>
|
|
51
51
|
<a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue.svg" alt="License: MIT" /></a>
|
|
52
52
|
</p>
|
|
53
53
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<img src="https://raw.githubusercontent.com/pactkit/pactkit/main/docs/assets/logo.png" alt="PactKit" width="480" />
|
|
2
|
+
<img src="https://raw.githubusercontent.com/pactkit/pactkit-src/main/docs/assets/logo.png" alt="PactKit" width="480" />
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
5
|
<p align="center">
|
|
6
6
|
<a href="https://pypi.org/project/pactkit/"><img src="https://img.shields.io/pypi/v/pactkit" alt="PyPI version" /></a>
|
|
7
7
|
<a href="https://pypi.org/project/pactkit/"><img src="https://img.shields.io/pypi/pyversions/pactkit" alt="Python" /></a>
|
|
8
|
-
<a href="https://github.com/pactkit/pactkit/actions
|
|
8
|
+
<a href="https://github.com/pactkit/pactkit-src/actions"><img src="https://github.com/pactkit/pactkit-src/actions/workflows/pactkit.yml/badge.svg" alt="CI" /></a>
|
|
9
9
|
<a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue.svg" alt="License: MIT" /></a>
|
|
10
10
|
</p>
|
|
11
11
|
|
{pactkit-2.10.4 → pactkit-2.10.6}/docs/architecture/governance/archive/lessons_archive_202603.md
RENAMED
|
@@ -48,3 +48,5 @@
|
|
|
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 |
|
|
52
|
+
| 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 |
|
|
@@ -2,9 +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
|
-
| 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
|
-
| 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
5
|
| 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 |
|
|
9
6
|
| 2026-03-24 | regression_workflow_impact hook/store matching uses node.id substring of changed file path, not reverse — e.g. 'useAuth' in 'src/hooks/useAuth.ts' | visualize.py:regression_workflow_impact |
|
|
10
7
|
| 2026-03-25 | export_focus_graphs() in visualize.py uses forward_reach() (not reverse_reach()) because entry points (command/service/page) are graph roots that invoke downward — forward BFS shows their dependency tree | src/pactkit/skills/visualize.py:export_focus_graphs |
|
|
@@ -53,3 +50,6 @@
|
|
|
53
50
|
| 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
51
|
| 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
52
|
| 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 |
|
|
53
|
+
| 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 |
|
|
54
|
+
| 2026-04-22 | When the same bug pattern recurs 3+ times across specs (BUG-010, BUG-slim-089, STORY-033, STORY-slim-054), promote the fix from spec-level to a standing rule in 08-architecture-principles.md — ad-hoc spec fixes do not prevent recurrence | ~/.claude/rules/08-architecture-principles.md:§9 |
|
|
55
|
+
| 2026-04-22 | Signal Strength L3 SHOULD semantics in rules.py:RULES_MODULES['core'] must use RFC 2119 wording — 'warning, non-blocking' caused AI to systematically defer all SHOULD tasks during Act | src/pactkit/prompts/rules.py:51 |
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
## Invariants
|
|
17
17
|
|
|
18
|
-
1. All
|
|
18
|
+
1. All 3790+ 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,32 @@
|
|
|
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
|
|
230
|
+
|
|
231
|
+
### [STORY-slim-103] Rules anti-pattern: Merge-over-Replace + Parameterize-over-Hardcode
|
|
232
|
+
> Spec: docs/specs/STORY-slim-103.md
|
|
233
|
+
|
|
234
|
+
- [x] Add §9 to 08-architecture-principles
|
|
235
|
+
- [x] Expand No Magic Values in 12-solution-design
|
|
236
|
+
- [x] Verify no new rules files
|
|
237
|
+
|
|
238
|
+
### [STORY-slim-104] Fix L3 SHOULD semantics in Signal Strength Convention
|
|
239
|
+
> Spec: docs/specs/STORY-slim-104.md
|
|
240
|
+
|
|
241
|
+
- [x] Change L3 Semantics text in rules.py
|
|
242
|
+
- [x] Add SHOULD clarification note
|
|
243
|
+
- [x] Add test for L3 content
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Project Context (Auto-generated)
|
|
2
|
+
> Last updated: 2026-04-22T19:00:19+08:00 by pactkit context
|
|
3
|
+
|
|
4
|
+
## Sprint Status
|
|
5
|
+
Backlog: 0 | In Progress: 0 | Done: 0 stories
|
|
6
|
+
|
|
7
|
+
## Current Stories
|
|
8
|
+
None
|
|
9
|
+
|
|
10
|
+
## Recent Completions
|
|
11
|
+
None
|
|
12
|
+
|
|
13
|
+
## Active Branches
|
|
14
|
+
develop
|
|
15
|
+
* main
|
|
16
|
+
|
|
17
|
+
## Key Decisions
|
|
18
|
+
- pactkit clean rglob patterns must exclude protected parent dirs (node_modules, .git) — recursive pattern matching deletes dependency internals
|
|
19
|
+
- 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.
|
|
20
|
+
- 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.
|
|
21
|
+
- When the same bug pattern recurs 3+ times across specs (BUG-010, BUG-slim-089, STORY-033, STORY-slim-054), promote the fix from spec-level to a standing rule in 08-architecture-principles.md — ad-hoc spec fixes do not prevent recurrence
|
|
22
|
+
- Signal Strength L3 SHOULD semantics in rules.py:RULES_MODULES['core'] must use RFC 2119 wording — 'warning, non-blocking' caused AI to systematically defer all SHOULD tasks during Act
|
|
23
|
+
|
|
24
|
+
## Next Recommended Action
|
|
25
|
+
`/project-design`
|
|
26
|
+
|
|
27
|
+
## Agent Continuation
|
|
28
|
+
No active work session.
|
|
@@ -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
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# STORY-slim-103: Rules anti-pattern: add Merge-over-Replace and Parameterize-over-Hardcode to existing rules
|
|
2
|
+
|
|
3
|
+
| Field | Value |
|
|
4
|
+
|-------|-------|
|
|
5
|
+
| ID | STORY-slim-103 |
|
|
6
|
+
| Status | Done |
|
|
7
|
+
| Priority | P1 |
|
|
8
|
+
| Release | 2.10.6 |
|
|
9
|
+
|
|
10
|
+
## Background
|
|
11
|
+
|
|
12
|
+
LLM has two systematic design biases that current rules fail to counter:
|
|
13
|
+
|
|
14
|
+
1. **Full-replace bias**: LLM defaults to full file overwrites (Write tool) instead of incremental edits (Edit tool / merge). This has caused 5+ bugs in PactKit history (BUG-010, BUG-slim-089, STORY-033, STORY-slim-054) where user config was silently destroyed.
|
|
15
|
+
|
|
16
|
+
2. **Hardcode bias**: LLM defaults to writing concrete values inline instead of extracting configurable parameters. The existing `No Magic Values` constraint in `12-solution-design.md` only covers code implementation — it misses rules, Specs, configs, and playbooks.
|
|
17
|
+
|
|
18
|
+
Both biases are LLM cognitive shortcuts (lower token cost, simpler reasoning). Without standing rules, each occurrence is discovered as a bug post-facto and fixed as a one-off spec, never promoted to a reusable principle.
|
|
19
|
+
|
|
20
|
+
### PDCA Coverage Map (Rules → Commands)
|
|
21
|
+
|
|
22
|
+
| Rules File | Referenced By |
|
|
23
|
+
|---|---|
|
|
24
|
+
| `08-architecture-principles.md` | Plan, Act, Design, Sprint |
|
|
25
|
+
| `12-solution-design.md` | Plan (Phase 1), Act (Phase 1) |
|
|
26
|
+
|
|
27
|
+
Both target files are loaded into context during architecture decisions (08) and implementation design (12) — the exact phases where these biases manifest.
|
|
28
|
+
|
|
29
|
+
## Requirements
|
|
30
|
+
|
|
31
|
+
### R1: Merge over Replace Principle in 08-architecture-principles.md (MUST)
|
|
32
|
+
|
|
33
|
+
Add §9 to `~/.claude/rules/08-architecture-principles.md` establishing "Merge over Replace" as a standing architecture principle:
|
|
34
|
+
- Signal level: L3 SHOULD (non-blocking, but violation = data loss risk)
|
|
35
|
+
- MUST include a Decision Matrix: when full-replace is safe vs. when incremental merge is required
|
|
36
|
+
- MUST define the criteria: "If the target file may contain user-modified content or sections managed by other tools, use incremental merge"
|
|
37
|
+
- SHOULD reference the 5 historical bugs as evidence (without bloating the rule)
|
|
38
|
+
|
|
39
|
+
### R2: Expand No Magic Values to All Artifacts in 12-solution-design.md (MUST)
|
|
40
|
+
|
|
41
|
+
Expand the existing `No Magic Values` constraint in `12-solution-design.md` Implementation Constraints:
|
|
42
|
+
- Broaden scope from "code implementation" to "all artifacts" (rules, Specs, configs, playbooks, prompts)
|
|
43
|
+
- Add a **Flexibility Litmus Test**: "If changing this value requires grep + multi-file edits, it should be parameterized"
|
|
44
|
+
- Add explicit examples for non-code artifacts (rule thresholds, path patterns, tool names)
|
|
45
|
+
|
|
46
|
+
### R3: No New Rules Files (MUST NOT)
|
|
47
|
+
|
|
48
|
+
MUST NOT create any new rules file. All changes MUST be edits to existing `08-architecture-principles.md` and `12-solution-design.md` — violation breaks the user's constraint of keeping the rules count stable.
|
|
49
|
+
|
|
50
|
+
## Acceptance Criteria
|
|
51
|
+
|
|
52
|
+
### AC1: Merge over Replace principle exists in 08 (R1)
|
|
53
|
+
|
|
54
|
+
- **Given** `08-architecture-principles.md` is loaded by Plan/Act/Design/Sprint
|
|
55
|
+
- **When** LLM reads the file during any PDCA command
|
|
56
|
+
- **Then** §9 "Merge over Replace" is present with a Decision Matrix distinguishing safe-to-replace vs. must-merge scenarios
|
|
57
|
+
|
|
58
|
+
### AC2: No Magic Values scope covers all artifacts (R2)
|
|
59
|
+
|
|
60
|
+
- **Given** `12-solution-design.md` is loaded by Plan/Act
|
|
61
|
+
- **When** LLM enters Implementation Constraints during Solution Design Protocol
|
|
62
|
+
- **Then** "No Magic Values" explicitly states it applies to rules, Specs, configs, playbooks — not just code
|
|
63
|
+
- **Then** a Flexibility Litmus Test is present ("If changing this value requires grep + multi-file edits → parameterize")
|
|
64
|
+
|
|
65
|
+
### AC3: No new rules files created (R3)
|
|
66
|
+
|
|
67
|
+
- **Given** the current rules directory has N files
|
|
68
|
+
- **When** this story is implemented
|
|
69
|
+
- **Then** the rules directory still has exactly N files (no additions, no deletions)
|
|
70
|
+
|
|
71
|
+
## Target Call Chain
|
|
72
|
+
|
|
73
|
+
N/A — this story modifies rules files (prompt-level artifacts), not source code. No call chain.
|
|
74
|
+
|
|
75
|
+
## Implementation Steps
|
|
76
|
+
|
|
77
|
+
| Step | File | Action | Dependencies | Risk |
|
|
78
|
+
|------|------|--------|-------------|------|
|
|
79
|
+
| 1 | `~/.claude/rules/08-architecture-principles.md` | Add §9 Merge over Replace with Decision Matrix after §8 | None | Low |
|
|
80
|
+
| 2 | `~/.claude/rules/12-solution-design.md` | Expand No Magic Values scope + add Flexibility Litmus Test | None | Low |
|
|
81
|
+
| 3 | Verify | Confirm no new files in `~/.claude/rules/`, spec-lint passes | Step 1-2 | Low |
|
|
82
|
+
|
|
83
|
+
## Security Scope
|
|
84
|
+
|
|
85
|
+
| Check | Applicable | Reason |
|
|
86
|
+
|-------|------------|--------|
|
|
87
|
+
| SEC-1 Input Validation | N/A | Docs/rules only |
|
|
88
|
+
| SEC-2 Auth/AuthZ | N/A | Docs/rules only |
|
|
89
|
+
| SEC-3 Data Exposure | N/A | Docs/rules only |
|
|
90
|
+
| SEC-4 Injection | N/A | Docs/rules only |
|
|
91
|
+
| SEC-5 Cryptography | N/A | Docs/rules only |
|
|
92
|
+
| SEC-6 Dependency | N/A | Docs/rules only |
|
|
93
|
+
| SEC-7 Logging | N/A | Docs/rules only |
|
|
94
|
+
| SEC-8 Config | N/A | Docs/rules only |
|
|
95
|
+
|
|
96
|
+
## Out of Scope
|
|
97
|
+
|
|
98
|
+
- Modifying PDCA skill files (skill.md) — the `@` references already load 08 and 12, no skill changes needed
|
|
99
|
+
- Adding enforcement tooling (linter, hook) — this story adds principles only; automation is a separate story
|
|
100
|
+
- Modifying PactKit source code — rules files are prompt-level artifacts
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# STORY-slim-104: Fix L3 SHOULD semantics in Signal Strength Convention
|
|
2
|
+
|
|
3
|
+
| Field | Value |
|
|
4
|
+
|-------|-------|
|
|
5
|
+
| ID | STORY-slim-104 |
|
|
6
|
+
| Status | Done |
|
|
7
|
+
| Priority | P1 |
|
|
8
|
+
| Release | 2.10.6 |
|
|
9
|
+
|
|
10
|
+
## Background
|
|
11
|
+
|
|
12
|
+
Signal Strength Convention 表中 L3 Recommended 的 Semantics 列当前定义为 "Violation = warning, non-blocking"。这个措辞让 AI 将 SHOULD 误解为 "可以不做",导致 Spec 中标记为 SHOULD 的 task 被系统性 defer。
|
|
13
|
+
|
|
14
|
+
RFC 2119 对 SHOULD 的正确定义是:"除非有充分理由,否则必须做"(there may exist valid reasons to ignore a particular item, but the full implications must be understood and carefully weighed before choosing a different course)。当前措辞与 RFC 2119 语义不符。
|
|
15
|
+
|
|
16
|
+
**实际影响**: 观测到 AI 在 Act 阶段完成所有 MUST task 后,将全部 SHOULD task defer,给出的理由包括 "context 太长"、"改动大下次做" 等。这些 SHOULD task 最终全部被补回,总共只花 15 分钟。
|
|
17
|
+
|
|
18
|
+
**Canonical source**: `src/pactkit/prompts/rules.py:51`,`RULES_MODULES["core"]` 模板字符串。
|
|
19
|
+
|
|
20
|
+
## Requirements
|
|
21
|
+
|
|
22
|
+
### R1: Fix L3 Semantics to RFC 2119 (MUST)
|
|
23
|
+
|
|
24
|
+
Change L3 Recommended row Semantics from `Violation = warning, non-blocking` to `Default required — skip only with stated reason`. This aligns with RFC 2119 SHOULD semantics: the default is to do it, and skipping requires an explicit, stated justification.
|
|
25
|
+
|
|
26
|
+
### R2: Add SHOULD clarification note (SHOULD)
|
|
27
|
+
|
|
28
|
+
Add a bullet point after the table clarifying that `SHOULD` (L3) is NOT optional — it means "do unless you have a stated reason not to". This prevents the table's compact format from being misread.
|
|
29
|
+
|
|
30
|
+
## Acceptance Criteria
|
|
31
|
+
|
|
32
|
+
### AC1: L3 Semantics text updated (R1)
|
|
33
|
+
|
|
34
|
+
- **Given** `src/pactkit/prompts/rules.py` contains the Signal Strength Convention table
|
|
35
|
+
- **When** I read the L3 Recommended row
|
|
36
|
+
- **Then** the Semantics column reads `Default required — skip only with stated reason` (not `Violation = warning, non-blocking`)
|
|
37
|
+
|
|
38
|
+
### AC2: Clarification note present (R2)
|
|
39
|
+
|
|
40
|
+
- **Given** `src/pactkit/prompts/rules.py` contains the Signal Strength Convention section
|
|
41
|
+
- **When** I read the bullet points after the table
|
|
42
|
+
- **Then** there is a bullet clarifying that SHOULD (L3) is not optional — skipping requires a stated reason
|
|
43
|
+
|
|
44
|
+
### AC3: Deployed rules file reflects change (R1, R2)
|
|
45
|
+
|
|
46
|
+
- **Given** pactkit has been deployed via `pactkit init` or `pactkit deploy`
|
|
47
|
+
- **When** I read `~/.claude/rules/01-core-protocol.md`
|
|
48
|
+
- **Then** the L3 row and clarification note match the source in `rules.py`
|
|
49
|
+
|
|
50
|
+
## Target Call Chain
|
|
51
|
+
|
|
52
|
+
`RULES_MODULES["core"]` (rules.py:4) → `deployer._deploy_rules()` → writes `01-core-protocol.md`
|
|
53
|
+
|
|
54
|
+
## Implementation Steps
|
|
55
|
+
|
|
56
|
+
| Step | File | Action | Dependencies | Risk |
|
|
57
|
+
|------|------|--------|-------------|------|
|
|
58
|
+
| 1 | `src/pactkit/prompts/rules.py` | Change L3 Semantics text + add SHOULD clarification bullet | None | Low |
|
|
59
|
+
| 2 | `tests/` | Add/update test verifying L3 row content | Step 1 | Low |
|
|
60
|
+
|
|
61
|
+
## Security Scope
|
|
62
|
+
|
|
63
|
+
| Check | Applicable | Reason |
|
|
64
|
+
|-------|------------|--------|
|
|
65
|
+
| SEC-1 | N/A | Prompt text change only, no code execution logic |
|
|
66
|
+
| SEC-2 | N/A | No user input handling |
|
|
67
|
+
| SEC-3 | N/A | No database patterns |
|
|
68
|
+
| SEC-4 | N/A | No frontend files |
|
|
69
|
+
| SEC-5 | N/A | No auth/session logic |
|
|
70
|
+
| SEC-6 | N/A | No API/route files |
|
|
71
|
+
| SEC-7 | N/A | No error handling logic |
|
|
72
|
+
| SEC-8 | N/A | No dependency changes |
|
|
73
|
+
|
|
74
|
+
## Out of Scope
|
|
75
|
+
|
|
76
|
+
- STORY-slim-086 Spec 中的中文版表格(历史记录,不影响部署)
|
|
77
|
+
- 其他 rules 文件中对 SHOULD 的使用(语义由此表定义,使用方不需改)
|