pactkit 2.16.0__tar.gz → 2.17.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.16.0 → pactkit-2.17.0}/.github/workflows/pactkit.yml +1 -1
- {pactkit-2.16.0 → pactkit-2.17.0}/CHANGELOG.md +25 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/PKG-INFO +9 -4
- {pactkit-2.16.0 → pactkit-2.17.0}/README.md +7 -2
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/architecture/governance/archive/lessons_archive_202603.md +4 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/architecture/governance/lessons.md +4 -4
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/architecture/governance/rules.md +1 -1
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/product/archive/archive_202607.md +8 -0
- pactkit-2.17.0/docs/product/archive/archive_202608.md +50 -0
- pactkit-2.17.0/docs/product/context.md +29 -0
- pactkit-2.17.0/docs/specs/STORY-slim-125.md +72 -0
- pactkit-2.17.0/docs/specs/STORY-slim-134.md +102 -0
- pactkit-2.17.0/docs/specs/STORY-slim-135.md +134 -0
- pactkit-2.17.0/docs/specs/STORY-slim-136.md +141 -0
- pactkit-2.17.0/docs/specs/STORY-slim-137.md +125 -0
- pactkit-2.17.0/docs/specs/STORY-slim-138.md +136 -0
- pactkit-2.17.0/docs/specs/STORY-slim-139.md +118 -0
- pactkit-2.17.0/docs/specs/STORY-slim-140.md +97 -0
- pactkit-2.17.0/docs/test_cases/STORY-slim-135_case.md +85 -0
- pactkit-2.17.0/docs/test_cases/STORY-slim-136_case.md +95 -0
- pactkit-2.17.0/docs/test_cases/STORY-slim-137_case.md +92 -0
- pactkit-2.17.0/docs/test_cases/STORY-slim-138_case.md +106 -0
- pactkit-2.17.0/docs/test_cases/STORY-slim-139_case.md +68 -0
- pactkit-2.17.0/docs/test_cases/STORY-slim-140_case.md +40 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/pyproject.toml +1 -1
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/__init__.py +1 -1
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/cli.py +139 -2
- pactkit-2.17.0/src/pactkit/commit_gate.py +349 -0
- pactkit-2.17.0/src/pactkit/config.py +1109 -0
- pactkit-2.17.0/src/pactkit/deploy_manifest.py +57 -0
- pactkit-2.17.0/src/pactkit/deps.py +234 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/doctor.py +63 -0
- pactkit-2.17.0/src/pactkit/done_verify.py +368 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/generators/deployer.py +20 -60
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/prompts/commands.py +11 -10
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/prompts/rules.py +17 -14
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/prompts/skills.py +44 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/prompts/workflows.py +0 -4
- pactkit-2.17.0/tests/fixtures/config_golden/copy_claude.json +147 -0
- pactkit-2.17.0/tests/fixtures/config_golden/copy_claude.yaml +24 -0
- pactkit-2.17.0/tests/fixtures/config_golden/copy_codex.json +139 -0
- pactkit-2.17.0/tests/fixtures/config_golden/copy_codex.yaml +55 -0
- pactkit-2.17.0/tests/fixtures/config_golden/copy_github.json +140 -0
- pactkit-2.17.0/tests/fixtures/config_golden/copy_github.yaml +4 -0
- pactkit-2.17.0/tests/fixtures/config_golden/empty.json +139 -0
- pactkit-2.17.0/tests/fixtures/config_golden/full_legacy.json +139 -0
- pactkit-2.17.0/tests/fixtures/config_golden/full_legacy.yaml +93 -0
- pactkit-2.17.0/tests/fixtures/config_golden/minimal.json +139 -0
- pactkit-2.17.0/tests/fixtures/config_golden/minimal.yaml +1 -0
- pactkit-2.17.0/tests/fixtures/config_golden/unknown_keys.json +142 -0
- pactkit-2.17.0/tests/fixtures/config_golden/unknown_keys.yaml +3 -0
- pactkit-2.17.0/tests/integration/__init__.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug009_project_config_backfill.py +5 -4
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_check_extensions_072_073.py +4 -6
- pactkit-2.17.0/tests/unit/test_commit_gate.py +312 -0
- pactkit-2.17.0/tests/unit/test_deps.py +152 -0
- pactkit-2.17.0/tests/unit/test_done_verify.py +281 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_prompt_cli_refs.py +1 -1
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story025_ci_pipeline.py +5 -5
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story026_issue_tracker.py +5 -5
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story030_lint.py +5 -5
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story033_config_backfill.py +21 -22
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story039_venv_config.py +5 -5
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story052_conditional_github_release.py +4 -5
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story053_impact_regression.py +5 -6
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story055_config.py +5 -14
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story056_config.py +3 -8
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story133_debug_skill.py +4 -2
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim011_command_rules.py +24 -22
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim012_ci.py +9 -8
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim022.py +16 -13
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim028.py +5 -4
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim125.py +34 -39
- pactkit-2.17.0/tests/unit/test_story_slim134_no_model_in_frontmatter.py +126 -0
- pactkit-2.17.0/tests/unit/test_story_slim135_config_schema.py +240 -0
- pactkit-2.17.0/tests/unit/test_story_slim139_skill_manifest.py +176 -0
- pactkit-2.16.0/docs/product/context.md +0 -29
- pactkit-2.16.0/docs/specs/STORY-slim-125.md +0 -86
- pactkit-2.16.0/src/pactkit/config.py +0 -1064
- {pactkit-2.16.0 → pactkit-2.17.0}/.codegraph/.gitignore +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/.github/workflows/publish.yml +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/.gitignore +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/AGENTS.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/CODE_OF_CONDUCT.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/CONTRIBUTING.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/LICENSE +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/SECURITY.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/architecture/governance/archive/lessons_archive_202602.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/architecture/governance/harness_audit.json +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/architecture/governance/philosophy.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/assets/logo.png +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/e2e/journey.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/guides/codex-integration-preresearch.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/guides/tool-integration-checklist.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/product/archive/archive_202602.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/product/archive/archive_202603.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/product/archive/archive_202604.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/product/archive/archive_202605.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/product/archive/archive_202606.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/product/friction-log.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/product/prd.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/product/sprint_board.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-001.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-002.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-003.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-004.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-005.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-006.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-007.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-008.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-009.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-010.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-011.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-012.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-013.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-014.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-015.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-016.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-017.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-018.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-019.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-020.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-021.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-022.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-023.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-024.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-025.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-026.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-027.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-028.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-029.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-030.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-031.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-032.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-033.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-034.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-035.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-slim-001.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-slim-002.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-slim-003.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-slim-004.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-slim-005.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-slim-006.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-slim-089.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/BUG-slim-107.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/HOTFIX-slim-023.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/HOTFIX-slim-049.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/HOTFIX-slim-050.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/HOTFIX-slim-051.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/HOTFIX-slim-052.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/HOTFIX-slim-061.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/HOTFIX-slim-062.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/HOTFIX-slim-067.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/HOTFIX-slim-069.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/HOTFIX-slim-070.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/HOTFIX-slim-085.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/HOTFIX-slim-087.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/HOTFIX-slim-096.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/HOTFIX-slim-099.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/HOTFIX-slim-107.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/HOTFIX-slim-117.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/HOTFIX-slim-122.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/HOTFIX-slim-123.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/HOTFIX-slim-126.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/HOTFIX-slim-127.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/HOTFIX-slim-130.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/HOTFIX-slim-131.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/HOTFIX-slim-132.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-001.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-002.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-003.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-004.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-005.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-006.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-007.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-008.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-009.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-010.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-011.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-012.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-013.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-014.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-015.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-016.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-017.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-018.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-019.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-020.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-021.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-022.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-023.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-024.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-025.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-026.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-027.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-028.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-029.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-030.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-031.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-032.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-033.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-034.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-035.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-036.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-037.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-038.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-039.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-040.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-041.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-042.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-043.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-044.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-045.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-046.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-047.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-048.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-049.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-050.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-051.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-052.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-053.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-054.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-055.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-056.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-057.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-058.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-059.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-060.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-061.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-062.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-063.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-064.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-065.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-069.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-070.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-071.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-072.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-073.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-001.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-005.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-006.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-007.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-009.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-010.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-011.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-012.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-013.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-014.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-015.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-016.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-017.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-018.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-019.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-020.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-021.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-022.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-023.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-024.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-028.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-029.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-030.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-031.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-032.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-033.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-034.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-035.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-036.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-037.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-038.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-039.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-040.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-041.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-042.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-043.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-044.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-045.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-046.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-047.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-048.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-049.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-050.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-051.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-052.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-053.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-054.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-055.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-056.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-057.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-058.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-059.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-060.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-063.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-066.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-067.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-068.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-069.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-070.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-071.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-072.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-073.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-074.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-075.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-076.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-077.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-078.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-079.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-080.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-081.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-082.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-083.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-084.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-086.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-088.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-089.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-090.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-091.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-092.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-093.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-094.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-095.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-097.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-098.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-099.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-100.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-101.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-102.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-103.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-104.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-105.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-106.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-107.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-108.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-109.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-110.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-111.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-112.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-113.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-114.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-115.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-116.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-118.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-119.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-120.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-121.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-124.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-126.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-127.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-128.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-129.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-132.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/specs/STORY-slim-133.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/test_cases/BUG-001_case.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/test_cases/BUG-002_case.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/test_cases/STORY-slim-028_case.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/test_cases/STORY-slim-029_case.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/test_cases/STORY-slim-031_case.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/test_cases/STORY-slim-032_case.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/test_cases/STORY-slim-033_case.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/docs/test_cases/STORY-slim-034_case.md +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/opencode.json +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/__main__.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/audit.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/backfill.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/cleaners.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/context_gen.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/coverage_gate.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/garden.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/generators/__init__.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/generators/adapter.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/generators/deploy_base.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/guards.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/id_generator.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/invariants.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/issue_sync.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/lazy_visualize.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/lessons.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/lint_runner.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/observe.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/profiles.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/prompts/__init__.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/prompts/agents.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/prompts/guides.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/prompts/references.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/regression.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/schemas.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/scripts.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/sec_scope.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/skills/__init__.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/skills/analyzers/__init__.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/skills/analyzers/go_analyzer.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/skills/analyzers/java_analyzer.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/skills/analyzers/python_analyzer.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/skills/analyzers/ts_analyzer.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/skills/board.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/skills/interface_summary.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/skills/report.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/skills/scaffold.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/skills/spec_linter.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/skills/visualize.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/spec_status.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/test_mapper.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/utils.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/src/pactkit/validators.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/conftest.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/e2e/__init__.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/e2e/cli/__init__.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/e2e/cli/test_cli_e2e.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/fixtures/agent_parser/agents_dir/researcher.yaml +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/fixtures/agent_parser/agents_dir/writer.yaml +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/fixtures/agent_parser/langgraph_app.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/fixtures/agent_parser/mcp_settings.json +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/fixtures/api_call_parser/axios_style.tsx +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/fixtures/api_call_parser/dynamic.tsx +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/fixtures/api_call_parser/page.tsx +0 -0
- /pactkit-2.16.0/tests/integration/__init__.py → /pactkit-2.17.0/tests/fixtures/config_golden/empty.yaml +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/integration/test_deploy_classic.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_agent_features.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_agent_frontmatter.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_agents_enrichment.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_audit.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_blast_radius.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_board_bug027.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_board_sections.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug001_skill_path.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug002_plugin_paths.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug003_multi_import.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug004_dead_set.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug005_archive_taskless.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug006_scan_excludes.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug007_stale_trace_refs.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug008_stale_command_refs.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug010_rewrite_yaml.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug011_stale_refs.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug012_call_graph_filter.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug013_config_single_source.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug014_version_hygiene.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug017_project_init_playbook.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug018_issue_tracker_verification.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug019_venv_deployment.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug020_claude_md_backup.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug025_release_delegation.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug026_version_sync.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug028_ghost_refs.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug029_stack_detection_fallback.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug030_spec_lint_cli.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug031_docstring_accuracy.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug034_plan_metadata_template.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug_021.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug_022.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug_023.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug_024.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug_slim001_env_detection.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug_slim002_instruction_collision.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug_slim003.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug_slim004.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug_slim005.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug_slim006.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_bug_slim089_global_claude_md.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_check_command.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_check_playbook_072_073.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_command_frontmatter.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_command_visualize_modes.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_complexity.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_config.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_config_auto_merge.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_constitution_sharpening.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_context_gen.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_create_skill.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_cross_flow_matrix.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_deploy_base.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_deployer_cleanup.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_deployer_plugin.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_design_command.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_done_gates.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_draw_prompt.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_draw_references.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_drawio_mcp.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_garden.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_home_path_fix.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_hotfix_command.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_init_guard.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_init_playbook_074.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_interface_summary.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_lang_profiles.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_layer_violations.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_lessons_rotation_075.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_list_stories.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_mcp_integration.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_model_config.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_modular_constitution.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_monorepo_detect.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_multi_prefix.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_observe.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_pdca_slim.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_profiles.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_project_visibility.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_prompt_quality_075.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_prompt_structural_invariants.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_prompts_package.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_release.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_release_field.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_release_v110.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_render_prompt.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_report_parser.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_report_unified.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_review_command.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_rules_enrichment.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_scaffold.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_scaffold_developer_prefix.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_schemas.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_script_extraction.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_selective_deploy.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_session_context.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_skill_structure.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_skills_enrichment.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_slim_deps_088.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_smart_regression.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_solution_design_rule.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_sprint_command.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_stack_references.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_status_command.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_statusline.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story014_release.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story015_ci_lint_gate.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story016_claude_md.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story017_init_claude_md.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story018_arch_staleness.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story019_bailout.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story020_horizon.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story021_rfc.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story022_decision_tree.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story023_test_quality.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story024_native_agent.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story028_rule_scoping.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story029_doctor.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story031_git_init_guard.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story032_greenfield_redirect.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story034_plan_config_refresh.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story035_readme_docs.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story037_regression_fix.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story038_call_graph_update.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story040_layered_claude_md.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story042_spec_linter.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story043_active_clarify.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story044_consistency_check.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story045_auto_pr.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story046_agent_adapter.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story047_enterprise_flags.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story048_worktree_isolation.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story049_community_standards.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story050_doc_only_shortcut.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story051_workflow_streamlining.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story055_commands.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story055_spec_linter.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story056_commands.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story057_implicit_cleanup.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story058_opencode_extraction.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story058_routing_fix.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story059_codex_removal.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story060_init_hang.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story061_remove_thinking.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story062_mcp_recommendations.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story063_prompt_slimming.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story064_venv_local_md.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story065_sprint_model.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story072_developer_prefix.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story106_lateral_scan.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim009_lazy_rules.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim010_dry_refactor.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim014_clean.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim014_context.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim014_guard.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim014_lazy_viz.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim014_next_id.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim014_regression.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim014_sec_scope.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim014_validators.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim015_doctor.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim016_testmap_lint.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim017.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim018.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim019_plan_subphases.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim020_explore_stall_fix.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim021.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim023.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim024.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim025.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim026.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim027.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim029.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim030.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim031.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim032.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim033.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim034.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim035.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim036.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim037.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim038.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim039.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim040.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim041.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim042.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim043.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim044.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim045.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim046.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim047.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim048.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim049.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim051.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim052.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim053.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim054.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim055.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim056.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim060_codex_profile.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim063.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim065.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim076_multistack.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim077_monorepo_stack.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim078.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim079.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim080.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim081.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim082.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim083.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim084.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim095.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim098_pdca_nudge.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim099_act_context_ref.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim102_version_marker.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim104_should_semantics.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim107.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim109_journey_spec.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim111_playwright_assertion.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim112_rules_split.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim114_journey_sync.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim119.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim120.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim121.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim126.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim127_managed_block.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim128_engineering_concerns.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_story_slim132.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_tools.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_topology_parsers_066.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_update_task.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_visualize_call_nested.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_visualize_chain_fix.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_visualize_modes.py +0 -0
- {pactkit-2.16.0 → pactkit-2.17.0}/tests/unit/test_visualize_multilang_chain.py +0 -0
|
@@ -4,6 +4,31 @@ 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.17.0] - 2026-08-13
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
- **`pactkit done-verify`** (STORY-slim-136) — Mechanical archive-honesty gate for `/project-done`. Verifies requirement→test evidence chains, checkbox↔case-file consistency (with code-span stripping), zero-production-caller components (WARN), and Spec/Board/archive status consistency. Any FAIL blocks archiving and commit (exit 1). Wired into project-done Phase 3 as a mandatory step.
|
|
11
|
+
- **`pactkit commit-gate`** (STORY-slim-138, STORY-slim-140) — Pre-commit test gate with skip≠pass transparency (passed/failed/skipped reported separately; skips always listed). Two channels sharing one pipeline: Claude Code PreToolUse hook (auto-installed into `.claude/settings.json` by init/update) and git pre-commit (auto-installed for non-Claude formats). Self-lock protection: gate-internal failures always allow with a loud WARN. Direct commits on main/master/develop force the full unit suite.
|
|
12
|
+
- **`pactkit deps check/install`** (STORY-slim-137) — External dependency registry (node/codegraph/gh) with platform-aware guided install. `pactkit init` CLI only reports (CI/air-gap safe); `/project-init` Phase 1.5 asks before installing. `enterprise.no_external` refuses installs.
|
|
13
|
+
- **`pactkit schema config`** (STORY-slim-135) — Discoverability report for every pactkit.yaml key: default, effective value, and source file.
|
|
14
|
+
- **Deployment parity check in `pactkit doctor`** (STORY-slim-139) — Every deploy writes `.pactkit-deployed.json`; doctor compares per-format manifests against the registry and FormatProfile capability matrix, turning silent deployment drift into explicit `Deployed drift:` reports.
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
- **Schema-driven pactkit.yaml** (STORY-slim-135) — `CONFIG_SCHEMA` is now the single source for defaults, validation, deep-merge behavior, and rendering. Fresh `pactkit init` writes a minimal yaml (stack + developer only) instead of a 94-line default wall; absent keys resolve through defaults. Multi-copy sync keeps `.claude`/`.codex`/`.github`/`.opencode` copies identical (canonical = `.claude` first); doctor reports copy drift.
|
|
18
|
+
- **Skill deployment single source** (STORY-slim-139) — `SKILL_MANIFEST` + public `get_skill_manifest()` contract; codex/copilot adapters consume it (restoring pactkit-garden/audit/report which a stale hardcoded list had silently dropped), opencode already conformant.
|
|
19
|
+
- **Rule map migration** — `COMMAND_RULES_MAP` keys migrated to the merged `pactkit` rule file; inline embedding no longer duplicates globally-loaded constitution content per command.
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
- **Codex adapter never touches an existing `config.toml`** — after two wipe incidents (custom TOML writer stringified arrays; parse-failure path rewrote managed-only content), the policy is now create-if-absent only. Existing files stay byte-identical.
|
|
23
|
+
- **OpenCode global instructions** — the merge logic no longer strips `rules/pactkit.md` from the always-load layer.
|
|
24
|
+
- **`install_git_hook` idempotency** — re-running no longer clobbers chained third-party pre-commit hooks.
|
|
25
|
+
- **Config copy precedence incident** — canonical selection uses explicit preference order, not key-count heuristics (an inflated default-wall copy could otherwise overwrite hand-curated config).
|
|
26
|
+
|
|
27
|
+
## [2.16.1] - 2026-07-23
|
|
28
|
+
|
|
29
|
+
### Fixed
|
|
30
|
+
- **Bedrock VS Code plugin model compatibility** (STORY-slim-134) — Removed `model:` field from all `/project-*` command frontmatter. Claude Code was resolving `model: sonnet/opus` to Anthropic's latest model ID (e.g., `us.anthropic.claude-sonnet-4-5-20250929-v1:0`), bypassing `ANTHROPIC_DEFAULT_SONNET_MODEL` env var in VS Code plugin environments. Commands now inherit the session default model set by the user's provider env vars.
|
|
31
|
+
|
|
7
32
|
## [2.16.0] - 2026-07-13
|
|
8
33
|
|
|
9
34
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: pactkit
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.17.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
|
|
@@ -130,7 +130,7 @@ pip install pactkit[all] # Everything above + IDE adapters
|
|
|
130
130
|
|
|
131
131
|
### Recommended External Tools
|
|
132
132
|
|
|
133
|
-
These tools enhance PactKit but cannot be distributed via pip:
|
|
133
|
+
These tools enhance PactKit but cannot be distributed via pip. Run `pactkit deps check` to see what's missing and `pactkit deps install` for guided platform-aware installation:
|
|
134
134
|
|
|
135
135
|
| Tool | Purpose | Install |
|
|
136
136
|
|------|---------|---------|
|
|
@@ -280,7 +280,7 @@ PactKit deploys 10 skills (3 scripted + 7 prompt-only), auto-invoked by commands
|
|
|
280
280
|
|
|
281
281
|
## CLI Subcommands
|
|
282
282
|
|
|
283
|
-
PactKit ships
|
|
283
|
+
PactKit ships 36 deterministic CLI subcommands — operations that were previously delegated to AI prompts are now enforced in Python code (the "C" in P.A.C.T.):
|
|
284
284
|
|
|
285
285
|
| Command | Purpose |
|
|
286
286
|
|---------|---------|
|
|
@@ -310,6 +310,11 @@ PactKit ships 26 deterministic CLI subcommands — operations that were previous
|
|
|
310
310
|
| `pactkit lint-context` | Validate context.md structure |
|
|
311
311
|
| `pactkit lint-lessons` | Validate lessons.md structure |
|
|
312
312
|
| `pactkit lint-testcase` | Validate test case structure |
|
|
313
|
+
| `pactkit done-verify` | Archive honesty gate: requirement→test evidence chain, checkbox↔case consistency, status machine (blocks `/project-done` on FAIL) |
|
|
314
|
+
| `pactkit commit-gate` | Pre-commit test gate with skip≠pass transparency; PreToolUse hook + git pre-commit channels, auto-installed per format |
|
|
315
|
+
| `pactkit deps` | External dependency check (`deps check`) and guided install (`deps install`) for node/codegraph/gh |
|
|
316
|
+
| `pactkit schema config` | List every pactkit.yaml key with default, effective value, and source |
|
|
317
|
+
| `pactkit sync` | Sync codegraph index |
|
|
313
318
|
|
|
314
319
|
## Deployment Architecture
|
|
315
320
|
|
|
@@ -85,7 +85,7 @@ pip install pactkit[all] # Everything above + IDE adapters
|
|
|
85
85
|
|
|
86
86
|
### Recommended External Tools
|
|
87
87
|
|
|
88
|
-
These tools enhance PactKit but cannot be distributed via pip:
|
|
88
|
+
These tools enhance PactKit but cannot be distributed via pip. Run `pactkit deps check` to see what's missing and `pactkit deps install` for guided platform-aware installation:
|
|
89
89
|
|
|
90
90
|
| Tool | Purpose | Install |
|
|
91
91
|
|------|---------|---------|
|
|
@@ -235,7 +235,7 @@ PactKit deploys 10 skills (3 scripted + 7 prompt-only), auto-invoked by commands
|
|
|
235
235
|
|
|
236
236
|
## CLI Subcommands
|
|
237
237
|
|
|
238
|
-
PactKit ships
|
|
238
|
+
PactKit ships 36 deterministic CLI subcommands — operations that were previously delegated to AI prompts are now enforced in Python code (the "C" in P.A.C.T.):
|
|
239
239
|
|
|
240
240
|
| Command | Purpose |
|
|
241
241
|
|---------|---------|
|
|
@@ -265,6 +265,11 @@ PactKit ships 26 deterministic CLI subcommands — operations that were previous
|
|
|
265
265
|
| `pactkit lint-context` | Validate context.md structure |
|
|
266
266
|
| `pactkit lint-lessons` | Validate lessons.md structure |
|
|
267
267
|
| `pactkit lint-testcase` | Validate test case structure |
|
|
268
|
+
| `pactkit done-verify` | Archive honesty gate: requirement→test evidence chain, checkbox↔case consistency, status machine (blocks `/project-done` on FAIL) |
|
|
269
|
+
| `pactkit commit-gate` | Pre-commit test gate with skip≠pass transparency; PreToolUse hook + git pre-commit channels, auto-installed per format |
|
|
270
|
+
| `pactkit deps` | External dependency check (`deps check`) and guided install (`deps install`) for node/codegraph/gh |
|
|
271
|
+
| `pactkit schema config` | List every pactkit.yaml key with default, effective value, and source |
|
|
272
|
+
| `pactkit sync` | Sync codegraph index |
|
|
268
273
|
|
|
269
274
|
## Deployment Architecture
|
|
270
275
|
|
{pactkit-2.16.0 → pactkit-2.17.0}/docs/architecture/governance/archive/lessons_archive_202603.md
RENAMED
|
@@ -67,3 +67,7 @@
|
|
|
67
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
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 |
|
|
69
69
|
| 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 |
|
|
70
|
+
| 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 |
|
|
71
|
+
| 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 |
|
|
72
|
+
| 2026-03-31 | CLI args must mirror visualize.py standalone argparse; feature implemented in visualize.py but not exposed in cli.py is effectively dead code | cli.py:viz_parser |
|
|
73
|
+
| 2026-03-31 | tree-sitter comment nodes are direct children of function body nodes (block/statement_block), enabling scoped dispatch hint queries without parent traversal. Per-language comment query needed: Go/TS use (comment), Java uses [(line_comment)(block_comment)]. | visualize.py:_extract_calls_from_body |
|
|
@@ -2,10 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
| Date | Lesson | Context |
|
|
4
4
|
|------|--------|---------|
|
|
5
|
-
| 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 |
|
|
6
|
-
| 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 |
|
|
7
|
-
| 2026-03-31 | CLI args must mirror visualize.py standalone argparse; feature implemented in visualize.py but not exposed in cli.py is effectively dead code | cli.py:viz_parser |
|
|
8
|
-
| 2026-03-31 | tree-sitter comment nodes are direct children of function body nodes (block/statement_block), enabling scoped dispatch hint queries without parent traversal. Per-language comment query needed: Go/TS use (comment), Java uses [(line_comment)(block_comment)]. | visualize.py:_extract_calls_from_body |
|
|
9
5
|
| 2026-03-31 | config.py load_config() deep merge was single-level; adding check.pactguard (nested dict inside check) required upgrading to two-level merge to preserve sub-dict defaults like mode and blocking | src/pactkit/config.py:load_config |
|
|
10
6
|
| 2026-03-31 | Adding pactkit-garden to VALID_SKILLS broke 5 hardcoded count assertions in test_config.py, test_pdca_slim.py, test_selective_deploy.py, test_prompt_structural_invariants.py, test_story_slim063.py — grep == 21 and == 10 in tests before releasing a new skill | tests/unit/test_pdca_slim.py:test_valid_skills_count |
|
|
11
7
|
| 2026-03-31 | DETECTED_ENV in commands.py init playbook was unnecessary — _render_prompt(template, profile) already resolves per-format at deploy time. Added FORMAT_NAME to deployer.py var_map to enable pactkit init --format {FORMAT_NAME}. | deployer.py:_render_prompt |
|
|
@@ -53,3 +49,7 @@
|
|
|
53
49
|
| 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 |
|
|
54
50
|
| 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 |
|
|
55
51
|
| 2026-07-13 | Adding project-debug required updating VALID_COMMANDS in config.py, VALID_SKILLS, COMMANDS_CONTENT registration in commands.py, and COMMAND_RULES_MAP in rules.py — plus 6 test files with hardcoded count assertions | src/pactkit/config.py:VALID_COMMANDS, src/pactkit/prompts/rules.py:COMMAND_RULES_MAP |
|
|
52
|
+
| 2026-07-23 | Removing `model:` from COMMANDS_CONTENT frontmatter fixes Bedrock VS Code plugin errors — Claude Code resolves the alias to Anthropic's latest model ID, bypassing `ANTHROPIC_DEFAULT_SONNET_MODEL`; without it, commands inherit the session default model set by the user's env vars | src/pactkit/prompts/commands.py:COMMANDS_CONTENT |
|
|
53
|
+
| 2026-08-13 | guardrail 测试(行数/字符数上限)触线时,优先把组装逻辑上移到 CLI 组合层而不是抬阈值——deployer 保持精简,init/update 的副作用归 cli 编排 | cli.py:init/update post-deploy housekeeping |
|
|
54
|
+
| 2026-08-13 | 配置副本同步 canonical 不能用键数启发式(默认值墙副本键数多但意图少,会覆盖手工配置),必须用显式优先级——见 config.py:sync_config_copies 的 CANONICAL_PREFERENCE | config.py:sync_config_copies |
|
|
55
|
+
| 2026-08-13 | 门禁词表扫描须先剥离 code fence/inline code span(done_verify.py:_strip_code_spans),否则词表元讨论自身误报 | done_verify.py:_strip_code_spans |
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
## Invariants
|
|
17
17
|
|
|
18
|
-
1. All
|
|
18
|
+
1. All 4124+ 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`.
|
|
@@ -18,3 +18,11 @@
|
|
|
18
18
|
- [x] Create SKILL.md protocol with all phases
|
|
19
19
|
- [x] Add to routing table in pactkit.md
|
|
20
20
|
- [x] Register in available-skills list
|
|
21
|
+
|
|
22
|
+
### [STORY-slim-134] remove model field from command frontmatter
|
|
23
|
+
> Spec: docs/specs/STORY-slim-134.md
|
|
24
|
+
|
|
25
|
+
- [x] 删除 commands.py frontmatter model 字段
|
|
26
|
+
- [x] 删除 workflows.py frontmatter model 字段
|
|
27
|
+
- [x] 运行测试套件
|
|
28
|
+
- [x] redeploy plugin artifact
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
|
|
2
|
+
### [STORY-slim-137] pactkit deps: external dependency check and guided install
|
|
3
|
+
> Spec: docs/specs/STORY-slim-137.md
|
|
4
|
+
|
|
5
|
+
- [x] deps.py 注册表+check/install
|
|
6
|
+
- [x] CLI 子命令+init 只读摘要+doctor 健康项
|
|
7
|
+
- [x] project-init Phase 1.5 接线+plugin 同步
|
|
8
|
+
- [x] mock 单测
|
|
9
|
+
|
|
10
|
+
### [STORY-slim-138] pactkit commit-gate: pre-commit test gate with skip transparency
|
|
11
|
+
> Spec: docs/specs/STORY-slim-138.md
|
|
12
|
+
|
|
13
|
+
- [x] commit_gate.py 判定逻辑(regression+test-map+pytest -rs)
|
|
14
|
+
- [x] --hook PreToolUse 模式+自锁防护
|
|
15
|
+
- [x] settings.json hook 幂等部署+--git-hook
|
|
16
|
+
- [x] mock/fixture 单测
|
|
17
|
+
|
|
18
|
+
### [STORY-slim-136] pactkit done-verify: mechanical archive honesty gate
|
|
19
|
+
> Spec: docs/specs/STORY-slim-136.md
|
|
20
|
+
|
|
21
|
+
- [x] done_verify 模块: R项证据链+勾选诚实性+状态机核验
|
|
22
|
+
- [x] 接线验证(零生产调用方 WARN)
|
|
23
|
+
- [x] CLI 子命令注册
|
|
24
|
+
- [x] project-done playbook 强制接线+plugin 同步
|
|
25
|
+
- [x] 单测覆盖 AC2-AC5 场景
|
|
26
|
+
|
|
27
|
+
### [STORY-slim-135] Schema-driven pactkit.yaml governance: minimal init, single renderer, drift detection
|
|
28
|
+
> Spec: docs/specs/STORY-slim-135.md
|
|
29
|
+
|
|
30
|
+
- [x] 引入 CONFIG_SCHEMA registry
|
|
31
|
+
- [x] 渲染器收敛+init 极简输出
|
|
32
|
+
- [x] pactkit schema config 可发现性
|
|
33
|
+
- [x] 多副本同步写入+doctor 漂移检测
|
|
34
|
+
- [x] golden 等价性测试+全量回归
|
|
35
|
+
|
|
36
|
+
### [STORY-slim-140] commit-gate git-hook fallback for non-Claude environments
|
|
37
|
+
> Spec: docs/specs/STORY-slim-140.md
|
|
38
|
+
|
|
39
|
+
- [x] cli post-deploy 格式分派(无 classic→自动 git hook)
|
|
40
|
+
- [x] 门禁通道状态输出
|
|
41
|
+
- [x] 幂等/链式/no_git 单测
|
|
42
|
+
|
|
43
|
+
### [STORY-slim-139] Skill manifest single source + adapter parity check
|
|
44
|
+
> Spec: docs/specs/STORY-slim-139.md
|
|
45
|
+
|
|
46
|
+
- [x] SKILL_MANIFEST 注册表+get_skill_manifest()
|
|
47
|
+
- [x] _deploy_skills 迭代化+.pactkit-deployed.json 落盘
|
|
48
|
+
- [x] doctor parity 检查(能力矩阵感知)
|
|
49
|
+
- [x] 跨仓: pactkit-codex 消费契约+版本 bump
|
|
50
|
+
- [x] 单测
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Project Context (Auto-generated)
|
|
2
|
+
> Last updated: 2026-08-13T17:47:41+08:00 by pactkit context
|
|
3
|
+
|
|
4
|
+
## Sprint Status
|
|
5
|
+
Backlog: 5 | 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
|
+
- Adding project-debug required updating VALID_COMMANDS in config.py, VALID_SKILLS, COMMANDS_CONTENT registration in commands.py, and COMMAND_RULES_MAP in rules.py — plus 6 test files with hardcoded count assertions
|
|
20
|
+
- Removing `model:` from COMMANDS_CONTENT frontmatter fixes Bedrock VS Code plugin errors — Claude Code resolves the alias to Anthropic's latest model ID, bypassing `ANTHROPIC_DEFAULT_SONNET_MODEL`; without it, commands inherit the session default model set by the user's env vars
|
|
21
|
+
- guardrail 测试(行数/字符数上限)触线时,优先把组装逻辑上移到 CLI 组合层而不是抬阈值——deployer 保持精简,init/update 的副作用归 cli 编排
|
|
22
|
+
- 配置副本同步 canonical 不能用键数启发式(默认值墙副本键数多但意图少,会覆盖手工配置),必须用显式优先级——见 config.py:sync_config_copies 的 CANONICAL_PREFERENCE
|
|
23
|
+
- 门禁词表扫描须先剥离 code fence/inline code span(done_verify.py:_strip_code_spans),否则词表元讨论自身误报
|
|
24
|
+
|
|
25
|
+
## Next Recommended Action
|
|
26
|
+
`/project-plan`
|
|
27
|
+
|
|
28
|
+
## Agent Continuation
|
|
29
|
+
No active work session.
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# STORY-slim-125: Add model frontmatter to all PDCA command/skill prompts
|
|
2
|
+
|
|
3
|
+
| Field | Value |
|
|
4
|
+
|-------|-------|
|
|
5
|
+
| ID | STORY-slim-125 |
|
|
6
|
+
| Status | Done |
|
|
7
|
+
| Priority | P1 |
|
|
8
|
+
| Release | 2.14.0 |
|
|
9
|
+
|
|
10
|
+
## Background
|
|
11
|
+
|
|
12
|
+
Originally (v2.14.0), all PDCA command frontmatter included a `model:` field to ensure consistent model routing. However, this caused breakage in enterprise Bedrock deployments: Claude Code resolves `model: sonnet` to the latest Anthropic model ID (e.g., `us.anthropic.claude-sonnet-4-5-20250929-v1:0`), which may not be available in a user's Bedrock deployment.
|
|
13
|
+
|
|
14
|
+
Superseded by STORY-slim-134 (v2.17.0): the `model:` field is removed from all command frontmatter. Commands now inherit the user's session-level default model, which is controlled by environment variables (`ANTHROPIC_DEFAULT_SONNET_MODEL`, etc.) that the user configures for their provider.
|
|
15
|
+
|
|
16
|
+
## Requirements
|
|
17
|
+
|
|
18
|
+
### R1: No PDCA command has model frontmatter (MUST)
|
|
19
|
+
|
|
20
|
+
No command/skill prompt in `src/pactkit/prompts/commands.py` or `src/pactkit/prompts/workflows.py` MUST include a `model:` field in its frontmatter block. Commands inherit the session default model.
|
|
21
|
+
|
|
22
|
+
### R2: Deploy produces no model field in SKILL.md (MUST)
|
|
23
|
+
|
|
24
|
+
After `pactkit update`, no deployed `~/.claude/skills/project-*/SKILL.md` MUST contain a `model:` line in its YAML frontmatter.
|
|
25
|
+
|
|
26
|
+
## Acceptance Criteria
|
|
27
|
+
|
|
28
|
+
### AC1: No command has model field (R1)
|
|
29
|
+
|
|
30
|
+
- **Given** the source prompts in `commands.py` and `workflows.py`
|
|
31
|
+
- **When** their frontmatter is parsed
|
|
32
|
+
- **Then** no command prompt contains a `model:` field
|
|
33
|
+
|
|
34
|
+
### AC2: Deploy produces no model in SKILL.md (R2)
|
|
35
|
+
|
|
36
|
+
- **Given** `pactkit update` is run
|
|
37
|
+
- **When** deployed SKILL.md files are inspected
|
|
38
|
+
- **Then** no `project-*` skill contains `model:` in frontmatter
|
|
39
|
+
|
|
40
|
+
### AC3: project-design has no model field (R1)
|
|
41
|
+
|
|
42
|
+
- **Given** the `project-design` prompt in `workflows.py`
|
|
43
|
+
- **When** its frontmatter is read
|
|
44
|
+
- **Then** no `model:` field is present
|
|
45
|
+
|
|
46
|
+
## Target Call Chain
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
commands.py / workflows.py (prompt string with frontmatter)
|
|
50
|
+
→ deployer.py _deploy_skills()
|
|
51
|
+
→ writes ~/.claude/skills/project-*/SKILL.md
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Implementation Steps
|
|
55
|
+
|
|
56
|
+
| Step | File | Action | Dependencies | Risk |
|
|
57
|
+
|------|------|--------|-------------|------|
|
|
58
|
+
| 1 | `src/pactkit/prompts/commands.py` | Add `model: sonnet` to check, done, clarify, init, release, pr frontmatter | None | Low |
|
|
59
|
+
| 2 | `src/pactkit/prompts/workflows.py` | Add `model: sonnet` to sprint, hotfix; `model: opus` to design | None | Low |
|
|
60
|
+
| 3 | `tests/unit/` | Test that all command prompts have model field | Steps 1-2 | Low |
|
|
61
|
+
|
|
62
|
+
## Security Scope
|
|
63
|
+
|
|
64
|
+
| Check | Applicable | Reason |
|
|
65
|
+
|-------|------------|--------|
|
|
66
|
+
| SEC-1 through SEC-8 | N/A | Prompt-only changes, no user input, no external systems |
|
|
67
|
+
|
|
68
|
+
## Out of Scope
|
|
69
|
+
|
|
70
|
+
- Changing embedded skill models (pactkit-trace, pactkit-draw, etc.) — already assigned
|
|
71
|
+
- Validating model availability at runtime (Claude Code handles gracefully)
|
|
72
|
+
- Adding model field to agent definitions (separate mechanism via `agent_models` config)
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# STORY-slim-134: remove model field from command frontmatter
|
|
2
|
+
|
|
3
|
+
| Field | Value |
|
|
4
|
+
|-------|-------|
|
|
5
|
+
| ID | STORY-slim-134 |
|
|
6
|
+
| Status | Done |
|
|
7
|
+
| Priority | P1 |
|
|
8
|
+
| Release | 2.17.0 |
|
|
9
|
+
|
|
10
|
+
## Background
|
|
11
|
+
|
|
12
|
+
Claude Code 在读取 command frontmatter 中的 `model: sonnet` / `model: opus` 字段时,会将 alias 解析成 Anthropic 官方最新的 model ID(如 `us.anthropic.claude-sonnet-4-5-20250929-v1:0`)。但企业用户通过 Bedrock 代理(如 genai-nexus)接入时,其部署往往只启用了较旧版本的模型,导致 VS Code 插件环境下所有 `/project-*` 命令都因模型不可用而报错。
|
|
13
|
+
|
|
14
|
+
移除 frontmatter 中的 `model:` 字段后,command 会继承用户当前 session 的默认模型(由用户的 `ANTHROPIC_DEFAULT_SONNET_MODEL` 等环境变量或 Claude Code 设置控制),不再主动切换,从而避免 Bedrock 兼容性问题。
|
|
15
|
+
|
|
16
|
+
## Requirements
|
|
17
|
+
|
|
18
|
+
### R1: 移除 prompts/commands.py 中的 model 字段 (MUST)
|
|
19
|
+
|
|
20
|
+
删除 `src/pactkit/prompts/commands.py` 中所有 command 字符串 frontmatter 里的 `model:` 行。涉及 9 处(`model: opus` × 2,`model: sonnet` × 7)。
|
|
21
|
+
|
|
22
|
+
### R2: 移除 prompts/workflows.py 中的 model 字段 (MUST)
|
|
23
|
+
|
|
24
|
+
删除 `src/pactkit/prompts/workflows.py` 中所有 command 字符串 frontmatter 里的 `model:` 行。涉及 4 处(`model: opus` × 1,`model: sonnet` × 3)。
|
|
25
|
+
|
|
26
|
+
### R3: 同步更新 pactkit-plugin/commands/ (MUST)
|
|
27
|
+
|
|
28
|
+
执行 `pactkit deploy --format plugin` 重新生成 `pactkit-plugin/commands/*.md`,确保 generated artifact 与 source 一致。
|
|
29
|
+
|
|
30
|
+
### R4: 不影响 sprint 内联 model 引用 (MUST NOT)
|
|
31
|
+
|
|
32
|
+
`workflows.py` 中 sprint 命令正文里对 `model: sonnet` 的**文本说明**(如 `A1 model: opus`)不得修改——这些是给 LLM 读的 prompt 指令,不是 frontmatter 字段。
|
|
33
|
+
|
|
34
|
+
## Acceptance Criteria
|
|
35
|
+
|
|
36
|
+
### AC1: commands.py 无 model 字段 (R1)
|
|
37
|
+
|
|
38
|
+
- **Given** `src/pactkit/prompts/commands.py` 中各 command 字符串的 YAML frontmatter
|
|
39
|
+
- **When** 检查每个 `---` 块内的字段列表
|
|
40
|
+
- **Then** 不存在任何 `model:` 行;`description:` 和 `allowed-tools:` 字段保持不变
|
|
41
|
+
|
|
42
|
+
### AC2: workflows.py 无 model 字段 (R2)
|
|
43
|
+
|
|
44
|
+
- **Given** `src/pactkit/prompts/workflows.py` 中各 command 字符串的 YAML frontmatter
|
|
45
|
+
- **When** 检查每个 `---` 块内的字段列表
|
|
46
|
+
- **Then** 不存在任何 `model:` 行;正文中对模型的文字引用保持不变
|
|
47
|
+
|
|
48
|
+
### AC3: plugin artifact 与 source 一致 (R3)
|
|
49
|
+
|
|
50
|
+
- **Given** R1/R2 修改完成后执行 `pactkit deploy --format plugin`
|
|
51
|
+
- **When** 检查 `pactkit-plugin/commands/*.md` 各文件的 frontmatter
|
|
52
|
+
- **Then** 所有文件 frontmatter 中均无 `model:` 字段
|
|
53
|
+
|
|
54
|
+
### AC5: sprint 正文模型引用不变 (R4)
|
|
55
|
+
|
|
56
|
+
- **Given** R1/R2 修改完成
|
|
57
|
+
- **When** 检查 `workflows.py` 中 sprint 命令正文(非 frontmatter)的内容
|
|
58
|
+
- **Then** `A1 (system-architect, model: opus)`、`A2 (senior-developer, model: sonnet)` 等文字说明保持不变
|
|
59
|
+
|
|
60
|
+
### AC4: 测试套件全通过 (R1-R4)
|
|
61
|
+
|
|
62
|
+
- **Given** 修改完成
|
|
63
|
+
- **When** 运行 `.venv/bin/pytest tests/ -v`
|
|
64
|
+
- **Then** 所有测试通过,无新失败
|
|
65
|
+
|
|
66
|
+
## Target Call Chain
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
src/pactkit/prompts/commands.py (COMMANDS_CONTENT 字符串常量,含 model: 字段)
|
|
70
|
+
src/pactkit/prompts/workflows.py (SPRINT_PROMPT / HOTFIX_PROMPT 等,含 model: 字段)
|
|
71
|
+
→ deployer._deploy_commands() — 原样写出字符串到文件
|
|
72
|
+
→ pactkit-plugin/commands/*.md (generated artifact)
|
|
73
|
+
→ Claude Code frontmatter 解析 → model alias → Bedrock model ID
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Implementation Steps
|
|
77
|
+
|
|
78
|
+
| Step | File | Action | Dependencies | Risk |
|
|
79
|
+
|------|------|--------|-------------|------|
|
|
80
|
+
| 1 | `src/pactkit/prompts/commands.py` | 删除所有 frontmatter 中的 `model:` 行(9 处) | None | Low |
|
|
81
|
+
| 2 | `src/pactkit/prompts/workflows.py` | 删除所有 frontmatter 中的 `model:` 行(4 处) | Step 1 | Low |
|
|
82
|
+
| 3 | 运行测试 | `.venv/bin/pytest tests/ -v` 确保无回归 | Step 1-2 | Low |
|
|
83
|
+
| 4 | `pactkit-plugin/commands/` | `pactkit deploy --format plugin` 重新生成 artifact | Step 1-2 | Low |
|
|
84
|
+
|
|
85
|
+
## Security Scope
|
|
86
|
+
|
|
87
|
+
| Check | Applicable | Reason |
|
|
88
|
+
|-------|------------|--------|
|
|
89
|
+
| SEC-1 | N/A | 仅删除字符串字段,无新代码逻辑引入 |
|
|
90
|
+
| SEC-2 | N/A | 无输入处理变更 |
|
|
91
|
+
| SEC-3 | N/A | 无数据库相关 |
|
|
92
|
+
| SEC-4 | N/A | 无前端文件 |
|
|
93
|
+
| SEC-5 | N/A | 无认证/会话逻辑变更 |
|
|
94
|
+
| SEC-6 | N/A | 无 API/路由变更 |
|
|
95
|
+
| SEC-7 | N/A | 无错误处理变更 |
|
|
96
|
+
| SEC-8 | N/A | 无依赖变更 |
|
|
97
|
+
|
|
98
|
+
## Out of Scope
|
|
99
|
+
|
|
100
|
+
- 不修改 `deployer.py` 中的 frontmatter 处理逻辑
|
|
101
|
+
- 不为用户提供 model fallback 配置机制(该需求已明确放弃)
|
|
102
|
+
- 不修改 sprint/hotfix 正文中对模型的文字说明(R4)
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# STORY-slim-135: Schema-driven pactkit.yaml governance: minimal init, single renderer, drift detection
|
|
2
|
+
|
|
3
|
+
| Field | Value |
|
|
4
|
+
|-------|-------|
|
|
5
|
+
| ID | STORY-slim-135 |
|
|
6
|
+
| Status | Done |
|
|
7
|
+
| Priority | P1 |
|
|
8
|
+
| Release | 2.17.0 |
|
|
9
|
+
|
|
10
|
+
## Background
|
|
11
|
+
|
|
12
|
+
pactkit.yaml 治理存在三个实测病灶(2026-08-13 全部在本仓库实锤):
|
|
13
|
+
|
|
14
|
+
1. **init 生成"默认值墙"**:`generate_default_yaml()` 给新项目倾泻 94 行配置,其中约 90 行是 `provider: none` / `enabled: false` / 默认阈值,用户真正要配的只有 `stack` + `developer` 两行。这与 STORY-slim-126 确立的方向("缺失 key = 接受默认,保持 yaml 极简",`auto_merge_config_file` 已停止回填)直接矛盾——合并侧说极简,脚手架侧说全量。更隐蔽的害处:init 把默认值显式固化进文件后,PactKit 日后调优默认值时存量项目永远拿着旧值(配置漂移温床)。
|
|
15
|
+
|
|
16
|
+
2. **渲染逻辑双写(DRY 违反)**:`generate_default_yaml()` 与 `_rewrite_yaml()` 各自手写逐段渲染(ci/check/pactguard/observe/e2e/visualize…),注释文案都不一致。新增一个配置键需改 5~6 处:`get_default_config` → `DEEP_MERGE_KEYS` → `KNOWN_KEYS` → `_rewrite_yaml` → `generate_default_yaml` → `validate_config`,违反 Open-Closed 与 No Magic Values。
|
|
17
|
+
|
|
18
|
+
3. **多副本漂移 + 静默优先级**:本项目同时存在 `.claude/`、`.codex/`、`.github/` 三份 pactkit.yaml,内容互不一致(`.codex` 副本 `developer: ""`,`.github` 副本残留 `version: 0.0.1`)。`find_pactkit_yaml()` 按 opencode > codex > copilot > classic 顺序取第一个命中,导致 `pactkit next-id` 静默读到 codex 副本、丢失 `slim` 前缀,输出 `STORY-074` 而非 `STORY-slim-135`——无任何告警。
|
|
19
|
+
|
|
20
|
+
## Requirements
|
|
21
|
+
|
|
22
|
+
### R1: CONFIG_SCHEMA 声明式注册表 (MUST)
|
|
23
|
+
|
|
24
|
+
在 `src/pactkit/config.py` 引入单一 `CONFIG_SCHEMA` registry:每个配置键一条声明式条目,包含 `default`、`deep_merge`(bool)、`comment`(yaml 段落注释文案)、`validator`(校验函数)。`get_default_config()`、`validate_config()`、yaml 渲染全部改为由 `CONFIG_SCHEMA` 驱动生成——新增配置键 MUST 只需新增一条 registry 条目,不得再触碰多个函数体。
|
|
25
|
+
|
|
26
|
+
### R2: init 只生成 stack + developer (MUST)
|
|
27
|
+
|
|
28
|
+
`generate_default_yaml()` 的输出 MUST 只包含:文件头注释(含"运行 `pactkit schema config` 查看全部可配项"的指引)、`stack`、`developer`。不得输出 ci / issue_tracker / lint / venv / release / regression / check / done / e2e / visualize / command_models 等默认值段。默认值解析继续由 `load_config()` 合并完成,行为不变。
|
|
29
|
+
|
|
30
|
+
### R3: 单一渲染器 (MUST)
|
|
31
|
+
|
|
32
|
+
`_rewrite_yaml()` 与 `generate_default_yaml()` 的手写逐段渲染 MUST 收敛为同一个 schema 驱动的渲染函数。`auto_merge_config_file()`、`update_yaml_stack()` 重写 yaml 时复用同一渲染器;用户已有的显式配置键和值 MUST 原样保留(含未知键的 Custom 段,即 BUG-023 行为)。
|
|
33
|
+
|
|
34
|
+
### R4: 多副本一致性治理 (MUST)
|
|
35
|
+
|
|
36
|
+
- `pactkit init` / `pactkit update` 写配置时,MUST 将同一 canonical 内容同步到所有已存在的副本路径(`.claude/`、`.codex/`、`.github/`、`.opencode/`),消除静默漂移。
|
|
37
|
+
- `pactkit doctor` MUST 新增副本漂移检测:多个副本的关键键(`stack`、`developer`)不一致时报告并给出修复建议。
|
|
38
|
+
- `find_pactkit_yaml()` 的命中优先级 MUST 在 `pactkit schema config` 输出中可见,消除"静默读到非预期副本"。
|
|
39
|
+
|
|
40
|
+
### R5: `pactkit schema config` 可发现性 (MUST)
|
|
41
|
+
|
|
42
|
+
`pactkit schema` 新增 `config` 类型:输出全部可配键、默认值、当前生效值(merge 后)、来源(default / 哪个副本文件)。这是 R2 极简化的配套——用户改配置前能查到全部选项。
|
|
43
|
+
|
|
44
|
+
### R6: 解析行为零回归 (MUST NOT)
|
|
45
|
+
|
|
46
|
+
`load_config()` 对所有现有配置键的合并结果 MUST NOT 改变。对以下 fixture 集合的 merge 结果 MUST 与重构前逐键一致:94 行老版全量 yaml、本项目当前三份副本、空文件、仅含 `stack` 的极简文件、含未知自定义键的文件。
|
|
47
|
+
|
|
48
|
+
## Acceptance Criteria
|
|
49
|
+
|
|
50
|
+
### AC1: 新 init yaml 极简 (R2)
|
|
51
|
+
|
|
52
|
+
- **Given** 在空目录执行 `pactkit init --format classic --non-interactive`
|
|
53
|
+
- **When** 读取生成的 `.claude/pactkit.yaml`
|
|
54
|
+
- **Then** 文件仅含头部注释 + `stack` + `developer`(≤ 12 行);不存在 `check:`、`e2e:`、`visualize:`、`regression:` 等默认值段
|
|
55
|
+
|
|
56
|
+
### AC2: schema 单一事实源 (R1, R3)
|
|
57
|
+
|
|
58
|
+
- **Given** 重构完成后的 `src/pactkit/config.py`
|
|
59
|
+
- **When** 检查 `get_default_config()`、`validate_config()`、渲染函数的实现
|
|
60
|
+
- **Then** 三者均由 `CONFIG_SCHEMA` 驱动;代码中不再存在逐键手写的默认值字典、逐段手写的 yaml 渲染分支
|
|
61
|
+
|
|
62
|
+
### AC3: 解析等价性 golden 测试 (R6)
|
|
63
|
+
|
|
64
|
+
- **Given** fixture 集合:94 行老版 yaml、本项目三份当前副本、空文件、极简 yaml、含未知键 yaml
|
|
65
|
+
- **When** 用重构后的 `load_config()` 加载并合并
|
|
66
|
+
- **Then** 每个 fixture 的 merged dict 与重构前基准(重构时先固化快照)逐键一致
|
|
67
|
+
|
|
68
|
+
### AC4: 重写路径统一渲染 (R3)
|
|
69
|
+
|
|
70
|
+
- **Given** 一份显式自定义过的 pactkit.yaml(含自定义键 + 部分显式段)
|
|
71
|
+
- **When** 执行 `pactkit update`(触发 auto_merge)和 `pactkit redetect-stack`
|
|
72
|
+
- **Then** 重写后的文件保留全部用户显式键值;段落渲染与 init 输出同源(同一渲染函数)
|
|
73
|
+
|
|
74
|
+
### AC5: 副本漂移被检测并修复 (R4)
|
|
75
|
+
|
|
76
|
+
- **Given** 人为构造 `.claude/pactkit.yaml`(`developer: "slim"`)与 `.codex/pactkit.yaml`(`developer: ""`)不一致
|
|
77
|
+
- **When** 执行 `pactkit doctor`,再执行 `pactkit update`
|
|
78
|
+
- **Then** doctor 报告副本漂移及冲突键;update 后所有已存在副本内容一致,`pactkit next-id` 输出带 `slim` 前缀的 ID
|
|
79
|
+
|
|
80
|
+
### AC6: schema config 可查全部键 (R5)
|
|
81
|
+
|
|
82
|
+
- **Given** 本项目任意 pactkit.yaml
|
|
83
|
+
- **When** 执行 `pactkit schema config`
|
|
84
|
+
- **Then** 输出覆盖 `CONFIG_SCHEMA` 全部条目,每条含默认值、当前生效值、来源(default 或具体副本路径)
|
|
85
|
+
|
|
86
|
+
### AC7: 测试套件全通过 (R1-R6)
|
|
87
|
+
|
|
88
|
+
- **Given** 全部修改完成
|
|
89
|
+
- **When** 运行 `.venv/bin/pytest tests/ -v`
|
|
90
|
+
- **Then** 所有测试通过,无新失败
|
|
91
|
+
|
|
92
|
+
## Target Call Chain
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
pactkit init → deployer._generate_pactkit_yaml() → config.generate_default_yaml(stack)
|
|
96
|
+
pactkit update → deployer → config.auto_merge_config_file() → config._rewrite_yaml()
|
|
97
|
+
pactkit redetect-stack → config.update_yaml_stack() → config._rewrite_yaml()
|
|
98
|
+
pactkit {next-id,audit,doctor,observe,lint,...} → config.load_config()
|
|
99
|
+
← find_pactkit_yaml() (PACTKIT_YAML_CANDIDATES 优先级: opencode > codex > copilot > classic)
|
|
100
|
+
← get_default_config() + DEEP_MERGE_KEYS 深合并
|
|
101
|
+
pactkit schema config (新) → CONFIG_SCHEMA + load_config() 生效值解析
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Implementation Steps
|
|
105
|
+
|
|
106
|
+
| Step | File | Action | Dependencies | Risk |
|
|
107
|
+
|------|------|--------|-------------|------|
|
|
108
|
+
| 1 | `src/pactkit/config.py` | 引入 CONFIG_SCHEMA registry(每键 default/deep_merge/comment/validator) | None | Medium |
|
|
109
|
+
| 2 | `src/pactkit/config.py` | get_default_config / validate_config 改为 schema 驱动;先固化现有 fixture 的 merge 快照作为 golden 基准 | Step 1 | High(行为回归风险,靠 AC3 golden 测试兜底) |
|
|
110
|
+
| 3 | `src/pactkit/config.py` | 渲染器收敛:schema 驱动 render_config_yaml(),_rewrite_yaml / generate_default_yaml 复用;init 输出砍到 stack+developer | Step 1 | Medium |
|
|
111
|
+
| 4 | `src/pactkit/schemas.py` + `cli.py` | schema 命令新增 config 类型(键/默认值/生效值/来源) | Step 1-2 | Low |
|
|
112
|
+
| 5 | `src/pactkit/generators/deployer.py` | init/update 同步写所有已存在副本 | Step 3 | Medium |
|
|
113
|
+
| 6 | `src/pactkit/doctor.py` | 新增副本漂移检测 | Step 5 | Low |
|
|
114
|
+
| 7 | `tests/unit/` | CONFIG_SCHEMA 单测 + AC3 golden 测试 + AC5 漂移检测测试 | Step 1-6 | Low |
|
|
115
|
+
|
|
116
|
+
## Security Scope
|
|
117
|
+
|
|
118
|
+
| Check | Applicable | Reason |
|
|
119
|
+
|-------|------------|--------|
|
|
120
|
+
| SEC-1 | Yes | 重构配置加载逻辑,须保证合法/非法 yaml 输入行为不回归(golden 测试覆盖) |
|
|
121
|
+
| SEC-2 | Yes | pactkit.yaml 是用户可控输入;必须继续使用 `yaml.safe_load`,禁止引入 `yaml.load` |
|
|
122
|
+
| SEC-3 | N/A | 无数据库相关(sec-scope 命中为关键词误报) |
|
|
123
|
+
| SEC-4 | N/A | 无前端文件 |
|
|
124
|
+
| SEC-5 | N/A | 无认证/会话逻辑(sec-scope 命中为关键词误报) |
|
|
125
|
+
| SEC-6 | N/A | 无 API/路由变更 |
|
|
126
|
+
| SEC-7 | Yes | yaml 解析失败、副本写入失败的错误处理路径须在重构后保持优雅降级 |
|
|
127
|
+
| SEC-8 | N/A | 无依赖变更 |
|
|
128
|
+
|
|
129
|
+
## Out of Scope
|
|
130
|
+
|
|
131
|
+
- 不改 `find_pactkit_yaml()` 的优先级顺序本身(只要求可见性 + 副本一致,重排优先级是另一个决策)
|
|
132
|
+
- 不为配置项做分层覆盖机制(global ~/.claude yaml vs project yaml 的覆盖语义维持现状)
|
|
133
|
+
- 不迁移存量项目的 94 行老 yaml(它们继续有效;用户可手动精简,`schema config` 提供指引)
|
|
134
|
+
- `pactkit deps` 外部依赖一键安装(codegraph/gh/node)——单独建卡,不在本故事
|