Replayable Python protocol engine for validating time-bound future claims from canonical artifacts.
Project description
Future Claim Certifier
Future Claim Certifier is a Python implementation of Dynamic Future-Claim Certification (DFCC). It checks whether a time-bound claim about a future state can be used as authority, and it explains why the answer is allow, deny, unknown, expired, blocked, or conflicting.
The project is designed for software agents, auditors, and protocol engineers who need decisions that can be replayed later from the same files. Every important input is a canonical artifact with a digest, schema, reason path, and typed outcome.
Paper: Takahashi, K. (2026). Dynamic Future-Claim Certification: A Replayable Authority Validation Protocol with Canonical Artifacts. Zenodo. https://doi.org/10.5281/zenodo.21199529
What It Does
DFCC separates three questions that are often mixed together:
- What was certified at issue time?
- Is the certificate still active at use time?
- Is the requested use allowed for this context?
The package implements the protocol layer:
- canonical JSON and digest identity;
- artifact bundles and reference resolution;
- schema/profile validation;
- accepted evidence and audit-only raw evidence;
- bounded certificate issuance;
- lifecycle/status replay;
- represented and operational authority checks;
- golden conformance cases.
It is not a general solver. The bundled backend is an exact finite-state reference backend for small examples and tests. Larger solvers, simulators, or proof engines can be connected behind the checker interfaces.
Install
For users:
python -m pip install future-claim-certifier
dfcc conformance run --suite primary
For local development:
uv sync --locked --all-groups
uv run dfcc conformance run --suite primary
Python 3.11 or newer is supported. The import package is dfcc; the command
line tool is dfcc.
Five-Minute CLI Flow
Strict authority starts from an artifact bundle. The bundle contains the claim, time basis, accepted clauses or explicit trust assumptions, proof references, and a manifest digest. Use this path for decisions that another process or agent will rely on later:
uv run dfcc validate-bundle artifact-bundle.json --full-replay
uv run dfcc certify-bundle artifact-bundle.json --out issue.json
uv run dfcc replay-status --bundle artifact-bundle.json
The direct safe-temperature example is useful for learning and migration. It is not the strict authority path unless synthetic trust is explicitly allowed:
uv run dfcc certify examples/safe_temperature/spec.json --out issue.json
uv run dfcc check \
issue.json \
examples/safe_temperature/proposed_use.json \
examples/safe_temperature/status_context.json \
--allow-synthetic-trust \
--out status-view.json
Without --allow-synthetic-trust, direct checks return a blocking unknown
when the evidence is not bound to artifacts. This default prevents embedded
source, raw evidence, or unstated trust from becoming authority.
Check whether a represented use is allowed from a strict bundle:
uv run dfcc validate-bundle artifact-bundle.json --full-replay --out report.json
Run packaged conformance suites:
uv run dfcc conformance run --suite primary
uv run dfcc conformance run --suite legacy
uv run dfcc conformance run --suite strict
Replay lifecycle/status data directly from a bundle:
uv run dfcc replay-status --bundle artifact-bundle.json
List and export schemas:
uv run dfcc schema list
uv run dfcc schema export issue-certificate.schema.json --out issue-schema.json
Python Example
from dfcc.certificate import certify_claim_from_artifact_bundle
from dfcc.validation import validate_artifact_bundle
report = validate_artifact_bundle(artifact_bundle, full_replay=True)
view = report.authority_view
if view is not None and view.authority_outcome.code == "assert" and not view.blocking_set:
use_claim_as_represented_authority()
else:
inspect_blocking_records(report.final_result)
For strict artifact-bundle issuance, use:
certificate = certify_claim_from_artifact_bundle(artifact_bundle)
The strict path uses accepted clauses or explicit trust assumptions. Raw
evidence is audit data only and cannot silently change the certified semantics.
Strict replay also requires the bundle manifest digest. A missing digest becomes
missing_ref; a stale digest becomes digest_mismatch.
The direct convenience API is retained for migration and local examples:
from dfcc import check_authority
from dfcc.certificate import certify_claim
certificate = certify_claim(claim, bundle, anchor, time_basis)
view = check_authority(
certificate,
proposed_use,
status_context,
allow_synthetic_trust=True,
)
Without allow_synthetic_trust=True, direct inputs are normalized as synthetic
trust and return a blocking unknown result instead of represented assert or
deny, or operational accept or reject.
Reading Outcomes
DFCC is conservative. Missing or conflicting evidence is never upgraded into an allowing result.
Common results:
assert: the represented claim is currently usable as true for the requested represented use.deny: the represented claim is currently usable as false for the requested represented use.accept: the operational target is allowed after observation, completion, fiber, adjudication, adequacy, and policy checks.reject: the operational target is rejected by those checks.unknown: more accepted evidence or proof material is needed.expired: the status time is outside the certificate validity window.out_of_frame: the requested use is outside the certified frame.conflict: artifacts, lifecycle traces, or proof records disagree.policy_block: the protocol result exists, but policy does not allow use.checker_unknown: proof, checker, admission, or synthetic-trust evidence is missing or not accepted.missing_ref,digest_mismatch,schema_invalid,artifact_conflict: strict replay stopped before authority because artifact evidence did not resolve cleanly.
For non-allowing outcomes, inspect blocking_records, failure_records, and
typed reason_ref_records. They identify the artifact digest and JSON Pointer
path that caused the decision.
Documentation
- Docs index: start here for learning paths.
- Architecture: main concepts and trust boundaries.
- Agent usage: safe use by autonomous agents.
- Protocol mapping: paper definitions mapped to API, schemas, failure codes, and conformance cases.
- Release checklist: pre-publish audit steps.
- Security policy: security model and reporting.
- Contributing: local development commands.
Release And Quality Gates
The repository CI runs:
- ruff format and lint;
- mypy strict type checking;
- pytest with coverage gate at 90% or higher;
- bandit;
- pip-audit;
- primary and legacy conformance suites;
- strict conformance cases that prove raw evidence, embedded source, missing manifest digest, and unbound proof refs cannot authorize a claim;
- package build and distribution metadata checks.
PyPI publishing uses GitHub Actions Trusted Publishing. No long-lived PyPI API token is required.
License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file future_claim_certifier-1.1.0.tar.gz.
File metadata
- Download URL: future_claim_certifier-1.1.0.tar.gz
- Upload date:
- Size: 263.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ccdf41f1fcca41446a23fafe36a5e1d3829e933bdd13c5d8721d497be67a890e
|
|
| MD5 |
5ff9c8f3b4cc7eb757c83d3fdffaa9af
|
|
| BLAKE2b-256 |
c50cfc8c99ea989499b8fe1708222c2031742ac33a7e678acc1441764fb98f1a
|
Provenance
The following attestation bundles were made for future_claim_certifier-1.1.0.tar.gz:
Publisher:
workflow.yml on kadubon/future-claim-certifier
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
future_claim_certifier-1.1.0.tar.gz -
Subject digest:
ccdf41f1fcca41446a23fafe36a5e1d3829e933bdd13c5d8721d497be67a890e - Sigstore transparency entry: 2091023266
- Sigstore integration time:
-
Permalink:
kadubon/future-claim-certifier@017a4c1be9adce4cd7035d77a8b73520884e5243 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/kadubon
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
workflow.yml@017a4c1be9adce4cd7035d77a8b73520884e5243 -
Trigger Event:
push
-
Statement type:
File details
Details for the file future_claim_certifier-1.1.0-py3-none-any.whl.
File metadata
- Download URL: future_claim_certifier-1.1.0-py3-none-any.whl
- Upload date:
- Size: 195.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9d3feaa7e546a399a4c0f2024f1f6cae787a8b579be2764b32a125bd483547a1
|
|
| MD5 |
c7547b5b00c270903b3c82744af97fa7
|
|
| BLAKE2b-256 |
03e4d71ca0f4f4ecf9a1b50ccd96a41ae046e655f1f7601931bd6e338f1fe86e
|
Provenance
The following attestation bundles were made for future_claim_certifier-1.1.0-py3-none-any.whl:
Publisher:
workflow.yml on kadubon/future-claim-certifier
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
future_claim_certifier-1.1.0-py3-none-any.whl -
Subject digest:
9d3feaa7e546a399a4c0f2024f1f6cae787a8b579be2764b32a125bd483547a1 - Sigstore transparency entry: 2091023639
- Sigstore integration time:
-
Permalink:
kadubon/future-claim-certifier@017a4c1be9adce4cd7035d77a8b73520884e5243 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/kadubon
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
workflow.yml@017a4c1be9adce4cd7035d77a8b73520884e5243 -
Trigger Event:
push
-
Statement type: