pactkit 2.24.2__tar.gz → 2.25.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.24.2 → pactkit-2.25.0}/CHANGELOG.md +24 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/PKG-INFO +3 -3
- pactkit-2.25.0/docs/architecture/governance/lessons/LESSON-20260828102433-81cd3e00a0.md +10 -0
- pactkit-2.25.0/docs/architecture/governance/lessons/LESSON-20260830034504-4f7d0f8c58.md +10 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/rules.md +1 -1
- pactkit-2.25.0/docs/product/stories/HOTFIX-slim-20260828ee6cde3108fb.yaml +13 -0
- pactkit-2.25.0/docs/product/stories/STORY-slim-20260828897396a935ab.yaml +31 -0
- pactkit-2.25.0/docs/product/stories/STORY-slim-202608289e83eeb30df4.yaml +31 -0
- pactkit-2.25.0/docs/product/stories/STORY-slim-20260828d43fae4edbb6.yaml +22 -0
- pactkit-2.25.0/docs/product/stories/STORY-slim-20260830c65491123af1.yaml +28 -0
- pactkit-2.25.0/docs/specs/HOTFIX-slim-20260828ee6cde3108fb.md +40 -0
- pactkit-2.25.0/docs/specs/STORY-slim-20260828897396a935ab.md +246 -0
- pactkit-2.25.0/docs/specs/STORY-slim-202608289e83eeb30df4.md +264 -0
- pactkit-2.25.0/docs/specs/STORY-slim-20260828d43fae4edbb6.md +155 -0
- pactkit-2.25.0/docs/specs/STORY-slim-20260830c65491123af1.md +178 -0
- pactkit-2.25.0/docs/test_cases/STORY-slim-20260828897396a935ab_case.md +56 -0
- pactkit-2.25.0/docs/test_cases/STORY-slim-20260830c65491123af1_case.md +43 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/pyproject.toml +2 -2
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/__init__.py +1 -1
- pactkit-2.25.0/src/pactkit/auth_gate.py +144 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/cleaners.py +35 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/cli.py +66 -4
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/commit_gate.py +410 -49
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/config.py +48 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/enforcement.py +89 -4
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/prompts/commands.py +4 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/prompts/rules.py +17 -2
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/run_events.py +64 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/run_stats.py +66 -4
- pactkit-2.25.0/src/pactkit/secrets_gate.py +83 -0
- pactkit-2.25.0/src/pactkit/session_gate.py +54 -0
- pactkit-2.25.0/src/pactkit/tamper_guard.py +243 -0
- pactkit-2.25.0/src/pactkit/utils.py +92 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/__root__.txt +4 -2
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/commit-gate.txt +3 -1
- pactkit-2.25.0/tests/fixtures/cli_help_golden/gate.txt +15 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/config_golden/copy_claude.json +12 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/config_golden/copy_codex.json +12 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/config_golden/copy_github.json +12 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/config_golden/empty.json +12 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/config_golden/full_legacy.json +12 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/config_golden/minimal.json +12 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/config_golden/unknown_keys.json +12 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_commit_gate.py +40 -14
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_constitution_sharpening.py +5 -1
- pactkit-2.25.0/tests/unit/test_gate_telemetry.py +252 -0
- pactkit-2.25.0/tests/unit/test_hook_expansion.py +394 -0
- pactkit-2.25.0/tests/unit/test_push_gate.py +479 -0
- pactkit-2.25.0/tests/unit/test_stack_test_command.py +195 -0
- pactkit-2.24.2/src/pactkit/utils.py +0 -39
- {pactkit-2.24.2 → pactkit-2.25.0}/.codegraph/.gitignore +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/.coverage +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/.github/workflows/pactkit.yml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/.github/workflows/publish.yml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/.gitignore +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/AGENTS.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/CODE_OF_CONDUCT.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/CONTRIBUTING.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/LICENSE +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/README.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/SECURITY.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/archive/lessons_archive_202602.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/archive/lessons_archive_202603.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/archive/lessons_archive_202604.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/harness_audit.json +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260227-8e92f52c86.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260227-a21cacfde2.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260227-ccb19799ea.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260228-6e4b02ff08.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260228-b87245d5fc.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260302-8980b2512d.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260302-8f58fa2045.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260302-a3a1b7900e.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260303-3f65c0442b.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260304-23c605e495.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260304-8bd6c10219.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260305-129d1dea2a.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260305-48752d79c3.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260305-b9afdd8720.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260305-f93ee5b19f.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260306-7061390095.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260313-edf7807faf.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260316-091567c2bb.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260316-4661b3789a.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260316-7214dac8fc.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260317-3d8a855086.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260317-4ba69c35f0.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260317-6cd2a53ba5.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260317-7a0dd3407e.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260317-86927e3701.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260317-9a8025eaac.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260317-a0721cc066.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260317-a1f53d759b.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260317-a9f7897b36.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260317-ff430eaa29.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260318-fb0bcd928b.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260319-f320fbb5cc.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260320-b2d80c56b3.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260320-c102dbd6f8.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260320-e8f6ddae81.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260321-5e57da75b0.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260321-6a4a30628f.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260321-b5a58de3f9.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260321-e0138991ed.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260321-e49663fc95.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260322-4c0480e882.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260322-d1ece5c0d4.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260323-4bd30888ce.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260323-7a02b3eb85.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260323-8624e0d93a.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260323-a8faeea78c.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260324-075e3332b8.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260324-0f6f041a52.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260324-2dab5931de.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260324-8bcda73e9b.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260324-9e6238f0c8.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260324-a1cace9846.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260324-bf64dd9564.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260324-c344d7655c.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260324-e60c50dcc9.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260324-f5149caffe.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260325-1a5eeea04c.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260326-02460b22de.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260326-09de627b2b.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260326-204ea48f84.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260326-32e2fd3074.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260326-6c6dbfc365.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260326-7811ad7ff2.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260326-88e7123370.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260326-d2376010b1.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260326-e4f0eb8850.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260326-e68b8aa47f.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260326-fdd06ad981.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260327-e3c7f5abcb.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260330-eb1760def2.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260331-1b58a289ea.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260331-26e474753e.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260331-3028ab9cf5.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260331-350048862b.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260331-7d41cdf5a3.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260331-8e5558a077.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260331-c46df1c3b1.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260401-41515789f6.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260401-4453752dda.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260401-5a225a1c0a.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260401-90724b10f0.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260401-9e322eb76e.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260401-bd20019d3d.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260401-de035be681.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260401-f44c8f499e.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260401-fa52f596ff.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260402-5b063207c8.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260402-5e0913ec81.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260415-3d8b5e8f81.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260415-84219771ca.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260416-41d4564480.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260416-5cdc3cf53f.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260416-807c65a8e7.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260416-ade561c777.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260416-b78aaf129a.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260416-db8a5430a0.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260416-f5a765c496.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260417-f1d777e9c9.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260418-ee12f2ff0d.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260420-2260437be7.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260420-a35a083e29.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260420-fa7d958d56.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260421-309c998a10.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260422-6509ac4df0.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260422-8dd5ed6a24.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260423-b0890ad9c2.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260424-24cc1d5e19.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260424-39a99c887d.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260427-f7955d5775.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260507-7b75a5cab8.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260507-b26f97255d.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260525-1fe96d2ff4.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260525-717e18e190.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260525-df4853fa3f.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260526-4c230f3a9d.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260601-6d6b779a83.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260601-e65d3407ed.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260610-51c3cf895e.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260629-6171e54ac8.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260702-4616caa284.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260713-da6d40dcc0.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260723-d4c9801300.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260813-18efcf9687.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260813-1dc6e2e1c7.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260813-21d4da632f.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260817-3587ae1a22.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260817-5f08a6affa.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260817-800f717c9d.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260817-a2cd839a2d.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260822-9175485749.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260822105138-298451a42c.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260822105138-522c7e4af4.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260822105138-72cc1d0343.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260823015950-6b8cbea92e.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260823022240-d3570f57fb.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260823050717-9192db37f8.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260826072120-c6db5dd5b1.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260826074629-f5119ea78b.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260826080242-012107ada2.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260826082256-eff3747d60.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260827093143-3236113033.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260827095642-059a7e996b.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons/LESSON-20260827102057-e04522a6fc.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/lessons.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/architecture/governance/philosophy.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/assets/logo.png +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/e2e/journey.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/guides/codex-integration-preresearch.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/guides/tool-integration-checklist.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/archive/archive_202602.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/archive/archive_202603.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/archive/archive_202604.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/archive/archive_202605.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/archive/archive_202606.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/archive/archive_202607.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/archive/archive_202608.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/context.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/friction-log.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/harness-comparison-2026-08-27.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/prd.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/sprint_board.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/HOTFIX-slim-127.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/HOTFIX-slim-131.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/HOTFIX-slim-132.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/STORY-slim-115.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/STORY-slim-118.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/STORY-slim-119.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/STORY-slim-145.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/STORY-slim-147.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/STORY-slim-148.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/STORY-slim-149.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/STORY-slim-2026082381e832771d4e.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/STORY-slim-20260823d854b0cf1875.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/STORY-slim-20260823de7e85d6042a.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/STORY-slim-20260825b1c83a046b4b.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/STORY-slim-202608264cf429c75e22.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/STORY-slim-2026082672b57c78fd67.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/STORY-slim-202608267c3989223b4d.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/STORY-slim-202608268fc379dbe6ef.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/STORY-slim-20260826ac1f0bfe4148.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/STORY-slim-20260826cb37edfdd4da.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/STORY-slim-20260826ce35b77ce005.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/STORY-slim-20260826f9492ab32c3d.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/STORY-slim-20260827024e71df170f.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/STORY-slim-2026082727cc4ab535e7.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/STORY-slim-2026082730b5954cf538.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/STORY-slim-20260827625b870eb7da.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/STORY-slim-202608277ec1236a7b99.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/STORY-slim-20260827833e7a200f9a.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/STORY-slim-20260827855bf3efaec3.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/STORY-slim-2026082799fa651655be.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/STORY-slim-20260827c67e3add6af5.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/STORY-slim-20260827d0ae0dfada51.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/STORY-slim-20260827eddbe9669c87.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/STORY-slim-20260827fb6291b717eb.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/product/stories/STORY-slim-20260827fc9de5542ad7.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-001.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-002.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-003.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-004.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-005.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-006.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-007.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-008.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-009.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-010.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-011.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-012.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-013.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-014.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-015.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-016.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-017.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-018.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-019.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-020.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-021.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-022.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-023.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-024.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-025.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-026.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-027.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-028.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-029.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-030.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-031.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-032.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-033.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-034.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-035.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-slim-001.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-slim-002.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-slim-003.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-slim-004.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-slim-005.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-slim-006.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-slim-089.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/BUG-slim-107.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/HOTFIX-slim-023.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/HOTFIX-slim-049.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/HOTFIX-slim-050.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/HOTFIX-slim-051.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/HOTFIX-slim-052.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/HOTFIX-slim-061.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/HOTFIX-slim-062.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/HOTFIX-slim-067.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/HOTFIX-slim-069.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/HOTFIX-slim-070.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/HOTFIX-slim-085.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/HOTFIX-slim-087.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/HOTFIX-slim-096.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/HOTFIX-slim-099.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/HOTFIX-slim-107.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/HOTFIX-slim-117.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/HOTFIX-slim-122.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/HOTFIX-slim-123.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/HOTFIX-slim-126.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/HOTFIX-slim-127.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/HOTFIX-slim-130.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/HOTFIX-slim-131.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/HOTFIX-slim-132.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-001.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-002.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-003.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-004.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-005.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-006.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-007.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-008.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-009.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-010.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-011.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-012.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-013.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-014.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-015.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-016.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-017.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-018.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-019.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-020.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-021.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-022.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-023.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-024.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-025.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-026.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-027.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-028.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-029.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-030.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-031.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-032.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-033.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-034.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-035.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-036.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-037.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-038.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-039.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-040.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-041.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-042.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-043.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-044.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-045.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-046.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-047.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-048.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-049.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-050.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-051.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-052.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-053.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-054.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-055.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-056.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-057.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-058.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-059.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-060.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-061.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-062.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-063.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-064.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-065.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-069.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-070.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-071.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-072.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-073.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-001.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-005.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-006.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-007.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-009.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-010.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-011.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-012.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-013.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-014.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-015.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-016.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-017.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-018.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-019.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-020.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-021.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-022.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-023.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-024.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-028.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-029.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-030.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-031.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-032.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-033.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-034.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-035.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-036.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-037.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-038.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-039.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-040.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-041.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-042.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-043.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-044.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-045.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-046.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-047.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-048.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-049.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-050.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-051.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-052.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-053.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-054.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-055.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-056.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-057.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-058.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-059.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-060.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-063.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-066.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-067.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-068.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-069.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-070.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-071.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-072.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-073.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-074.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-075.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-076.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-077.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-078.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-079.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-080.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-081.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-082.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-083.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-084.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-086.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-088.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-089.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-090.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-091.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-092.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-093.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-094.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-095.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-097.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-098.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-099.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-100.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-101.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-102.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-103.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-104.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-105.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-106.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-107.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-108.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-109.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-110.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-111.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-112.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-113.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-114.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-115.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-116.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-118.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-119.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-120.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-121.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-124.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-125.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-126.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-127.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-128.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-129.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-132.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-133.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-134.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-135.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-136.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-137.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-138.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-139.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-140.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-141.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-142.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-143.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-144.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-145.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-146.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-147.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-148.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-149.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-2026082381e832771d4e.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-20260823d854b0cf1875.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-20260823de7e85d6042a.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-2026082466c8670d9655.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-20260824dd23a0ed3b4c.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-20260825b1c83a046b4b.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-202608264cf429c75e22.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-2026082672b57c78fd67.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-202608267c3989223b4d.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-202608268fc379dbe6ef.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-20260826ac1f0bfe4148.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-20260826cb37edfdd4da.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-20260826ce35b77ce005.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-20260826f9492ab32c3d.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-20260827024e71df170f.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-20260827eddbe9669c87.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/specs/STORY-slim-20260827fc9de5542ad7.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/BUG-001_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/BUG-002_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-028_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-029_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-031_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-032_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-033_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-034_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-135_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-136_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-137_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-138_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-139_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-140_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-141_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-142_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-143_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-144_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-146_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-147_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-148_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-149_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-2026082381e832771d4e_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-20260823d854b0cf1875_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-20260823de7e85d6042a_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-20260825b1c83a046b4b_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-202608264cf429c75e22_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-2026082672b57c78fd67_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-202608267c3989223b4d_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-202608268fc379dbe6ef_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-20260826ac1f0bfe4148_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-20260826cb37edfdd4da_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-20260826ce35b77ce005_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-20260826f9492ab32c3d_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-20260827024e71df170f_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-20260827eddbe9669c87_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/docs/test_cases/STORY-slim-20260827fc9de5542ad7_case.md +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/opencode.json +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/__main__.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/audit.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/backfill.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/context_gen.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/continuation.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/coverage_gate.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/delivery_evidence.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/deploy_manifest.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/deployment_transaction.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/deps.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/doctor.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/done_verify.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/garden.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/generators/__init__.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/generators/claude_md.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/generators/command_ownership.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/generators/deploy_base.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/generators/deployer.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/governance.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/graph_query.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/guards.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/host_continuation.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/id_generator.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/invariants.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/issue_sync.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/lazy_visualize.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/legacy/__init__.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/legacy/host_continuation.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/legacy/usage.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/legacy/workflow_engine.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/lessons.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/lint_runner.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/observe.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/portable_methods.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/profiles.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/project_root.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/prompts/__init__.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/prompts/agents.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/prompts/guides.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/prompts/references.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/prompts/skills.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/prompts/workflows.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/protocols.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/regression.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/risk_profile.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/schemas.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/scripts.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/sec_scope.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/skills/__init__.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/skills/analyzers/__init__.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/skills/analyzers/go_analyzer.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/skills/analyzers/java_analyzer.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/skills/analyzers/python_analyzer.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/skills/analyzers/ts_analyzer.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/skills/board.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/skills/interface_summary.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/skills/report.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/skills/scaffold.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/skills/spec_linter.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/skills/visualize.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/spec_graph.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/spec_preflight.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/spec_status.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/test_mapper.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/validators.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/workflow_engine.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/workflow_registry.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/src/pactkit/workflow_validators.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/conftest.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/e2e/__init__.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/e2e/cli/__init__.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/e2e/cli/test_cli_e2e.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/e2e/cli/test_story_slim146_cli.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/e2e/cli/test_story_slim147_workflow_cli.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/e2e/cli/test_story_slim148_governance_cli.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/e2e/cli/test_story_slim149_query_cli.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/agent_parser/agents_dir/researcher.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/agent_parser/agents_dir/writer.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/agent_parser/langgraph_app.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/agent_parser/mcp_settings.json +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/api_call_parser/axios_style.tsx +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/api_call_parser/dynamic.tsx +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/api_call_parser/page.tsx +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/audit.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/backfill-release.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/board.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/clean.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/context.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/continuation.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/coverage-gate.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/deps.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/doctor.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/done-verify.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/garden.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/generate-id.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/governance.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/guard.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/init.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/interface-summary.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/invariants-refresh.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/issue-sync.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/lesson-append.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/lint-context.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/lint-lessons.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/lint-testcase.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/lint.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/observe.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/query.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/redetect-stack.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/regression.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/report.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/schema.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/sec-scope.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/spec-graph.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/spec-lint.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/spec-preflight.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/spec-status.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/stats.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/sync.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/test-map.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/update.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/upgrade.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/version.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/visualize.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/work-unit.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/cli_help_golden/workflow.txt +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/config_golden/copy_claude.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/config_golden/copy_codex.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/config_golden/copy_github.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/config_golden/empty.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/config_golden/full_legacy.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/config_golden/minimal.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/fixtures/config_golden/unknown_keys.yaml +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/integration/__init__.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/integration/test_deploy_classic.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_agent_features.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_agent_frontmatter.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_agents_enrichment.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_audit.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_blast_radius.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_board_bug027.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_board_sections.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug001_skill_path.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug002_plugin_paths.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug003_multi_import.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug004_dead_set.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug005_archive_taskless.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug006_scan_excludes.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug007_stale_trace_refs.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug008_stale_command_refs.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug009_project_config_backfill.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug010_rewrite_yaml.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug011_stale_refs.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug012_call_graph_filter.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug013_config_single_source.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug014_version_hygiene.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug017_project_init_playbook.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug018_issue_tracker_verification.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug019_venv_deployment.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug020_claude_md_backup.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug025_release_delegation.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug026_version_sync.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug028_ghost_refs.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug029_stack_detection_fallback.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug030_spec_lint_cli.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug031_docstring_accuracy.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug034_plan_metadata_template.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug_021.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug_022.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug_023.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug_024.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug_slim001_env_detection.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug_slim002_instruction_collision.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug_slim003.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug_slim004.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug_slim005.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug_slim006.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_bug_slim089_global_claude_md.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_check_command.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_check_extensions_072_073.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_check_playbook_072_073.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_cli_help_surface.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_codex_hook_channel.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_command_frontmatter.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_command_ownership_v2.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_command_visualize_modes.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_complexity.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_config.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_config_auto_merge.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_config_sync_precedence.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_context_gen.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_continuation_hardening.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_create_skill.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_cross_flow_matrix.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_deploy_base.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_deploy_ownership_safety.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_deployer_cleanup.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_deployer_plugin.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_deployment_transaction.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_deps.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_design_command.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_done_gates.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_done_verify.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_draw_prompt.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_draw_references.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_drawio_mcp.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_enforcement.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_engine_robustness.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_garden.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_gate_fail_closed.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_home_path_fix.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_hotfix_command.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_hotfix_legacy_constitution.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_init_guard.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_init_playbook_074.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_interface_summary.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_lang_profiles.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_layer_violations.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_legacy_engine_freeze.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_lessons_rotation_075.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_list_stories.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_mcp_integration.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_model_config.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_modular_constitution.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_monorepo_detect.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_multi_prefix.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_observe.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_pdca_semantics_v2.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_pdca_slim.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_profiles.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_project_root.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_project_visibility.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_prompt_cli_contract.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_prompt_cli_refs.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_prompt_quality_075.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_prompt_structural_invariants.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_prompts_package.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_release.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_release_field.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_release_v110.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_render_prompt.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_report_parser.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_report_unified.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_resolve_scope.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_review_command.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_rule_registry_architecture.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_rules_enrichment.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_run_events.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_run_stats.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_scaffold.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_scaffold_developer_prefix.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_schemas.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_script_extraction.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_selective_deploy.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_session_context.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_skill_structure.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_skills_enrichment.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_slim_deps_088.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_smart_regression.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_solution_design_rule.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_spec_preflight.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_sprint_command.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_stack_references.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_status_command.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_statusline.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story014_release.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story015_ci_lint_gate.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story016_claude_md.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story017_init_claude_md.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story018_arch_staleness.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story019_bailout.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story020_horizon.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story021_rfc.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story022_decision_tree.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story023_test_quality.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story024_native_agent.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story025_ci_pipeline.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story026_issue_tracker.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story028_rule_scoping.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story029_doctor.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story030_lint.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story031_git_init_guard.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story032_greenfield_redirect.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story033_config_backfill.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story034_plan_config_refresh.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story035_readme_docs.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story037_regression_fix.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story038_call_graph_update.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story039_venv_config.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story040_layered_claude_md.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story042_spec_linter.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story043_active_clarify.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story044_consistency_check.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story045_auto_pr.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story047_enterprise_flags.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story048_worktree_isolation.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story049_community_standards.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story050_doc_only_shortcut.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story051_workflow_streamlining.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story052_conditional_github_release.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story053_impact_regression.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story055_commands.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story055_config.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story055_spec_linter.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story056_commands.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story056_config.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story057_implicit_cleanup.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story058_opencode_extraction.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story058_routing_fix.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story059_codex_removal.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story060_init_hang.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story061_remove_thinking.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story062_mcp_recommendations.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story063_prompt_slimming.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story064_venv_local_md.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story065_sprint_model.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story072_developer_prefix.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story106_lateral_scan.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story133_debug_skill.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_pdca_host_capsules.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_pdca_semantics_v2.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim009_lazy_rules.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim010_dry_refactor.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim011_command_rules.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim012_ci.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim014_clean.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim014_context.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim014_guard.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim014_lazy_viz.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim014_next_id.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim014_regression.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim014_sec_scope.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim014_validators.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim015_doctor.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim016_testmap_lint.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim017.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim018.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim019_plan_subphases.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim020_explore_stall_fix.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim021.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim022.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim023.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim024.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim025.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim026.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim027.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim028.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim029.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim030.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim031.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim032.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim033.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim034.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim035.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim036.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim037.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim038.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim039.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim040.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim041.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim042.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim043.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim044.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim045.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim046.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim047.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim048.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim049.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim051.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim052.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim053.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim054.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim055.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim056.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim060_codex_profile.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim063.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim065.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim076_multistack.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim077_monorepo_stack.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim078.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim079.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim080.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim081.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim082.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim083.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim084.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim095.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim098_pdca_nudge.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim099_act_context_ref.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim102_version_marker.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim104_should_semantics.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim107.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim109_journey_spec.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim111_playwright_assertion.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim112_rules_split.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim114_journey_sync.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim119.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim120.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim121.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim125.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim126.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim127_managed_block.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim128_engineering_concerns.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim132.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim134_no_model_in_frontmatter.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim135_config_schema.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim139_skill_manifest.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim141_manifest_hash.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim142_all_target_isolation.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim143_spec_graph.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim144_wave_mode.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim145.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim146.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim147.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim148.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim149.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim150.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim_stop_hook.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_story_slim_work_units.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_tools.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_topology_parsers_066.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_update_task.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_visualize_call_nested.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_visualize_chain_fix.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_visualize_modes.py +0 -0
- {pactkit-2.24.2 → pactkit-2.25.0}/tests/unit/test_visualize_multilang_chain.py +0 -0
|
@@ -1,5 +1,29 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.25.0] - 2026-08-30
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
- **Protected-branch push gate** — `git push` to a protected branch (default `main`/`master`) is intercepted across all three channels (PreToolUse, codex hooks.json, git pre-push) and blocked with an actionable message: the sanctioned path (feature branch + PR), the human bypass (`PACTKIT_ALLOW_DIRECT_PUSH=1` via the `!` prefix), and the repo-owner config (`enforcement.allow_direct_push`). Direct commits on protected branches block by default instead of merely running the full suite; `--no-verify` is no longer a free PreToolUse bypass (the agent can type it; only the env var proves a human channel). Every block and bypass is audited under `push_gate`.
|
|
7
|
+
- **Tamper guard** — agent modification of enforcement artifacts is blocked: `.git/hooks/**`, `.pactkit/enforcement/**`, `.codex/hooks.json` fully; `.claude/settings.json` only when the edit removes a gate registration. Bypass: `PACTKIT_ALLOW_CONFIG_EDIT=1` or `enforcement.tamper_guard: false`.
|
|
8
|
+
- **L1 Hard-Rule Override Protocol** — core rules now state that L1 rules are never waivable in conversation: a conflicting user instruction is refused (not obeyed), and editing rules/hooks/gate config to comply is itself L1 tampering. Sanctioned channels: do it the sanctioned way, the human runs the command via `!`, or the repo owner changes the config.
|
|
9
|
+
- **Stack-aware commit-gate test commands** — the gate runs the detected stack's real suite (`npm test` / `go test ./...` / `mvn|gradle test`) instead of forcing pytest onto Node/Go/Java repos; `pactkit doctor` probes report stack-specific availability. Python keeps the venv-aware pytest path verbatim (monorepos included).
|
|
10
|
+
- **Session context hooks** — `pactkit gate --hook session-start` regenerates `.pactkit/context.md` and prints it (SessionStart injects stdout as context; fires post-compaction too), `--hook pre-compact` refreshes state as a side effect and never blocks compaction. Cold-start orientation is deterministic instead of prompt-hoped.
|
|
11
|
+
- **Spec tampering guard** — during Act, editing a spec with an active preflight receipt is blocked ("Spec is Law", L1); Plan-phase spec writing is unaffected (no receipt exists yet). Bypass: `PACTKIT_ALLOW_SPEC_EDIT=1` or `pactkit gate authorize spec_edit`.
|
|
12
|
+
- **Authorization gate** — external-effect commands (`gh pr create`, `gh release create|delete|upload`, `gh repo create|delete`, `npm`/`pnpm`/`yarn`/`cargo publish`, `twine upload`, `docker push`) block until the user authorizes: ask first, then `pactkit gate authorize <scope>` opens a short-TTL audited window; the strict human channel is `PACTKIT_AUTHORIZED=1` via `!`. Read-only variants never match. Honest threat model: prevents forgetting, not malice — all uses leave records.
|
|
13
|
+
- **Secrets gate** — Bash commands containing literal credential material (AWS `AKIA…`, `ghp_`/`github_pat_`, `glpat-`, `xox?-`, `sk-…`, private keys, `password=`/`pwd=`/`passwd=` with a literal value) block by default; env-var indirection (`password=$DB_PASS`) is exempt as the sanctioned pattern. Bypass: `PACTKIT_ALLOW_SECRET=1` or `enforcement.secrets_gate: false`.
|
|
14
|
+
- **`pactkit gate` command** — one entry for session hooks and `authorize <scope> [--ttl-minutes N]` (token lives in the tamper-guard-protected `.pactkit/enforcement/`).
|
|
15
|
+
- **Gate telemetry** — gate blocks, authorizations, and Skill invocations feed the run-event stream (`gate_blocked` / `authorization_asked` / `authorization_granted` / `command_invoked`) so `pactkit stats` reflects real direct-PDCA usage, not only the workflow engine: per-gate block counts, per-command invocation counts, and the authorization pair at project scope. Telemetry is best-effort and never blocks a gate verdict.
|
|
16
|
+
- **`enforcement` config section** — `protected_branches` (default `[main, master]`), `allow_direct_push` (false), `tamper_guard` (true), `spec_guard` (true), `auth_gate` (true), `secrets_gate` (true), `auth_ttl_minutes` (30). Missing/malformed values fall back to safe defaults.
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
- **Git hooks no longer lock out machines without pactkit** — generated pre-commit/pre-push scripts probe `command -v pactkit` and WARN + allow when the binary is missing (was: exit 127 blocking every commit for teammates/CI in non-Python teams).
|
|
20
|
+
- **Audit records no longer persist credentials** — command-derived text is redacted (`[REDACTED:{pattern}]`) before any persistence (enforcement reasons, event details, stderr); `pactkit clean` scrubs legacy records once. Found in the 2026-08-30 fleet inspection: a blocked `PGPASSWORD=…` command had written the literal password into the on-disk audit record.
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
- **Behavior change (intentional)**: direct commits on `main`/`master` that previously "just ran more tests" now block by default — set `enforcement.allow_direct_push: true` (PactKit's own repo does) or use the bypass env var.
|
|
24
|
+
- `pactkit stats` output gains a project-scoped `Gate telemetry` section (JSON: `gate_telemetry`).
|
|
25
|
+
- Constitution baseline: core protocol word budget 735→900 (L1 Override Protocol + authorize channel).
|
|
26
|
+
|
|
3
27
|
## [2.24.2] - 2026-08-27
|
|
4
28
|
|
|
5
29
|
### Fixed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: pactkit
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.25.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
|
|
@@ -23,7 +23,7 @@ Classifier: Topic :: Software Development :: Quality Assurance
|
|
|
23
23
|
Requires-Python: >=3.10
|
|
24
24
|
Requires-Dist: pyyaml>=6.0
|
|
25
25
|
Provides-Extra: all
|
|
26
|
-
Requires-Dist: pactkit-codex<2.
|
|
26
|
+
Requires-Dist: pactkit-codex<2.26.0,>=2.25.0; extra == 'all'
|
|
27
27
|
Requires-Dist: pactkit-opencode>=2.9.0; extra == 'all'
|
|
28
28
|
Requires-Dist: ruff>=0.4; extra == 'all'
|
|
29
29
|
Requires-Dist: tree-sitter-go>=0.25; extra == 'all'
|
|
@@ -31,7 +31,7 @@ Requires-Dist: tree-sitter-java>=0.23; extra == 'all'
|
|
|
31
31
|
Requires-Dist: tree-sitter-typescript>=0.23; extra == 'all'
|
|
32
32
|
Requires-Dist: tree-sitter>=0.25; extra == 'all'
|
|
33
33
|
Provides-Extra: codex
|
|
34
|
-
Requires-Dist: pactkit-codex<2.
|
|
34
|
+
Requires-Dist: pactkit-codex<2.26.0,>=2.25.0; extra == 'codex'
|
|
35
35
|
Provides-Extra: lint
|
|
36
36
|
Requires-Dist: ruff>=0.4; extra == 'lint'
|
|
37
37
|
Provides-Extra: opencode
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema_version: 1
|
|
3
|
+
id: LESSON-20260828102433-81cd3e00a0
|
|
4
|
+
date: '2026-08-28'
|
|
5
|
+
story_id: STORY-slim-20260828897396a935ab
|
|
6
|
+
context: session_gate.py:pre_compact_entry
|
|
7
|
+
tags: []
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
SessionStart/PreCompact 契约不对称:前者 stdout 注入上下文且 compact 后触发,后者 stdout 只进 debug log——压缩前刷新状态文件必须做成副作用而非打印
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema_version: 1
|
|
3
|
+
id: LESSON-20260830034504-4f7d0f8c58
|
|
4
|
+
date: '2026-08-30'
|
|
5
|
+
story_id: STORY-slim-20260830c65491123af1
|
|
6
|
+
context: run_stats.py:collect_gate_telemetry
|
|
7
|
+
tags: []
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
计数器断线的根因是聚合端与发射端分离:run_stats 早已统计 authorization_asked/granted 但只有 workflow engine 发射——补遥测的正确切入点是 gate 拦截咽喉点(_record_gate/tamper_guard、check_command 各 gate)而非聚合层
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
## Invariants
|
|
17
17
|
|
|
18
|
-
1. All
|
|
18
|
+
1. All 4791+ 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,13 @@
|
|
|
1
|
+
schema_version: 1
|
|
2
|
+
id: HOTFIX-slim-20260828ee6cde3108fb
|
|
3
|
+
title: git hooks must not lock everyone out when pactkit is missing
|
|
4
|
+
spec_path: docs/specs/HOTFIX-slim-20260828ee6cde3108fb.md
|
|
5
|
+
status: archived
|
|
6
|
+
tasks:
|
|
7
|
+
- id: task-ce700c4d7c
|
|
8
|
+
title: PATH probe in generated pre-commit/pre-push scripts
|
|
9
|
+
completed: true
|
|
10
|
+
created_at: '2026-08-28T09:40:06+00:00'
|
|
11
|
+
updated_at: '2026-08-28T10:25:19+00:00'
|
|
12
|
+
completed_at: '2026-08-28T09:45:19+00:00'
|
|
13
|
+
archived_at: '2026-08-28T10:25:19+00:00'
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
schema_version: 1
|
|
2
|
+
id: STORY-slim-20260828897396a935ab
|
|
3
|
+
title: 'Hook coverage expansion: session context, spec/auth/secrets gates'
|
|
4
|
+
spec_path: docs/specs/STORY-slim-20260828897396a935ab.md
|
|
5
|
+
status: archived
|
|
6
|
+
tasks:
|
|
7
|
+
- id: task-88ef617a79
|
|
8
|
+
title: auth_gate module + TTL token
|
|
9
|
+
completed: true
|
|
10
|
+
- id: task-4fe2f5e463
|
|
11
|
+
title: secrets_gate credential patterns
|
|
12
|
+
completed: true
|
|
13
|
+
- id: task-3599c86e37
|
|
14
|
+
title: session_gate SessionStart/PreCompact
|
|
15
|
+
completed: true
|
|
16
|
+
- id: task-9ea9b99702
|
|
17
|
+
title: spec_guard in tamper_guard
|
|
18
|
+
completed: true
|
|
19
|
+
- id: task-dbae64cef8
|
|
20
|
+
title: dispatch wiring + install registration
|
|
21
|
+
completed: true
|
|
22
|
+
- id: task-58f20fc032
|
|
23
|
+
title: config/enforcement/cli extensions
|
|
24
|
+
completed: true
|
|
25
|
+
- id: task-fe4d5a6fb7
|
|
26
|
+
title: unit tests AC1-AC6
|
|
27
|
+
completed: true
|
|
28
|
+
created_at: '2026-08-28T10:12:42+00:00'
|
|
29
|
+
updated_at: '2026-08-28T10:25:19+00:00'
|
|
30
|
+
completed_at: '2026-08-28T10:23:54+00:00'
|
|
31
|
+
archived_at: '2026-08-28T10:25:19+00:00'
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
schema_version: 1
|
|
2
|
+
id: STORY-slim-202608289e83eeb30df4
|
|
3
|
+
title: Protected-branch push gate + L1 hard-rule override protocol
|
|
4
|
+
spec_path: docs/specs/STORY-slim-202608289e83eeb30df4.md
|
|
5
|
+
status: archived
|
|
6
|
+
tasks:
|
|
7
|
+
- id: task-ea1a074f1b
|
|
8
|
+
title: Extend hook_entry with git push matching + branch resolution + block/bypass
|
|
9
|
+
completed: true
|
|
10
|
+
- id: task-0697f734bc
|
|
11
|
+
title: Add enforcement config section to config.py
|
|
12
|
+
completed: true
|
|
13
|
+
- id: task-99362d5614
|
|
14
|
+
title: Install pre-push hook + tamper guard registration + ensure_gate_channel
|
|
15
|
+
completed: true
|
|
16
|
+
- id: task-642a8a34e6
|
|
17
|
+
title: Extend GATES + probe_push_gate + doctor output
|
|
18
|
+
completed: true
|
|
19
|
+
- id: task-0697d362c6
|
|
20
|
+
title: 'Upgrade prompts/rules.py: L1 entries + Override Protocol'
|
|
21
|
+
completed: true
|
|
22
|
+
- id: task-3957ff25e0
|
|
23
|
+
title: Write unit tests for AC1-AC8
|
|
24
|
+
completed: true
|
|
25
|
+
- id: task-4ae76ca85f
|
|
26
|
+
title: Set pactkit self-config allow_direct_push/tamper_guard
|
|
27
|
+
completed: true
|
|
28
|
+
created_at: '2026-08-28T07:32:17+00:00'
|
|
29
|
+
updated_at: '2026-08-28T10:25:19+00:00'
|
|
30
|
+
completed_at: '2026-08-28T09:37:23+00:00'
|
|
31
|
+
archived_at: '2026-08-28T10:25:19+00:00'
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
schema_version: 1
|
|
2
|
+
id: STORY-slim-20260828d43fae4edbb6
|
|
3
|
+
title: Stack-aware commit-gate test commands (node/go/java)
|
|
4
|
+
spec_path: docs/specs/STORY-slim-20260828d43fae4edbb6.md
|
|
5
|
+
status: archived
|
|
6
|
+
tasks:
|
|
7
|
+
- id: task-2f9bce4ef2
|
|
8
|
+
title: utils.stack_test_command marker resolution
|
|
9
|
+
completed: true
|
|
10
|
+
- id: task-f3ec4c758a
|
|
11
|
+
title: run_pytest stack dispatch + GateUnavailable
|
|
12
|
+
completed: true
|
|
13
|
+
- id: task-9fe787b9dd
|
|
14
|
+
title: probe_commit_gate stack-aware
|
|
15
|
+
completed: true
|
|
16
|
+
- id: task-8c24910f22
|
|
17
|
+
title: unit tests AC1-AC5
|
|
18
|
+
completed: true
|
|
19
|
+
created_at: '2026-08-28T09:43:04+00:00'
|
|
20
|
+
updated_at: '2026-08-28T10:25:19+00:00'
|
|
21
|
+
completed_at: '2026-08-28T09:45:19+00:00'
|
|
22
|
+
archived_at: '2026-08-28T10:25:19+00:00'
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
schema_version: 1
|
|
2
|
+
id: STORY-slim-20260830c65491123af1
|
|
3
|
+
title: Gate telemetry truthfulness + audit-record redaction
|
|
4
|
+
spec_path: docs/specs/STORY-slim-20260830c65491123af1.md
|
|
5
|
+
status: archived
|
|
6
|
+
tasks:
|
|
7
|
+
- id: task-e925929544
|
|
8
|
+
title: redact_command helper + persisted reason redaction
|
|
9
|
+
completed: true
|
|
10
|
+
- id: task-52f121ef11
|
|
11
|
+
title: EVENT_TYPES extension + gate event emission
|
|
12
|
+
completed: true
|
|
13
|
+
- id: task-14aa0a45c6
|
|
14
|
+
title: Skill matcher telemetry branch
|
|
15
|
+
completed: true
|
|
16
|
+
- id: task-c2d0f91cc2
|
|
17
|
+
title: run_stats gate/command counters
|
|
18
|
+
completed: true
|
|
19
|
+
- id: task-ca9189a213
|
|
20
|
+
title: clean-time legacy record scrub
|
|
21
|
+
completed: true
|
|
22
|
+
- id: task-31e039b53c
|
|
23
|
+
title: unit tests AC1-AC5
|
|
24
|
+
completed: true
|
|
25
|
+
created_at: '2026-08-30T03:29:00+00:00'
|
|
26
|
+
updated_at: '2026-08-30T03:46:05+00:00'
|
|
27
|
+
completed_at: '2026-08-30T03:35:56+00:00'
|
|
28
|
+
archived_at: '2026-08-30T03:46:05+00:00'
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# HOTFIX-slim-20260828ee6cde3108fb: git hooks must not lock everyone out when pactkit is missing
|
|
2
|
+
|
|
3
|
+
| Field | Value |
|
|
4
|
+
|-------|-------|
|
|
5
|
+
| ID | HOTFIX-slim-20260828ee6cde3108fb |
|
|
6
|
+
| Status | Done |
|
|
7
|
+
| Priority | P1 |
|
|
8
|
+
| Release | 2.25.0 |
|
|
9
|
+
|
|
10
|
+
## Background
|
|
11
|
+
|
|
12
|
+
The git hooks written by `install_git_hook` / `install_pre_push_hook`
|
|
13
|
+
(`src/pactkit/commit_gate.py`) call `exec pactkit commit-gate`. On a
|
|
14
|
+
machine without the pactkit binary on PATH (teammates, CI runners, docker
|
|
15
|
+
builds — the default state in Node.js teams that never install Python),
|
|
16
|
+
the shell exits 127 and git treats the failed hook as a block: **every
|
|
17
|
+
commit and push is locked out by a broken gate**, violating the R3
|
|
18
|
+
self-lock protection principle (a gate that cannot run must WARN and
|
|
19
|
+
allow, not masquerade as enforcement).
|
|
20
|
+
|
|
21
|
+
## Target
|
|
22
|
+
|
|
23
|
+
`src/pactkit/commit_gate.py` — `install_git_hook` (~:687) and
|
|
24
|
+
`install_pre_push_hook` (~:702): generated hook scripts gain a PATH probe
|
|
25
|
+
(`command -v pactkit`) that prints a WARN and exits 0 when the binary is
|
|
26
|
+
missing. The chain-onto-existing-hook path gets the same probe.
|
|
27
|
+
|
|
28
|
+
## Fix
|
|
29
|
+
|
|
30
|
+
Prepend to both generated scripts:
|
|
31
|
+
|
|
32
|
+
```sh
|
|
33
|
+
command -v pactkit >/dev/null 2>&1 || {
|
|
34
|
+
echo "[WARN] pactkit not on PATH — gate skipped (unavailable, not enforced)"
|
|
35
|
+
exit 0
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Verification: unit tests assert the probe is present in installed hook
|
|
40
|
+
scripts (`tests/unit/test_commit_gate.py`, `tests/unit/test_push_gate.py`).
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
# STORY-slim-20260828897396a935ab: Hook coverage expansion: session context, spec/auth/secrets gates
|
|
2
|
+
|
|
3
|
+
| Field | Value |
|
|
4
|
+
|-------|-------|
|
|
5
|
+
| ID | STORY-slim-20260828897396a935ab |
|
|
6
|
+
| Status | Done |
|
|
7
|
+
| Priority | P1 |
|
|
8
|
+
| Release | 2.25.0 |
|
|
9
|
+
|
|
10
|
+
## Background
|
|
11
|
+
|
|
12
|
+
Claude Code exposes 7 hook event families; PactKit uses one (PreToolUse).
|
|
13
|
+
The 2026-08-28 hook-coverage analysis identified five mechanisms whose
|
|
14
|
+
rules today live only in prompt text (the layer that loses to context
|
|
15
|
+
growth and compaction — the exact failure mode behind this release
|
|
16
|
+
train's original incident):
|
|
17
|
+
|
|
18
|
+
1. **Cold-start orientation**: `.pactkit/context.md` is generated by
|
|
19
|
+
`pactkit context` but relies on prompt discipline to be read.
|
|
20
|
+
2. **"Spec is Law" (L1)**: agents MUST NOT amend a Spec unilaterally
|
|
21
|
+
during Act — unenforced. Preflight receipts already bind spec hashes.
|
|
22
|
+
3. **Workflow state loss on compaction**: PDCA state (story, phase,
|
|
23
|
+
next action) evaporates with the compacted context.
|
|
24
|
+
4. **Authorization list (Runtime Contract)**: push/PR/release/publish/
|
|
25
|
+
external messages require user authorization — pure prompt today.
|
|
26
|
+
push-gate (STORY-slim-202608289e83eeb30df4) covers `git push` only.
|
|
27
|
+
5. **Secrets red line (L1)**: never print credentials — unenforced.
|
|
28
|
+
(Observed live this session: a plaintext password in a curl command
|
|
29
|
+
entered a transcript.)
|
|
30
|
+
|
|
31
|
+
Doc-verified hook contracts: SessionStart stdout (plain text) IS injected
|
|
32
|
+
as context and fires with matcher sources including `compact`; PreCompact
|
|
33
|
+
stdout is NOT injected (debug log only) — it is useful for side effects
|
|
34
|
+
only. User-confirmed design decisions: authorization gate = block + TTL
|
|
35
|
+
token (conversation flow, audited, honor-system); secrets gate = block by
|
|
36
|
+
default with env bypass.
|
|
37
|
+
|
|
38
|
+
## Requirements
|
|
39
|
+
|
|
40
|
+
### R1: SessionStart context injection (MUST)
|
|
41
|
+
|
|
42
|
+
A new hook command `pactkit gate --hook session-start` MUST regenerate
|
|
43
|
+
`.pactkit/context.md` (via the existing `context_gen.generate_context`)
|
|
44
|
+
and print it to stdout — SessionStart injects plain-text stdout as
|
|
45
|
+
context, making cold-start orientation deterministic instead of
|
|
46
|
+
prompt-hoped. Because SessionStart fires on source `compact` as well,
|
|
47
|
+
post-compaction re-orientation comes free. When generation fails, the
|
|
48
|
+
hook MUST exit 0 with a one-line WARN (context injection is an aid, never
|
|
49
|
+
a gate). Registered only for Claude Code formats (classic/all); Codex and
|
|
50
|
+
other channels skip session events (not portable).
|
|
51
|
+
|
|
52
|
+
### R2: PreCompact state refresh (MUST)
|
|
53
|
+
|
|
54
|
+
`pactkit gate --hook pre-compact` MUST refresh `.pactkit/context.md` as a
|
|
55
|
+
side effect (stdout is discarded by the harness for this event — the
|
|
56
|
+
refresh serves the subsequent SessionStart(compact) injection).
|
|
57
|
+
Compaction MUST NOT be blocked under any code path (exit 0 always; a
|
|
58
|
+
failed refresh is logged, never fatal). Deliberately redundant with R1:
|
|
59
|
+
belt-and-suspenders against SessionStart-source variance.
|
|
60
|
+
|
|
61
|
+
### R3: Spec tampering guard (MUST)
|
|
62
|
+
|
|
63
|
+
`tamper_guard.check_edit_tool` and `check_bash_command` MUST block agent
|
|
64
|
+
modification of `docs/specs/*.md` when a preflight receipt exists for
|
|
65
|
+
that story (`.pactkit/preflight/{story_id}/current.json`): during Act the
|
|
66
|
+
Spec is Law, and amendments MUST go back through `/project-plan` (the RFC
|
|
67
|
+
gate's "do not modify the Spec unilaterally"). Plan-phase spec writing is
|
|
68
|
+
unaffected — no receipt exists until spec-preflight runs. Release:
|
|
69
|
+
`PACTKIT_ALLOW_SPEC_EDIT=1` (human channel) or a valid `spec_edit`
|
|
70
|
+
authorization token. Audit under gate name `spec_guard`. Config:
|
|
71
|
+
`enforcement.spec_guard` (default `true`).
|
|
72
|
+
|
|
73
|
+
### R4: Authorization gate (MUST)
|
|
74
|
+
|
|
75
|
+
The PreToolUse Bash dispatch (`commit_gate.hook_entry`) MUST block
|
|
76
|
+
external-effect commands until the user has authorized them: `gh pr
|
|
77
|
+
create`, `gh release create|delete|upload`, `gh repo create|delete`,
|
|
78
|
+
`npm publish`, `pnpm publish`, `yarn publish`, `cargo publish`, `twine
|
|
79
|
+
upload`, `docker push`. Read-only variants (`gh pr view`, `gh release
|
|
80
|
+
list`, …) MUST NOT match (subcommand-anchored patterns only). The block
|
|
81
|
+
message MUST instruct: ask the user; after explicit confirmation run
|
|
82
|
+
`pactkit gate authorize <scope>`; the strict human channel is
|
|
83
|
+
`PACTKIT_AUTHORIZED=1` via the `!` prefix. Every block and authorized
|
|
84
|
+
allow MUST be audited under gate name `auth_gate`. Honest threat model
|
|
85
|
+
(documented in the block message rationale): this gate prevents
|
|
86
|
+
forgetting, not malice — the token is agent-invocable by design, all uses
|
|
87
|
+
leave records. Config: `enforcement.auth_gate` (default `true`),
|
|
88
|
+
`enforcement.auth_ttl_minutes` (default `30`).
|
|
89
|
+
|
|
90
|
+
### R5: Secrets gate (MUST)
|
|
91
|
+
|
|
92
|
+
The PreToolUse Bash dispatch MUST block commands containing literal
|
|
93
|
+
credential material: `AKIA[0-9A-Z]{16}` (AWS), `ghp_`/`github_pat_`
|
|
94
|
+
(GitHub), `glpat-` (GitLab), `xox[baprs]-` (Slack), `sk-` + 20+ chars
|
|
95
|
+
(API keys), `-----BEGIN … PRIVATE KEY-----`, and `password=`/`pwd=`/
|
|
96
|
+
`passwd=` with a non-empty literal value. Environment-variable
|
|
97
|
+
references (`$VAR`, `${VAR}`) MUST be exempt — indirection is the
|
|
98
|
+
sanctioned pattern. Block by default (user decision), with
|
|
99
|
+
`PACTKIT_ALLOW_SECRET=1` bypass and config `enforcement.secrets_gate`
|
|
100
|
+
(default `true`). Audited under gate name `secrets_gate`.
|
|
101
|
+
|
|
102
|
+
### R6: authorize CLI + token + registration + doctor (MUST)
|
|
103
|
+
|
|
104
|
+
`pactkit gate authorize <scope> [--ttl-minutes N]` MUST atomically write
|
|
105
|
+
`.pactkit/enforcement/authorization.json` (`{scope, expires_at, ts}`),
|
|
106
|
+
valid for the configured TTL; guards R3/R4 read it via a shared helper.
|
|
107
|
+
The token file lives under `.pactkit/enforcement/` — already inside the
|
|
108
|
+
tamper guard's protected surface, so raw file tampering stays blocked and
|
|
109
|
+
the CLI is the single audited write path. `install_hook` MUST register
|
|
110
|
+
the SessionStart and PreCompact entries (classic/all formats only).
|
|
111
|
+
`config.py`'s `enforcement` section extends with `spec_guard`,
|
|
112
|
+
`auth_gate`, `secrets_gate` (bool, default `true`) and `auth_ttl_minutes`
|
|
113
|
+
(int, default `30`); the validator's known-key set updates accordingly.
|
|
114
|
+
`GATES` extends with `spec_guard`, `auth_gate`, `secrets_gate`; each gets
|
|
115
|
+
a doctor probe; all three fold into the existing `_enforcement_settings`
|
|
116
|
+
normalization (missing/malformed values fall back to safe defaults).
|
|
117
|
+
|
|
118
|
+
## Acceptance Criteria
|
|
119
|
+
|
|
120
|
+
### AC1: SessionStart injects context (R1)
|
|
121
|
+
|
|
122
|
+
- **Given** a deployed project with board stories and a git repo
|
|
123
|
+
- **When** `pactkit gate --hook session-start` runs
|
|
124
|
+
- **Then** stdout contains the regenerated context (Sprint Status / Current Stories sections) and exit code is 0
|
|
125
|
+
- **Given** generation raises (e.g. unreadable board)
|
|
126
|
+
- **Then** the hook exits 0 with a one-line WARN on stderr, never non-zero
|
|
127
|
+
|
|
128
|
+
### AC2: PreCompact refreshes state without blocking (R2)
|
|
129
|
+
|
|
130
|
+
- **Given** a project with workflow state
|
|
131
|
+
- **When** `pactkit gate --hook pre-compact` runs
|
|
132
|
+
- **Then** `.pactkit/context.md` is refreshed (mtime changes) and the exit code is 0
|
|
133
|
+
- **Given** the refresh fails internally
|
|
134
|
+
- **Then** the exit code is still 0 (compaction must never be blocked)
|
|
135
|
+
|
|
136
|
+
### AC3: Spec tampering blocked during Act (R3)
|
|
137
|
+
|
|
138
|
+
- **Given** a spec with an active preflight receipt (`current.json` exists and matches the story)
|
|
139
|
+
- **When** an Edit tool call targets `docs/specs/{story}.md`
|
|
140
|
+
- **Then** the hook exits 2 with a "Spec is Law" message and a `spec_guard` record is written
|
|
141
|
+
- **Given** `PACTKIT_ALLOW_SPEC_EDIT=1` in the environment, or a valid `spec_edit` token
|
|
142
|
+
- **When** the same Edit is attempted
|
|
143
|
+
- **Then** it is allowed
|
|
144
|
+
- **Given** a spec with NO receipt (Plan phase, fresh story)
|
|
145
|
+
- **When** an Edit targets it
|
|
146
|
+
- **Then** it is allowed (spec writing is legitimate)
|
|
147
|
+
|
|
148
|
+
### AC4: External-effect commands gated (R4)
|
|
149
|
+
|
|
150
|
+
- **Given** a project with default enforcement config
|
|
151
|
+
- **When** the hook receives `gh release create v1.0.0` (or `npm publish`, `gh pr create`, `docker push`, `twine upload dist/*`)
|
|
152
|
+
- **Then** it exits 2 with the ask-first message naming `pactkit gate authorize`, and an `auth_gate` record is written
|
|
153
|
+
- **Given** a valid `release` token (fresh `pactkit gate authorize release`)
|
|
154
|
+
- **When** the same command is received
|
|
155
|
+
- **Then** it is allowed and the authorized allow is recorded
|
|
156
|
+
- **Given** an expired token (> TTL)
|
|
157
|
+
- **When** the same command is received
|
|
158
|
+
- **Then** it is blocked again
|
|
159
|
+
- **Given** read-only commands (`gh pr view 12`, `gh release list`)
|
|
160
|
+
- **When** received
|
|
161
|
+
- **Then** they pass untouched (exit 0, no record)
|
|
162
|
+
|
|
163
|
+
### AC5: Secrets blocked by default (R5)
|
|
164
|
+
|
|
165
|
+
- **Given** default enforcement config
|
|
166
|
+
- **When** the hook receives a command containing `AKIAIOSFODNN7EXAMPLE` or `password=Test@1234` or `-----BEGIN RSA PRIVATE KEY-----`
|
|
167
|
+
- **Then** it exits 2 with the secrets red-line message, and a `secrets_gate` record is written
|
|
168
|
+
- **Given** the same command with `PACTKIT_ALLOW_SECRET=1` in the environment, or `password=$DB_PASS` (env indirection)
|
|
169
|
+
- **When** received
|
|
170
|
+
- **Then** it is allowed
|
|
171
|
+
|
|
172
|
+
### AC6: Registration, config, doctor (R6)
|
|
173
|
+
|
|
174
|
+
- **Given** `pactkit init --format all` on a fresh project
|
|
175
|
+
- **When** deployment finishes
|
|
176
|
+
- **Then** `.claude/settings.json` contains SessionStart and PreCompact entries alongside the existing PreToolUse matchers, `.codex/hooks.json` does NOT contain session-event entries (not portable), and `pactkit doctor` reports `spec_guard`, `auth_gate`, `secrets_gate` probe status
|
|
177
|
+
- **Given** a pactkit.yaml with `enforcement: {auth_ttl_minutes: "30 minutes"}`
|
|
178
|
+
- **When** config validation runs
|
|
179
|
+
- **Then** a warning is emitted (must be an integer)
|
|
180
|
+
|
|
181
|
+
## Target Call Chain
|
|
182
|
+
|
|
183
|
+
```
|
|
184
|
+
SessionStart / PreCompact (Claude Code only, classic|all formats)
|
|
185
|
+
└─ cli.py (new `gate` subcommand) → session_gate.py (new)
|
|
186
|
+
├─ session_start: context_gen.generate_context → print stdout (injected)
|
|
187
|
+
└─ pre_compact: context_gen.generate_context (side effect only)
|
|
188
|
+
|
|
189
|
+
PreToolUse (existing single entry, extended dispatch)
|
|
190
|
+
└─ commit_gate.hook_entry
|
|
191
|
+
├─ git push → check_push (existing)
|
|
192
|
+
├─ git commit → run_gate (existing)
|
|
193
|
+
└─ otherwise → tamper_guard / new checks:
|
|
194
|
+
├─ secrets_gate.scan_command (new, first — L1)
|
|
195
|
+
├─ auth_gate.check_command (new)
|
|
196
|
+
├─ spec_guard: docs/specs/*.md edit check (new, in tamper_guard)
|
|
197
|
+
└─ tamper_guard.check_bash_command (existing)
|
|
198
|
+
|
|
199
|
+
pactkit gate authorize <scope> → authorization.json (atomic, in tamper-guard-
|
|
200
|
+
protected .pactkit/enforcement/) → shared token reader for R3/R4
|
|
201
|
+
|
|
202
|
+
config.py enforcement += spec_guard/auth_gate/secrets_gate/auth_ttl_minutes
|
|
203
|
+
enforcement.py GATES += spec_guard/auth_gate/secrets_gate + probes
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
## Implementation Steps
|
|
207
|
+
|
|
208
|
+
| Step | File | Action | Dependencies | Risk |
|
|
209
|
+
|------|------|--------|-------------|------|
|
|
210
|
+
| 1 | `src/pactkit/auth_gate.py` (new) | External-effect patterns, token read/write, `pactkit gate authorize` logic | None | Medium |
|
|
211
|
+
| 2 | `src/pactkit/secrets_gate.py` (new) | Credential pattern scan + env-indirection exemption | None | Low |
|
|
212
|
+
| 3 | `src/pactkit/session_gate.py` (new) | session-start / pre-compact entries over context_gen | None | Low |
|
|
213
|
+
| 4 | `src/pactkit/tamper_guard.py` | spec_guard check (receipt lookup) + protected-path integration | Step 1 | Medium |
|
|
214
|
+
| 5 | `src/pactkit/commit_gate.py` | Dispatch wiring: secrets → auth ordering; install SessionStart/PreCompact entries | Steps 1-3 | Medium |
|
|
215
|
+
| 6 | `src/pactkit/config.py` | enforcement keys + validator update | None | Low |
|
|
216
|
+
| 7 | `src/pactkit/enforcement.py` | GATES + probes | Steps 1-4 | Low |
|
|
217
|
+
| 8 | `src/pactkit/cli.py` | `gate` subcommand (`--hook`, `authorize`) | Steps 1-3 | Low |
|
|
218
|
+
| 9 | `tests/unit/test_hook_expansion.py` (new) | AC1-AC6 coverage | Steps 1-8 | Low |
|
|
219
|
+
|
|
220
|
+
## Security Scope
|
|
221
|
+
|
|
222
|
+
| Check | Applicable | Reason |
|
|
223
|
+
|-------|------------|--------|
|
|
224
|
+
| SEC-1 | Yes | New gate modules; parsing stays regex/JSON with isinstance guards, no eval/shell assembly; token file written atomically |
|
|
225
|
+
| SEC-2 | Yes | Hook stdin is untrusted JSON (existing shape guards); authorization.json is agent-writable by design — document the honor-system threat model |
|
|
226
|
+
| SEC-5 | Yes | The token is a capability credential (short-TTL, local file, tamper-guard protected); MUST NOT contain or derive from real secrets; scopes are a closed set |
|
|
227
|
+
| SEC-7 | Yes | Failure semantics fixed per channel: session hooks never block compaction (exit 0); PreToolUse gates block on their own contract only; every fallback writes a status record |
|
|
228
|
+
| SEC-8 | No | No dependency manifests changed |
|
|
229
|
+
|
|
230
|
+
## Dependency Surface
|
|
231
|
+
|
|
232
|
+
| Field | Value |
|
|
233
|
+
|-------|-------|
|
|
234
|
+
| Depends on | STORY-slim-202608289e83eeb30df4 (hook_entry dispatch, tamper_guard surface, enforcement section — same release train, committed 1df1512) |
|
|
235
|
+
| Provides | `pactkit gate` subcommand; `authorization.json` token; gates `spec_guard`/`auth_gate`/`secrets_gate`; session-event registration |
|
|
236
|
+
| Touches | `src/pactkit/{auth_gate,secrets_gate,session_gate,tamper_guard,commit_gate,config,enforcement,cli}.py`, `tests/unit/` (new file) |
|
|
237
|
+
| Conflict risk | LOW |
|
|
238
|
+
|
|
239
|
+
## Out of Scope
|
|
240
|
+
|
|
241
|
+
- Stop hook / completion-evidence enforcement (loop-risk design needed — separate story)
|
|
242
|
+
- model-gate (Task-matcher alias rewriting — pending the user's routing decision)
|
|
243
|
+
- PostToolUse fast-lint feedback
|
|
244
|
+
- UserPromptSubmit conditional rule injection
|
|
245
|
+
- Codex/OpenCode parity for session events (not portable; git-fallback channels unchanged)
|
|
246
|
+
- Output-stream secret scanning (PostToolUse) — command-string scan only
|