Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
ddb8191
docs: add ADR 001 for reward-binding ownership (PF-VA-00).
fraware Jul 24, 2026
cbadfd9
docs: add PF-VA-00 baseline inventory for reward-binding.
fraware Jul 24, 2026
385110f
docs: update mission and claim/trusted boundaries for reward-binding.
fraware Jul 24, 2026
a895e75
docs: refresh assumptions, audit brief, and release checklist.
fraware Jul 24, 2026
642cfeb
pcs: mirror reward evidence schemas under adapters/pcs.
fraware Jul 24, 2026
9f57cf9
pcs: add reward_binding_adapter with valid fixtures.
fraware Jul 24, 2026
2bb15ca
schemas: add reward_binding_input schema and examples.
fraware Jul 24, 2026
3e24055
validator: implement reward_binding predicates and decision schema.
fraware Jul 24, 2026
8c37dff
cli: add check-reward-binding command entrypoint.
fraware Jul 24, 2026
6e5b707
lean: add RewardBinding model and Assumption updates.
fraware Jul 24, 2026
62b35cc
lean: add RewardBindingCertificate and soundness theorems.
fraware Jul 24, 2026
58bd1d7
lean: add RewardBindingReplay golden scenarios.
fraware Jul 24, 2026
23f0f1b
validator: add certificate schema and emit/replay path.
fraware Jul 24, 2026
ff79697
docs: document certificate semantics, theorems, and threat model.
fraware Jul 24, 2026
d570e92
pcs: add adversarial reward-binding fixtures.
fraware Jul 24, 2026
e143393
pcs: add LabTrust and OVK companion fixtures.
fraware Jul 24, 2026
74ab4a5
docs: add companion PR specs for pcs-core, LabTrust, and OVK.
fraware Jul 24, 2026
63c5f7f
release: bump pf-core to 0.7.0 with CHANGELOG and VA-08 inventory.
fraware Jul 24, 2026
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
20 changes: 20 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# CHANGELOG

## 0.7.0 — 2026-07-24

### Added

- Reward-binding layer (parallel to `TraceSafe`): normalized `RewardBindingInput`, four predicates, multi-outcome decider, Lean model + soundness, `pf-core.reward_binding_certificate.v0`.
- CLI: `pf core check-reward-binding`, `emit-reward-binding-certificate`, `replay-reward-binding`.
- Untrusted PCS reward-binding adapter + mirrored schemas under `adapters/pcs/`.
- Assumptions A11–A14; ADR-001 reward-binding ownership; companion PR specs for pcs-core / LabTrust / OVK.
- Adversarial and LabTrust/OVK-shaped fixtures (offline).

### Changed

- Claim-boundary and audit forbidden phrases extended for reward overclaims.
- `pf-core/VERSION` MINOR bump from 0.6.0.

### Frozen

- `pf-core.certificate.v0` unchanged.
20 changes: 20 additions & 0 deletions SECURITY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Security Policy

## Supported versions

| Version | Supported |
|---------|-----------|
| 0.7.x | Yes |
| 0.6.x | Best-effort |
| < 0.6 | No |

## Reporting a vulnerability

This repository is private. Report suspected vulnerabilities in the trusted kernel (`pf-core/lean`, `pf-core/schemas`, `pf-core/validator/pf_core`) or adapter integrity handling privately to the maintainers via the organization's private security channel. Do not open public issues for exploitable defects.

Include: affected commit/tag, reproduction under network-disabled conditions, and whether the issue crosses the trusted/untrusted boundary.

## Scope notes

- Untrusted adapters (`adapters/`) are not a security boundary for predicate truth.
- Reward-binding certificates assert binding under A11–A14; they do not assert objective correctness or verifier accuracy.
1 change: 1 addition & 0 deletions adapters/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Untrusted adapter packages (outside PF-Core TCB).
59 changes: 59 additions & 0 deletions adapters/pcs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# PCS adapters (untrusted)

This tree is **outside the PF-Core TCB**. It normalizes portable PCS-shaped evidence into trusted PF-Core schemas. Predicate acceptance truth lives only in `pf_core/reward_binding.py` and Lean `PFCore.RewardBinding`.

## Mirrored schemas

Immutable mirrors under `adapters/pcs/schemas/`:

| Schema `$id` | File |
|--------------|------|
| `pcs.reward_evidence_envelope.v0` | `reward_evidence_envelope.schema.json` |
| `pcs.verifier_profile.v0` | `verifier_profile.schema.json` |
| `pcs.environment_profile.v0` | `environment_profile.schema.json` |
| `pcs.verification_result.v0` | `verification_result.schema.json` |
| `pcs.authority_record.v0` | `authority_record.schema.json` |

Upstream to pcs-core via companion tickets in `docs/pf-core/pf-va-pr-artifacts/`. Do not invent a second portable evidence standard under `pf-core/schemas/`.

### Schema pin digests (SHA-256 of canonical file bytes)

Regenerate with:

```bash
python -c "import hashlib,pathlib; p=pathlib.Path('adapters/pcs/schemas');
[print(f.name, hashlib.sha256(f.read_bytes()).hexdigest()) for f in sorted(p.glob('*.schema.json'))]"
```

Pins are recorded in `adapters/pcs/schemas/SCHEMA_PINS.json` after VA-01 land.

## Trust registry (`trusted_keys.json`)

Operator pin format:

```json
{
"schema_version": "pcs.trusted_keys.v0",
"keys": [
{ "key_id": "org-root-1", "alg": "sha256", "public_pin": "<hex64>" }
]
}
```

`reward_binding_adapter` accepts an integrity envelope only when `key_id` is listed and the recomputed payload digest matches `integrity.digest`. Trust-root correctness is assumption A13 (organizational).

## Reward-binding adapter

```bash
python -m adapters.pcs.reward_binding_adapter \
--trace trace.json \
--reward-evidence reward.json \
--artifact-root artifacts/ \
--trust-registry trusted_keys.json
```

Emits `RewardBindingInput` (`pf-core.reward_binding_input.v0`) plus a mapping report listing discharged vs delegated assumptions. Never sets predicate acceptance.

## Non-claims

Adapter success does not imply reward correctness, verifier accuracy, environment fidelity, or RL/judge objective endorsement.
1 change: 1 addition & 0 deletions adapters/pcs/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# PCS adapters package (untrusted).
10 changes: 10 additions & 0 deletions adapters/pcs/fixtures/labtrust-reward-binding/manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"schema_version": "labtrust.reward_binding_fixture.v0",
"description": "Local LabTrust-shaped reward-binding fixture pointer (vendored; no network).",
"trace_fixture": "../reward-binding/trace_valid.json",
"reward_evidence": "../reward-binding/reward_valid.json",
"artifact_root": "../reward-binding/artifacts",
"trust_registry": "../reward-binding/trusted_keys.json",
"expected_outcome": "safe",
"notes": "Companion LabTrust PR should accept this mapping without cloning siblings in pf-core-trusted."
}
11 changes: 11 additions & 0 deletions adapters/pcs/fixtures/ovk-verifier-profile/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# OVK-shaped verifier profile fixture (local)

Minimal offline fixture for companion OVK profile-pin work. Not executed against a live OVK binary in `pf-core-trusted`.

| Field | Value |
|-------|-------|
| `profile_id` | `ovk-basic-v0` |
| `config_digest` | hex64 `c` repeated |
| `suite` | `ovk.offline_check.v0` |

