pactkit 2.15.0__tar.gz → 2.15.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pactkit-2.15.2/.codegraph/.gitignore +5 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/CHANGELOG.md +23 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/PKG-INFO +1 -1
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/architecture/governance/archive/lessons_archive_202603.md +3 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/architecture/governance/lessons.md +3 -3
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/architecture/governance/rules.md +1 -1
- pactkit-2.15.2/docs/product/archive/archive_202606.md +37 -0
- pactkit-2.15.2/docs/product/archive/archive_202607.md +13 -0
- pactkit-2.15.2/docs/product/context.md +29 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/product/sprint_board.md +11 -0
- pactkit-2.15.2/docs/specs/HOTFIX-slim-130.md +104 -0
- pactkit-2.15.2/docs/specs/HOTFIX-slim-131.md +21 -0
- pactkit-2.15.2/docs/specs/HOTFIX-slim-132.md +23 -0
- pactkit-2.15.2/docs/specs/STORY-slim-128.md +157 -0
- pactkit-2.15.2/docs/specs/STORY-slim-129.md +134 -0
- pactkit-2.15.2/docs/specs/STORY-slim-132.md +96 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/pyproject.toml +1 -1
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/__init__.py +1 -1
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/config.py +1 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/generators/deploy_base.py +6 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/generators/deployer.py +47 -8
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/prompts/commands.py +21 -5
- pactkit-2.15.2/src/pactkit/prompts/guides.py +657 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/prompts/rules.py +72 -6
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/prompts/skills.py +2 -9
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/schemas.py +2 -1
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/skills/spec_linter.py +1 -1
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_config.py +2 -2
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_prompt_structural_invariants.py +2 -2
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_selective_deploy.py +2 -2
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_solution_design_rule.py +9 -7
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story042_spec_linter.py +42 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story059_codex_removal.py +1 -1
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story063_prompt_slimming.py +3 -1
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim011_command_rules.py +13 -10
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim021.py +3 -3
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim026.py +2 -2
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim112_rules_split.py +8 -7
- pactkit-2.15.2/tests/unit/test_story_slim128_engineering_concerns.py +207 -0
- pactkit-2.15.2/tests/unit/test_story_slim132.py +146 -0
- pactkit-2.15.0/.codegraph/.gitignore +0 -16
- pactkit-2.15.0/docs/product/archive/archive_202606.md +0 -17
- pactkit-2.15.0/docs/product/context.md +0 -29
- {pactkit-2.15.0 → pactkit-2.15.2}/.github/workflows/pactkit.yml +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/.github/workflows/publish.yml +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/.gitignore +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/AGENTS.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/CODE_OF_CONDUCT.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/CONTRIBUTING.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/LICENSE +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/README.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/SECURITY.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/architecture/governance/archive/lessons_archive_202602.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/architecture/governance/harness_audit.json +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/architecture/governance/philosophy.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/assets/logo.png +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/e2e/journey.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/guides/codex-integration-preresearch.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/guides/tool-integration-checklist.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/product/archive/archive_202602.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/product/archive/archive_202603.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/product/archive/archive_202604.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/product/archive/archive_202605.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/product/friction-log.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/product/prd.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-001.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-002.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-003.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-004.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-005.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-006.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-007.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-008.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-009.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-010.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-011.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-012.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-013.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-014.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-015.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-016.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-017.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-018.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-019.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-020.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-021.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-022.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-023.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-024.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-025.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-026.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-027.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-028.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-029.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-030.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-031.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-032.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-033.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-034.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-035.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-slim-001.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-slim-002.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-slim-003.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-slim-004.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-slim-005.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-slim-006.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-slim-089.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-slim-107.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-023.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-049.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-050.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-051.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-052.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-061.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-062.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-067.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-069.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-070.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-085.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-087.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-096.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-099.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-107.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-117.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-122.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-123.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-126.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-127.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-001.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-002.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-003.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-004.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-005.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-006.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-007.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-008.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-009.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-010.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-011.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-012.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-013.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-014.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-015.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-016.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-017.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-018.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-019.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-020.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-021.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-022.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-023.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-024.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-025.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-026.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-027.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-028.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-029.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-030.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-031.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-032.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-033.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-034.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-035.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-036.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-037.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-038.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-039.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-040.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-041.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-042.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-043.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-044.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-045.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-046.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-047.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-048.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-049.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-050.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-051.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-052.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-053.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-054.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-055.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-056.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-057.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-058.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-059.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-060.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-061.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-062.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-063.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-064.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-065.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-069.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-070.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-071.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-072.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-073.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-001.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-005.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-006.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-007.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-009.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-010.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-011.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-012.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-013.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-014.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-015.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-016.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-017.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-018.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-019.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-020.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-021.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-022.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-023.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-024.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-028.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-029.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-030.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-031.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-032.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-033.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-034.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-035.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-036.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-037.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-038.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-039.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-040.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-041.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-042.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-043.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-044.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-045.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-046.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-047.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-048.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-049.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-050.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-051.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-052.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-053.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-054.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-055.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-056.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-057.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-058.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-059.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-060.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-063.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-066.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-067.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-068.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-069.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-070.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-071.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-072.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-073.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-074.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-075.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-076.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-077.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-078.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-079.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-080.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-081.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-082.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-083.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-084.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-086.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-088.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-089.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-090.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-091.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-092.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-093.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-094.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-095.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-097.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-098.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-099.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-100.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-101.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-102.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-103.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-104.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-105.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-106.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-107.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-108.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-109.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-110.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-111.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-112.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-113.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-114.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-115.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-116.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-118.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-119.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-120.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-121.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-124.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-125.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-126.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-127.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/test_cases/BUG-001_case.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/test_cases/BUG-002_case.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/test_cases/STORY-slim-028_case.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/test_cases/STORY-slim-029_case.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/test_cases/STORY-slim-031_case.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/test_cases/STORY-slim-032_case.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/test_cases/STORY-slim-033_case.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/docs/test_cases/STORY-slim-034_case.md +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/opencode.json +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/__main__.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/audit.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/backfill.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/cleaners.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/cli.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/context_gen.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/coverage_gate.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/doctor.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/garden.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/generators/__init__.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/generators/adapter.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/guards.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/id_generator.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/invariants.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/issue_sync.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/lazy_visualize.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/lessons.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/lint_runner.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/observe.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/profiles.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/prompts/__init__.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/prompts/agents.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/prompts/references.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/prompts/workflows.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/regression.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/scripts.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/sec_scope.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/skills/__init__.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/skills/analyzers/__init__.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/skills/analyzers/go_analyzer.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/skills/analyzers/java_analyzer.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/skills/analyzers/python_analyzer.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/skills/analyzers/ts_analyzer.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/skills/board.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/skills/interface_summary.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/skills/report.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/skills/scaffold.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/skills/visualize.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/spec_status.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/test_mapper.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/utils.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/validators.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/conftest.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/e2e/__init__.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/e2e/cli/__init__.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/e2e/cli/test_cli_e2e.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/fixtures/agent_parser/agents_dir/researcher.yaml +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/fixtures/agent_parser/agents_dir/writer.yaml +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/fixtures/agent_parser/langgraph_app.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/fixtures/agent_parser/mcp_settings.json +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/fixtures/api_call_parser/axios_style.tsx +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/fixtures/api_call_parser/dynamic.tsx +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/fixtures/api_call_parser/page.tsx +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/integration/__init__.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/integration/test_deploy_classic.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_agent_features.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_agent_frontmatter.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_agents_enrichment.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_audit.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_blast_radius.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_board_bug027.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_board_sections.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug001_skill_path.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug002_plugin_paths.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug003_multi_import.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug004_dead_set.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug005_archive_taskless.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug006_scan_excludes.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug007_stale_trace_refs.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug008_stale_command_refs.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug009_project_config_backfill.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug010_rewrite_yaml.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug011_stale_refs.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug012_call_graph_filter.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug013_config_single_source.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug014_version_hygiene.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug017_project_init_playbook.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug018_issue_tracker_verification.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug019_venv_deployment.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug020_claude_md_backup.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug025_release_delegation.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug026_version_sync.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug028_ghost_refs.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug029_stack_detection_fallback.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug030_spec_lint_cli.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug031_docstring_accuracy.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug034_plan_metadata_template.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug_021.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug_022.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug_023.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug_024.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug_slim001_env_detection.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug_slim002_instruction_collision.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug_slim003.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug_slim004.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug_slim005.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug_slim006.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug_slim089_global_claude_md.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_check_command.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_check_extensions_072_073.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_check_playbook_072_073.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_command_frontmatter.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_command_visualize_modes.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_complexity.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_config_auto_merge.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_constitution_sharpening.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_context_gen.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_create_skill.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_cross_flow_matrix.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_deploy_base.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_deployer_cleanup.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_deployer_plugin.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_design_command.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_done_gates.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_draw_prompt.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_draw_references.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_drawio_mcp.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_garden.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_home_path_fix.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_hotfix_command.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_init_guard.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_init_playbook_074.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_interface_summary.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_lang_profiles.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_layer_violations.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_lessons_rotation_075.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_list_stories.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_mcp_integration.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_model_config.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_modular_constitution.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_monorepo_detect.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_multi_prefix.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_observe.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_pdca_slim.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_profiles.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_project_visibility.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_prompt_cli_refs.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_prompt_quality_075.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_prompts_package.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_release.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_release_field.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_release_v110.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_render_prompt.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_report_parser.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_report_unified.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_review_command.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_rules_enrichment.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_scaffold.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_scaffold_developer_prefix.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_schemas.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_script_extraction.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_session_context.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_skill_structure.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_skills_enrichment.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_slim_deps_088.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_smart_regression.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_sprint_command.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_stack_references.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_status_command.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_statusline.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story014_release.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story015_ci_lint_gate.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story016_claude_md.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story017_init_claude_md.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story018_arch_staleness.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story019_bailout.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story020_horizon.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story021_rfc.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story022_decision_tree.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story023_test_quality.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story024_native_agent.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story025_ci_pipeline.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story026_issue_tracker.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story028_rule_scoping.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story029_doctor.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story030_lint.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story031_git_init_guard.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story032_greenfield_redirect.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story033_config_backfill.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story034_plan_config_refresh.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story035_readme_docs.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story037_regression_fix.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story038_call_graph_update.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story039_venv_config.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story040_layered_claude_md.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story043_active_clarify.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story044_consistency_check.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story045_auto_pr.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story046_agent_adapter.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story047_enterprise_flags.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story048_worktree_isolation.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story049_community_standards.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story050_doc_only_shortcut.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story051_workflow_streamlining.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story052_conditional_github_release.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story053_impact_regression.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story055_commands.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story055_config.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story055_spec_linter.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story056_commands.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story056_config.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story057_implicit_cleanup.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story058_opencode_extraction.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story058_routing_fix.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story060_init_hang.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story061_remove_thinking.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story062_mcp_recommendations.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story064_venv_local_md.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story065_sprint_model.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story072_developer_prefix.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story106_lateral_scan.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim009_lazy_rules.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim010_dry_refactor.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim012_ci.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim014_clean.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim014_context.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim014_guard.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim014_lazy_viz.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim014_next_id.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim014_regression.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim014_sec_scope.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim014_validators.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim015_doctor.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim016_testmap_lint.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim017.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim018.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim019_plan_subphases.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim020_explore_stall_fix.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim022.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim023.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim024.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim025.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim027.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim028.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim029.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim030.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim031.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim032.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim033.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim034.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim035.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim036.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim037.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim038.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim039.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim040.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim041.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim042.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim043.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim044.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim045.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim046.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim047.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim048.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim049.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim051.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim052.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim053.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim054.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim055.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim056.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim060_codex_profile.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim063.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim065.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim076_multistack.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim077_monorepo_stack.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim078.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim079.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim080.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim081.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim082.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim083.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim084.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim095.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim098_pdca_nudge.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim099_act_context_ref.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim102_version_marker.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim104_should_semantics.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim107.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim109_journey_spec.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim111_playwright_assertion.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim114_journey_sync.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim119.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim120.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim121.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim125.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim126.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim127_managed_block.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_tools.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_topology_parsers_066.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_update_task.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_visualize_call_nested.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_visualize_chain_fix.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_visualize_modes.py +0 -0
- {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_visualize_multilang_chain.py +0 -0
|
@@ -4,6 +4,29 @@ 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.15.2] - 2026-07-02
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
- **Codegraph commands decoupled from prompts** (STORY-slim-132) — Replaced hardcoded codegraph CLI command lists with runtime `codegraph --help` discovery. PactKit no longer needs updates when codegraph changes its command signatures.
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
- **Act Phase 0.6 board move command** (HOTFIX-slim-132) — Added explicit `board.py move_story` command template to prevent AI from guessing wrong subcommand syntax.
|
|
14
|
+
- **Prompt deployer** (HOTFIX-slim-131) — Insert @ references after YAML frontmatter so model: field is parsed correctly.
|
|
15
|
+
- **Skill frontmatter** (HOTFIX-slim-130) — Move @ references below YAML frontmatter in project-* skills.
|
|
16
|
+
|
|
17
|
+
### Refactored
|
|
18
|
+
- **Prompt rules** — Moved large rules from @inject to on-demand Read to reduce initial context size.
|
|
19
|
+
|
|
20
|
+
## [2.15.1] - 2026-06-10
|
|
21
|
+
|
|
22
|
+
### Added
|
|
23
|
+
- **Engineering Concerns guide system** (STORY-slim-128) — On-demand NFR guide loading via trigger index. Plan Phase 2 scans requirement keywords and includes NFR decisions in Spec; Act Phase 1.5 loads matched guides (1-3 max). Initial 13 concerns: concurrency, async, configuration, observability, module-design, database, caching, api-integration, event-driven, resilience, memory-management, code-review-first, component-reuse.
|
|
24
|
+
- **6 additional engineering guides** (STORY-slim-129) — error-recovery (retry/backoff/idempotency), data-consistency (transactions/saga/optimistic lock), backwards-compatibility (API versioning/non-breaking migration), performance-antipatterns (N+1/unbounded queries/indexing), graceful-shutdown (SIGTERM/drain/cleanup order), testing-strategy (boundary/mock vs real/isolation). Total: 19 guides.
|
|
25
|
+
|
|
26
|
+
### Fixed
|
|
27
|
+
- **Spec linter** — Accept heading format for Security Scope `SEC-*` entries.
|
|
28
|
+
- **CI** — Remove obsolete `.opencode/pactkit.yaml` test.
|
|
29
|
+
|
|
7
30
|
## [2.15.0] - 2026-06-04
|
|
8
31
|
|
|
9
32
|
### Added
|
{pactkit-2.15.0 → pactkit-2.15.2}/docs/architecture/governance/archive/lessons_archive_202603.md
RENAMED
|
@@ -63,3 +63,6 @@
|
|
|
63
63
|
| 2026-03-26 | test_story_slim056.py _init_project() helper creates realistic pactkit project fixture for subprocess E2E tests; 60 tests cover all 25 subcommands | test_story_slim056.py:_init_project |
|
|
64
64
|
| 2026-03-26 | entry_points auto-discovery with _load_entry_point_deployers() enables pip install pactkit-opencode to self-register; pre-existing tests referencing extracted functions must be updated to import from adapter package | deployer.py:_load_entry_point_deployers |
|
|
65
65
|
| 2026-03-26 | VALID_FORMATS auto-derives from FORMAT_PROFILES.keys() — removing a profile cascades to config, CLI, and deployer with zero manual sync | profiles.py:FORMAT_PROFILES |
|
|
66
|
+
| 2026-03-26 | DeployerBase static methods use lazy imports to avoid circular dependencies between deploy_base.py and deployer.py | deploy_base.py:DeployerBase.render_prompt |
|
|
67
|
+
| 2026-03-26 | Thin adapter conversion: pactkit-codex reduced from 15,356 lines (full fork) to 668 lines (thin adapter) by importing core via DeployerBase. Key: deploy_codex_playbooks needs explicit path replacement for ALL format prefixes (~/.claude/, ~/.config/opencode/ → ~/.codex/) | pactkit_codex/deployer.py:deploy_codex_playbooks |
|
|
68
|
+
| 2026-03-27 | When migrating commands to skills (subdir/SKILL.md format), all path assertions in pre-existing tests must be updated in the same commit — 17 tests broke because they asserted flat commands/*.md paths | deployer.py:_deploy_commands |
|
|
@@ -2,9 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
| Date | Lesson | Context |
|
|
4
4
|
|------|--------|---------|
|
|
5
|
-
| 2026-03-26 | DeployerBase static methods use lazy imports to avoid circular dependencies between deploy_base.py and deployer.py | deploy_base.py:DeployerBase.render_prompt |
|
|
6
|
-
| 2026-03-26 | Thin adapter conversion: pactkit-codex reduced from 15,356 lines (full fork) to 668 lines (thin adapter) by importing core via DeployerBase. Key: deploy_codex_playbooks needs explicit path replacement for ALL format prefixes (~/.claude/, ~/.config/opencode/ → ~/.codex/) | pactkit_codex/deployer.py:deploy_codex_playbooks |
|
|
7
|
-
| 2026-03-27 | When migrating commands to skills (subdir/SKILL.md format), all path assertions in pre-existing tests must be updated in the same commit — 17 tests broke because they asserted flat commands/*.md paths | deployer.py:_deploy_commands |
|
|
8
5
|
| 2026-03-30 | Frontend API path convention bugs are structurally preventable: ApiCallParser+api_convention_summary in trace phase surfaces prefix/wrapper conventions before implementation, eliminating a class of copy-paste path errors | visualize.py:ApiCallParser |
|
|
9
6
|
| 2026-03-31 | Rendering-only changes to visualize.py can be isolated by extracting a shared render helper (_render_nested_call_graph) that both forward and reverse BFS call — keeps AST parsing untouched | visualize.py:_render_nested_call_graph |
|
|
10
7
|
| 2026-03-31 | dict.update() on call_edges causes last-wins overwrite when scanning same-name functions across files; use extend-merge pattern instead | visualize.py:_build_call_graph |
|
|
@@ -53,3 +50,6 @@
|
|
|
53
50
|
| 2026-05-26 | SKILL.md model: frontmatter is passed through by deployer without transformation — source prompts in commands.py/workflows.py are the single source of truth for deployed skill metadata | commands.py:COMMANDS_CONTENT |
|
|
54
51
|
| 2026-06-01 | codegraph sync must be enforced by code (pactkit visualize/sync), not by prompt instructions — prompt-only enforcement is unreliable for deterministic operations | lazy_visualize.py:codegraph_sync |
|
|
55
52
|
| 2026-06-01 | Managed-block pattern (start/end markers + regex replace) is the canonical way to update mixed-ownership files — same pattern for CLAUDE.md and CLAUDE.local.md | deployer.py:_upsert_claude_md_managed_block |
|
|
53
|
+
| 2026-06-10 | Engineering guides are additive: new GUIDES_FILES entries auto-deploy via _deploy_guides() without deployer changes. Test impact limited to count assertions in test_story_slim128. | src/pactkit/prompts/guides.py:GUIDES_FILES |
|
|
54
|
+
| 2026-06-29 | Large @inject rules (architecture 11KB, solution 8.4KB, engineering 4.3KB) removed from COMMAND_RULES_MAP — loaded on-demand via Read in playbooks. Saves ~12,500 tokens/PDCA session. | src/pactkit/prompts/rules.py:COMMAND_RULES_MAP |
|
|
55
|
+
| 2026-07-02 | Hardcoding external tool CLI commands in SKILL_VISUALIZE_MD and deployer.py creates upgrade coupling — replaced with codegraph --help runtime discovery in _build_claude_md_managed_content() | src/pactkit/generators/deployer.py:_build_claude_md_managed_content |
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
## Invariants
|
|
17
17
|
|
|
18
|
-
1. All
|
|
18
|
+
1. All 4032+ tests must pass before any commit to `main`.
|
|
19
19
|
2. Specs (`docs/specs/`) are the source of truth — code conforms to specs, not the reverse.
|
|
20
20
|
3. CLI entry point is `pactkit` via `src/pactkit/cli.py:main`.
|
|
21
21
|
4. No runtime dependencies beyond `pyyaml`.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
|
|
2
|
+
### [STORY-slim-126] codegraph sync code enforcement
|
|
3
|
+
> Spec: docs/specs/STORY-slim-126.md
|
|
4
|
+
|
|
5
|
+
- [x] Add codegraph_sync() function
|
|
6
|
+
- [x] Integrate into visualize path
|
|
7
|
+
- [x] Add pactkit sync subcommand
|
|
8
|
+
- [x] Remove prompt instructions
|
|
9
|
+
- [x] Unit tests
|
|
10
|
+
|
|
11
|
+
### [STORY-slim-127] project CLAUDE.md managed-block update
|
|
12
|
+
> Spec: docs/specs/STORY-slim-127.md
|
|
13
|
+
|
|
14
|
+
- [x] Add marker constants
|
|
15
|
+
- [x] Extract managed content builder
|
|
16
|
+
- [x] Rewrite _generate_project_claude_md with upsert
|
|
17
|
+
- [x] Unit tests
|
|
18
|
+
|
|
19
|
+
### [STORY-slim-129] Engineering Concerns Guide Expansion — 6 Additional NFR Guides
|
|
20
|
+
> Spec: docs/specs/STORY-slim-129.md
|
|
21
|
+
|
|
22
|
+
- [x] Add 6 guide files to guides.py
|
|
23
|
+
- [x] Update trigger index in rules.py
|
|
24
|
+
- [x] Update test expectations 13→19
|
|
25
|
+
- [x] Verify deployment
|
|
26
|
+
|
|
27
|
+
### [STORY-slim-128] Engineering Concerns: Guide-based NFR enforcement
|
|
28
|
+
> Spec: docs/specs/STORY-slim-128.md
|
|
29
|
+
|
|
30
|
+
- [x] Create guides.py with 13 guide contents
|
|
31
|
+
- [x] Add trigger index to rules.py
|
|
32
|
+
- [x] Extend deployer for guides/ subdirectory
|
|
33
|
+
- [x] Enhance plan Phase 2 with NFR assessment
|
|
34
|
+
- [x] Enhance act Phase 1.5 with guide loading
|
|
35
|
+
- [x] Config registration + COMMAND_RULES_MAP
|
|
36
|
+
- [x] Multi-format parity
|
|
37
|
+
- [x] Unit tests
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
|
|
2
|
+
### [STORY-slim-132] Decouple codegraph commands from hardcoded prompt
|
|
3
|
+
> Spec: docs/specs/STORY-slim-132.md
|
|
4
|
+
|
|
5
|
+
- [x] Replace skills.py codegraph block with help fallback
|
|
6
|
+
- [x] Replace deployer.py codegraph section
|
|
7
|
+
- [x] Update global CLAUDE.md
|
|
8
|
+
- [x] Remove MCP tool name list
|
|
9
|
+
|
|
10
|
+
### [HOTFIX-slim-130] Fix skill frontmatter parsing
|
|
11
|
+
> Spec: docs/specs/HOTFIX-slim-130.md
|
|
12
|
+
|
|
13
|
+
- [x] Move @ references below YAML frontmatter block in all project-* skills
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Project Context (Auto-generated)
|
|
2
|
+
> Last updated: 2026-07-02T11:00:51+08:00 by pactkit context
|
|
3
|
+
|
|
4
|
+
## Sprint Status
|
|
5
|
+
Backlog: 4 | In Progress: 0 | Done: 0 stories
|
|
6
|
+
|
|
7
|
+
## Current Stories
|
|
8
|
+
None
|
|
9
|
+
|
|
10
|
+
## Recent Completions
|
|
11
|
+
None
|
|
12
|
+
|
|
13
|
+
## Active Branches
|
|
14
|
+
+ claude/naughty-euclid-e6a787
|
|
15
|
+
develop
|
|
16
|
+
* main
|
|
17
|
+
|
|
18
|
+
## Key Decisions
|
|
19
|
+
- codegraph sync must be enforced by code (pactkit visualize/sync), not by prompt instructions — prompt-only enforcement is unreliable for deterministic operations
|
|
20
|
+
- Managed-block pattern (start/end markers + regex replace) is the canonical way to update mixed-ownership files — same pattern for CLAUDE.md and CLAUDE.local.md
|
|
21
|
+
- Engineering guides are additive: new GUIDES_FILES entries auto-deploy via _deploy_guides() without deployer changes. Test impact limited to count assertions in test_story_slim128.
|
|
22
|
+
- Large @inject rules (architecture 11KB, solution 8.4KB, engineering 4.3KB) removed from COMMAND_RULES_MAP — loaded on-demand via Read in playbooks. Saves ~12,500 tokens/PDCA session.
|
|
23
|
+
- Hardcoding external tool CLI commands in SKILL_VISUALIZE_MD and deployer.py creates upgrade coupling — replaced with codegraph --help runtime discovery in _build_claude_md_managed_content()
|
|
24
|
+
|
|
25
|
+
## Next Recommended Action
|
|
26
|
+
`/project-plan`
|
|
27
|
+
|
|
28
|
+
## Agent Continuation
|
|
29
|
+
No active work session.
|
|
@@ -26,6 +26,17 @@
|
|
|
26
26
|
- [ ] Fix project-done
|
|
27
27
|
- [ ] Fix project-hotfix
|
|
28
28
|
|
|
29
|
+
### [HOTFIX-slim-131] Fix deployer @ refs before frontmatter
|
|
30
|
+
> Spec: docs/specs/HOTFIX-slim-131.md
|
|
31
|
+
|
|
32
|
+
- [ ] Fix _deploy_commands prepend order
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
### [HOTFIX-slim-132] Add explicit board.py move_story command to project-act
|
|
36
|
+
> Spec: docs/specs/HOTFIX-slim-132.md
|
|
37
|
+
|
|
38
|
+
- [ ] Add move_story command template to Phase 0.6
|
|
39
|
+
|
|
29
40
|
## 🔄 In Progress
|
|
30
41
|
|
|
31
42
|
## ✅ Done
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# HOTFIX-slim-130: Fix skill frontmatter parsing — move @ references below YAML block
|
|
2
|
+
|
|
3
|
+
| Field | Value |
|
|
4
|
+
|-------|-------|
|
|
5
|
+
| ID | HOTFIX-slim-130 |
|
|
6
|
+
| Status | Open |
|
|
7
|
+
| Priority | P1 |
|
|
8
|
+
| Release | 2.15.2 |
|
|
9
|
+
|
|
10
|
+
## Background
|
|
11
|
+
|
|
12
|
+
All 11 `project-*` skills have `@` reference lines (file includes) placed **before** the YAML frontmatter block (`---`). Claude Code's skill parser requires frontmatter to start on line 1 of the file. When `@` lines precede `---`, the entire frontmatter is treated as plain text — `model`, `allowed-tools`, and `description` fields are silently ignored.
|
|
13
|
+
|
|
14
|
+
**Impact**: Every `/project-*` command runs on the session's default model (opus) regardless of the `model:` directive in frontmatter. This wastes tokens (opus for tasks that should use sonnet) and breaks the model routing strategy defined in `pactkit.yaml`.
|
|
15
|
+
|
|
16
|
+
**Root cause**: Skill files were authored with `@` includes at the top for readability, unaware that this breaks YAML frontmatter detection.
|
|
17
|
+
|
|
18
|
+
## Affected Files
|
|
19
|
+
|
|
20
|
+
All skills matching `~/.claude/skills/project-*/SKILL.md` (11 files):
|
|
21
|
+
|
|
22
|
+
1. `project-act/SKILL.md`
|
|
23
|
+
2. `project-check/SKILL.md`
|
|
24
|
+
3. `project-clarify/SKILL.md`
|
|
25
|
+
4. `project-design/SKILL.md`
|
|
26
|
+
5. `project-done/SKILL.md`
|
|
27
|
+
6. `project-hotfix/SKILL.md`
|
|
28
|
+
7. `project-init/SKILL.md`
|
|
29
|
+
8. `project-plan/SKILL.md`
|
|
30
|
+
9. `project-pr/SKILL.md`
|
|
31
|
+
10. `project-release/SKILL.md`
|
|
32
|
+
11. `project-sprint/SKILL.md`
|
|
33
|
+
|
|
34
|
+
## Requirements
|
|
35
|
+
|
|
36
|
+
### R1: Frontmatter MUST be first in file (MUST)
|
|
37
|
+
|
|
38
|
+
Every `SKILL.md` file MUST start with `---` on line 1. No content (including `@` references) may precede the frontmatter block.
|
|
39
|
+
|
|
40
|
+
### R2: @ references MUST move below frontmatter (MUST)
|
|
41
|
+
|
|
42
|
+
All `@` include lines MUST be placed immediately after the closing `---` of the frontmatter block, before the markdown body. Preserve the original set of references — do not add or remove any.
|
|
43
|
+
|
|
44
|
+
### R3: Existing frontmatter fields preserved (MUST)
|
|
45
|
+
|
|
46
|
+
All existing frontmatter fields (`description`, `allowed-tools`, `model`) MUST remain unchanged in value. Only their position in the file changes.
|
|
47
|
+
|
|
48
|
+
## Acceptance Criteria
|
|
49
|
+
|
|
50
|
+
### AC1: Frontmatter starts on line 1 (R1)
|
|
51
|
+
|
|
52
|
+
- **Given** any file in `~/.claude/skills/project-*/SKILL.md`
|
|
53
|
+
- **When** I read line 1
|
|
54
|
+
- **Then** it MUST be exactly `---`
|
|
55
|
+
|
|
56
|
+
### AC2: Model field is parseable (R1, R3)
|
|
57
|
+
|
|
58
|
+
- **Given** `project-act/SKILL.md` with `model: sonnet` in frontmatter
|
|
59
|
+
- **When** Claude Code loads the skill
|
|
60
|
+
- **Then** the skill executes on sonnet, not the session default
|
|
61
|
+
|
|
62
|
+
### AC3: @ references still present (R2)
|
|
63
|
+
|
|
64
|
+
- **Given** any affected skill file
|
|
65
|
+
- **When** I count `@` reference lines
|
|
66
|
+
- **Then** the count matches the original (no references lost or added)
|
|
67
|
+
|
|
68
|
+
### AC4: No content change (R3)
|
|
69
|
+
|
|
70
|
+
- **Given** the markdown body of any affected skill
|
|
71
|
+
- **When** compared to pre-fix content (excluding line position)
|
|
72
|
+
- **Then** all instructions, phases, and protocols are identical
|
|
73
|
+
|
|
74
|
+
## Fix Pattern
|
|
75
|
+
|
|
76
|
+
Before (broken):
|
|
77
|
+
```markdown
|
|
78
|
+
@~/.claude/skills/_rules/04-architecture-principles.md
|
|
79
|
+
@~/.claude/rules/09-credential-safety.md
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
description: "Implement code per Spec, strict TDD"
|
|
83
|
+
model: sonnet
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
# Command: Act
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
After (correct):
|
|
90
|
+
```markdown
|
|
91
|
+
---
|
|
92
|
+
description: "Implement code per Spec, strict TDD"
|
|
93
|
+
model: sonnet
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
@~/.claude/skills/_rules/04-architecture-principles.md
|
|
97
|
+
@~/.claude/rules/09-credential-safety.md
|
|
98
|
+
|
|
99
|
+
# Command: Act
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Security Scope
|
|
103
|
+
|
|
104
|
+
SEC-1: No credential or secret handling involved. Pure file reformatting.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# HOTFIX-slim-131: Fix deployer prepending @ references before YAML frontmatter
|
|
2
|
+
|
|
3
|
+
| Field | Value |
|
|
4
|
+
|-------|-------|
|
|
5
|
+
| ID | HOTFIX-slim-131 |
|
|
6
|
+
| Status | In Progress |
|
|
7
|
+
| Priority | P0 |
|
|
8
|
+
| Release | 2.15.2 |
|
|
9
|
+
|
|
10
|
+
## Background
|
|
11
|
+
|
|
12
|
+
`_deploy_commands()` in deployer.py prepends `_build_command_rules_header()` output (@ reference lines) before the command content which includes YAML frontmatter. This pushes frontmatter away from line 1, causing Claude Code to not parse `model:`, `description:`, and `allowed-tools:` fields. The `model:` frontmatter (added in STORY-slim-125) never takes effect at runtime.
|
|
13
|
+
|
|
14
|
+
## Fix
|
|
15
|
+
|
|
16
|
+
Insert @ references after the closing `---` of frontmatter, not before the opening `---`.
|
|
17
|
+
|
|
18
|
+
## Target
|
|
19
|
+
|
|
20
|
+
- File: `src/pactkit/generators/deployer.py`
|
|
21
|
+
- Function: `_deploy_commands()` (line ~1008)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# HOTFIX-slim-132: Add explicit board.py move_story command to project-act playbook
|
|
2
|
+
|
|
3
|
+
| Field | Value |
|
|
4
|
+
|-------|-------|
|
|
5
|
+
| ID | HOTFIX-slim-132 |
|
|
6
|
+
| Status | Done |
|
|
7
|
+
| Priority | P2 |
|
|
8
|
+
| Release | 2.16.0 |
|
|
9
|
+
|
|
10
|
+
## Background
|
|
11
|
+
|
|
12
|
+
AI consistently guesses wrong board.py subcommand syntax (tries `move_to_in_progress`, `"In Progress"`) because project-act Phase 0.6 only says "move it to In Progress" without giving the exact CLI invocation.
|
|
13
|
+
|
|
14
|
+
## Fix
|
|
15
|
+
|
|
16
|
+
In `project-act/SKILL.md` Phase 0.6 step 3, replace vague instruction with explicit command template:
|
|
17
|
+
```
|
|
18
|
+
python3 ~/.claude/skills/pactkit-board/scripts/board.py move_story "{STORY_ID}" "in_progress"
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Target
|
|
22
|
+
|
|
23
|
+
`~/.claude/skills/project-act/SKILL.md:46`
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# STORY-slim-128: Engineering Concerns: Guide-based NFR enforcement
|
|
2
|
+
|
|
3
|
+
| Field | Value |
|
|
4
|
+
|-------|-------|
|
|
5
|
+
| ID | STORY-slim-128 |
|
|
6
|
+
| Status | Draft |
|
|
7
|
+
| Priority | P1 |
|
|
8
|
+
| Release | 2.16.0 |
|
|
9
|
+
|
|
10
|
+
## Background
|
|
11
|
+
|
|
12
|
+
LLM 编程时系统性缺失非功能性需求(NFR)考量:并发模型、超时策略、缓存一致性、内存管理等。
|
|
13
|
+
现有 PactKit 规则体系中,`06-solution-design.md` 只覆盖"复用已有组件",缺乏对其他 12 类工程关注点的引导。
|
|
14
|
+
|
|
15
|
+
核心矛盾:如果把所有 NFR 规则放入常驻 prompt,context 膨胀导致注意力衰减;如果不放,LLM 就忽略它们。
|
|
16
|
+
|
|
17
|
+
解决方案:**按需加载的指南系统** — 一个轻量触发索引(常驻,~40行)+ 13 个精炼指南文件(按需加载,每个 <50 行)。
|
|
18
|
+
Plan 阶段:根据需求关键词强制回答 NFR 决策问题(写入 Spec)。
|
|
19
|
+
Act 阶段:根据 Spec 中标注的 concerns,动态加载对应指南作为实现约束。
|
|
20
|
+
|
|
21
|
+
### 调用链
|
|
22
|
+
```
|
|
23
|
+
rules.py (RULES_MODULES["engineering"]) → deployer._deploy_rules() → ~/.claude/skills/_rules/07-engineering-concerns.md
|
|
24
|
+
rules.py (GUIDES_FILES) → deployer._deploy_guides() → ~/.claude/skills/_rules/guides/*.md
|
|
25
|
+
commands.py (plan Phase 2 扩展) → deployed SKILL.md
|
|
26
|
+
commands.py (act Phase 1.5 扩展) → deployed SKILL.md
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Requirements
|
|
30
|
+
|
|
31
|
+
### R1: Trigger Index Rule (MUST)
|
|
32
|
+
|
|
33
|
+
新增 `RULES_MODULES["engineering"]` 和 `RULES_ONDEMAND_FILES["engineering"]`,部署为 `07-engineering-concerns.md`。
|
|
34
|
+
内容为触发索引表(~40行):列出关键词→concern 映射,以及 concern→guide 文件的路由表。
|
|
35
|
+
此文件通过 `@import` 被 plan/act 命令加载。
|
|
36
|
+
|
|
37
|
+
### R2: Guides Deployment Mechanism (MUST)
|
|
38
|
+
|
|
39
|
+
在 `deployer.py` 中新增 `_deploy_guides()` 函数,将 13 个精炼指南文件部署到 `~/.claude/skills/_rules/guides/` 目录。
|
|
40
|
+
所有 format 均需支持:Claude Code(文件部署)、OpenCode(inline 或文件)、Codex(文件)、Copilot(文件)。
|
|
41
|
+
指南文件源定义在新文件 `src/pactkit/prompts/guides.py` 中(避免 `rules.py` 过长)。
|
|
42
|
+
|
|
43
|
+
### R3: Guides Content — 13 Engineering Guides (MUST)
|
|
44
|
+
|
|
45
|
+
每个指南文件 < 50 行,格式统一:决策表 + MUST 清单 + NEVER 清单 + 代码模板。
|
|
46
|
+
覆盖:concurrency、async-patterns、configuration、observability、module-design、database、caching、api-integration、event-driven、resilience、memory-management、code-review-first、component-reuse。
|
|
47
|
+
|
|
48
|
+
### R4: Plan Command Enhancement (MUST)
|
|
49
|
+
|
|
50
|
+
`project-plan` Phase 2 新增 "Engineering Concerns Assessment" 步骤:
|
|
51
|
+
- 扫描需求关键词(定时/API/数据库/缓存/事件/并发等)
|
|
52
|
+
- 匹配到的 concern → Spec 的 Technical Design 中 MUST 包含对应 NFR 决策
|
|
53
|
+
- 未匹配 → 不强制(避免噪音)
|
|
54
|
+
|
|
55
|
+
### R5: Act Command Enhancement (MUST)
|
|
56
|
+
|
|
57
|
+
`project-act` 新增 Phase 1.5 "Engineering Concerns Loading":
|
|
58
|
+
- 读取 Spec 的 Technical Design → 识别标注的 engineering concerns
|
|
59
|
+
- 加载对应的指南文件(`read` 指令)
|
|
60
|
+
- MUST 只加载相关的 1-3 个,NEVER 全部加载
|
|
61
|
+
|
|
62
|
+
### R6: Config Integration (SHOULD)
|
|
63
|
+
|
|
64
|
+
在 `VALID_RULES` 中注册 `"07-engineering-concerns"`。
|
|
65
|
+
在 `COMMAND_RULES_MAP` 中为 `project-plan` 和 `project-act` 添加 `"engineering"` key。
|
|
66
|
+
支持通过 `pactkit.yaml` 的 `rules` 配置项禁用。
|
|
67
|
+
|
|
68
|
+
### R7: Multi-format Parity (MUST)
|
|
69
|
+
|
|
70
|
+
OpenCode、Codex、Copilot 格式均需部署 guides 内容:
|
|
71
|
+
- OpenCode/Codex:作为独立文件部署到对应 rules 目录,或 inline 嵌入
|
|
72
|
+
- Copilot:写入对应的 prompt 文件中(copilot 不支持动态文件引用,需 inline)
|
|
73
|
+
- 各格式 plan/act playbook 均需包含 engineering concerns phase
|
|
74
|
+
|
|
75
|
+
## Acceptance Criteria
|
|
76
|
+
|
|
77
|
+
### AC1: Trigger Index Deployed (R1, R6)
|
|
78
|
+
|
|
79
|
+
- **Given** PactKit 已安装,用户运行 `pactkit init`
|
|
80
|
+
- **When** deployer 执行 classic format 部署
|
|
81
|
+
- **Then** `~/.claude/skills/_rules/07-engineering-concerns.md` 文件存在,内容包含关键词→concern 映射表和 concern→guide 路由表
|
|
82
|
+
|
|
83
|
+
### AC2: All 13 Guides Deployed (R2, R3)
|
|
84
|
+
|
|
85
|
+
- **Given** 用户运行 `pactkit init` 或 `pactkit update`
|
|
86
|
+
- **When** deployer 执行部署
|
|
87
|
+
- **Then** `~/.claude/skills/_rules/guides/` 目录下存在 13 个 .md 文件,每个文件 < 50 行
|
|
88
|
+
|
|
89
|
+
### AC3: Plan Phase Triggers NFR Questions (R4)
|
|
90
|
+
|
|
91
|
+
- **Given** 一个包含 "从第三方 API 拉取数据存入数据库" 的 Story
|
|
92
|
+
- **When** Plan Phase 2 执行 Engineering Concerns Assessment
|
|
93
|
+
- **Then** Spec 的 Technical Design 中包含:并发模型决策、API 超时/重试策略、数据库连接管理策略
|
|
94
|
+
|
|
95
|
+
### AC4: Act Phase Loads Relevant Guides Only (R5)
|
|
96
|
+
|
|
97
|
+
- **Given** Spec 的 Technical Design 标注了 `concerns: [database, api-integration]`
|
|
98
|
+
- **When** Act Phase 1.5 执行
|
|
99
|
+
- **Then** 只加载 `guides/database.md` 和 `guides/api-integration.md`,不加载其他 11 个指南
|
|
100
|
+
|
|
101
|
+
### AC5: OpenCode/Codex/Copilot Parity (R7)
|
|
102
|
+
|
|
103
|
+
- **Given** 用户运行 `pactkit init --format opencode`
|
|
104
|
+
- **When** deployer 执行 OpenCode 格式部署
|
|
105
|
+
- **Then** 对应目录下存在 engineering concerns trigger index + guides 内容(inline 或文件形式)
|
|
106
|
+
|
|
107
|
+
## Target Call Chain
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
# 部署链
|
|
111
|
+
pactkit init/update
|
|
112
|
+
→ deployer._deploy_classic() (deployer.py:302)
|
|
113
|
+
→ _deploy_rules(claude_root, enabled_rules) (deployer.py:584)
|
|
114
|
+
→ atomic_write(ondemand_dir / "07-engineering-concerns.md") — R1
|
|
115
|
+
→ _deploy_guides(claude_root) (NEW) (deployer.py:NEW)
|
|
116
|
+
→ atomic_write(guides_dir / "*.md") x13 — R2
|
|
117
|
+
→ _deploy_commands(skills_dir, ...) (deployer.py:917)
|
|
118
|
+
→ _build_command_rules_header("project-plan") — includes "engineering" — R4
|
|
119
|
+
→ _build_command_rules_header("project-act") — includes "engineering" — R5
|
|
120
|
+
|
|
121
|
+
# 指南内容源
|
|
122
|
+
src/pactkit/prompts/guides.py (NEW)
|
|
123
|
+
→ GUIDES_FILES: dict[str, str] — filename → content
|
|
124
|
+
→ Referenced by deployer._deploy_guides()
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Implementation Steps
|
|
128
|
+
|
|
129
|
+
| Step | File | Action | Dependencies | Risk |
|
|
130
|
+
|------|------|--------|-------------|------|
|
|
131
|
+
| 1 | `src/pactkit/prompts/guides.py` | 新建:定义 GUIDES_FILES dict(13 个指南内容) | None | Low |
|
|
132
|
+
| 2 | `src/pactkit/prompts/rules.py` | 新增 RULES_MODULES["engineering"] 触发索引内容 + RULES_ONDEMAND_FILES 注册 | Step 1 | Low |
|
|
133
|
+
| 3 | `src/pactkit/config.py` | VALID_RULES 新增 "07-engineering-concerns" | Step 2 | Low |
|
|
134
|
+
| 4 | `src/pactkit/generators/deployer.py` | 新增 _deploy_guides() + 在 _deploy_classic/opencode/codex/copilot 中调用 | Steps 1-3 | Medium |
|
|
135
|
+
| 5 | `src/pactkit/prompts/commands.py` | plan Phase 2 新增 Engineering Concerns Assessment 段落 | Step 2 | Low |
|
|
136
|
+
| 6 | `src/pactkit/prompts/commands.py` | act 新增 Phase 1.5 Engineering Concerns Loading 段落 | Step 2 | Low |
|
|
137
|
+
| 7 | `src/pactkit/prompts/rules.py` | COMMAND_RULES_MAP 为 plan/act 添加 "engineering" | Step 3 | Low |
|
|
138
|
+
| 8 | `tests/unit/` | 测试:deployer 部署 guides 目录、plan/act 包含新 phase | All | Low |
|
|
139
|
+
|
|
140
|
+
## Security Scope
|
|
141
|
+
|
|
142
|
+
| Check | Applicable | Reason |
|
|
143
|
+
|-------|------------|--------|
|
|
144
|
+
| SEC-1 | N/A | No secrets involved — only prompt/doc content |
|
|
145
|
+
| SEC-2 | N/A | No user input processing |
|
|
146
|
+
| SEC-3 | N/A | No database queries |
|
|
147
|
+
| SEC-4 | N/A | No rendering |
|
|
148
|
+
| SEC-5 | N/A | No auth |
|
|
149
|
+
| SEC-6 | N/A | No endpoints |
|
|
150
|
+
| SEC-7 | N/A | No error messages |
|
|
151
|
+
| SEC-8 | N/A | No new dependencies |
|
|
152
|
+
|
|
153
|
+
## Out of Scope
|
|
154
|
+
|
|
155
|
+
- CI/lint 自动化检测(semgrep/ruff 自定义规则)— 后续 Story
|
|
156
|
+
- 指南文件的热加载/动态选择 AI 判断 — 本 Story 用关键词匹配,不用 LLM 判断
|
|
157
|
+
- Check 阶段的完整 13 项 checklist 验证 — 可选后续 Story
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# STORY-slim-129: Engineering Concerns Guide Expansion — 6 Additional NFR Guides
|
|
2
|
+
|
|
3
|
+
| Field | Value |
|
|
4
|
+
|-------|-------|
|
|
5
|
+
| ID | STORY-slim-129 |
|
|
6
|
+
| Status | Done |
|
|
7
|
+
| Priority | P1 |
|
|
8
|
+
| Release | 2.15.1 |
|
|
9
|
+
|
|
10
|
+
## Background
|
|
11
|
+
|
|
12
|
+
STORY-slim-128 established the Engineering Concerns guide system with 13 on-demand guides covering concurrency, async, configuration, observability, module design, database, caching, API integration, event-driven, resilience, memory management, code-review-first, and component-reuse.
|
|
13
|
+
|
|
14
|
+
Analysis of common LLM-generated code weaknesses identified 6 additional high-frequency gaps:
|
|
15
|
+
1. **Error Recovery & Retry** — LLM try/catch blocks almost always just `log + return None`, missing retry with backoff, idempotency, partial failure handling
|
|
16
|
+
2. **Data Consistency** — multi-table/multi-service writes without transaction strategy, no idempotency key, no compensation
|
|
17
|
+
3. **Backwards Compatibility** — LLM defaults to breaking changes for API/schema modifications
|
|
18
|
+
4. **Performance Anti-patterns** — N+1 queries, unbounded list APIs, missing indices, hot-path serialization
|
|
19
|
+
5. **Graceful Shutdown** — no SIGTERM handler, no in-flight request drain, no resource cleanup ordering
|
|
20
|
+
6. **Testing Strategy** — LLM writes tests without considering boundary testing, mock vs real, or test isolation
|
|
21
|
+
|
|
22
|
+
## Requirements
|
|
23
|
+
|
|
24
|
+
### R1: Six New Guide Files (MUST)
|
|
25
|
+
|
|
26
|
+
Add 6 new guide files to `GUIDES_FILES` in `src/pactkit/prompts/guides.py`:
|
|
27
|
+
- `error-recovery.md` — retry strategies, backoff, idempotency, partial failure
|
|
28
|
+
- `data-consistency.md` — distributed transactions, idempotency keys, optimistic/pessimistic locking, Saga
|
|
29
|
+
- `backwards-compatibility.md` — API versioning, non-breaking DB migrations, protocol evolution
|
|
30
|
+
- `performance-antipatterns.md` — N+1 queries, unbounded queries, missing indexes, hot-path costs
|
|
31
|
+
- `graceful-shutdown.md` — SIGTERM handling, request drain, resource cleanup order
|
|
32
|
+
- `testing-strategy.md` — boundary testing, mock vs real, test isolation, deterministic tests
|
|
33
|
+
|
|
34
|
+
Each guide MUST follow existing format: Decision Table + MUST + NEVER + Template, ≤ 50 lines.
|
|
35
|
+
|
|
36
|
+
### R2: Trigger Index Update (MUST)
|
|
37
|
+
|
|
38
|
+
Add 6 new rows to the keyword→concern table in `RULES_MODULES["engineering"]` in `src/pactkit/prompts/rules.py`:
|
|
39
|
+
- error-recovery: retry/重试/backoff/幂等/idempoten/partial failure
|
|
40
|
+
- data-consistency: 一致性/consistency/saga/补偿/idempotency key/分布式事务
|
|
41
|
+
- backwards-compatibility: 兼容/backward/breaking change/deprecat/migration/版本
|
|
42
|
+
- performance-antipatterns: N+1/unbounded/分页/pagina/index/索引/热路径/hot path
|
|
43
|
+
- graceful-shutdown: shutdown/优雅关闭/SIGTERM/drain/信号处理
|
|
44
|
+
- testing-strategy: 测试策略/test strategy/mock/stub/boundary/隔离/isolation
|
|
45
|
+
|
|
46
|
+
### R3: Guide Loading Table Update (MUST)
|
|
47
|
+
|
|
48
|
+
Add 6 new rows to the Act Phase Guide Loading Table in the same `engineering` module content, mapping concern→guide file path.
|
|
49
|
+
|
|
50
|
+
### R4: Pre-existing Test Update (MUST)
|
|
51
|
+
|
|
52
|
+
Update hardcoded counts in tests:
|
|
53
|
+
- `test_story_slim128_engineering_concerns.py`: 13→19 guide count
|
|
54
|
+
- `test_story_slim026.py`: plan prompt char baseline if exceeded
|
|
55
|
+
- `test_story063_prompt_slimming.py`: BASELINE_TOTAL_CHARS if exceeded
|
|
56
|
+
- Trigger index "NEVER load all 13" → "NEVER load all 19"
|
|
57
|
+
|
|
58
|
+
### R5: Token Budget Control (SHOULD)
|
|
59
|
+
|
|
60
|
+
Total trigger index growth SHOULD be ≤ 8 lines (6 keyword rows + 6 guide path rows = 12 table rows, but table rows are short). The trigger index must remain under ~60 lines total.
|
|
61
|
+
|
|
62
|
+
### R6: Guide Loading Cap (MUST)
|
|
63
|
+
|
|
64
|
+
Maintain the "MUST load only 1-3 relevant guides" instruction. Do NOT increase the cap — more guides available does not mean more should be loaded simultaneously.
|
|
65
|
+
|
|
66
|
+
## Acceptance Criteria
|
|
67
|
+
|
|
68
|
+
### AC1: Guide Files Registered (R1)
|
|
69
|
+
|
|
70
|
+
- **Given** `GUIDES_FILES` dict in `src/pactkit/prompts/guides.py`
|
|
71
|
+
- **When** the module is loaded
|
|
72
|
+
- **Then** it contains exactly 19 entries (13 original + 6 new), each ≤ 50 lines with MUST and NEVER sections
|
|
73
|
+
|
|
74
|
+
### AC2: Trigger Index Extended (R2, R3)
|
|
75
|
+
|
|
76
|
+
- **Given** `RULES_MODULES["engineering"]` in rules.py
|
|
77
|
+
- **When** the content is inspected
|
|
78
|
+
- **Then** the keyword table has 19 rows and the guide loading table has 19 rows
|
|
79
|
+
|
|
80
|
+
### AC3: Deployment Creates 19 Guide Files (R1)
|
|
81
|
+
|
|
82
|
+
- **Given** `_deploy_guides()` is called
|
|
83
|
+
- **When** deployment completes
|
|
84
|
+
- **Then** 19 `.md` files exist in `skills/_rules/guides/` directory
|
|
85
|
+
|
|
86
|
+
### AC4: Guide Loading Cap Unchanged (R6)
|
|
87
|
+
|
|
88
|
+
- **Given** trigger index content
|
|
89
|
+
- **When** inspected for loading instruction
|
|
90
|
+
- **Then** still says "MUST load only 1-3 relevant guides" (not 4+)
|
|
91
|
+
|
|
92
|
+
### AC5: All Tests Pass (R4)
|
|
93
|
+
|
|
94
|
+
- **Given** updated test expectations (19 guides)
|
|
95
|
+
- **When** full test suite runs
|
|
96
|
+
- **Then** all tests pass including pre-existing count assertions
|
|
97
|
+
|
|
98
|
+
## Target Call Chain
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
guides.py::GUIDES_FILES (add 6 entries)
|
|
102
|
+
→ rules.py::RULES_MODULES["engineering"] (extend keyword table + guide table)
|
|
103
|
+
→ deployer.py::_deploy_guides() (already handles any GUIDES_FILES count)
|
|
104
|
+
→ tests/ (update count assertions 13→19)
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Implementation Steps
|
|
108
|
+
|
|
109
|
+
| Step | File | Action | Dependencies | Risk |
|
|
110
|
+
|------|------|--------|-------------|------|
|
|
111
|
+
| 1 | `src/pactkit/prompts/guides.py` | Add 6 new guide entries to GUIDES_FILES | None | Low |
|
|
112
|
+
| 2 | `src/pactkit/prompts/rules.py` | Add 6 keyword rows + 6 guide loading rows to engineering module | Step 1 | Low |
|
|
113
|
+
| 3 | `tests/unit/test_story_slim128_engineering_concerns.py` | Update count 13→19, update EXPECTED_GUIDES set | Steps 1-2 | Low |
|
|
114
|
+
| 4 | Other test files | Update baselines if char counts exceeded | Steps 1-2 | Low |
|
|
115
|
+
|
|
116
|
+
## Security Scope
|
|
117
|
+
|
|
118
|
+
| Check | Applicable | Reason |
|
|
119
|
+
|-------|------------|--------|
|
|
120
|
+
| SEC-1 Input Validation | N/A | docs/tests only |
|
|
121
|
+
| SEC-2 Auth/AuthZ | N/A | docs/tests only |
|
|
122
|
+
| SEC-3 Data Exposure | N/A | docs/tests only |
|
|
123
|
+
| SEC-4 Cryptography | N/A | docs/tests only |
|
|
124
|
+
| SEC-5 Error Handling | N/A | docs/tests only |
|
|
125
|
+
| SEC-6 Dependencies | N/A | docs/tests only |
|
|
126
|
+
| SEC-7 Logging | N/A | docs/tests only |
|
|
127
|
+
| SEC-8 Config/Secrets | N/A | docs/tests only |
|
|
128
|
+
|
|
129
|
+
## Out of Scope
|
|
130
|
+
|
|
131
|
+
- No changes to deployer logic (already handles dynamic GUIDES_FILES count)
|
|
132
|
+
- No changes to command prompts (plan/act phases already reference the trigger index)
|
|
133
|
+
- No new RULES_ONDEMAND_FILES entry needed (engineering key already exists)
|
|
134
|
+
- No config.py changes (VALID_RULES already includes 07-engineering-concerns)
|