Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 12 additions & 11 deletions docs/CLAIM_EVIDENCE_MATRIX.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# SelfConnect Claim Evidence Matrix

Last updated: 2026-07-18
Last updated: 2026-07-20

This matrix ties current SelfConnect positioning to concrete proof artifacts on
`test/win32-hardening-v1`. It is intentionally conservative: if a capability has
Expand Down Expand Up @@ -29,10 +29,10 @@ not been live-tested or committed as a probe, it is marked as pending.
| Pipe-authenticated role leases/generations | Proven as isolated control-plane proof | `sc_mesh_lease.py`, `experiments/win32_probe/pipe_role_lease_probe.py`, redacted PASS artifact |
| Governed lease gate on guarded send/read path | Proven as optional in-process runtime gate | optional runtime governed enforcement on the guarded send/read path (role+birth_id+generation+hwnd+owner_sid_hash) layered over the explore-mode target guard; `sc_mesh_lease.evaluate_lease_gate`, `sc_mesh_lease.current_owner_sid`, `sc_cli.send_text_to_window`/`read_window`, `sc_mcp` tools, `tests/test_mesh_lease.py`, `tests/test_package_adapters.py`, `experiments/win32_probe/runtime_sid_probe.py`, `experiments/win32_probe/results/runtime_sid_probe_PASS_redacted.json`. Boundary: OPTIONAL, in-process, NOT a full daemon; explore mode unchanged (no-op); birth_id optional in gate (checked when provided, skipped when omitted for backward compat); runtime OS SID lookup now uses `OpenProcessToken` -> `GetTokenInformation(TokenUser)` -> `ConvertSidToStringSidW` and fails closed on `<unknown-sid>` |
| Channel-router composition proof | Proven as redacted model proof plus live throwaway/local proof | `experiments/win32_probe/channel_router_composition_probe.py`, `experiments/win32_probe/results/channel_router_composition_PASS_redacted.json`, `experiments/win32_probe/results/channel_router_composition_LIVE_PASS_redacted.json`, `tests/test_channel_router_composition.py`, `docs/CHANNEL_ROUTER_COMPOSITION_PROOF.md`. Boundary: the recorded model selected terminal `WM_CHAR` for its CASCADIA fixture; current production auto routing is class-aware and uses `WriteConsoleInputW` for `ConsoleWindowClass`. The browser route remains UIA Value/Invoke |
| TPM/CNG key use | Proven in experiment/enterprise lane | `experiments/win32_probe/CAPABILITY_BACKLOG.md`; full attestation pending |
| TPM platform attestation | Pending | `NCryptCreateClaim` descriptor fix still required |
| TPM/CNG key use | Proven in package path | `sc_tpm_attestation.py`, `tests/test_tpm_attestation.py`; the installed identity key is machine-scoped, hardware-backed, PCP-identity marked, and non-exportable |
| TPM platform attestation | Proven locally with an explicit remote-trust boundary | `sc_tpm_attestation.py`, `tests/test_tpm_attestation.py`, `docs/TPM_PLATFORM_ATTESTATION.md`, and the 2026-07-20 redacted live/selftest artifacts prove nonce-bound `NCRYPT_CLAIM_PLATFORM`, PCR 0-23 digest verification, pinned-key signature verification, and durable replay rejection. Manufacturer/EK chain trust, fleet enrollment/revocation, and an external relying-party policy remain deployment gates |
| ETW provider smoke | Proven as isolated probe | `experiments/win32_probe/etw_provider.py`, `CAPABILITY_BACKLOG.md` |
| Windows SCM service wrapper | Implemented and test-covered; live installation evidence pending | `sc_fabric_windows_svc.py`, `tests/test_fabric_windows_svc.py`; SelfConnectFabricV2 service name and install/remove/start/stop/query code exist. Boundary: this is not evidence that the service is installed, running, or production-ready on a release machine. |
| Windows SCM service wrapper | Proven live on the release workstation | `sc_fabric_windows_svc.py`, `tests/test_fabric_windows_svc.py`, `experiments/fabric_v2/results/fabric_v2_scm_live_20260720_redacted.json`; auto-start LocalSystem installation, real named-pipe ACK, graceful restart replay persistence, forced-process SCM recovery, and post-recovery traffic passed. Boundary: one-host proof is not fleet deployment evidence |
| Job Object containment | Proven in experiment/enterprise lane | `CAPABILITY_BACKLOG.md`; runtime adapter pending |
| MCP/package distribution | Proven as optional adapter | `sc_mcp.py`, `pyproject.toml`, package tests, built wheel inspection. Boundary: MCP is not required for the proven WM_CHAR terminal path, UIA browser path, echo-filtered readback, target guard, or lease-gate model |
| Fabric V0 logical scale harness | Proven as benchmark/evidence harness | `sc_fabric_benchmark.py`, `docs/FABRIC_V2_BENCHMARK_RESULTS.md`; 5/10/15/20 logical agents passed with flat sub-ms transport/governance p99 and `0.0` model calls per known task |
Expand All @@ -59,13 +59,12 @@ The current non-claims are:
- first AI-to-AI communication through desktop automation;
- unrestricted browser automation across public sites;
- CAPTCHA bypass or anti-bot evasion;
- production TPM attestation;
- manufacturer/EK-chain-approved remote TPM attestation or fleet enrollment;
- production named-pipe control-plane replacement for terminal-visible routing.

