2026-07-03 11:03:58 +00:00
|
|
|
from pathlib import Path
|
|
|
|
|
import sys
|
|
|
|
|
|
|
|
|
|
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "provider" / "src"))
|
|
|
|
|
|
|
|
|
|
from pacta.config import RepoConfig
|
|
|
|
|
from pacta.signing import generate_ed25519_keypair
|
|
|
|
|
from pacta_provider.discovery import discover_toolchains
|
|
|
|
|
from pacta_provider.service import build_attestation
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_provider_discovery_finds_env_script(tmp_path):
|
|
|
|
|
root = tmp_path / "toolchains" / "aeneas-toolchain"
|
|
|
|
|
lean = root / "aeneas" / "backends" / "lean"
|
|
|
|
|
lean.mkdir(parents=True)
|
|
|
|
|
(lean / "lakefile.lean").write_text("", encoding="utf-8")
|
|
|
|
|
(root / "env.sh").write_text(
|
|
|
|
|
'SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"\n'
|
|
|
|
|
'export AENEAS_HOME="$SCRIPT_DIR/aeneas"\n',
|
|
|
|
|
encoding="utf-8",
|
|
|
|
|
)
|
|
|
|
|
candidates = discover_toolchains([tmp_path], max_depth=5)
|
|
|
|
|
assert candidates
|
|
|
|
|
assert candidates[0].lean_project_dir == lean
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_provider_builds_signed_attestation_for_fixture(tmp_path):
|
|
|
|
|
private_key = tmp_path / "provider.key"
|
|
|
|
|
public_key = tmp_path / "provider.pub"
|
|
|
|
|
generate_ed25519_keypair(private_key, public_key)
|
|
|
|
|
repo = RepoConfig(
|
|
|
|
|
name="dalek-ed25519-verified",
|
|
|
|
|
url="https://github.com/saymrwulf/dalek-ed25519-verified.git",
|
|
|
|
|
kind="ed25519",
|
|
|
|
|
verification_dir="verification",
|
|
|
|
|
verified_backend="serial/u64",
|
|
|
|
|
certificates=["CurveFieldProofs.fieldImplementation", "CurveFieldProofs.edwardsImplementation"],
|
Estate sync: boundary-axiom vocabulary + the four-tier apex reality (R4)
The verified corpus completed its phase 2 on 2026-07-06: every ed25519
fork now carries FOUR button-enforced apex tiers up to the full lift
(accept <=> decompress(R) = [k](-A)+[s]B as points), the complete scalar
layer, and the constructive encoding/decoding chain. pacta was calibrated
to the pre-apex corpus and - worse - had no vocabulary for
boundary-audited certificates: its axiom audit knew only "clean = exactly
the three standard axioms", so the apex tiers would have scored dirty.
New vocabulary:
- Profile.certificate_axioms: per-certificate ALLOWED axiom sets;
expected_axioms_for(cert) resolves each certificate's own boundary.
- RepoConfig.apex_boundary: a simple per-fork key (dalek-wrappers /
hash3 / anza) expanded by the ed25519 profile into the exact
per-tier allowed sets. AUTHORITY NOTE in profiles/ed25519.py: each
repo's check.sh Phase 3b is the enforcement point; if the button and
this table disagree, the button wins.
- run_axiom_audit compares each certificate against ITS allowed set;
deviation in EITHER direction (extra axiom or missing boundary
axiom) is dirty.
New risk reality:
- R4 is now reachable: full four-tier apex + constructive chain +
scalar arithmetic, all proven with cones pinned to their documented
boundaries. R4 always carries explicit residual blockers (SHA-512
oracle, hypothesis-parametric wire parses, translation faithfulness,
no side-channel/build assurance - those gate R5).
- R3 unchanged (arithmetic pair) and now explains exactly which apex
certificates are missing for R4.
Attestation trust model hardened:
- The provider is trusted for its OBSERVATION, never its VERDICT:
axiom_status is re-derived locally from observed_axioms against the
agent's own boundary policy. A provider that labels a dirty cone
"clean" gains nothing; "proven" with no observed axioms is
"unverifiable".
- Partial attestations degrade instead of being rejected: uncovered
certificates stay unproven and the score caps accordingly (an
arithmetic-only attestation still authorizes an R3 library capsule,
never a wallet).
Also: scripts/mini_pytest.py - a dependency-free test runner (tmp_path,
raises, monkeypatch, capsys) for hosts without pytest; examples
regenerated FROM the tool (dalek/anza fixtures now R4, 16 certs; new
full four-tier attestation example); tests updated + new
tests/test_boundaries.py (lying-provider, missing-boundary-axiom,
partial-coverage cases). 40/40 tests green.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 08:04:43 +00:00
|
|
|
axiom_imports=["Proofs.FieldMain", "Proofs.EdMain"],
|
2026-07-03 11:03:58 +00:00
|
|
|
expected_axioms=[],
|
|
|
|
|
)
|
|
|
|
|
attestation = build_attestation(
|
|
|
|
|
repo,
|
|
|
|
|
Path("tests/fixtures/mini-ed25519-verified"),
|
|
|
|
|
provider="local-test-provider",
|
|
|
|
|
private_key=private_key,
|
|
|
|
|
public_key=public_key,
|
|
|
|
|
timeout=30,
|
|
|
|
|
log_dir=tmp_path / "logs",
|
|
|
|
|
)
|
|
|
|
|
assert attestation["signature"]["status"] == "signed"
|
|
|
|
|
assert attestation["certificates"][0]["status"] == "proven"
|
2026-07-16 13:25:19 +00:00
|
|
|
# The leaf carries its own scope block (review round 6): the
|
|
|
|
|
# profile's guarantees/exclusions/deployment_constraints must reach
|
|
|
|
|
# the published leaf, not only the claim card.
|
|
|
|
|
assert "scope" in attestation
|
|
|
|
|
for key in ("guarantees", "exclusions", "deployment_constraints"):
|
|
|
|
|
assert key in attestation["scope"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_attestation_scope_carries_repo_known_status_and_exclusions(tmp_path):
|
|
|
|
|
# A repo's known_status (scoped-claim wording) and known_exclusions
|
|
|
|
|
# must land in the leaf's scope block. Regression for the entry-13
|
|
|
|
|
# requirement that the leaf itself carry its scoped attestation text.
|
|
|
|
|
private_key = tmp_path / "provider.key"
|
|
|
|
|
public_key = tmp_path / "provider.pub"
|
|
|
|
|
generate_ed25519_keypair(private_key, public_key)
|
|
|
|
|
repo = RepoConfig(
|
|
|
|
|
name="dalek-ed25519-verified",
|
|
|
|
|
url="https://github.com/saymrwulf/dalek-ed25519-verified.git",
|
|
|
|
|
kind="ed25519",
|
|
|
|
|
verification_dir="verification",
|
|
|
|
|
verified_backend="serial/u64",
|
|
|
|
|
certificates=["CurveFieldProofs.fieldImplementation"],
|
|
|
|
|
axiom_imports=["Proofs.FieldMain"],
|
|
|
|
|
expected_axioms=[],
|
|
|
|
|
known_status="SCOPE MARKER: mechanized model only, not the deployed verifier.",
|
|
|
|
|
known_exclusions=["EXCLUSION MARKER: side-channel resistance"],
|
|
|
|
|
)
|
|
|
|
|
attestation = build_attestation(
|
|
|
|
|
repo,
|
|
|
|
|
Path("tests/fixtures/mini-ed25519-verified"),
|
|
|
|
|
provider="local-test-provider",
|
|
|
|
|
private_key=private_key,
|
|
|
|
|
public_key=public_key,
|
|
|
|
|
timeout=30,
|
|
|
|
|
log_dir=tmp_path / "logs",
|
|
|
|
|
)
|
|
|
|
|
scope = attestation["scope"]
|
|
|
|
|
assert any("SCOPE MARKER" in c for c in scope["deployment_constraints"])
|
|
|
|
|
assert any("EXCLUSION MARKER" in e for e in scope["exclusions"])
|