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.
- capability_reasoning_kernel-0.5.0rc1/.github/dependabot.yml +10 -0
- capability_reasoning_kernel-0.5.0rc1/.github/workflows/ci.yml +108 -0
- capability_reasoning_kernel-0.5.0rc1/.github/workflows/release.yml +107 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/.pre-commit-config.yaml +2 -2
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/CHANGELOG.md +36 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/PKG-INFO +31 -21
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/README.md +22 -18
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/SECURITY.md +6 -1
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/docs/ANALYSIS-2026-07.md +3 -0
- capability_reasoning_kernel-0.5.0rc1/docs/CONFORMANCE.md +30 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/docs/DEVELOPMENT.md +25 -8
- capability_reasoning_kernel-0.5.0rc1/docs/OPERATIONS.md +145 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/docs/index.html +6 -6
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/justfile +10 -4
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/pyproject.toml +9 -3
- capability_reasoning_kernel-0.5.0rc1/scripts/check_artifacts.py +46 -0
- capability_reasoning_kernel-0.5.0rc1/scripts/check_published.py +54 -0
- capability_reasoning_kernel-0.5.0rc1/scripts/check_version.py +15 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/__init__.py +28 -3
- capability_reasoning_kernel-0.5.0rc1/src/reasoning_kernel/kernel/effects.py +175 -0
- capability_reasoning_kernel-0.5.0rc1/src/reasoning_kernel/kernel/gate.py +139 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/kernel/interpreter.py +118 -64
- capability_reasoning_kernel-0.5.0rc1/src/reasoning_kernel/kernel/runtime.py +63 -0
- capability_reasoning_kernel-0.5.0rc1/src/reasoning_kernel/kernel/session.py +61 -0
- capability_reasoning_kernel-0.5.0rc1/src/reasoning_kernel/memory/sink.py +155 -0
- capability_reasoning_kernel-0.5.0rc1/src/reasoning_kernel/memory/trace.py +150 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/reasoner/anthropic.py +14 -3
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/reasoner/base.py +53 -2
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/reasoner/deepseek.py +4 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/reasoner/openai.py +69 -30
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/reasoner/parse.py +11 -3
- capability_reasoning_kernel-0.5.0rc1/src/reasoning_kernel/reasoner/telemetry.py +36 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/schemas/capability.py +1 -1
- capability_reasoning_kernel-0.5.0rc1/src/reasoning_kernel/schemas/limits.py +36 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/schemas/registry.py +4 -1
- capability_reasoning_kernel-0.5.0rc1/src/reasoning_kernel/schemas/trace.py +184 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/tools/demo_mail.py +6 -3
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/tools/registry.py +6 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_interpreter_loop.py +4 -2
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_no_bypass_conformance.py +7 -3
- capability_reasoning_kernel-0.5.0rc1/tests/test_operational.py +695 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_parse_with_schema.py +24 -1
- capability_reasoning_kernel-0.5.0rc1/tests/test_provider_contracts.py +170 -0
- capability_reasoning_kernel-0.5.0rc1/tests/test_providers_live.py +183 -0
- capability_reasoning_kernel-0.5.0rc1/tests/test_release_contract.py +43 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/uv.lock +508 -5
- capability_reasoning_kernel-0.4.2/.github/workflows/ci.yml +0 -73
- capability_reasoning_kernel-0.4.2/.github/workflows/release.yml +0 -55
- capability_reasoning_kernel-0.4.2/src/reasoning_kernel/kernel/effects.py +0 -90
- capability_reasoning_kernel-0.4.2/src/reasoning_kernel/kernel/gate.py +0 -92
- capability_reasoning_kernel-0.4.2/src/reasoning_kernel/memory/trace.py +0 -23
- capability_reasoning_kernel-0.4.2/src/reasoning_kernel/schemas/limits.py +0 -23
- capability_reasoning_kernel-0.4.2/src/reasoning_kernel/schemas/trace.py +0 -110
- capability_reasoning_kernel-0.4.2/tests/test_providers_live.py +0 -54
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/.env.example +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/.github/workflows/pages.yml +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/.gitignore +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/.python-version +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/CLAUDE.md +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/LICENSE +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/docs/.nojekyll +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/docs/favicon.svg +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/config.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/context/__init__.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/context/assembler.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/demo/__init__.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/demo/_report.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/demo/email_exfil.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/demo/live_run.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/demo/merge.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/demo/reasoner_error.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/demo/run_limits.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/demo/subkernel.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/kernel/__init__.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/kernel/taint.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/memory/__init__.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/memory/store.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/py.typed +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/reasoner/__init__.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/reasoner/factory.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/reasoner/fake.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/reasoner/roles.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/schemas/__init__.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/schemas/ids.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/schemas/plan.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/schemas/policy.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/schemas/provenance.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/schemas/values.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/src/reasoning_kernel/tools/__init__.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/conftest.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_capability.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_composition.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_declass_policy.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_demo_email_exfil.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_demo_mail_tools.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_gate_capability.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_gate_provenance_declassify.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_gate_unrestricted_readers.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_invariant_a.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_merge.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_plan_schema.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_provenance_propagation.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_public_api.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_reasoner_factory.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_reasoner_robustness.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_registry.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_run_limits.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_store.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_subject_provenance.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_subkernel.py +0 -0
- {capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/tests/test_trace_append_only.py +0 -0
|
@@ -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
|
{capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/.pre-commit-config.yaml
RENAMED
|
@@ -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.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: capability-reasoning-kernel
|
|
3
|
-
Version: 0.
|
|
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.
|
|
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
|
-
|
|
71
|
-
|
|
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`).
|
|
100
|
-
|
|
101
|
-
|
|
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`
|
|
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
|
|
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 #
|
|
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 #
|
|
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
|
-
|
|
154
|
-
|
|
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
|
|
209
|
-
|
|
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.
|
|
220
|
-
|
|
221
|
-
|
|
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** —
|
|
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
|
-
|
|
39
|
-
|
|
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`).
|
|
68
|
-
|
|
69
|
-
|
|
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`
|
|
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
|
|
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 #
|
|
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 #
|
|
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
|
-
|
|
122
|
-
|
|
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
|
|
177
|
-
|
|
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.
|
|
188
|
-
|
|
189
|
-
|
|
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** —
|
|
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
|
|
55
|
+
mechanism-level issues are taken seriously and addressed in the applicable supported release line.
|
{capability_reasoning_kernel-0.4.2 → capability_reasoning_kernel-0.5.0rc1}/docs/ANALYSIS-2026-07.md
RENAMED
|
@@ -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.
|