Note: the Windows SCM wrapper is implemented and test-covered
(`sc_fabric_windows_svc.py`, `sc_fabric_service.py`). Live installation,
startup/restart behavior under SCM, and full governed daemon coverage remain
release evidence gaps.
The Windows SCM wrapper is installed and live-tested on the release workstation.
Fleet rollout, signed installer policy, and independent deployment evidence are
separate gates.

## Next Highest-Value Evidence

Expand All @@ -74,8 +73,10 @@ release evidence gaps.
as an opt-in gate. Runtime OS owner SID lookup is proven via
`OpenProcessToken` -> `GetTokenInformation(TokenUser)` ->
`ConvertSidToStringSidW`.
2. Capture live installed-service evidence for the existing Fabric V2 SCM wrapper.
3. Finish TPM platform attestation with correct `NCryptBufferDesc`.
2. Done on the release workstation: capture live installed-service evidence for
the Fabric V2 SCM wrapper.
3. Done for the local mechanism: provision and verify a nonce-bound TPM platform
quote with replay rejection. Manufacturer/EK trust remains external policy.
4. Add browser multi-tab/stale-tab proof.
5. Add governed audit event for protected checkpoint pause.
6. Wrap job-object containment as an optional runtime adapter.
56 changes: 56 additions & 0 deletions docs/TPM_PLATFORM_ATTESTATION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# TPM Platform Attestation

SelfConnect can provision a machine-scoped, non-exportable RSA identity key in
the Windows Microsoft Platform Crypto Provider and use it to issue a
nonce-bound `NCRYPT_CLAIM_PLATFORM` quote.

## Provision

Run from an elevated PowerShell prompt:

```powershell
python -m pip install ".[trust]"
selfconnect-tpm-attestation provision
```

The default key is `SelfConnectPlatformAIK-v1`. Its private material remains in
the platform provider. The command reports only the public-key digest and key
properties.

## Verify The Hardware Path

```powershell
selfconnect-tpm-attestation selftest --output tpm-selftest-redacted.json
```

The selftest provisions an ephemeral identity key, issues a quote covering PCR
0 through PCR 23, verifies its RSA signature and PCR digest, rejects a wrong
nonce, rejects modified PCR evidence, and deletes the ephemeral key.

Application verifiers should generate a fresh 16-64 byte nonce, pin the
provisioned public-key digest, call `verify_and_consume`, and keep the
`NonceReplayStore` on durable local storage. The replay store uses a
cross-process file lock and atomic replacement.

## Proven Boundary

The local verifier proves all of the following:

- the quote is signed by the pinned, non-exportable PCP identity key;
- the TPM quote contains the verifier nonce;
- the selected PCR inventory recomputes to the quoted digest;
- the expected PCR 0-23 selection is bound to the quote;
- the verifier nonce has not already been consumed by the durable replay store.

This is platform-attestation mechanism evidence on the tested Windows TPM 2.0
host. It does not establish manufacturer or endorsement-key certificate-chain
trust, remote fleet enrollment, verifier policy distribution, certificate
revocation, independent assessment, or an authorization to operate. Those are
relying-party and deployment controls.

