capability-reasoning-kernel 0.4.2__tar.gz → 0.5.0rc1__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.
Files changed (111) hide show
  1. capability_reasoning_kernel-0.5.0rc1/.github/dependabot.yml +10 -0
  2. capability_reasoning_kernel-0.5.0rc1/.github/workflows/ci.yml +108 -0
  3. capability_reasoning_kernel-0.5.0rc1/.github/workflows/release.yml +107 -0
  4. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/.pre-commit-config.yaml +2 -2
  5. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/CHANGELOG.md +36 -0
  6. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/PKG-INFO +31 -21
  7. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/README.md +22 -18
  8. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/SECURITY.md +6 -1
  9. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/docs/ANALYSIS-2026-07.md +3 -0
  10. capability_reasoning_kernel-0.5.0rc1/docs/CONFORMANCE.md +30 -0
  11. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/docs/DEVELOPMENT.md +25 -8
  12. capability_reasoning_kernel-0.5.0rc1/docs/OPERATIONS.md +145 -0
  13. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/docs/index.html +6 -6
  14. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/justfile +10 -4
  15. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/pyproject.toml +9 -3
  16. capability_reasoning_kernel-0.5.0rc1/scripts/check_artifacts.py +46 -0
  17. capability_reasoning_kernel-0.5.0rc1/scripts/check_published.py +54 -0
  18. capability_reasoning_kernel-0.5.0rc1/scripts/check_version.py +15 -0
  19. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/__init__.py +28 -3
  20. capability_reasoning_kernel-0.5.0rc1/src/reasoning_kernel/kernel/effects.py +175 -0
  21. capability_reasoning_kernel-0.5.0rc1/src/reasoning_kernel/kernel/gate.py +139 -0
  22. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/kernel/interpreter.py +118 -64
  23. capability_reasoning_kernel-0.5.0rc1/src/reasoning_kernel/kernel/runtime.py +63 -0
  24. capability_reasoning_kernel-0.5.0rc1/src/reasoning_kernel/kernel/session.py +61 -0
  25. capability_reasoning_kernel-0.5.0rc1/src/reasoning_kernel/memory/sink.py +155 -0
  26. capability_reasoning_kernel-0.5.0rc1/src/reasoning_kernel/memory/trace.py +150 -0
  27. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/reasoner/anthropic.py +14 -3
  28. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/reasoner/base.py +53 -2
  29. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/reasoner/deepseek.py +4 -0
  30. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/reasoner/openai.py +69 -30
  31. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/reasoner/parse.py +11 -3
  32. capability_reasoning_kernel-0.5.0rc1/src/reasoning_kernel/reasoner/telemetry.py +36 -0
  33. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/schemas/capability.py +1 -1
  34. capability_reasoning_kernel-0.5.0rc1/src/reasoning_kernel/schemas/limits.py +36 -0
  35. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/schemas/registry.py +4 -1
  36. capability_reasoning_kernel-0.5.0rc1/src/reasoning_kernel/schemas/trace.py +184 -0
  37. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/tools/demo_mail.py +6 -3
  38. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/tools/registry.py +6 -0
  39. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_interpreter_loop.py +4 -2
  40. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_no_bypass_conformance.py +7 -3
  41. capability_reasoning_kernel-0.5.0rc1/tests/test_operational.py +695 -0
  42. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_parse_with_schema.py +24 -1
  43. capability_reasoning_kernel-0.5.0rc1/tests/test_provider_contracts.py +170 -0
  44. capability_reasoning_kernel-0.5.0rc1/tests/test_providers_live.py +183 -0
  45. capability_reasoning_kernel-0.5.0rc1/tests/test_release_contract.py +43 -0
  46. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/uv.lock +508 -5
  47. capability_reasoning_kernel-0.4.2/.github/workflows/ci.yml +0 -73
  48. capability_reasoning_kernel-0.4.2/.github/workflows/release.yml +0 -55
  49. capability_reasoning_kernel-0.4.2/src/reasoning_kernel/kernel/effects.py +0 -90
  50. capability_reasoning_kernel-0.4.2/src/reasoning_kernel/kernel/gate.py +0 -92
  51. capability_reasoning_kernel-0.4.2/src/reasoning_kernel/memory/trace.py +0 -23
  52. capability_reasoning_kernel-0.4.2/src/reasoning_kernel/schemas/limits.py +0 -23
  53. capability_reasoning_kernel-0.4.2/src/reasoning_kernel/schemas/trace.py +0 -110
  54. capability_reasoning_kernel-0.4.2/tests/test_providers_live.py +0 -54
  55. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/.env.example +0 -0
  56. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/.github/workflows/pages.yml +0 -0
  57. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/.gitignore +0 -0
  58. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/.python-version +0 -0
  59. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/CLAUDE.md +0 -0
  60. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/LICENSE +0 -0
  61. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/docs/.nojekyll +0 -0
  62. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/docs/favicon.svg +0 -0
  63. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/config.py +0 -0
  64. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/context/__init__.py +0 -0
  65. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/context/assembler.py +0 -0
  66. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/demo/__init__.py +0 -0
  67. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/demo/_report.py +0 -0
  68. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/demo/email_exfil.py +0 -0
  69. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/demo/live_run.py +0 -0
  70. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/demo/merge.py +0 -0
  71. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/demo/reasoner_error.py +0 -0
  72. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/demo/run_limits.py +0 -0
  73. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/demo/subkernel.py +0 -0
  74. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/kernel/__init__.py +0 -0
  75. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/kernel/taint.py +0 -0
  76. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/memory/__init__.py +0 -0
  77. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/memory/store.py +0 -0
  78. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/py.typed +0 -0
  79. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/reasoner/__init__.py +0 -0
  80. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/reasoner/factory.py +0 -0
  81. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/reasoner/fake.py +0 -0
  82. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/reasoner/roles.py +0 -0
  83. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/schemas/__init__.py +0 -0
  84. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/schemas/ids.py +0 -0
  85. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/schemas/plan.py +0 -0
  86. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/schemas/policy.py +0 -0
  87. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/schemas/provenance.py +0 -0
  88. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/schemas/values.py +0 -0
  89. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/tools/__init__.py +0 -0
  90. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/conftest.py +0 -0
  91. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_capability.py +0 -0
  92. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_composition.py +0 -0
  93. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_declass_policy.py +0 -0
  94. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_demo_email_exfil.py +0 -0
  95. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_demo_mail_tools.py +0 -0
  96. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_gate_capability.py +0 -0
  97. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_gate_provenance_declassify.py +0 -0
  98. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_gate_unrestricted_readers.py +0 -0
  99. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_invariant_a.py +0 -0
  100. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_merge.py +0 -0
  101. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_plan_schema.py +0 -0
  102. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_provenance_propagation.py +0 -0
  103. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_public_api.py +0 -0
  104. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_reasoner_factory.py +0 -0
  105. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_reasoner_robustness.py +0 -0
  106. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_registry.py +0 -0
  107. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_run_limits.py +0 -0
  108. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_store.py +0 -0
  109. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_subject_provenance.py +0 -0
  110. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_subkernel.py +0 -0
  111. {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_trace_append_only.py +0 -0
@@ -0,0 +1,10 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: github-actions
4
+ directory: /
5
+ schedule:
6
+ interval: weekly
7
+ - package-ecosystem: uv
8
+ directory: /
9
+ schedule:
10
+ interval: weekly
@@ -0,0 +1,108 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ workflow_dispatch:
8
+ inputs:
9
+ live_providers:
10
+ description: Comma-separated providers required by the live gate
11
+ required: true
12
+ default: deepseek
13
+ type: string
14
+ workflow_call:
15
+ inputs:
16
+ live_providers:
17
+ description: Comma-separated providers required by the live gate
18
+ required: false
19
+ default: ""
20
+ type: string
21
+ secrets:
22
+ ANTHROPIC_API_KEY:
23
+ required: false
24
+ OPENAI_API_KEY:
25
+ required: false
26
+ DEEPSEEK_API_KEY:
27
+ required: false
28
+
29
+ permissions:
30
+ contents: read
31
+
32
+ concurrency:
33
+ group: ci-${{ github.ref }}
34
+ cancel-in-progress: true
35
+
36
+ jobs:
37
+ quality:
38
+ runs-on: ubuntu-latest
39
+ strategy:
40
+ fail-fast: false
41
+ matrix:
42
+ python-version: ["3.12", "3.13", "3.14"]
43
+ steps:
44
+ - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
45
+ with:
46
+ persist-credentials: false
47
+
48
+ - name: Install uv
49
+ uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
50
+ with:
51
+ version: "0.12.10"
52
+ checksum: "173d95a0c32d18c896c46ba6fafbf3cf9c14ab74b033f81b76c883ef492a976b"
53
+ python-version: ${{ matrix.python-version }}
54
+ enable-cache: true
55
+
56
+ - name: Install just
57
+ uses: extractions/setup-just@53165ef7e734c5c07cb06b3c8e7b647c5aa16db3 # v4
58
+
59
+ - name: Sync dependencies
60
+ run: uv sync --all-extras --locked
61
+
62
+ # The justfile uses `set dotenv-load`; provide a no-secret env so it loads cleanly.
63
+ # The default suite is key-free and `live` tests are excluded via addopts -m 'not live'.
64
+ - name: Prepare env
65
+ run: cp .env.example .env
66
+
67
+ - name: Lint
68
+ run: just lint
69
+
70
+ - name: Typecheck
71
+ run: just typecheck
72
+
73
+ - name: Test
74
+ run: just test # runs with coverage; fails under the threshold in pyproject
75
+
76
+ - name: Verify distribution
77
+ run: just package-check
78
+
79
+ # Explicit provider qualification: manual or required by the release's reusable workflow call.
80
+ live:
81
+ if: inputs.live_providers != ''
82
+ runs-on: ubuntu-latest
83
+ steps:
84
+ - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
85
+ with:
86
+ persist-credentials: false
87
+
88
+ - name: Install uv
89
+ uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
90
+ with:
91
+ version: "0.12.10"
92
+ checksum: "173d95a0c32d18c896c46ba6fafbf3cf9c14ab74b033f81b76c883ef492a976b"
93
+ python-version: "3.12"
94
+ enable-cache: true
95
+
96
+ - name: Install just
97
+ uses: extractions/setup-just@53165ef7e734c5c07cb06b3c8e7b647c5aa16db3 # v4
98
+
99
+ - name: Sync dependencies
100
+ run: uv sync --all-extras --locked
101
+
102
+ - name: Run live provider tests
103
+ env:
104
+ RK_LIVE_PROVIDERS: ${{ inputs.live_providers }}
105
+ ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
106
+ OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
107
+ DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}
108
+ run: just test-live
@@ -0,0 +1,107 @@
1
+ name: Release
2
+
3
+ # Test the tagged commit, then promote one immutable distribution through both indexes.
4
+ on:
5
+ push:
6
+ tags: ["v*"]
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ concurrency:
12
+ group: release-${{ github.ref }}
13
+ cancel-in-progress: false
14
+
15
+ jobs:
16
+ quality:
17
+ uses: ./.github/workflows/ci.yml
18
+ with:
19
+ live_providers: deepseek
20
+ secrets:
21
+ DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}
22
+
23
+ build:
24
+ needs: quality
25
+ runs-on: ubuntu-latest
26
+ steps:
27
+ - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
28
+ with:
29
+ persist-credentials: false
30
+ - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
31
+ with:
32
+ version: "0.12.10"
33
+ checksum: "173d95a0c32d18c896c46ba6fafbf3cf9c14ab74b033f81b76c883ef492a976b"
34
+ python-version: "3.12"
35
+ - run: uv sync --all-extras --locked
36
+ - name: Validate tag and build
37
+ run: |
38
+ uv run python scripts/check_version.py
39
+ uv build
40
+ uv run twine check --strict dist/*
41
+ uv run python scripts/check_artifacts.py dist
42
+ sha256sum dist/* > SHA256SUMS
43
+ - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
44
+ with:
45
+ name: distribution
46
+ path: |
47
+ dist/
48
+ SHA256SUMS
49
+ if-no-files-found: error
50
+
51
+ testpypi:
52
+ needs: build
53
+ runs-on: ubuntu-latest
54
+ environment: testpypi
55
+ permissions:
56
+ contents: read
57
+ id-token: write
58
+ steps:
59
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
60
+ with:
61
+ name: distribution
62
+ - run: sha256sum --check SHA256SUMS
63
+ - name: Publish to TestPyPI
64
+ uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # release/v1
65
+ with:
66
+ repository-url: https://test.pypi.org/legacy/
67
+
68
+ verify-testpypi:
69
+ needs: testpypi
70
+ runs-on: ubuntu-latest
71
+ steps:
72
+ - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
73
+ with:
74
+ persist-credentials: false
75
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
76
+ with:
77
+ name: distribution
78
+ - run: sha256sum --check SHA256SUMS
79
+ - run: python scripts/check_published.py dist testpypi
80
+
81
+ pypi:
82
+ needs: verify-testpypi
83
+ runs-on: ubuntu-latest
84
+ environment: pypi
85
+ permissions:
86
+ contents: read
87
+ id-token: write
88
+ steps:
89
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
90
+ with:
91
+ name: distribution
92
+ - run: sha256sum --check SHA256SUMS
93
+ - name: Publish to PyPI
94
+ uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # release/v1
95
+
96
+ verify-pypi:
97
+ needs: pypi
98
+ runs-on: ubuntu-latest
99
+ steps:
100
+ - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
101
+ with:
102
+ persist-credentials: false
103
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
104
+ with:
105
+ name: distribution
106
+ - run: sha256sum --check SHA256SUMS
107
+ - run: python scripts/check_published.py dist pypi
@@ -16,13 +16,13 @@ repos:
16
16
  - id: ruff-check
17
17
  name: ruff check --fix (uv.lock version, same as `just fix`)
18
18
  language: system
19
- entry: uv run ruff check --fix src/ tests/
19
+ entry: uv run ruff check --fix src/ tests/ scripts/
20
20
  pass_filenames: false
21
21
  types_or: [python, pyi]
22
22
  - id: ruff-format
23
23
  name: ruff format (uv.lock version, same as `just fix`)
24
24
  language: system
25
- entry: uv run ruff format src/ tests/
25
+ entry: uv run ruff format src/ tests/ scripts/
26
26
  pass_filenames: false
27
27
  types_or: [python, pyi]
28
28
  - id: pyright
@@ -4,6 +4,41 @@ All notable changes to this project are documented here. The format is based on
4
4
  [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to
5
5
  [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [0.5.0rc1] - 2026-09-06
8
+
9
+ Operational embedding candidate. This entry does not imply a published release or live-adapter UAT.
10
+
11
+ ### Added
12
+
13
+ - Single-use `RunSession`, bounded operational defaults and root-wide step/tool/parser/LLM budgets.
14
+ - Explicit tool egress declarations, normalized input verification and output model revalidation.
15
+ - `TraceSink`, memory/SQLite sinks, durable pre-call records and fail-closed storage handling.
16
+ - Correlated invocation IDs, parent run IDs, partial/uncertain effect outcomes and terminal run status.
17
+ - Redacted operational events, detached snapshots and canonical detailed digests.
18
+ - Bounded shared reasoner executor, returned usage/latency capture and public provider result types.
19
+ - Sanitized provider failure categories, HTTP status and allow-listed operational error codes.
20
+ - Crash, concurrency, shared-budget, adapter-contract and provider failure regression tests.
21
+ - Python 3.14 CI, locked dependencies, pinned actions and single-artifact release promotion with
22
+ a pinned/checksummed uv runtime, version checks, isolated wheel smoke and served-byte verification.
23
+ - Operational/migration guide and conformance checklist.
24
+
25
+ ### Changed
26
+
27
+ - Require a patched `pydantic-settings>=2.14.2` (GHSA-4xgf-cpjx-pc3j) and refresh its lock entry.
28
+ - Version the SQLite audit schema, migrate the unversioned candidate layout, reject unknown/newer
29
+ layouts or missing key constraints, and verify released bytes after TestPyPI and PyPI publication.
30
+ - Require an explicit live-provider set in release CI; `0.5.0rc1` qualifies DeepSeek while OpenAI
31
+ remains supported but is not live-qualified for this candidate.
32
+ - Low-level interpreters reject reuse and context/trace mismatches; child IDs are opaque.
33
+ - Limits span descendants; `RunLimits()` remains unbounded for explicit low-level wiring.
34
+ - Failed tools stop later steps without implying rollback; output validation cannot undo a call.
35
+ - OpenAI-compatible fallback uses structured error parameters, once; refusals/truncations and
36
+ malformed outputs are terminal errors. DeepSeek routes directly through JSON mode with local
37
+ schema validation because its compatible API does not implement OpenAI's native JSON Schema mode.
38
+ Provider exception messages no longer include raw API text.
39
+ - Pyright explicitly resolves the project virtualenv. Documentation distinguishes root planning,
40
+ delegated untrusted planning and partial effects.
41
+
7
42
  ## [0.4.2] - 2026-07-10
8
43
 
9
44
  A correctness release for the gate's provenance stage, plus fail-closed hardening of the provider
@@ -143,6 +178,7 @@ Initial reference implementation of the Reasoning Kernel pattern (strong / CaMeL
143
178
  invariants, no-effect-bypasses-the-Verifier by construction, the deterministic declassification seam,
144
179
  and the worked email-exfiltration demo.
145
180
 
181
+ [0.5.0rc1]: https://github.com/gianlucamazza/reasoning-kernel/releases/tag/v0.5.0rc1
146
182
  [0.4.2]: https://github.com/gianlucamazza/reasoning-kernel/releases/tag/v0.4.2
147
183
  [0.4.1]: https://github.com/gianlucamazza/reasoning-kernel/releases/tag/v0.4.1
148
184
  [0.4.0]: https://github.com/gianlucamazza/reasoning-kernel/releases/tag/v0.4.0
@@ -1,10 +1,12 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: capability-reasoning-kernel
3
- Version: 0.4.2
3
+ Version: 0.5.0rc1
4
4
  Summary: Reference implementation of the Reasoning Kernel pattern (strong / CaMeL-like form)
5
5
  Project-URL: Homepage, https://github.com/gianlucamazza/reasoning-kernel
6
6
  Project-URL: Repository, https://github.com/gianlucamazza/reasoning-kernel
7
7
  Project-URL: Issues, https://github.com/gianlucamazza/reasoning-kernel/issues
8
+ Project-URL: Documentation, https://github.com/gianlucamazza/reasoning-kernel/blob/main/docs/OPERATIONS.md
9
+ Project-URL: Changelog, https://github.com/gianlucamazza/reasoning-kernel/blob/main/CHANGELOG.md
8
10
  Author: Gianluca Mazza — Venere Labs
9
11
  License: MIT
10
12
  License-File: LICENSE
@@ -15,16 +17,20 @@ Classifier: License :: OSI Approved :: MIT License
15
17
  Classifier: Programming Language :: Python :: 3
16
18
  Classifier: Programming Language :: Python :: 3.12
17
19
  Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Programming Language :: Python :: 3.14
18
21
  Classifier: Topic :: Security
19
22
  Classifier: Typing :: Typed
20
23
  Requires-Python: >=3.12
21
- Requires-Dist: pydantic-settings>=2.0
24
+ Requires-Dist: pydantic-settings>=2.14.2
22
25
  Requires-Dist: pydantic>=2.7
23
26
  Provides-Extra: dev
27
+ Requires-Dist: anthropic>=0.40; extra == 'dev'
28
+ Requires-Dist: openai>=1.50; extra == 'dev'
24
29
  Requires-Dist: pyright>=1.1.380; extra == 'dev'
25
30
  Requires-Dist: pytest-cov>=5.0; extra == 'dev'
26
31
  Requires-Dist: pytest>=8.0; extra == 'dev'
27
32
  Requires-Dist: ruff>=0.9; extra == 'dev'
33
+ Requires-Dist: twine>=6.0; extra == 'dev'
28
34
  Provides-Extra: providers
29
35
  Requires-Dist: anthropic>=0.40; extra == 'providers'
30
36
  Requires-Dist: openai>=1.50; extra == 'providers'
@@ -67,8 +73,9 @@ It is a reference implementation, **not** a turn-key security product.
67
73
  The pattern guarantees a **topology, not a property**: it fixes *where* mediation and verification
68
74
  live, by construction; it does not guarantee any particular policy is safe. Conformance is a
69
75
  *necessary*, not a *sufficient*, condition. Concretely: no matter what an injected message says, it can
70
- never reach the planner nor fire a tool without passing your Gate — that boundary holds by
71
- construction; whether your Gate's *policy* is correct is on you.
76
+ cannot fire a tool without passing your Gate. The root planner is isolated from tool results;
77
+ delegated sub-planners deliberately see untrusted data under reduced grants. Whether your Gate's
78
+ *policy* is correct is on you.
72
79
 
73
80
  ## Strong form: no trusted reasoner
74
81
 
@@ -96,19 +103,19 @@ The trusted, deterministic kernel is the **interpreter + capability/provenance g
96
103
 
97
104
  Reasoner providers: Anthropic, OpenAI, Deepseek (OpenAI-compatible, reusing the `openai` SDK via a
98
105
  `base_url` — no separate dependency), plus a deterministic `FakeProvider` for key-free tests — all
99
- behind one interface (`reasoner/base.py`). The fungibility corollary is validated live: OpenAI and
100
- Deepseek return schema-valid `Plan`s through the same interface (`just test-live`); Anthropic is
101
- exercised on demand when its key is set.
106
+ behind one interface (`reasoner/base.py`). Configured providers can be exercised through the same
107
+ live contract (`just test-live`); `0.5.0rc1` qualifies DeepSeek while retaining OpenAI and Anthropic
108
+ as supported, independently testable adapters.
102
109
 
103
110
  ## No effect bypasses the Verifier — by construction
104
111
 
105
112
  1. Tool callables live only in `ToolRegistry`, handed only to `EffectDispatcher`; the interpreter
106
113
  never holds one.
107
- 2. `EffectDispatcher` cannot be constructed without a `Gate`, and `dispatch` checks it
114
+ 2. `EffectDispatcher` cannot be constructed without a `Gate`, and `dispatch` authorizes the call
108
115
  unconditionally before the callable runs.
109
116
  3. `ToolCallStep` is the only step kind that invokes a tool callable, and its only handler routes
110
117
  through the dispatcher. The other step kinds (`const`, `q_parse`, `subkernel`, `merge`) produce
111
- values, never external effects.
118
+ values; a sub-kernel may invoke tools through its reduced Gate and the same dispatcher path.
112
119
 
113
120
  ## What a run looks like
114
121
 
@@ -136,9 +143,9 @@ just demo-limits # termination: RunLimits aborts the run closed before th
136
143
  just demo-reasoner-error # fail-closed: a failing reasoner commits nothing (plan_rejected)
137
144
  just demo-merge # MergeStep: combine several reads into one value; taint flows through the join
138
145
 
139
- uv sync --all-extras # adds the provider SDKs for the live flows below
146
+ uv sync --all-extras # explicit provider extra (dev also includes SDKs for mock tests)
140
147
  just demo-live # end-to-end with a REAL planner/parser (needs a key in .env)
141
- just test-live # optional: real Anthropic/OpenAI/Deepseek round-trips (needs API keys)
148
+ just test-live # configured real-provider round-trips; RK_LIVE_PROVIDERS makes a set mandatory
142
149
  ```
143
150
 
144
151
  See [`docs/DEVELOPMENT.md`](docs/DEVELOPMENT.md) for the quality bar (coverage gate, strict typing,
@@ -150,8 +157,12 @@ pre-commit) and how to configure provider keys. Release notes are in
150
157
  Install: `pip install capability-reasoning-kernel` — it **imports as** `import reasoning_kernel`
151
158
  (the PyPI name differs because `reasoning-kernel` was taken by an unrelated project).
152
159
 
153
- There is no facade: you wire the parts explicitly, which is the point — every trusted seam is visible.
154
- The package root re-exports the building blocks. Sketch (see
160
+ For operational embedding, use `RunSession` with a persistent sink and bounded defaults; see
161
+ [operations and migration](docs/OPERATIONS.md) and the [conformance checklist](docs/CONFORMANCE.md).
162
+ It isolates each run, records partial effects and refuses automatic replay. This checkout is a
163
+ **0.5.0rc1 candidate**, not evidence of publication or validated host integration.
164
+
165
+ Explicit low-level wiring remains available. The package root re-exports the building blocks. Sketch (see
155
166
  [`demo/email_exfil.py`](src/reasoning_kernel/demo/email_exfil.py) for a complete, runnable version):
156
167
 
157
168
  ```python
@@ -205,9 +216,8 @@ result = kernel.run(ctx) # RunResult(trace, committed); committed is
205
216
  - **Reasoner failure is fail-closed**: a provider that returns no usable output (empty / refused /
206
217
  malformed) raises `ReasonerError` (`reasoner/base.py`), and a provider call that fails in transport
207
218
  (rate limit exhausted, 5xx, network fault) raises its `TransportError` subclass; either way the
208
- Conductor records a terminal trace event and commits nothing, rather than crashing or acting on a
209
- partial result. Treating the model as untrusted compute
210
- means a flaky reasoner can never produce a half-applied effect.
219
+ Conductor records a terminal trace event and stops subsequent work. Earlier effects remain real
220
+ and are reported in `RunResult.effects`; `committed=None` means no final value, not rollback.
211
221
  - **Capability composition (§5.4)**: every reasoner is bound to a `CapabilitySet`; the kernel rejects a
212
222
  reasoner whose grant exceeds the dispatcher's — a child can never widen authority. A `SubKernelStep`
213
223
  delegates untrusted content to an inner kernel at a **clamped, reduced grant**: an injection in that
@@ -216,9 +226,9 @@ result = kernel.run(ctx) # RunResult(trace, committed); committed is
216
226
  - **Static, data-independent control flow**: a `Plan` is a forward-only DAG of five step kinds
217
227
  (`const`, `tool`, `q_parse`, `subkernel`, `merge`), executed linearly by `kernel/interpreter.py`; a
218
228
  `QuarantineParseStep`'s target schema is fixed at plan time
219
- (`schema_ref`), never chosen on the quarantined value. No branch, loop, or tool selection is
220
- conditioned on untrusted content — so control-flow leaks of quarantined data are precluded by
221
- construction, not by policy (the matching cost is in *Honest limits*).
229
+ (`schema_ref`), never chosen on the quarantined value. There are no runtime branches or loops.
230
+ Delegated sub-planners can choose a child plan based on untrusted input; its authority and literal
231
+ provenance are reduced accordingly. This is not a claim of data-independent planning across delegation.
222
232
 
223
233
  ## Honest limits (fundamental — localized, not dissolved)
224
234
 
@@ -256,7 +266,7 @@ result = kernel.run(ctx) # RunResult(trace, committed); committed is
256
266
  - **Join** — combining values combines their labels conservatively (union of sources, intersection of
257
267
  readers, union of subjects), so taint only ever increases.
258
268
  - **Quarantine** — routing untrusted content through the Q-LLM, which cannot launder its taint.
259
- - **Capability / grant** — an unforgeable permission a tool requires; a run holds a fixed
269
+ - **Capability / grant** — a host-issued permission a tool requires; a run holds a fixed
260
270
  `CapabilitySet` (its *grant*), and a sub-kernel's grant can only ever shrink.
261
271
  - **Declassifier (`DeclassPolicy`)** — the single deterministic seam that may let tainted data into a
262
272
  WRITE; the one place trust is deliberately relaxed.
@@ -35,8 +35,9 @@ It is a reference implementation, **not** a turn-key security product.
35
35
  The pattern guarantees a **topology, not a property**: it fixes *where* mediation and verification
36
36
  live, by construction; it does not guarantee any particular policy is safe. Conformance is a
37
37
  *necessary*, not a *sufficient*, condition. Concretely: no matter what an injected message says, it can
38
- never reach the planner nor fire a tool without passing your Gate — that boundary holds by
39
- construction; whether your Gate's *policy* is correct is on you.
38
+ cannot fire a tool without passing your Gate. The root planner is isolated from tool results;
39
+ delegated sub-planners deliberately see untrusted data under reduced grants. Whether your Gate's
40
+ *policy* is correct is on you.
40
41
 
41
42
  ## Strong form: no trusted reasoner
42
43
 
@@ -64,19 +65,19 @@ The trusted, deterministic kernel is the **interpreter + capability/provenance g
64
65
 
65
66
  Reasoner providers: Anthropic, OpenAI, Deepseek (OpenAI-compatible, reusing the `openai` SDK via a
66
67
  `base_url` — no separate dependency), plus a deterministic `FakeProvider` for key-free tests — all
67
- behind one interface (`reasoner/base.py`). The fungibility corollary is validated live: OpenAI and
68
- Deepseek return schema-valid `Plan`s through the same interface (`just test-live`); Anthropic is
69
- exercised on demand when its key is set.
68
+ behind one interface (`reasoner/base.py`). Configured providers can be exercised through the same
69
+ live contract (`just test-live`); `0.5.0rc1` qualifies DeepSeek while retaining OpenAI and Anthropic
70
+ as supported, independently testable adapters.
70
71
 
71
72
  ## No effect bypasses the Verifier — by construction
72
73
 
73
74
  1. Tool callables live only in `ToolRegistry`, handed only to `EffectDispatcher`; the interpreter
74
75
  never holds one.
75
- 2. `EffectDispatcher` cannot be constructed without a `Gate`, and `dispatch` checks it
76
+ 2. `EffectDispatcher` cannot be constructed without a `Gate`, and `dispatch` authorizes the call
76
77
  unconditionally before the callable runs.
77
78
  3. `ToolCallStep` is the only step kind that invokes a tool callable, and its only handler routes
78
79
  through the dispatcher. The other step kinds (`const`, `q_parse`, `subkernel`, `merge`) produce
79
- values, never external effects.
80
+ values; a sub-kernel may invoke tools through its reduced Gate and the same dispatcher path.
80
81
 
81
82
  ## What a run looks like
82
83
 
@@ -104,9 +105,9 @@ just demo-limits # termination: RunLimits aborts the run closed before th
104
105
  just demo-reasoner-error # fail-closed: a failing reasoner commits nothing (plan_rejected)
105
106
  just demo-merge # MergeStep: combine several reads into one value; taint flows through the join
106
107
 
107
- uv sync --all-extras # adds the provider SDKs for the live flows below
108
+ uv sync --all-extras # explicit provider extra (dev also includes SDKs for mock tests)
108
109
  just demo-live # end-to-end with a REAL planner/parser (needs a key in .env)
109
- just test-live # optional: real Anthropic/OpenAI/Deepseek round-trips (needs API keys)
110
+ just test-live # configured real-provider round-trips; RK_LIVE_PROVIDERS makes a set mandatory
110
111
  ```
111
112
 
112
113
  See [`docs/DEVELOPMENT.md`](docs/DEVELOPMENT.md) for the quality bar (coverage gate, strict typing,
@@ -118,8 +119,12 @@ pre-commit) and how to configure provider keys. Release notes are in
118
119
  Install: `pip install capability-reasoning-kernel` — it **imports as** `import reasoning_kernel`
119
120
  (the PyPI name differs because `reasoning-kernel` was taken by an unrelated project).
120
121
 
121
- There is no facade: you wire the parts explicitly, which is the point — every trusted seam is visible.
122
- The package root re-exports the building blocks. Sketch (see
122
+ For operational embedding, use `RunSession` with a persistent sink and bounded defaults; see
123
+ [operations and migration](docs/OPERATIONS.md) and the [conformance checklist](docs/CONFORMANCE.md).
124
+ It isolates each run, records partial effects and refuses automatic replay. This checkout is a
125
+ **0.5.0rc1 candidate**, not evidence of publication or validated host integration.
126
+
127
+ Explicit low-level wiring remains available. The package root re-exports the building blocks. Sketch (see
123
128
  [`demo/email_exfil.py`](src/reasoning_kernel/demo/email_exfil.py) for a complete, runnable version):
124
129
 
125
130
  ```python
@@ -173,9 +178,8 @@ result = kernel.run(ctx) # RunResult(trace, committed); committed is
173
178
  - **Reasoner failure is fail-closed**: a provider that returns no usable output (empty / refused /
174
179
  malformed) raises `ReasonerError` (`reasoner/base.py`), and a provider call that fails in transport
175
180
  (rate limit exhausted, 5xx, network fault) raises its `TransportError` subclass; either way the
176
- Conductor records a terminal trace event and commits nothing, rather than crashing or acting on a
177
- partial result. Treating the model as untrusted compute
178
- means a flaky reasoner can never produce a half-applied effect.
181
+ Conductor records a terminal trace event and stops subsequent work. Earlier effects remain real
182
+ and are reported in `RunResult.effects`; `committed=None` means no final value, not rollback.
179
183
  - **Capability composition (§5.4)**: every reasoner is bound to a `CapabilitySet`; the kernel rejects a
180
184
  reasoner whose grant exceeds the dispatcher's — a child can never widen authority. A `SubKernelStep`
181
185
  delegates untrusted content to an inner kernel at a **clamped, reduced grant**: an injection in that
@@ -184,9 +188,9 @@ result = kernel.run(ctx) # RunResult(trace, committed); committed is
184
188
  - **Static, data-independent control flow**: a `Plan` is a forward-only DAG of five step kinds
185
189
  (`const`, `tool`, `q_parse`, `subkernel`, `merge`), executed linearly by `kernel/interpreter.py`; a
186
190
  `QuarantineParseStep`'s target schema is fixed at plan time
187
- (`schema_ref`), never chosen on the quarantined value. No branch, loop, or tool selection is
188
- conditioned on untrusted content — so control-flow leaks of quarantined data are precluded by
189
- construction, not by policy (the matching cost is in *Honest limits*).
191
+ (`schema_ref`), never chosen on the quarantined value. There are no runtime branches or loops.
192
+ Delegated sub-planners can choose a child plan based on untrusted input; its authority and literal
193
+ provenance are reduced accordingly. This is not a claim of data-independent planning across delegation.
190
194
 
191
195
  ## Honest limits (fundamental — localized, not dissolved)
192
196
 
@@ -224,7 +228,7 @@ result = kernel.run(ctx) # RunResult(trace, committed); committed is
224
228
  - **Join** — combining values combines their labels conservatively (union of sources, intersection of
225
229
  readers, union of subjects), so taint only ever increases.
226
230
  - **Quarantine** — routing untrusted content through the Q-LLM, which cannot launder its taint.
227
- - **Capability / grant** — an unforgeable permission a tool requires; a run holds a fixed
231
+ - **Capability / grant** — a host-issued permission a tool requires; a run holds a fixed
228
232
  `CapabilitySet` (its *grant*), and a sub-kernel's grant can only ever shrink.
229
233
  - **Declassifier (`DeclassPolicy`)** — the single deterministic seam that may let tainted data into a
230
234
  WRITE; the one place trust is deliberately relaxed.
@@ -13,6 +13,10 @@ In particular (see the "Honest limits" section of the [README](README.md)):
13
13
  - A pass-through declassifier conforms to the pattern yet protects nothing — **the declassifier is the
14
14
  residual risk surface**. Every `may_declassify=True` is a deliberate, traced trust decision.
15
15
  - There is no atomicity / rollback: an effect already committed is real even if a later step fails.
16
+ - Operational sessions require explicit egress declarations and record uncertain effects; audit
17
+ storage failures halt work but cannot undo an external call. See [operations](docs/OPERATIONS.md).
18
+ - Providers are data recipients authorized by the host. Quarantine does not enforce confidentiality
19
+ against the selected provider. SQLite audit is not tamper-proof or a substitute for host access control.
16
20
 
17
21
  So a "vulnerability" here means a way to make the **kernel itself** commit an effect that its Gate and
18
22
  labels should have blocked — i.e. a hole in the mechanism (`kernel/`, `schemas/`, `memory/`), not a
@@ -35,6 +39,7 @@ permissive policy written on top of it.
35
39
  | Version | Supported |
36
40
  |---------|-----------|
37
41
  | `0.4.x` | ✅ |
42
+ | `0.5.0rc1` | Candidate; report issues, validate adapters before application use |
38
43
  | `< 0.4` | ❌ |
39
44
 
40
45
  ## Reporting a vulnerability
@@ -47,4 +52,4 @@ Please report privately — do **not** open a public issue for a suspected vulne
47
52
  Include a minimal reproduction (a plan + tool/policy setup that commits an effect that should have been
48
53
  blocked), the expected vs. actual behavior, and the affected version/commit. Expect an initial
49
54
  acknowledgement within a few days. As a single-maintainer reference project there is no formal SLA, but
50
- mechanism-level issues are taken seriously and will be addressed in a `0.4.x` patch.
55
+ mechanism-level issues are taken seriously and addressed in the applicable supported release line.
@@ -1,5 +1,8 @@
1
1
  # Analisi del progetto e piano di miglioramento — luglio 2026
2
2
 
3
+ > Historical snapshot. The 0.5 operational candidate is described in
4
+ > [OPERATIONS.md](OPERATIONS.md) and [CONFORMANCE.md](CONFORMANCE.md); see CHANGELOG for changes.
5
+
3
6
  Analisi completa della codebase alla versione **0.4.1** (branch `main`, commit `0189752`),
4
7
  condotta su tre assi: core fidato (kernel/memory/context), livello di integrazione LLM
5
8
  (reasoner/config/tools), e qualità/DevEx (test, CI, packaging, documentazione).
@@ -0,0 +1,30 @@
1
+ # Conformance and operational acceptance
2
+
3
+ Conformance establishes mediation points. Policy correctness and host configuration are separate
4
+ requirements; an allow-all policy can conform without useful confidentiality protection.
5
+
6
+ | Requirement | Test evidence |
7
+ |---|---|
8
+ | Every model input is assembled by the host/kernel | `test_invariant_a`, `test_subject_provenance` |
9
+ | Each callable invocation has its own preceding Gate authorization | `test_no_bypass_conformance`, `test_operational` |
10
+ | Parsing, merging and delegation cannot launder provenance | `test_provenance_propagation`, `test_merge`, `test_subkernel` |
11
+ | Delegated authority never exceeds its parent | `test_composition`, `test_subkernel`, `test_operational` |
12
+ | Egress READs receive provenance checks | `test_operational` |
13
+ | Normalized checked values are the executed values | `test_operational` |
14
+ | Contexts/budgets are isolated between roots and shared within a tree | `test_operational` |
15
+ | Failure stops later work and preserves partial-effect evidence | `test_operational`, `test_reasoner_robustness` |
16
+ | Storage failure before start prevents the callable | `test_operational` |
17
+ | Process crashes leave durable evidence; reopening cannot replay | `test_operational` |
18
+ | Provider refusal, truncation and fallback errors are terminal | `test_provider_contracts` |
19
+
20
+ Reproduce these scenarios against application policies and wiring, including tools returning invalid
21
+ output or raising after an effect. Validators and policies are trusted code and must not perform I/O.
22
+ Supplying an external model authorizes data transfer; quarantining it does not make that transfer private.
23
+
24
+ Before application use, verify identity mapping, destination restrictions, adapter provenance, egress
25
+ declarations, finite adapter timeouts, shared-client thread safety, audit access/retention and operator
26
+ reconciliation. Exercise clean and injected input with the chosen providers. Record local, CI,
27
+ published-artifact and live-adapter evidence separately.
28
+
29
+ Conformance does not include rollback, exactly-once external effects, automatic recovery, tamper-proof
30
+ storage, a Python security sandbox or correctness of arbitrary declassification policies.