pactkit 2.11.0__tar.gz → 2.12.0__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.11.0 → pactkit-2.12.0}/.github/workflows/pactkit.yml +1 -1
- {pactkit-2.11.0 → pactkit-2.12.0}/.opencode/pactkit.yaml +12 -6
- {pactkit-2.11.0 → pactkit-2.12.0}/CHANGELOG.md +10 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/PKG-INFO +1 -2
- {pactkit-2.11.0 → pactkit-2.12.0}/README.md +0 -1
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/architecture/governance/lessons.md +1 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/architecture/governance/rules.md +1 -1
- pactkit-2.12.0/docs/e2e/journey.md +243 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/product/archive/archive_202604.md +18 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/product/context.md +9 -6
- pactkit-2.12.0/docs/product/sprint_board.md +39 -0
- pactkit-2.12.0/docs/specs/BUG-slim-107.md +12 -0
- pactkit-2.12.0/docs/specs/STORY-slim-107.md +134 -0
- pactkit-2.12.0/docs/specs/STORY-slim-108.md +97 -0
- pactkit-2.12.0/docs/specs/STORY-slim-109.md +106 -0
- pactkit-2.12.0/docs/specs/STORY-slim-110.md +96 -0
- pactkit-2.12.0/docs/specs/STORY-slim-111.md +100 -0
- pactkit-2.12.0/docs/specs/STORY-slim-112.md +255 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/pyproject.toml +1 -1
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/__init__.py +1 -1
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/cli.py +13 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/config.py +9 -11
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/generators/deployer.py +59 -9
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/lazy_visualize.py +1 -1
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/prompts/__init__.py +3 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/prompts/commands.py +33 -2
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/prompts/rules.py +148 -22
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/prompts/skills.py +16 -1
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/prompts/workflows.py +16 -1
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/skills/board.py +26 -18
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/skills/visualize.py +26 -8
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/e2e/cli/test_cli_e2e.py +42 -5
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug004_dead_set.py +8 -5
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_config.py +2 -2
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_config_auto_merge.py +3 -2
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_constitution_sharpening.py +29 -15
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_deployer_plugin.py +11 -3
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_design_command.py +105 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_mcp_integration.py +18 -10
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_modular_constitution.py +7 -11
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_prompt_structural_invariants.py +2 -2
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_rules_enrichment.py +19 -8
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_selective_deploy.py +29 -15
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_solution_design_rule.py +16 -10
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story028_rule_scoping.py +23 -10
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story063_prompt_slimming.py +5 -1
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim009_lazy_rules.py +41 -19
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim011_command_rules.py +40 -20
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim021.py +11 -7
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim023.py +5 -2
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim028.py +19 -11
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim083.py +4 -2
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim098_pdca_nudge.py +22 -17
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim102_version_marker.py +2 -1
- pactkit-2.12.0/tests/unit/test_story_slim107.py +145 -0
- pactkit-2.12.0/tests/unit/test_story_slim109_journey_spec.py +112 -0
- pactkit-2.12.0/tests/unit/test_story_slim111_playwright_assertion.py +144 -0
- pactkit-2.12.0/tests/unit/test_story_slim112_rules_split.py +394 -0
- pactkit-2.11.0/docs/product/sprint_board.md +0 -8
- {pactkit-2.11.0 → pactkit-2.12.0}/.github/workflows/publish.yml +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/.gitignore +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/AGENTS.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/CODE_OF_CONDUCT.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/CONTRIBUTING.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/LICENSE +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/SECURITY.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/architecture/governance/archive/lessons_archive_202602.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/architecture/governance/archive/lessons_archive_202603.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/architecture/governance/harness_audit.json +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/architecture/governance/philosophy.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/assets/logo.png +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/guides/codex-integration-preresearch.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/guides/tool-integration-checklist.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/product/archive/archive_202602.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/product/archive/archive_202603.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/product/friction-log.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/product/prd.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-001.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-002.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-003.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-004.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-005.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-006.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-007.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-008.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-009.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-010.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-011.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-012.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-013.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-014.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-015.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-016.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-017.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-018.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-019.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-020.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-021.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-022.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-023.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-024.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-025.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-026.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-027.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-028.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-029.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-030.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-031.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-032.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-033.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-034.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-035.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-slim-001.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-slim-002.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-slim-003.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-slim-004.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-slim-005.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-slim-006.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/BUG-slim-089.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-023.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-049.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-050.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-051.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-052.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-061.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-062.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-067.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-069.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-070.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-085.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-087.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-096.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-099.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-107.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-001.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-002.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-003.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-004.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-005.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-006.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-007.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-008.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-009.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-010.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-011.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-012.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-013.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-014.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-015.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-016.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-017.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-018.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-019.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-020.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-021.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-022.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-023.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-024.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-025.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-026.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-027.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-028.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-029.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-030.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-031.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-032.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-033.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-034.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-035.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-036.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-037.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-038.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-039.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-040.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-041.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-042.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-043.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-044.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-045.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-046.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-047.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-048.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-049.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-050.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-051.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-052.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-053.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-054.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-055.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-056.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-057.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-058.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-059.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-060.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-061.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-062.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-063.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-064.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-065.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-069.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-070.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-071.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-072.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-073.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-001.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-005.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-006.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-007.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-009.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-010.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-011.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-012.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-013.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-014.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-015.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-016.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-017.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-018.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-019.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-020.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-021.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-022.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-023.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-024.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-028.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-029.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-030.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-031.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-032.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-033.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-034.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-035.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-036.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-037.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-038.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-039.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-040.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-041.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-042.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-043.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-044.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-045.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-046.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-047.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-048.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-049.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-050.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-051.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-052.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-053.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-054.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-055.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-056.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-057.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-058.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-059.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-060.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-063.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-066.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-067.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-068.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-069.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-070.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-071.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-072.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-073.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-074.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-075.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-076.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-077.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-078.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-079.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-080.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-081.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-082.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-083.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-084.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-086.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-088.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-089.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-090.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-091.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-092.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-093.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-094.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-095.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-097.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-098.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-099.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-100.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-101.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-102.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-103.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-104.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-105.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/specs/STORY-slim-106.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/test_cases/BUG-001_case.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/test_cases/BUG-002_case.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/test_cases/STORY-slim-028_case.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/test_cases/STORY-slim-029_case.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/test_cases/STORY-slim-031_case.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/test_cases/STORY-slim-032_case.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/test_cases/STORY-slim-033_case.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/docs/test_cases/STORY-slim-034_case.md +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/opencode.json +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/__main__.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/audit.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/backfill.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/cleaners.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/context_gen.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/coverage_gate.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/doctor.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/garden.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/generators/__init__.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/generators/adapter.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/generators/deploy_base.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/guards.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/id_generator.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/invariants.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/issue_sync.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/lessons.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/lint_runner.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/observe.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/profiles.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/prompts/agents.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/prompts/references.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/regression.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/schemas.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/scripts.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/sec_scope.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/skills/__init__.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/skills/analyzers/__init__.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/skills/analyzers/go_analyzer.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/skills/analyzers/java_analyzer.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/skills/analyzers/python_analyzer.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/skills/analyzers/ts_analyzer.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/skills/report.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/skills/scaffold.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/skills/spec_linter.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/spec_status.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/test_mapper.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/utils.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/src/pactkit/validators.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/conftest.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/e2e/__init__.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/e2e/cli/__init__.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/fixtures/agent_parser/agents_dir/researcher.yaml +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/fixtures/agent_parser/agents_dir/writer.yaml +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/fixtures/agent_parser/langgraph_app.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/fixtures/agent_parser/mcp_settings.json +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/fixtures/api_call_parser/axios_style.tsx +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/fixtures/api_call_parser/dynamic.tsx +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/fixtures/api_call_parser/page.tsx +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/integration/__init__.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/integration/test_deploy_classic.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_agent_features.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_agent_frontmatter.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_agents_enrichment.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_audit.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_blast_radius.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_board_bug027.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_board_sections.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug001_skill_path.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug002_plugin_paths.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug003_multi_import.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug005_archive_taskless.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug006_scan_excludes.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug007_stale_trace_refs.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug008_stale_command_refs.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug009_project_config_backfill.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug010_rewrite_yaml.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug011_stale_refs.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug012_call_graph_filter.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug013_config_single_source.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug014_version_hygiene.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug017_project_init_playbook.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug018_issue_tracker_verification.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug019_venv_deployment.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug020_claude_md_backup.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug025_release_delegation.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug026_version_sync.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug028_ghost_refs.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug029_stack_detection_fallback.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug030_spec_lint_cli.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug031_docstring_accuracy.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug034_plan_metadata_template.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug_021.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug_022.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug_023.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug_024.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug_slim001_env_detection.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug_slim002_instruction_collision.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug_slim003.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug_slim004.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug_slim005.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug_slim006.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_bug_slim089_global_claude_md.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_check_command.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_check_extensions_072_073.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_check_playbook_072_073.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_command_frontmatter.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_command_visualize_modes.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_complexity.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_context_gen.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_create_skill.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_cross_flow_matrix.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_deploy_base.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_deployer_cleanup.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_done_gates.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_draw_prompt.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_draw_references.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_drawio_mcp.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_garden.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_home_path_fix.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_hotfix_command.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_init_guard.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_init_playbook_074.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_lang_profiles.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_layer_violations.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_lessons_rotation_075.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_list_stories.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_model_config.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_monorepo_detect.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_multi_prefix.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_observe.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_pdca_slim.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_profiles.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_project_visibility.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_prompt_cli_refs.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_prompt_quality_075.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_prompts_package.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_release.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_release_field.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_release_v110.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_render_prompt.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_report_parser.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_report_unified.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_review_command.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_scaffold.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_scaffold_developer_prefix.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_schemas.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_script_extraction.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_session_context.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_skill_structure.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_skills_enrichment.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_slim_deps_088.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_smart_regression.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_sprint_command.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_stack_references.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_status_command.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_statusline.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story014_release.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story015_ci_lint_gate.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story016_claude_md.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story017_init_claude_md.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story018_arch_staleness.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story019_bailout.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story020_horizon.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story021_rfc.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story022_decision_tree.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story023_test_quality.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story024_native_agent.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story025_ci_pipeline.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story026_issue_tracker.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story029_doctor.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story030_lint.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story031_git_init_guard.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story032_greenfield_redirect.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story033_config_backfill.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story034_plan_config_refresh.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story035_readme_docs.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story037_regression_fix.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story038_call_graph_update.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story039_venv_config.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story040_layered_claude_md.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story042_spec_linter.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story043_active_clarify.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story044_consistency_check.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story045_auto_pr.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story046_agent_adapter.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story047_enterprise_flags.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story048_worktree_isolation.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story049_community_standards.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story050_doc_only_shortcut.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story051_workflow_streamlining.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story052_conditional_github_release.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story053_impact_regression.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story055_commands.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story055_config.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story055_spec_linter.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story056_commands.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story056_config.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story057_implicit_cleanup.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story058_opencode_extraction.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story058_routing_fix.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story059_codex_removal.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story060_init_hang.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story061_remove_thinking.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story062_mcp_recommendations.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story064_venv_local_md.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story065_sprint_model.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story072_developer_prefix.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story106_lateral_scan.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim010_dry_refactor.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim012_ci.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim014_clean.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim014_context.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim014_guard.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim014_lazy_viz.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim014_next_id.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim014_regression.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim014_sec_scope.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim014_validators.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim015_doctor.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim016_testmap_lint.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim017.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim018.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim019_plan_subphases.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim020_explore_stall_fix.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim022.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim024.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim025.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim026.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim027.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim029.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim030.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim031.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim032.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim033.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim034.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim035.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim036.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim037.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim038.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim039.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim040.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim041.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim042.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim043.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim044.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim045.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim046.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim047.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim048.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim049.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim051.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim052.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim053.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim054.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim055.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim056.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim060_codex_profile.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim063.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim065.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim076_multistack.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim077_monorepo_stack.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim078.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim079.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim080.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim081.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim082.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim084.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim095.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim099_act_context_ref.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_story_slim104_should_semantics.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_tools.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_topology_parsers_066.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_update_task.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_visualize_call_nested.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_visualize_chain_fix.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_visualize_modes.py +0 -0
- {pactkit-2.11.0 → pactkit-2.12.0}/tests/unit/test_visualize_multilang_chain.py +0 -0
|
@@ -72,6 +72,14 @@ rules:
|
|
|
72
72
|
- 09-sectional-write
|
|
73
73
|
- 11-pdca-nudge
|
|
74
74
|
- 12-solution-design
|
|
75
|
+
- 05-principles
|
|
76
|
+
- 01-workflow-conventions
|
|
77
|
+
- 02-mcp-integration
|
|
78
|
+
- 03-shared-protocols
|
|
79
|
+
- 04-architecture-principles
|
|
80
|
+
- 05-sectional-write
|
|
81
|
+
- 06-solution-design
|
|
82
|
+
- pactkit
|
|
75
83
|
|
|
76
84
|
# CI/CD — set provider to github or gitlab to generate pipeline config
|
|
77
85
|
ci:
|
|
@@ -85,12 +93,6 @@ ci:
|
|
|
85
93
|
issue_tracker:
|
|
86
94
|
provider: github
|
|
87
95
|
|
|
88
|
-
# Hooks — safe, report-only hook templates (command-type only)
|
|
89
|
-
hooks:
|
|
90
|
-
post_test_coverage: false
|
|
91
|
-
pre_commit_lint: false
|
|
92
|
-
pre_push_check: false
|
|
93
|
-
|
|
94
96
|
# Lint — configure lint behavior in /project-done
|
|
95
97
|
lint_blocking: false
|
|
96
98
|
auto_fix: false
|
|
@@ -163,3 +165,7 @@ e2e:
|
|
|
163
165
|
env_file: .env.test
|
|
164
166
|
test_dir: tests/e2e
|
|
165
167
|
type: none
|
|
168
|
+
hooks:
|
|
169
|
+
post_test_coverage: false
|
|
170
|
+
pre_commit_lint: false
|
|
171
|
+
pre_push_check: false
|
|
@@ -4,6 +4,16 @@ 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.12.0] - 2026-05-06
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
- **Rules architecture refactor** (STORY-slim-112) — Merged 6 global core rules into single `pactkit.md`; on-demand rules renumbered 01-06 and moved to `~/.claude/skills/_rules/`. Reduces context window usage by ~60% per conversation.
|
|
11
|
+
- **Auto-deploy on version mismatch** — After `pipx upgrade pactkit`, the next CLI command auto-syncs deployed files without requiring explicit `pactkit init`.
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
- **Hardcoded paths in deployer** — `_build_command_rules_header()` now uses `FormatProfile.rules_dir` / `skills_dir` instead of hardcoded `~/.claude/` paths.
|
|
15
|
+
- **Stale filename references** — Updated cross-references in visualize.py, commands.py, lazy_visualize.py, and test files to match new rule filenames.
|
|
16
|
+
|
|
7
17
|
## [2.11.0] - 2026-04-25
|
|
8
18
|
|
|
9
19
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pactkit
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.12.0
|
|
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
|
|
@@ -369,7 +369,6 @@ docs/
|
|
|
369
369
|
| Field | Type | Default | Description |
|
|
370
370
|
|-------|------|---------|-------------|
|
|
371
371
|
| `stack` | string | auto-detected | Project stack (`python`, `node`, `go`, `java`) |
|
|
372
|
-
| `version` | string | current | PactKit version that generated the config |
|
|
373
372
|
| `developer` | string | `""` | Developer prefix for Story IDs (multi-developer collaboration) |
|
|
374
373
|
| `agents` | list | all 9 | Agent definitions to deploy |
|
|
375
374
|
| `commands` | list | all 11 | Command playbooks to deploy |
|
|
@@ -327,7 +327,6 @@ docs/
|
|
|
327
327
|
| Field | Type | Default | Description |
|
|
328
328
|
|-------|------|---------|-------------|
|
|
329
329
|
| `stack` | string | auto-detected | Project stack (`python`, `node`, `go`, `java`) |
|
|
330
|
-
| `version` | string | current | PactKit version that generated the config |
|
|
331
330
|
| `developer` | string | `""` | Developer prefix for Story IDs (multi-developer collaboration) |
|
|
332
331
|
| `agents` | list | all 9 | Agent definitions to deploy |
|
|
333
332
|
| `commands` | list | all 11 | Command playbooks to deploy |
|
|
@@ -53,3 +53,4 @@
|
|
|
53
53
|
| 2026-04-23 | Rule files deploy from src/pactkit/prompts/rules.py via pactkit deploy — never edit ~/.claude/rules/ directly | src/pactkit/prompts/rules.py:RULES_MODULES |
|
|
54
54
|
| 2026-04-24 | Plan Phase横向扫描(Lateral Scan)比纵向trace更重要——PactSearch的10个技术债中60%源于缺少水平重复检测。修复方向是改Plan playbook引导Architect用已有工具(LSP/visualize/grep)做横向扫描,而非新建CLI | commands.py:Plan_Phase_1 |
|
|
55
55
|
| 2026-04-24 | When migrating functionality (e.g., version checking from pactkit.yaml to global marker), grep all references across source, prompts, tests, and CLI help text — partial migration leaves ghost behavior | board.py:update_version |
|
|
56
|
+
| 2026-04-27 | When extracting project-specific rules into a framework, generalize by removing project names, library references, and spec IDs — keep only the anti-pattern/fix-pattern structure that applies to any codebase | rules.py:RULES_MODULES |
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
## Invariants
|
|
17
17
|
|
|
18
|
-
1. All
|
|
18
|
+
1. All 3841+ 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,243 @@
|
|
|
1
|
+
# User Journey Format Specification
|
|
2
|
+
|
|
3
|
+
> This document defines the canonical format for `docs/e2e/journey.md` in PactKit-managed projects.
|
|
4
|
+
> It is a **format specification template** -- projects copy and fill this structure with their own journeys.
|
|
5
|
+
|
|
6
|
+
## Purpose
|
|
7
|
+
|
|
8
|
+
A user journey describes an end-to-end flow that spans multiple stories. While individual stories
|
|
9
|
+
have their own acceptance criteria (in `docs/test_cases/`), journeys capture the cross-story
|
|
10
|
+
integration path that a real user follows.
|
|
11
|
+
|
|
12
|
+
**Relationship to other artifacts:**
|
|
13
|
+
- `docs/test_cases/{ID}_case.md` -- single-story acceptance (Gherkin scenarios)
|
|
14
|
+
- `docs/e2e/journey.md` -- cross-story user flows (this document)
|
|
15
|
+
- `tests/e2e/` -- executable E2E test code implementing journey segments
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Journey Structure
|
|
20
|
+
|
|
21
|
+
Each journey follows this format:
|
|
22
|
+
|
|
23
|
+
```markdown
|
|
24
|
+
## Journey: {Journey Name}
|
|
25
|
+
|
|
26
|
+
> {One-line description of the user goal}
|
|
27
|
+
|
|
28
|
+
### Pre-conditions (Fixtures)
|
|
29
|
+
|
|
30
|
+
| Fixture | Description | Setup Method |
|
|
31
|
+
|---------|-------------|--------------|
|
|
32
|
+
| {name} | {what it provides} | {seed script / API call / fixture function} |
|
|
33
|
+
|
|
34
|
+
### Steps
|
|
35
|
+
|
|
36
|
+
#### Step 1: {Step Title} [client]
|
|
37
|
+
|
|
38
|
+
**Action**: {What the user does}
|
|
39
|
+
|
|
40
|
+
**Assertions**:
|
|
41
|
+
- STRUCTURE: {element/component} exists on page
|
|
42
|
+
- STRUCTURE: {data container} is non-empty
|
|
43
|
+
- BEHAVIOR: {interaction} triggers {expected response}
|
|
44
|
+
|
|
45
|
+
#### Step 2: {Step Title} [server]
|
|
46
|
+
|
|
47
|
+
**Action**: {What the system processes}
|
|
48
|
+
|
|
49
|
+
**Assertions**:
|
|
50
|
+
- STRUCTURE: {database record / API response} contains expected fields
|
|
51
|
+
- STRUCTURE: {response payload} is non-empty
|
|
52
|
+
- BEHAVIOR: {side effect} is observable (log entry, event emitted, etc.)
|
|
53
|
+
|
|
54
|
+
#### Step 3: {Step Title} [server+client]
|
|
55
|
+
|
|
56
|
+
**Action**: {Full-stack interaction}
|
|
57
|
+
|
|
58
|
+
**Assertions**:
|
|
59
|
+
- STRUCTURE: {UI element} renders with data from server
|
|
60
|
+
- STRUCTURE: {response} matches expected schema shape
|
|
61
|
+
- BEHAVIOR: {round-trip} completes within timeout
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Execution Layer Annotations
|
|
67
|
+
|
|
68
|
+
Each step MUST be annotated with its execution layer:
|
|
69
|
+
|
|
70
|
+
| Annotation | Meaning | Test Tooling |
|
|
71
|
+
|------------|---------|--------------|
|
|
72
|
+
| `[client]` | Browser/UI interaction only | Playwright, Cypress |
|
|
73
|
+
| `[server]` | Backend/API processing only | pytest + httpx, curl |
|
|
74
|
+
| `[server+client]` | Full-stack round-trip | Playwright + API assertions |
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Assertion Types
|
|
79
|
+
|
|
80
|
+
Assertions are classified into two categories with different enforcement rules:
|
|
81
|
+
|
|
82
|
+
### Structure Assertions (MUST)
|
|
83
|
+
|
|
84
|
+
Structure assertions verify that the expected elements, fields, or components **exist** and are
|
|
85
|
+
**non-empty**. These are deterministic and safe to assert in any context.
|
|
86
|
+
|
|
87
|
+
Examples:
|
|
88
|
+
- "SQL code block element exists on page"
|
|
89
|
+
- "Chart component is rendered"
|
|
90
|
+
- "API response contains `data` field"
|
|
91
|
+
- "Answer container has text content (length > 0)"
|
|
92
|
+
|
|
93
|
+
### Content Assertions (MUST NOT for AI-generated content)
|
|
94
|
+
|
|
95
|
+
Content assertions verify specific text values, numbers, or exact strings. These are appropriate
|
|
96
|
+
for deterministic outputs but MUST NOT be used for AI-generated content.
|
|
97
|
+
|
|
98
|
+
**When content is deterministic** (e.g., user profile display, static labels):
|
|
99
|
+
- Exact text matching is acceptable
|
|
100
|
+
- Numeric value assertions are acceptable
|
|
101
|
+
|
|
102
|
+
**When content is AI-generated** (e.g., chatbot responses, generated analysis):
|
|
103
|
+
- MUST NOT assert specific text content
|
|
104
|
+
- MUST NOT assert exact numeric values in generated output
|
|
105
|
+
- MUST NOT assert specific word choices or phrasing
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## AI Content Assertion Strategy
|
|
110
|
+
|
|
111
|
+
> This section provides guidance for projects that include AI-generated content in their user journeys
|
|
112
|
+
> (e.g., chatbots, AI assistants, generated reports, analysis tools).
|
|
113
|
+
|
|
114
|
+
### What to Assert (MUST)
|
|
115
|
+
|
|
116
|
+
| Category | Example Assertion |
|
|
117
|
+
|----------|------------------|
|
|
118
|
+
| Structure exists | "SQL code block element is present in the response area" |
|
|
119
|
+
| Non-empty | "Response container has text content with length > 0" |
|
|
120
|
+
| Component renders | "Chart component is mounted and visible" |
|
|
121
|
+
| Schema shape | "API response has `answer` field of type string" |
|
|
122
|
+
| Timing | "Response arrives within N seconds" |
|
|
123
|
+
| State transition | "Loading spinner disappears after response" |
|
|
124
|
+
|
|
125
|
+
### What NOT to Assert (MUST NOT)
|
|
126
|
+
|
|
127
|
+
| Anti-Pattern | Why It Fails |
|
|
128
|
+
|--------------|--------------|
|
|
129
|
+
| `assert response.text == "The answer is 42"` | AI output is non-deterministic |
|
|
130
|
+
| `assert chart.data_points == [1.5, 2.3, 4.1]` | Generated values vary per run |
|
|
131
|
+
| `assert sql_block.contains("SELECT * FROM users")` | AI may generate equivalent but different SQL |
|
|
132
|
+
| `assert summary.word_count == 150` | Length varies with model/prompt |
|
|
133
|
+
|
|
134
|
+
### Correct Pattern
|
|
135
|
+
|
|
136
|
+
```python
|
|
137
|
+
# STRUCTURE: verify element exists
|
|
138
|
+
assert page.locator(".sql-code-block").is_visible()
|
|
139
|
+
|
|
140
|
+
# NON-EMPTY: verify content was generated
|
|
141
|
+
sql_content = page.locator(".sql-code-block").text_content()
|
|
142
|
+
assert len(sql_content.strip()) > 0
|
|
143
|
+
|
|
144
|
+
# SCHEMA: verify response shape, not content
|
|
145
|
+
response = api_client.get("/chat/answer")
|
|
146
|
+
assert "answer" in response.json()
|
|
147
|
+
assert isinstance(response.json()["answer"], str)
|
|
148
|
+
assert len(response.json()["answer"]) > 0
|
|
149
|
+
|
|
150
|
+
# BEHAVIOR: verify state transition occurred
|
|
151
|
+
assert page.locator(".loading-spinner").is_hidden()
|
|
152
|
+
assert page.locator(".answer-area").is_visible()
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## Pre-condition Fixtures
|
|
158
|
+
|
|
159
|
+
Each journey MUST declare its pre-conditions as named fixtures:
|
|
160
|
+
|
|
161
|
+
```markdown
|
|
162
|
+
### Pre-conditions (Fixtures)
|
|
163
|
+
|
|
164
|
+
| Fixture | Description | Setup Method |
|
|
165
|
+
|---------|-------------|--------------|
|
|
166
|
+
| authenticated_user | Logged-in user session | `conftest.py::auth_fixture` |
|
|
167
|
+
| sample_dataset | Pre-loaded test data | `scripts/seed_test_data.py` |
|
|
168
|
+
| clean_state | Empty database with schema | `pytest fixture: db_reset` |
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Fixtures are referenced by name in step pre-conditions, enabling:
|
|
172
|
+
- Test isolation (each journey starts from a known state)
|
|
173
|
+
- Parallelization (independent journeys can run concurrently)
|
|
174
|
+
- Debugging (reproduce failures by loading specific fixtures)
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## Example: Complete Journey
|
|
179
|
+
|
|
180
|
+
```markdown
|
|
181
|
+
## Journey: First Question to Answer
|
|
182
|
+
|
|
183
|
+
> New user asks their first question and receives an AI-generated answer.
|
|
184
|
+
|
|
185
|
+
### Pre-conditions (Fixtures)
|
|
186
|
+
|
|
187
|
+
| Fixture | Description | Setup Method |
|
|
188
|
+
|---------|-------------|--------------|
|
|
189
|
+
| authenticated_user | Logged-in user with valid session | `conftest.py::auth_user` |
|
|
190
|
+
| connected_datasource | At least one data source configured | `seed/datasource.sql` |
|
|
191
|
+
|
|
192
|
+
### Steps
|
|
193
|
+
|
|
194
|
+
#### Step 1: Navigate to Chat [client]
|
|
195
|
+
|
|
196
|
+
**Action**: User opens the chat interface from dashboard.
|
|
197
|
+
|
|
198
|
+
**Assertions**:
|
|
199
|
+
- STRUCTURE: Chat input field is visible
|
|
200
|
+
- STRUCTURE: Message history area exists (may be empty)
|
|
201
|
+
- BEHAVIOR: Input field accepts text input
|
|
202
|
+
|
|
203
|
+
#### Step 2: Submit Question [server+client]
|
|
204
|
+
|
|
205
|
+
**Action**: User types a question and presses Enter.
|
|
206
|
+
|
|
207
|
+
**Assertions**:
|
|
208
|
+
- STRUCTURE: Loading indicator appears
|
|
209
|
+
- STRUCTURE: User message appears in history
|
|
210
|
+
- BEHAVIOR: API call to `/api/chat` is triggered
|
|
211
|
+
|
|
212
|
+
#### Step 3: Receive Answer [server+client]
|
|
213
|
+
|
|
214
|
+
**Action**: Server processes the question and streams response.
|
|
215
|
+
|
|
216
|
+
**Assertions**:
|
|
217
|
+
- STRUCTURE: Answer area becomes visible
|
|
218
|
+
- STRUCTURE: Answer text content is non-empty
|
|
219
|
+
- STRUCTURE: SQL code block is present (if query was data-related)
|
|
220
|
+
- BEHAVIOR: Loading indicator disappears
|
|
221
|
+
- MUST NOT: Assert specific answer text content (AI-generated)
|
|
222
|
+
- MUST NOT: Assert exact SQL query string (AI-generated)
|
|
223
|
+
|
|
224
|
+
#### Step 4: View Generated Visualization [client]
|
|
225
|
+
|
|
226
|
+
**Action**: User clicks on the chart tab to see generated visualization.
|
|
227
|
+
|
|
228
|
+
**Assertions**:
|
|
229
|
+
- STRUCTURE: Chart component is rendered
|
|
230
|
+
- STRUCTURE: Chart has at least one data series
|
|
231
|
+
- BEHAVIOR: Chart responds to hover interaction
|
|
232
|
+
- MUST NOT: Assert specific chart data values (AI-generated)
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
## Usage in Check Phase 4
|
|
238
|
+
|
|
239
|
+
When `/project-check` Phase 4 (E2E Execution) runs:
|
|
240
|
+
|
|
241
|
+
1. If `docs/e2e/journey.md` exists, read it to identify journey segments affected by the current story
|
|
242
|
+
2. E2E tests SHOULD cover the affected segments (not the full journey)
|
|
243
|
+
3. Journey definitions inform test scope; `docs/test_cases/` informs acceptance criteria
|
|
@@ -269,3 +269,21 @@
|
|
|
269
269
|
- [x] Update CLI help text
|
|
270
270
|
- [x] Clean prompt references
|
|
271
271
|
- [x] Update agent docs
|
|
272
|
+
|
|
273
|
+
### [STORY-slim-107] Integrate tech debt prevention patterns into framework rules
|
|
274
|
+
> Spec: docs/specs/STORY-slim-107.md
|
|
275
|
+
|
|
276
|
+
- [x] Expand architecture §1 DRY with dual-write
|
|
277
|
+
- [x] Expand architecture §6 Security (deny-by-default, input validation, timing)
|
|
278
|
+
- [x] Add architecture §10 Code Enforces / LLM≠Calculator
|
|
279
|
+
- [x] Add architecture §11 Concurrency & Async Safety
|
|
280
|
+
- [x] Add architecture §12 Cache Lifecycle
|
|
281
|
+
- [x] Add architecture §13 Dead Code Hygiene
|
|
282
|
+
- [x] Add String→Enum to solution module
|
|
283
|
+
- [x] Run test suite
|
|
284
|
+
|
|
285
|
+
### [BUG-slim-107] Fix scan_excludes replacing defaults and hidden root module
|
|
286
|
+
> Spec: docs/specs/BUG-slim-107.md
|
|
287
|
+
|
|
288
|
+
- [x] Merge custom excludes with defaults
|
|
289
|
+
- [x] Show root module in available list
|
|
@@ -1,28 +1,31 @@
|
|
|
1
1
|
# Project Context (Auto-generated)
|
|
2
|
-
> Last updated: 2026-
|
|
2
|
+
> Last updated: 2026-05-06T14:08:28+08:00 by pactkit context
|
|
3
3
|
|
|
4
4
|
## Sprint Status
|
|
5
|
-
Backlog:
|
|
5
|
+
Backlog: 1 | In Progress: 0 | Done: 4 stories
|
|
6
6
|
|
|
7
7
|
## Current Stories
|
|
8
8
|
None
|
|
9
9
|
|
|
10
10
|
## Recent Completions
|
|
11
|
-
|
|
11
|
+
- STORY-slim-110: project-design 集成 User Journey 生成
|
|
12
|
+
- STORY-slim-109: E2E journey.md 规范定义与 File Atlas 集成
|
|
13
|
+
- STORY-slim-108: pactkit-trace --summary 模式:接口摘要输出
|
|
12
14
|
|
|
13
15
|
## Active Branches
|
|
14
|
-
|
|
16
|
+
+ claude/naughty-euclid-e6a787
|
|
17
|
+
develop
|
|
15
18
|
* main
|
|
16
19
|
|
|
17
20
|
## Key Decisions
|
|
18
|
-
- 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
|
|
19
21
|
- 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
|
|
20
22
|
- Rule files deploy from src/pactkit/prompts/rules.py via pactkit deploy — never edit ~/.claude/rules/ directly
|
|
21
23
|
- Plan Phase横向扫描(Lateral Scan)比纵向trace更重要——PactSearch的10个技术债中60%源于缺少水平重复检测。修复方向是改Plan playbook引导Architect用已有工具(LSP/visualize/grep)做横向扫描,而非新建CLI
|
|
22
24
|
- When migrating functionality (e.g., version checking from pactkit.yaml to global marker), grep all references across source, prompts, tests, and CLI help text — partial migration leaves ghost behavior
|
|
25
|
+
- When extracting project-specific rules into a framework, generalize by removing project names, library references, and spec IDs — keep only the anti-pattern/fix-pattern structure that applies to any codebase
|
|
23
26
|
|
|
24
27
|
## Next Recommended Action
|
|
25
|
-
`/project-
|
|
28
|
+
`/project-plan`
|
|
26
29
|
|
|
27
30
|
## Agent Continuation
|
|
28
31
|
No active work session.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Sprint Board
|
|
2
|
+
|
|
3
|
+
## 📋 Backlog
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### [STORY-slim-112] Rules 架构重构:全局原则 vs 按需操作规程
|
|
7
|
+
> Spec: docs/specs/STORY-slim-112.md
|
|
8
|
+
|
|
9
|
+
- [ ] 拆分 RULES_CORE/ONDEMAND + 新建 05-principles
|
|
10
|
+
- [ ] 更新 deployer 双目录部署
|
|
11
|
+
- [ ] 更新所有 skill @import 路径
|
|
12
|
+
- [ ] 更新测试断言
|
|
13
|
+
|
|
14
|
+
## 🔄 In Progress
|
|
15
|
+
|
|
16
|
+
## ✅ Done
|
|
17
|
+
|
|
18
|
+
### [STORY-slim-111] Check Phase 4 Playwright 断言策略指南
|
|
19
|
+
> Spec: docs/specs/STORY-slim-111.md
|
|
20
|
+
|
|
21
|
+
- [x] 修改 project-check SKILL.md Phase 4 增加断言策略
|
|
22
|
+
|
|
23
|
+
### [STORY-slim-110] project-design 集成 User Journey 生成
|
|
24
|
+
> Spec: docs/specs/STORY-slim-110.md
|
|
25
|
+
|
|
26
|
+
- [x] 修改 project-design SKILL.md Phase 1 Group B
|
|
27
|
+
|
|
28
|
+
### [STORY-slim-109] E2E journey.md 规范定义与 File Atlas 集成
|
|
29
|
+
> Spec: docs/specs/STORY-slim-109.md
|
|
30
|
+
|
|
31
|
+
- [x] 注册 File Atlas
|
|
32
|
+
- [x] 创建 journey.md 格式规范
|
|
33
|
+
- [x] 修改 project-check Phase 4
|
|
34
|
+
|
|
35
|
+
### [STORY-slim-108] pactkit-trace --summary 模式:接口摘要输出
|
|
36
|
+
> Spec: docs/specs/STORY-slim-108.md
|
|
37
|
+
|
|
38
|
+
- [x] 修改 pactkit-trace SKILL.md Phase 3
|
|
39
|
+
- [x] 修改 project-act SKILL.md Phase 1
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# BUG-slim-107: Custom scan_excludes replaces defaults, leaking .next as modules
|
|
2
|
+
|
|
3
|
+
## Background
|
|
4
|
+
When a project's `pactkit.yaml` defines custom `visualize.scan_excludes`, it completely replaces the built-in `SCAN_EXCLUDES` set. Projects lose critical exclusions like `.next`, causing build artifacts to be detected as modules. Combined with the root module `.` being hidden from the "Available modules" error message, this misleads AI into concluding "visual scan not applicable to Python projects".
|
|
5
|
+
|
|
6
|
+
## Target
|
|
7
|
+
- `src/pactkit/skills/visualize.py:280` — merge custom excludes with defaults instead of replacing
|
|
8
|
+
- `src/pactkit/skills/visualize.py:1180` — include root module in available list with descriptive label
|
|
9
|
+
|
|
10
|
+
## Fix
|
|
11
|
+
1. `_detect_modules`: union custom scan_excludes with SCAN_EXCLUDES
|
|
12
|
+
2. Available modules list: show root module as `"." (project root)` instead of filtering it out
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# STORY-slim-107: Integrate tech debt prevention patterns into framework rules
|
|
2
|
+
|
|
3
|
+
| Field | Value |
|
|
4
|
+
|-------|-------|
|
|
5
|
+
| ID | STORY-slim-107 |
|
|
6
|
+
| Status | Done |
|
|
7
|
+
| Priority | P1 |
|
|
8
|
+
| Release | 2.12.0 |
|
|
9
|
+
|
|
10
|
+
## Background
|
|
11
|
+
|
|
12
|
+
A tech debt cleanup across the pactsearch project (BUG-172~191, STORY-182~209) yielded 12 recurring anti-patterns. These were captured in a personal rules file (`13-tech-debt-patterns.md`) but are not yet available to PactKit framework users. The valuable, language-agnostic patterns should be integrated into the existing deployed rule modules (`architecture` and `solution`) so all PactKit users benefit from these lessons.
|
|
13
|
+
|
|
14
|
+
**Source material**: `~/.claude/rules/13-tech-debt-patterns.md` (12 rules derived from real tech debt specs)
|
|
15
|
+
|
|
16
|
+
**Integration targets** (no new rule files — enrich existing ones):
|
|
17
|
+
- `architecture` module (`08-architecture-principles.md`): expand §1 DRY, expand §6 Security, add §10–§13
|
|
18
|
+
- `solution` module (`12-solution-design.md`): add String→Enum pattern to Implementation Constraints
|
|
19
|
+
|
|
20
|
+
## Requirements
|
|
21
|
+
|
|
22
|
+
### R1: Expand Architecture §1 DRY with Dual-Write Prevention (MUST)
|
|
23
|
+
|
|
24
|
+
Add a "No Dual-Write" sub-section to §1 Single Source of Truth (DRY) with:
|
|
25
|
+
- Anti-pattern table (Memory+DB, Cache+Source, Frontend+Backend enums, File+DB)
|
|
26
|
+
- Fix pattern (choose ONE truth source; others become read-cache or projection)
|
|
27
|
+
- Keep language-agnostic (no owlready2/rdflib references)
|
|
28
|
+
|
|
29
|
+
### R2: Expand Architecture §6 Security with Deny-by-Default, Input Validation, and Timing Consistency (MUST)
|
|
30
|
+
|
|
31
|
+
Extend §6 Defense-in-Depth with three new sub-sections:
|
|
32
|
+
- **Deny-by-Default**: Sensitive endpoints MUST require auth by default; empty config = denied
|
|
33
|
+
- **Input Validation**: User input entering URLs, commands, SQL, file paths MUST be validated/escaped (table by destination type)
|
|
34
|
+
- **Timing Consistency**: Security-sensitive branches MUST have consistent timing to prevent side-channel attacks
|
|
35
|
+
|
|
36
|
+
### R3: Add Architecture §10 Code Enforces, Prompt Instructs (MUST)
|
|
37
|
+
|
|
38
|
+
New principle with litmus test: "If the LLM ignores the prompt instruction, does the constraint still hold?" Includes anti-pattern table (SQL limit, input length, output format, date freshness) and LLM≠Calculator decision matrix.
|
|
39
|
+
|
|
40
|
+
### R4: Add Architecture §11 Concurrency & Async Safety (SHOULD)
|
|
41
|
+
|
|
42
|
+
New principle covering:
|
|
43
|
+
- Fire-and-forget tasks MUST NOT silently fail (error visibility, backpressure, shutdown awareness)
|
|
44
|
+
- Request-scoped state (ContextVar or equivalent) MUST be cleaned up in finally blocks
|
|
45
|
+
- Shared mutable state MUST be protected (lock, semaphore lazy-init)
|
|
46
|
+
|
|
47
|
+
### R5: Add Architecture §12 Cache Lifecycle (SHOULD)
|
|
48
|
+
|
|
49
|
+
New principle: every cache MUST be registered in a central invalidation function. Write operations MUST declare which caches they affect.
|
|
50
|
+
|
|
51
|
+
### R6: Add Architecture §13 Dead Code Hygiene (SHOULD)
|
|
52
|
+
|
|
53
|
+
New principle: unused functions, empty middleware, unwired components MUST be deleted or activated. Categories table (dead function, empty middleware, unwired component, commented code).
|
|
54
|
+
|
|
55
|
+
### R7: Add String→Enum Pattern to Solution Design (SHOULD)
|
|
56
|
+
|
|
57
|
+
In `solution` module under Implementation Constraints (after No Magic Values), add a `String Literal → Enum` sub-section:
|
|
58
|
+
- Rule: any string value appearing in 3+ places SHOULD be promoted to a typed enum
|
|
59
|
+
- Language-agnostic pattern (Python `str, Enum`; TypeScript `as const`; etc.)
|
|
60
|
+
- Migration checklist (define enum, replace literals, verify with grep)
|
|
61
|
+
|
|
62
|
+
## Acceptance Criteria
|
|
63
|
+
|
|
64
|
+
### AC1: Architecture module deploys with new principles (R1, R2, R3, R4, R5, R6)
|
|
65
|
+
|
|
66
|
+
- **Given** PactKit v2.12.0 is deployed via `pactkit deploy`
|
|
67
|
+
- **When** the `08-architecture-principles.md` file is generated
|
|
68
|
+
- **Then** it contains §1 with dual-write sub-section, §6 with 3 security sub-sections, §10 Code Enforces, §11 Concurrency Safety, §12 Cache Lifecycle, §13 Dead Code Hygiene
|
|
69
|
+
|
|
70
|
+
### AC2: Solution module deploys with String→Enum pattern (R7)
|
|
71
|
+
|
|
72
|
+
- **Given** PactKit v2.12.0 is deployed via `pactkit deploy`
|
|
73
|
+
- **When** the `12-solution-design.md` file is generated
|
|
74
|
+
- **Then** it contains a "String Literal → Enum" sub-section under Implementation Constraints
|
|
75
|
+
|
|
76
|
+
### AC3: All rules are language-agnostic (R1-R7)
|
|
77
|
+
|
|
78
|
+
- **Given** the new rule content in `rules.py`
|
|
79
|
+
- **When** reviewed for project-specific references
|
|
80
|
+
- **Then** no pactsearch-specific terms (owlready2, rdflib, pactsearch, BUG-172, STORY-182, etc.) appear — only generic patterns
|
|
81
|
+
|
|
82
|
+
### AC4: Existing tests pass (R1-R7)
|
|
83
|
+
|
|
84
|
+
- **Given** the modified `rules.py`
|
|
85
|
+
- **When** `pytest tests/ -v` is run
|
|
86
|
+
- **Then** all existing tests pass with 0 failures
|
|
87
|
+
|
|
88
|
+
### AC5: RULES_MANAGED_PREFIXES unchanged (R1-R7)
|
|
89
|
+
|
|
90
|
+
- **Given** no new rule files are created
|
|
91
|
+
- **When** `RULES_MANAGED_PREFIXES` is inspected
|
|
92
|
+
- **Then** it is identical to the pre-change value (no new prefix added)
|
|
93
|
+
|
|
94
|
+
## Target Call Chain
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
rules.py:RULES_MODULES["architecture"] → deployer._deploy_rules() → atomic_write(08-architecture-principles.md)
|
|
98
|
+
rules.py:RULES_MODULES["solution"] → deployer._deploy_rules() → atomic_write(12-solution-design.md)
|
|
99
|
+
```
|
|
100
|
+
No new modules, no new files, no new keys — only content changes within existing string values.
|
|
101
|
+
|
|
102
|
+
## Implementation Steps
|
|
103
|
+
|
|
104
|
+
| Step | File | Action | Dependencies | Risk |
|
|
105
|
+
|------|------|--------|-------------|------|
|
|
106
|
+
| 1 | `src/pactkit/prompts/rules.py` | Expand `architecture` §1 with dual-write sub-section | None | Low |
|
|
107
|
+
| 2 | `src/pactkit/prompts/rules.py` | Expand `architecture` §6 with deny-by-default, input validation, timing consistency | Step 1 | Low |
|
|
108
|
+
| 3 | `src/pactkit/prompts/rules.py` | Add `architecture` §10 Code Enforces / LLM≠Calculator | Step 2 | Low |
|
|
109
|
+
| 4 | `src/pactkit/prompts/rules.py` | Add `architecture` §11 Concurrency & Async Safety | Step 3 | Low |
|
|
110
|
+
| 5 | `src/pactkit/prompts/rules.py` | Add `architecture` §12 Cache Lifecycle | Step 4 | Low |
|
|
111
|
+
| 6 | `src/pactkit/prompts/rules.py` | Add `architecture` §13 Dead Code Hygiene | Step 5 | Low |
|
|
112
|
+
| 7 | `src/pactkit/prompts/rules.py` | Add String→Enum pattern to `solution` Implementation Constraints | None | Low |
|
|
113
|
+
| 8 | `tests/` | Run full test suite, verify 0 failures | Steps 1-7 | Low |
|
|
114
|
+
|
|
115
|
+
## Security Scope
|
|
116
|
+
|
|
117
|
+
| Check | Applicable | Reason |
|
|
118
|
+
|-------|------------|--------|
|
|
119
|
+
| SEC-1 | N/A | Prompt content only, no credentials |
|
|
120
|
+
| SEC-2 | N/A | No file path handling changes |
|
|
121
|
+
| SEC-3 | N/A | No user input processing |
|
|
122
|
+
| SEC-4 | N/A | No network calls |
|
|
123
|
+
| SEC-5 | N/A | No shell commands |
|
|
124
|
+
| SEC-6 | N/A | No config file writes |
|
|
125
|
+
| SEC-7 | N/A | No dependency changes |
|
|
126
|
+
| SEC-8 | N/A | No API endpoints |
|
|
127
|
+
|
|
128
|
+
## Out of Scope
|
|
129
|
+
|
|
130
|
+
- Creating new rule files (no `13-*.md` or `14-*.md` in PactKit framework)
|
|
131
|
+
- `pactkit audit` CLI integration (future story)
|
|
132
|
+
- Modifying `RULES_MANAGED_PREFIXES`, `RULES_FILES`, or `COMMAND_RULES_MAP`
|
|
133
|
+
- P.A.C.T. philosophy rules (personal, not framework-level)
|
|
134
|
+
- Project-specific examples (pactsearch owlready2, rdflib, etc.)
|