## Evidence

- `sc_tpm_attestation.py`
- `tests/test_tpm_attestation.py`
- `experiments/win32_probe/results/tpm_platform_attestation_live_20260720_redacted.json`
- `experiments/win32_probe/results/tpm_platform_attestation_selftest_20260720_redacted.json`
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"account": "LocalSystem",
"auto_start": true,
"failure_restart_delays_ms": [5000, 15000, 60000],
"failure_reset_period_s": 86400,
"forced_process_termination": true,
"installed": true,
"live_roundtrip": true,
"ok": true,
"post_crash_roundtrip": true,
"raw_payload_included": false,
"replay_rejected_after_graceful_restart": true,
"schema_version": 1,
"scm_restarted_with_new_pid": true,
"service_name": "SelfConnectFabricV2",
"source_parent_commit": "569f456a81b22905c0f96827471cb2cdcb65bf01",
"system_scope_dependencies": true
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"claim_sha256": "d45817c097ff944dfc1762359db127161962feaad23a857c4d9b245654022285",
"key_name": "SelfConnectPlatformAIK-v1",
"manufacturer_chain_verified": false,
"nonce_sha256": "ffc471d499db1085f953919a9d9d3724c5f9ae283805d239b6a86684929185c2",
"ok": true,
"pcr_algorithm": 11,
"pcr_mask": 16777215,
"pcr_values_sha256": "cfa6d2a34942a42a3e96ce4ed26037f138d6695ad8d127824a13ccba6d22540d",
"provider": "Microsoft Platform Crypto Provider",
"public_key_sha256": "e5954da7514dcc6574cd9d429d7cf36fa3fa0ca8a57da348fb6e99d48402ba96",
"raw_claim_included": false,
"replay_checked": true,
"replay_rejected": true,
"schema_version": 1
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"hardware_backed": true,
"manufacturer_chain_verified": false,
"nonce_mismatch_rejected": true,
"ok": true,
"private_key_exportable": false,
"provider": "Microsoft Platform Crypto Provider",
"quote_verified": true,
"raw_claim_included": false,
"schema_version": 1,
"tampered_pcr_rejected": true
}
12 changes: 12 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ artifacts = [
"experiments/fabric_v2/results/baseline_5agent_fabric_v2_service_transport.json",
"experiments/fabric_v2/results/SC_FABRIC_SERVICE_20260621_1135_redacted.json",
"experiments/fabric_v2/results/fabric_v2_service_selftest_20260621_113419_redacted.json",
"experiments/fabric_v2/results/fabric_v2_scm_live_20260720_redacted.json",
"experiments/fabric_v2/results/baseline_5agent_fabric_v2_frame_mailbox.json",
"experiments/fabric_v2/results/fabric_v2_5agent_baseline_redacted.json",
"experiments/fabric_v2/results/fabric_v2_host_selftest_20260621_074925_redacted.json",
Expand All @@ -97,6 +98,8 @@ artifacts = [
"experiments/fabric_v2/results/fabric_v2_router_state_20260621_081434_redacted.json",
"experiments/fabric_v2/results/fabric_v2_selftest_20260621_073951_redacted.json",
"experiments/win32_probe/results/runtime_sid_probe_PASS_redacted.json",
"experiments/win32_probe/results/tpm_platform_attestation_live_20260720_redacted.json",
"experiments/win32_probe/results/tpm_platform_attestation_selftest_20260720_redacted.json",
]
include = [
"_win32_abi.py",
Expand Down Expand Up @@ -131,6 +134,7 @@ include = [
"sc_nats_bridge.py",
"sc_spawn.py",
"sc_tasks.py",
"sc_tpm_attestation.py",
"sc_transcript.py",
"claudego/**",
"experiments/win32_probe/CAPABILITY_BACKLOG.md",
Expand All @@ -151,11 +155,14 @@ include = [
"experiments/win32_probe/results/channel_router_composition_PASS_redacted.json",
"experiments/win32_probe/results/pipe_role_lease_PASS_redacted.json",
"experiments/win32_probe/results/runtime_sid_probe_PASS_redacted.json",
"experiments/win32_probe/results/tpm_platform_attestation_live_20260720_redacted.json",
"experiments/win32_probe/results/tpm_platform_attestation_selftest_20260720_redacted.json",
"experiments/win32_probe/results/terminal_active_tab_guard_LIVE_PASS_redacted.json",
"experiments/win32_probe/results/uia_echo_filter_PASS_redacted.json",
"experiments/fabric_v2/results/baseline_5agent_fabric_v2_service_transport.json",
"experiments/fabric_v2/results/SC_FABRIC_SERVICE_20260621_1135_redacted.json",
"experiments/fabric_v2/results/fabric_v2_service_selftest_20260621_113419_redacted.json",
"experiments/fabric_v2/results/fabric_v2_scm_live_20260720_redacted.json",
"experiments/fabric_v2/results/baseline_5agent_fabric_v2_frame_mailbox.json",
"experiments/fabric_v2/results/fabric_v2_5agent_baseline_redacted.json",
"experiments/fabric_v2/results/fabric_v2_host_selftest_20260621_074925_redacted.json",
Expand Down Expand Up @@ -186,6 +193,7 @@ include = [
"docs/UIA_ECHO_FILTER_TERMCONTROL.md",
"docs/PROVEN_VS_UNTESTED.md",
"docs/SELFCONNECT_PRODUCT_BOUNDARIES.md",
"docs/TPM_PLATFORM_ATTESTATION.md",
"skills/selfconnect-win32/**",
]

Expand All @@ -194,6 +202,7 @@ artifacts = [
"experiments/fabric_v2/results/baseline_5agent_fabric_v2_service_transport.json",
"experiments/fabric_v2/results/SC_FABRIC_SERVICE_20260621_1135_redacted.json",
"experiments/fabric_v2/results/fabric_v2_service_selftest_20260621_113419_redacted.json",
"experiments/fabric_v2/results/fabric_v2_scm_live_20260720_redacted.json",
"experiments/fabric_v2/results/baseline_5agent_fabric_v2_frame_mailbox.json",
"experiments/fabric_v2/results/fabric_v2_5agent_baseline_redacted.json",
"experiments/fabric_v2/results/fabric_v2_host_selftest_20260621_074925_redacted.json",
Expand All @@ -202,6 +211,8 @@ artifacts = [
"experiments/fabric_v2/results/fabric_v2_router_state_20260621_081434_redacted.json",
"experiments/fabric_v2/results/fabric_v2_selftest_20260621_073951_redacted.json",
"experiments/win32_probe/results/runtime_sid_probe_PASS_redacted.json",
"experiments/win32_probe/results/tpm_platform_attestation_live_20260720_redacted.json",
"experiments/win32_probe/results/tpm_platform_attestation_selftest_20260720_redacted.json",
]

[project.scripts]
Expand All @@ -215,6 +226,7 @@ selfconnect-fabric-host = "sc_fabric_host:main"
selfconnect-fabric-router = "sc_fabric_router:main"
selfconnect-fabric-service = "sc_fabric_service:main"
selfconnect-local-model = "sc_local_model_role:main"
selfconnect-tpm-attestation = "sc_tpm_attestation:main"

[tool.pytest.ini_options]
testpaths = ["tests", "test_self_connect.py"]
Expand Down
76 changes: 67 additions & 9 deletions release/claims.json
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@
},
{
"id": "package.installation_extras",
"statement": "The package declares optional UIA, MCP, Windows service, Telegram, ClaudeGo, and full dependency groups.",
"statement": "The package declares optional UIA, trust, MCP, Windows service, Telegram, ClaudeGo, and full dependency groups.",
"status": "proven",
"release": true,
"scope": "Dependency declarations in pyproject.toml.",
Expand All @@ -108,7 +108,7 @@
"evidence": [
{
"path": "pyproject.toml",
"sha256_text": "3421c7c0961457d891f207d27c683536a3f661a1ee10389aeb50318b1fa2c9de"
"sha256_text": "ce2a1f486016b1a3fff5f1962e834f541cd375a5b0d276a7c4c2c6c45f6d5c49"
}
]
},
Expand Down Expand Up @@ -703,6 +703,37 @@
}
]
},
{
"id": "fabric_v2.scm_live_service",
"statement": "The SelfConnect Fabric V2 service is installed as an auto-start LocalSystem Windows service on the release workstation and passed live ACK, graceful-restart replay, forced-crash recovery, and post-recovery traffic checks.",
"status": "proven",
"release": true,
"scope": "The SelfConnectFabricV2 SCM service on the tested Windows release workstation.",
"boundary": "This one-host result does not establish fleet deployment, signed-installer policy, every target machine, or default routing of every SelfConnect workload through Fabric V2.",
"verified_on": "2026-07-20",
"evidence": [
{
"path": "experiments/fabric_v2/results/fabric_v2_scm_live_20260720_redacted.json",
"sha256_text": "24f7ca09dce2c0aadc855949014ce1867abf1a02ec450daf6a793effd708505b",
"assertions": [
{"path": "ok", "equals": true},
{"path": "installed", "equals": true},
{"path": "live_roundtrip", "equals": true},
{"path": "replay_rejected_after_graceful_restart", "equals": true},
{"path": "scm_restarted_with_new_pid", "equals": true},
{"path": "post_crash_roundtrip", "equals": true}
]
},
{
"path": "sc_fabric_host.py",
"sha256_text": "e4817749e2d05f8db69dda7a476cc5f8a18f0bb75fdb4b4e9057ce960bb75fb5"
},
{
"path": "sc_fabric_windows_svc.py",
"sha256_text": "4ab1d65ba24160b7089a116556bc8ffa988991bf87b6be0fd0ab0bec175bd885"
}
]
},
{
"id": "real_agent.twenty_agent_portable_release_evidence",
"statement": "A portable release claim for the twenty-real-agent ladder is not yet approved because the raw local evidence is intentionally ignored and no tracked redacted run artifact is attached to this ledger.",
Expand All @@ -719,15 +750,42 @@
},
{
"id": "identity.tpm_platform_attestation",
"statement": "TPM platform attestation is pending.",
"status": "pending",
"release": false,
"scope": "No production attestation claim.",
"boundary": "A TPM capability probe or TPM-backed signing must not be described as remote-verifiable platform attestation.",
"verified_on": "2026-07-09",
"statement": "SelfConnect provisions a machine-scoped non-exportable PCP identity key and locally issues and verifies nonce-bound TPM platform quotes covering PCR 0 through PCR 23 with durable replay rejection.",
"status": "proven",
"release": true,
"scope": "The packaged Windows TPM 2.0 mechanism and the tested release workstation's SelfConnectPlatformAIK-v1 key.",
"boundary": "This does not establish manufacturer or endorsement-key certificate-chain trust, remote fleet enrollment, verifier-policy distribution, certificate revocation, independent assessment, or authorization to operate.",
"verified_on": "2026-07-20",
"evidence": [
{
"path": "experiments/win32_probe/CAPABILITY_BACKLOG.md"
"path": "experiments/win32_probe/results/tpm_platform_attestation_live_20260720_redacted.json",
"sha256_text": "788945911da23576ea262a77d05c7f0f455a7637ab7333bcc1e22d5f66e6ab35",
"assertions": [
{"path": "ok", "equals": true},
{"path": "pcr_mask", "equals": 16777215},
{"path": "replay_checked", "equals": true},
{"path": "replay_rejected", "equals": true},
{"path": "manufacturer_chain_verified", "equals": false},
{"path": "raw_claim_included", "equals": false}
]
},
{
"path": "experiments/win32_probe/results/tpm_platform_attestation_selftest_20260720_redacted.json",
"sha256_text": "700f8db598d302a5fa2e03ac1500fb596af52146d58ad4b8cc0a05c9aad4149b",
"assertions": [
{"path": "quote_verified", "equals": true},
{"path": "nonce_mismatch_rejected", "equals": true},
{"path": "tampered_pcr_rejected", "equals": true},
{"path": "private_key_exportable", "equals": false}
]
},
{
"path": "sc_tpm_attestation.py",
"sha256_text": "9ca6abbb1b4b704f82413a600d221051a7900f5e10e428a063a35f20446cff7e"
},
{
"path": "tests/test_tpm_attestation.py",
"sha256_text": "ecfd175db3e009cc126933e0098dcb603b8ae67255e53d6c43354602dd0efda2"
}
]
},
Expand Down
Loading