Upstream: `docs/pf-core/pf-va-pr-artifacts/ovk-profile-pin-pr-spec.md`.
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"schema_version": "pcs.verifier_profile.v0",
"profile_id": "ovk-basic-v0",
"config_digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
"status": "active",
"suite": "ovk.offline_check.v0",
"rubric": "ovk.rubric.pin.v0"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"authority_id": "auth-1",
"authorized_issuers": [
{
"principal_id": "issuer-1",
"tenant_id": "tenant-lab"
}
],
"claim_class": "reward_binding",
"environment_digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
"revoked": false,
"schema_version": "pcs.authority_record.v0",
"valid_from": 100,
"valid_until": 200
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"description": "lab env",
"digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
"profile_id": "env-1",
"schema_version": "pcs.environment_profile.v0"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"config_digest": "2222222222222222222222222222222222222222222222222222222222222222",
"profile_id": "vp-1",
"rubric": "r1",
"schema_version": "pcs.verifier_profile.v0",
"status": "active",
"suite": "basic"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"result_id": "vr-1",
"schema_version": "pcs.verification_result.v0",
"status": "pass",
"verifier_profile_ref": {
"digest": "2dde9120776c810002cb00d44aabeb73563e39281fb545c9bd2760cabfd9d595",
"id": "vp-1"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"authority_id": "auth-1",
"authorized_issuers": [
{
"principal_id": "issuer-1",
"tenant_id": "tenant-lab"
}
],
"claim_class": "reward_binding",
"environment_digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
"revoked": false,
"schema_version": "pcs.authority_record.v0",
"valid_from": 100,
"valid_until": 200
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"description": "lab env",
"digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
"profile_id": "env-1",
"schema_version": "pcs.environment_profile.v0"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"config_digest": "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
"profile_id": "vp-1",
"rubric": "r1",
"schema_version": "pcs.verifier_profile.v0",
"status": "active",
"suite": "basic"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"config_digest": "2222222222222222222222222222222222222222222222222222222222222222",
"profile_id": "vp-1",
"rubric": "r1",
"schema_version": "pcs.verifier_profile.v0",
"status": "active",
"suite": "basic"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"result_id": "vr-1",
"schema_version": "pcs.verification_result.v0",
"status": "pass",
"verifier_profile_ref": {
"digest": "2dde9120776c810002cb00d44aabeb73563e39281fb545c9bd2760cabfd9d595",
"id": "vp-1"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"result_id": "vr-2",
"schema_version": "pcs.verification_result.v0",
"status": "pass",
"verifier_profile_ref": {
"digest": "001f51522834ff1dff03fecbc865432bbd7c6e8856befe7b80fee722d99d9fa3",
"id": "vp-1b"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"authority_id": "auth-1",
"authorized_issuers": [
{
"principal_id": "issuer-1",
"tenant_id": "tenant-lab"
}
],
"claim_class": "reward_binding",
"environment_digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
"revoked": true,
"schema_version": "pcs.authority_record.v0",
"valid_from": 100,
"valid_until": 200
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"description": "lab env",
"digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
"profile_id": "env-1",
"schema_version": "pcs.environment_profile.v0"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"config_digest": "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
"profile_id": "vp-1",
"rubric": "r1",
"schema_version": "pcs.verifier_profile.v0",
"status": "active",
"suite": "basic"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"result_id": "vr-1",
"schema_version": "pcs.verification_result.v0",
"status": "pass",
"verifier_profile_ref": {
"digest": "2dde9120776c810002cb00d44aabeb73563e39281fb545c9bd2760cabfd9d595",
"id": "vp-1"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
{
"authority_ref": {
"digest": "530a92ae8b91bc89276183fb6f43bf03fe274985776e53e07960b51dbb655006",
"id": "auth-1"
},
"claim_class": "reward_binding",
"envelope_id": "rew-1",
"environment_profile_ref": {
"digest": "889a85d80dc564d8d839626cd6cdc8e36269059a1a7b2972d22a632677c9e08e",
"id": "env-1"
},
"integrity": {
"alg": "sha256",
"digest": "1d5c8803f8742d43b43183f188eeb4ca0269762ba07878a8b83a70fff9f4c1b3",
"key_id": "org-root-1"
},
"issued_at": 150,
"issuer": {
"principal_id": "issuer-1",
"tenant_id": "tenant-lab"
},
"schema_version": "pcs.reward_evidence_envelope.v0",
"stale": false,
"trace_digest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"verifier_result_refs": [
{
"digest": "7d677412669d2d5660586071b8ece0dc1495d346a9b0991ed564ef71aef45172",
"id": "vr-1"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{
"authority_ref": {
"digest": "530a92ae8b91bc89276183fb6f43bf03fe274985776e53e07960b51dbb655006",
"id": "auth-1"
},
"claim_class": "reward_binding",
"envelope_id": "rew-dup",
"environment_profile_ref": {
"digest": "889a85d80dc564d8d839626cd6cdc8e36269059a1a7b2972d22a632677c9e08e",
"id": "env-1"
},
"integrity": {
"alg": "sha256",
"digest": "3ef50c8d8123607b76e02bd92a4f14e27493ffe4b44c3ae1a8454c2cd758ac3c",
"key_id": "org-root-1"
},
"issued_at": 150,
"issuer": {
"principal_id": "issuer-1",
"tenant_id": "tenant-lab"
},
"schema_version": "pcs.reward_evidence_envelope.v0",
"stale": false,
"trace_digest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"verifier_result_refs": [
{
"digest": "7d677412669d2d5660586071b8ece0dc1495d346a9b0991ed564ef71aef45172",
"id": "vr-1"
},
{
"digest": "b50d92b7a7832aa0395b00a333a0044abd860db4ac3a1d6ad26264e7776d1ab3",
"id": "vr-2"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
{
"authority_ref": {
"digest": "530a92ae8b91bc89276183fb6f43bf03fe274985776e53e07960b51dbb655006",
"id": "auth-1"
},
"claim_class": "reward_binding",
"envelope_id": "rew-1",
"environment_profile_ref": {
"digest": "889a85d80dc564d8d839626cd6cdc8e36269059a1a7b2972d22a632677c9e08e",
"id": "env-1"
},
"integrity": {
"alg": "sha256",
"digest": "1d5c8803f8742d43b43183f188eeb4ca0269762ba07878a8b83a70fff9f4c1b3",
"key_id": "org-root-1"
},
"issued_at": 150,
"issuer": {
"principal_id": "issuer-1",
"tenant_id": "tenant-lab"
},
"schema_version": "pcs.reward_evidence_envelope.v0",
"stale": false,
"trace_digest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"verifier_result_refs": [
{
"digest": "7d677412669d2d5660586071b8ece0dc1495d346a9b0991ed564ef71aef45172",
"id": "vr-1"
}
]
}
Loading
Loading