diff --git a/Makefile b/Makefile index 8905dc1..1b49dbc 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: validate validate-json validate-yaml validate-quadlet validate-render validate-evidence validate-governance validate-policy-fabric validate-activation validate-supply-chain validate-release-bundle validate-sourceos-projections validate-package validate-cli validate-formula doctor probe +.PHONY: validate validate-json validate-yaml validate-quadlet validate-render validate-evidence validate-governance validate-policy-fabric validate-activation validate-supply-chain validate-release-bundle validate-sourceos-projections validate-package validate-cli validate-formula validate-runtime-install-receipts doctor probe PYTHON ?= python3 RUBY ?= ruby @@ -21,7 +21,7 @@ DECIDED_AT := 2026-05-04T12:51:00Z PYCLI := PYTHONPATH=src $(PYTHON) -m agent_machine.cli PYMOD := PYTHONPATH=src $(PYTHON) -m -validate: validate-json validate-yaml validate-quadlet validate-render validate-evidence validate-governance validate-policy-fabric validate-activation validate-supply-chain validate-release-bundle validate-sourceos-projections validate-package validate-cli validate-formula +validate: validate-json validate-yaml validate-quadlet validate-render validate-evidence validate-governance validate-policy-fabric validate-activation validate-supply-chain validate-release-bundle validate-sourceos-projections validate-package validate-cli validate-formula validate-runtime-install-receipts validate-json: $(PYTHON) scripts/validate-json.py @@ -102,6 +102,9 @@ validate-cli: validate-formula: $(RUBY) -c $(FORMULA) +validate-runtime-install-receipts: + $(PYTHON) scripts/validate-runtime-install-receipts.py + doctor: $(BOOTSTRAP_CLI) doctor --format json diff --git a/src/agent_machine/contracts.py b/src/agent_machine/contracts.py index a0fbeb7..1c9d983 100644 --- a/src/agent_machine/contracts.py +++ b/src/agent_machine/contracts.py @@ -56,6 +56,7 @@ def schema_by_kind(root: Path | None = None) -> dict[str, Path]: "InferenceProvider": base / "inference-provider.schema.json", "PolicyAdmission": base / "policy-admission.schema.json", "ReleaseEvidenceBundle": base / "release-evidence-bundle.schema.json", + "RuntimeInstallReceipt": base / "runtime-install-receipt.schema.json", "SignedReleaseBundleEnvelope": base / "signed-release-bundle-envelope.schema.json", "SteeringArtifactReceipt": base / "steering-artifact-receipt.schema.json", "SteeringSourceset": base / "steering-sourceset.schema.json", @@ -96,9 +97,9 @@ def validate_by_kind(instance_path: Path, root: Path | None = None) -> Path: instance = load_json(instance_path) if not isinstance(instance, dict): raise AssertionError(f"{instance_path}: example root must be a JSON object") - kind = instance.get("kind") + kind = instance.get("kind") or instance.get("type") if not isinstance(kind, str): - raise AssertionError(f"{instance_path}: missing string `kind` field") + raise AssertionError(f"{instance_path}: missing string `kind` or `type` field") mapping = schema_by_kind(root) schema_path = mapping.get(kind) if schema_path is None: