From 9b4ff33ac0e696d4cf21ae58d8d49acaaeffb306 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 6 May 2026 18:54:30 +0000 Subject: [PATCH 1/3] Initial plan From ee07b43360df75dd9bfde4cf57bba03cab71b213 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 6 May 2026 19:00:19 +0000 Subject: [PATCH 2/3] Implement RuntimeInstallReceipt emission for runtime install/update flows Agent-Logs-Url: https://github.com/SourceOS-Linux/agent-machine/sessions/8c94ac85-6722-473e-8277-be860a20533e Co-authored-by: mdheller <21163552+mdheller@users.noreply.github.com> --- Makefile | 7 +- contracts/runtime-install-receipt.schema.json | 58 +++++ .../runtime-install-receipt.deferred.json | 41 ++++ examples/runtime-install-receipt.denied.json | 41 ++++ examples/runtime-install-receipt.failed.json | 42 ++++ .../runtime-install-receipt.installed.json | 43 ++++ examples/runtime-install-receipt.partial.json | 48 ++++ .../runtime-install-receipt.rolled_back.json | 43 ++++ scripts/validate-runtime-install-receipts.py | 153 ++++++++++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 419 bytes .../__pycache__/activation.cpython-312.pyc | Bin 0 -> 17867 bytes .../__pycache__/cli.cpython-312.pyc | Bin 0 -> 20248 bytes .../__pycache__/contracts.cpython-312.pyc | Bin 0 -> 6717 bytes .../__pycache__/digest.cpython-312.pyc | Bin 0 -> 1427 bytes .../__pycache__/evidence.cpython-312.pyc | Bin 0 -> 8690 bytes .../__pycache__/governance.cpython-312.pyc | Bin 0 -> 19407 bytes .../__pycache__/paths.cpython-312.pyc | Bin 0 -> 1989 bytes .../release_bundle.cpython-312.pyc | Bin 0 -> 12484 bytes .../runtime_install_receipt.cpython-312.pyc | Bin 0 -> 10530 bytes .../__pycache__/supply_chain.cpython-312.pyc | Bin 0 -> 7082 bytes src/agent_machine/contracts.py | 5 +- .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 221 bytes .../renderers/__pycache__/k8s.cpython-312.pyc | Bin 0 -> 13925 bytes .../__pycache__/plan.cpython-312.pyc | Bin 0 -> 13651 bytes .../__pycache__/quadlet.cpython-312.pyc | Bin 0 -> 10106 bytes src/agent_machine/runtime_install_receipt.py | 229 ++++++++++++++++++ 26 files changed, 706 insertions(+), 4 deletions(-) create mode 100644 contracts/runtime-install-receipt.schema.json create mode 100644 examples/runtime-install-receipt.deferred.json create mode 100644 examples/runtime-install-receipt.denied.json create mode 100644 examples/runtime-install-receipt.failed.json create mode 100644 examples/runtime-install-receipt.installed.json create mode 100644 examples/runtime-install-receipt.partial.json create mode 100644 examples/runtime-install-receipt.rolled_back.json create mode 100644 scripts/validate-runtime-install-receipts.py create mode 100644 src/agent_machine/__pycache__/__init__.cpython-312.pyc create mode 100644 src/agent_machine/__pycache__/activation.cpython-312.pyc create mode 100644 src/agent_machine/__pycache__/cli.cpython-312.pyc create mode 100644 src/agent_machine/__pycache__/contracts.cpython-312.pyc create mode 100644 src/agent_machine/__pycache__/digest.cpython-312.pyc create mode 100644 src/agent_machine/__pycache__/evidence.cpython-312.pyc create mode 100644 src/agent_machine/__pycache__/governance.cpython-312.pyc create mode 100644 src/agent_machine/__pycache__/paths.cpython-312.pyc create mode 100644 src/agent_machine/__pycache__/release_bundle.cpython-312.pyc create mode 100644 src/agent_machine/__pycache__/runtime_install_receipt.cpython-312.pyc create mode 100644 src/agent_machine/__pycache__/supply_chain.cpython-312.pyc create mode 100644 src/agent_machine/renderers/__pycache__/__init__.cpython-312.pyc create mode 100644 src/agent_machine/renderers/__pycache__/k8s.cpython-312.pyc create mode 100644 src/agent_machine/renderers/__pycache__/plan.cpython-312.pyc create mode 100644 src/agent_machine/renderers/__pycache__/quadlet.cpython-312.pyc create mode 100644 src/agent_machine/runtime_install_receipt.py diff --git a/Makefile b/Makefile index dd6c1f9..527b999 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: validate validate-json validate-yaml validate-quadlet validate-render validate-evidence validate-governance 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-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 @@ -20,7 +20,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-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-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 @@ -86,6 +86,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/contracts/runtime-install-receipt.schema.json b/contracts/runtime-install-receipt.schema.json new file mode 100644 index 0000000..0eaec3c --- /dev/null +++ b/contracts/runtime-install-receipt.schema.json @@ -0,0 +1,58 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://schemas.srcos.ai/v2/RuntimeInstallReceipt.json", + "title": "RuntimeInstallReceipt", + "description": "Receipt for runtime installation, update, rollback, denial, or partial install flows with artifact verification, compact log references, policy decision linkage, and evidence references.", + "type": "object", + "additionalProperties": false, + "required": ["id", "type", "specVersion", "sessionRef", "capabilityLedgerRef", "runtimeRef", "targetRef", "platform", "installState", "manifest", "artifacts", "logMode", "policyDecisionRef", "evidenceRefs", "startedAt", "capturedAt"], + "properties": { + "id": { "type": "string", "pattern": "^urn:srcos:receipt:runtime-install:" }, + "type": { "const": "RuntimeInstallReceipt" }, + "specVersion": { "type": "string" }, + "sessionRef": { "type": "string", "pattern": "^urn:srcos:session:" }, + "capabilityLedgerRef": { "type": "string", "pattern": "^urn:srcos:capability-ledger:" }, + "agentMachineReceiptRef": { "type": ["string", "null"], "pattern": "^urn:srcos:agent-machine-receipt:" }, + "runtimeRef": { "type": "string", "pattern": "^urn:srcos:runtime:" }, + "runtimeName": { "type": ["string", "null"] }, + "runtimeVersion": { "type": ["string", "null"] }, + "targetRef": { "type": "string", "pattern": "^urn:srcos:target:" }, + "platform": { "type": "string", "enum": ["darwin-arm64", "darwin-x64", "linux-x64", "linux-arm64", "win32-x64"] }, + "installState": { "type": "string", "enum": ["requested", "manifest_resolved", "artifact_verified", "installing", "installed", "failed", "rolled_back", "partial", "denied", "deferred"] }, + "manifest": { + "type": "object", + "additionalProperties": false, + "required": ["manifestRef", "manifestDigest", "resolvedAt"], + "properties": { + "manifestRef": { "type": "string" }, + "manifestDigest": { "type": "string", "pattern": "^sha256:[a-fA-F0-9]{64}$" }, + "bundleFormatVersion": { "type": ["string", "integer", "null"] }, + "resolvedAt": { "type": "string", "format": "date-time" } + } + }, + "artifacts": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "additionalProperties": false, + "required": ["artifactRef", "digest", "verificationState"], + "properties": { + "artifactRef": { "type": "string" }, + "digest": { "type": "string", "pattern": "^sha256:[a-fA-F0-9]{64}$" }, + "sizeBytes": { "type": ["integer", "null"], "minimum": 0 }, + "verificationState": { "type": "string", "enum": ["not_checked", "verified", "failed", "skipped"] } + } + } + }, + "rollbackRef": { "type": ["string", "null"] }, + "failureReason": { "type": ["string", "null"] }, + "logMode": { "type": "string", "enum": ["compact_receipt_ref", "full_debug_redacted"] }, + "causalRefs": { "type": "array", "items": { "type": "string" } }, + "policyDecisionRef": { "type": "string", "pattern": "^urn:srcos:decision:" }, + "evidenceRefs": { "type": "array", "minItems": 1, "items": { "type": "string" } }, + "startedAt": { "type": "string", "format": "date-time" }, + "finishedAt": { "type": ["string", "null"], "format": "date-time" }, + "capturedAt": { "type": "string", "format": "date-time" } + } +} diff --git a/examples/runtime-install-receipt.deferred.json b/examples/runtime-install-receipt.deferred.json new file mode 100644 index 0000000..dbc54bf --- /dev/null +++ b/examples/runtime-install-receipt.deferred.json @@ -0,0 +1,41 @@ +{ + "id": "urn:srcos:receipt:runtime-install:agent-runtime-deferred-0001", + "type": "RuntimeInstallReceipt", + "specVersion": "0.1.0", + "sessionRef": "urn:srcos:session:runtime-install-demo-0006", + "capabilityLedgerRef": "urn:srcos:capability-ledger:runtime-install-demo-0006", + "agentMachineReceiptRef": null, + "runtimeRef": "urn:srcos:runtime:sourceos-agent-runtime@0.1.0", + "runtimeName": "sourceos-agent-runtime", + "runtimeVersion": "0.1.0", + "targetRef": "urn:srcos:target:developer-workstation-0001", + "platform": "linux-x64", + "installState": "deferred", + "manifest": { + "manifestRef": "urn:srcos:artifact:runtime-manifest-sourceos-agent-runtime-0.1.0", + "manifestDigest": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "bundleFormatVersion": "1", + "resolvedAt": "2026-05-06T09:00:00Z" + }, + "artifacts": [ + { + "artifactRef": "urn:srcos:artifact:sourceos-agent-runtime-linux-x64-0.1.0.tar.xz", + "digest": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "sizeBytes": 1048576, + "verificationState": "not_checked" + } + ], + "rollbackRef": null, + "failureReason": "install_window_not_open_deferred_to_maintenance_window", + "logMode": "compact_receipt_ref", + "causalRefs": [ + "urn:srcos:event:runtime-install-requested-0006" + ], + "policyDecisionRef": "urn:srcos:decision:runtime-install-policy-0006", + "evidenceRefs": [ + "urn:srcos:evidence:runtime-install-deferred-0001" + ], + "startedAt": "2026-05-06T09:00:00Z", + "finishedAt": null, + "capturedAt": "2026-05-06T09:00:05Z" +} diff --git a/examples/runtime-install-receipt.denied.json b/examples/runtime-install-receipt.denied.json new file mode 100644 index 0000000..073107c --- /dev/null +++ b/examples/runtime-install-receipt.denied.json @@ -0,0 +1,41 @@ +{ + "id": "urn:srcos:receipt:runtime-install:agent-runtime-denied-0001", + "type": "RuntimeInstallReceipt", + "specVersion": "0.1.0", + "sessionRef": "urn:srcos:session:runtime-install-demo-0003", + "capabilityLedgerRef": "urn:srcos:capability-ledger:runtime-install-demo-0003", + "agentMachineReceiptRef": null, + "runtimeRef": "urn:srcos:runtime:sourceos-agent-runtime@0.1.0", + "runtimeName": "sourceos-agent-runtime", + "runtimeVersion": "0.1.0", + "targetRef": "urn:srcos:target:developer-workstation-0001", + "platform": "linux-x64", + "installState": "denied", + "manifest": { + "manifestRef": "urn:srcos:artifact:runtime-manifest-sourceos-agent-runtime-0.1.0", + "manifestDigest": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "bundleFormatVersion": "1", + "resolvedAt": "2026-05-06T06:00:00Z" + }, + "artifacts": [ + { + "artifactRef": "urn:srcos:artifact:sourceos-agent-runtime-linux-x64-0.1.0.tar.xz", + "digest": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "sizeBytes": 1048576, + "verificationState": "not_checked" + } + ], + "rollbackRef": null, + "failureReason": "policy_denied_runtime_install_capability_not_granted", + "logMode": "compact_receipt_ref", + "causalRefs": [ + "urn:srcos:event:runtime-install-requested-0003" + ], + "policyDecisionRef": "urn:srcos:decision:runtime-install-policy-denied-0001", + "evidenceRefs": [ + "urn:srcos:evidence:runtime-install-policy-denial-0001" + ], + "startedAt": "2026-05-06T06:00:00Z", + "finishedAt": "2026-05-06T06:00:05Z", + "capturedAt": "2026-05-06T06:00:10Z" +} diff --git a/examples/runtime-install-receipt.failed.json b/examples/runtime-install-receipt.failed.json new file mode 100644 index 0000000..d555a38 --- /dev/null +++ b/examples/runtime-install-receipt.failed.json @@ -0,0 +1,42 @@ +{ + "id": "urn:srcos:receipt:runtime-install:agent-runtime-failed-artifact-0001", + "type": "RuntimeInstallReceipt", + "specVersion": "0.1.0", + "sessionRef": "urn:srcos:session:runtime-install-demo-0002", + "capabilityLedgerRef": "urn:srcos:capability-ledger:runtime-install-demo-0002", + "agentMachineReceiptRef": null, + "runtimeRef": "urn:srcos:runtime:sourceos-agent-runtime@0.1.0", + "runtimeName": "sourceos-agent-runtime", + "runtimeVersion": "0.1.0", + "targetRef": "urn:srcos:target:developer-workstation-0001", + "platform": "linux-x64", + "installState": "failed", + "manifest": { + "manifestRef": "urn:srcos:artifact:runtime-manifest-sourceos-agent-runtime-0.1.0", + "manifestDigest": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "bundleFormatVersion": "1", + "resolvedAt": "2026-05-06T05:00:00Z" + }, + "artifacts": [ + { + "artifactRef": "urn:srcos:artifact:sourceos-agent-runtime-linux-x64-0.1.0.tar.xz", + "digest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "sizeBytes": 1048576, + "verificationState": "failed" + } + ], + "rollbackRef": null, + "failureReason": "artifact_digest_verification_failed", + "logMode": "compact_receipt_ref", + "causalRefs": [ + "urn:srcos:event:runtime-install-requested-0002" + ], + "policyDecisionRef": "urn:srcos:decision:runtime-install-policy-0002", + "evidenceRefs": [ + "urn:srcos:evidence:runtime-install-artifact-verification-failed-0001", + "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + ], + "startedAt": "2026-05-06T05:00:00Z", + "finishedAt": "2026-05-06T05:01:00Z", + "capturedAt": "2026-05-06T05:01:05Z" +} diff --git a/examples/runtime-install-receipt.installed.json b/examples/runtime-install-receipt.installed.json new file mode 100644 index 0000000..0097a91 --- /dev/null +++ b/examples/runtime-install-receipt.installed.json @@ -0,0 +1,43 @@ +{ + "id": "urn:srcos:receipt:runtime-install:agent-runtime-installed-0001", + "type": "RuntimeInstallReceipt", + "specVersion": "0.1.0", + "sessionRef": "urn:srcos:session:runtime-install-demo-0001", + "capabilityLedgerRef": "urn:srcos:capability-ledger:runtime-install-demo-0001", + "agentMachineReceiptRef": "urn:srcos:agent-machine-receipt:runtime-probe-0001", + "runtimeRef": "urn:srcos:runtime:sourceos-agent-runtime@0.1.0", + "runtimeName": "sourceos-agent-runtime", + "runtimeVersion": "0.1.0", + "targetRef": "urn:srcos:target:developer-workstation-0001", + "platform": "linux-x64", + "installState": "installed", + "manifest": { + "manifestRef": "urn:srcos:artifact:runtime-manifest-sourceos-agent-runtime-0.1.0", + "manifestDigest": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "bundleFormatVersion": "1", + "resolvedAt": "2026-05-06T04:34:00Z" + }, + "artifacts": [ + { + "artifactRef": "urn:srcos:artifact:sourceos-agent-runtime-linux-x64-0.1.0.tar.xz", + "digest": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "sizeBytes": 1048576, + "verificationState": "verified" + } + ], + "rollbackRef": null, + "failureReason": null, + "logMode": "compact_receipt_ref", + "causalRefs": [ + "urn:srcos:event:runtime-install-requested-0001", + "urn:srcos:capability-ledger:runtime-install-demo-0001" + ], + "policyDecisionRef": "urn:srcos:decision:runtime-install-policy-0001", + "evidenceRefs": [ + "urn:srcos:evidence:runtime-install-verified-0001", + "sha256:3333333333333333333333333333333333333333333333333333333333333333" + ], + "startedAt": "2026-05-06T04:34:00Z", + "finishedAt": "2026-05-06T04:35:00Z", + "capturedAt": "2026-05-06T04:35:05Z" +} diff --git a/examples/runtime-install-receipt.partial.json b/examples/runtime-install-receipt.partial.json new file mode 100644 index 0000000..729ae2a --- /dev/null +++ b/examples/runtime-install-receipt.partial.json @@ -0,0 +1,48 @@ +{ + "id": "urn:srcos:receipt:runtime-install:agent-runtime-partial-0001", + "type": "RuntimeInstallReceipt", + "specVersion": "0.1.0", + "sessionRef": "urn:srcos:session:runtime-install-demo-0004", + "capabilityLedgerRef": "urn:srcos:capability-ledger:runtime-install-demo-0004", + "agentMachineReceiptRef": null, + "runtimeRef": "urn:srcos:runtime:sourceos-agent-runtime@0.1.0", + "runtimeName": "sourceos-agent-runtime", + "runtimeVersion": "0.1.0", + "targetRef": "urn:srcos:target:developer-workstation-0001", + "platform": "linux-x64", + "installState": "partial", + "manifest": { + "manifestRef": "urn:srcos:artifact:runtime-manifest-sourceos-agent-runtime-0.1.0", + "manifestDigest": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "bundleFormatVersion": "1", + "resolvedAt": "2026-05-06T07:00:00Z" + }, + "artifacts": [ + { + "artifactRef": "urn:srcos:artifact:sourceos-agent-runtime-linux-x64-0.1.0.tar.xz", + "digest": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "sizeBytes": 1048576, + "verificationState": "verified" + }, + { + "artifactRef": "urn:srcos:artifact:sourceos-agent-runtime-extensions-linux-x64-0.1.0.tar.xz", + "digest": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "sizeBytes": null, + "verificationState": "failed" + } + ], + "rollbackRef": null, + "failureReason": "extension_artifact_verification_failed_core_installed", + "logMode": "compact_receipt_ref", + "causalRefs": [ + "urn:srcos:event:runtime-install-requested-0004" + ], + "policyDecisionRef": "urn:srcos:decision:runtime-install-policy-0004", + "evidenceRefs": [ + "urn:srcos:evidence:runtime-install-partial-state-0001", + "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd" + ], + "startedAt": "2026-05-06T07:00:00Z", + "finishedAt": "2026-05-06T07:05:00Z", + "capturedAt": "2026-05-06T07:05:10Z" +} diff --git a/examples/runtime-install-receipt.rolled_back.json b/examples/runtime-install-receipt.rolled_back.json new file mode 100644 index 0000000..2bed838 --- /dev/null +++ b/examples/runtime-install-receipt.rolled_back.json @@ -0,0 +1,43 @@ +{ + "id": "urn:srcos:receipt:runtime-install:agent-runtime-rolled-back-0001", + "type": "RuntimeInstallReceipt", + "specVersion": "0.1.0", + "sessionRef": "urn:srcos:session:runtime-install-demo-0005", + "capabilityLedgerRef": "urn:srcos:capability-ledger:runtime-install-demo-0005", + "agentMachineReceiptRef": "urn:srcos:agent-machine-receipt:runtime-probe-0005", + "runtimeRef": "urn:srcos:runtime:sourceos-agent-runtime@0.1.0", + "runtimeName": "sourceos-agent-runtime", + "runtimeVersion": "0.1.0", + "targetRef": "urn:srcos:target:developer-workstation-0001", + "platform": "linux-x64", + "installState": "rolled_back", + "manifest": { + "manifestRef": "urn:srcos:artifact:runtime-manifest-sourceos-agent-runtime-0.1.0", + "manifestDigest": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "bundleFormatVersion": "1", + "resolvedAt": "2026-05-06T08:00:00Z" + }, + "artifacts": [ + { + "artifactRef": "urn:srcos:artifact:sourceos-agent-runtime-linux-x64-0.1.0.tar.xz", + "digest": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "sizeBytes": 1048576, + "verificationState": "verified" + } + ], + "rollbackRef": "urn:srcos:receipt:runtime-install:agent-runtime-installed-0000", + "failureReason": "post_install_health_check_failed_rollback_executed", + "logMode": "compact_receipt_ref", + "causalRefs": [ + "urn:srcos:event:runtime-install-requested-0005", + "urn:srcos:event:runtime-health-check-failed-0005" + ], + "policyDecisionRef": "urn:srcos:decision:runtime-install-policy-0005", + "evidenceRefs": [ + "urn:srcos:evidence:runtime-install-rollback-executed-0001", + "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee" + ], + "startedAt": "2026-05-06T08:00:00Z", + "finishedAt": "2026-05-06T08:10:00Z", + "capturedAt": "2026-05-06T08:10:05Z" +} diff --git a/scripts/validate-runtime-install-receipts.py b/scripts/validate-runtime-install-receipts.py new file mode 100644 index 0000000..3164049 --- /dev/null +++ b/scripts/validate-runtime-install-receipts.py @@ -0,0 +1,153 @@ +#!/usr/bin/env python3 +"""Validate RuntimeInstallReceipt examples and semantic consistency.""" + +from __future__ import annotations + +import sys +from pathlib import Path + +REPO_ROOT = Path(__file__).resolve().parents[1] +SRC_ROOT = REPO_ROOT / "src" +if str(SRC_ROOT) not in sys.path: + sys.path.insert(0, str(SRC_ROOT)) + +from agent_machine.runtime_install_receipt import ( # noqa: E402 + build_receipt, + emit_compact_log, + validate_receipt, + validate_receipt_file, +) + +EXAMPLE_FILES = [ + REPO_ROOT / "examples" / "runtime-install-receipt.installed.json", + REPO_ROOT / "examples" / "runtime-install-receipt.failed.json", + REPO_ROOT / "examples" / "runtime-install-receipt.denied.json", + REPO_ROOT / "examples" / "runtime-install-receipt.partial.json", + REPO_ROOT / "examples" / "runtime-install-receipt.rolled_back.json", + REPO_ROOT / "examples" / "runtime-install-receipt.deferred.json", +] + + +def validate_examples() -> None: + for path in EXAMPLE_FILES: + validate_receipt_file(path, REPO_ROOT) + print(f"VALID RuntimeInstallReceipt example {path.relative_to(REPO_ROOT)}") + + +def validate_compact_log_output() -> None: + """Confirm emit_compact_log produces a single-line compact reference string.""" + receipt = build_receipt( + receipt_id="urn:srcos:receipt:runtime-install:smoke-test-0001", + session_ref="urn:srcos:session:smoke-0001", + capability_ledger_ref="urn:srcos:capability-ledger:smoke-0001", + runtime_ref="urn:srcos:runtime:smoke-runtime@0.0.1", + target_ref="urn:srcos:target:smoke-target-0001", + platform="linux-x64", + install_state="installed", + manifest_ref="urn:srcos:artifact:smoke-manifest", + manifest_digest="sha256:1111111111111111111111111111111111111111111111111111111111111111", + manifest_resolved_at="2026-05-06T10:00:00Z", + artifacts=[ + { + "artifactRef": "urn:srcos:artifact:smoke-runtime-bin", + "digest": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "sizeBytes": 4096, + "verificationState": "verified", + } + ], + policy_decision_ref="urn:srcos:decision:smoke-policy-0001", + evidence_refs=["urn:srcos:evidence:smoke-evidence-0001"], + started_at="2026-05-06T10:00:00Z", + captured_at="2026-05-06T10:00:05Z", + finished_at="2026-05-06T10:00:04Z", + ) + validate_receipt(receipt, source="", root=REPO_ROOT) + log_line = emit_compact_log(receipt) + if "\n" in log_line: + raise AssertionError("emit_compact_log must produce a single-line string") + if "urn:srcos:receipt:runtime-install:smoke-test-0001" not in log_line: + raise AssertionError(f"compact log must include receipt id, got: {log_line!r}") + if "installed" not in log_line: + raise AssertionError(f"compact log must include installState, got: {log_line!r}") + print(f"VALID compact log output: {log_line}") + + +def validate_failure_states() -> None: + """Confirm that failure states require failureReason and missing states are rejected.""" + base = dict( + receipt_id="urn:srcos:receipt:runtime-install:semantics-test-0001", + session_ref="urn:srcos:session:semantics-0001", + capability_ledger_ref="urn:srcos:capability-ledger:semantics-0001", + runtime_ref="urn:srcos:runtime:semantics-runtime@0.0.1", + target_ref="urn:srcos:target:semantics-target-0001", + platform="linux-x64", + manifest_ref="urn:srcos:artifact:semantics-manifest", + manifest_digest="sha256:1111111111111111111111111111111111111111111111111111111111111111", + manifest_resolved_at="2026-05-06T10:00:00Z", + artifacts=[ + { + "artifactRef": "urn:srcos:artifact:semantics-runtime-bin", + "digest": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "verificationState": "not_checked", + } + ], + policy_decision_ref="urn:srcos:decision:semantics-policy-0001", + evidence_refs=["urn:srcos:evidence:semantics-evidence-0001"], + started_at="2026-05-06T10:00:00Z", + captured_at="2026-05-06T10:00:05Z", + ) + + # failure states must have failureReason + for bad_state in ("failed", "partial", "denied", "deferred"): + receipt = build_receipt(**base, install_state=bad_state, failure_reason=None) + try: + validate_receipt(receipt, root=REPO_ROOT) + raise AssertionError(f"Expected semantic error for installState={bad_state!r} without failureReason") + except AssertionError as exc: + if "failureReason" not in str(exc): + raise + print(f"VALID semantic rejection: installState={bad_state!r} without failureReason") + + # rolled_back must have rollbackRef + receipt = build_receipt(**base, install_state="rolled_back", failure_reason="health_check_failed", rollback_ref=None) + try: + validate_receipt(receipt, root=REPO_ROOT) + raise AssertionError("Expected semantic error for installState=rolled_back without rollbackRef") + except AssertionError as exc: + if "rollbackRef" not in str(exc): + raise + print("VALID semantic rejection: installState=rolled_back without rollbackRef") + + # installed must not carry failureReason + receipt = build_receipt(**base, install_state="installed", failure_reason="should_not_be_here") + try: + validate_receipt(receipt, root=REPO_ROOT) + raise AssertionError("Expected semantic error for installState=installed with failureReason") + except AssertionError as exc: + if "failureReason" not in str(exc): + raise + print("VALID semantic rejection: installState=installed with failureReason") + + # empty evidenceRefs must be rejected + bad_receipt = build_receipt(**{**base, "evidence_refs": []}, install_state="installed") + try: + validate_receipt(bad_receipt, root=REPO_ROOT) + raise AssertionError("Expected schema/semantic error for empty evidenceRefs") + except AssertionError: + pass + print("VALID semantic rejection: empty evidenceRefs") + + +def main() -> int: + validate_examples() + validate_compact_log_output() + validate_failure_states() + return 0 + + +if __name__ == "__main__": + try: + raise SystemExit(main()) + except (AssertionError, RuntimeError, ValueError) as exc: + print(str(exc), file=sys.stderr) + raise SystemExit(1) from exc diff --git a/src/agent_machine/__pycache__/__init__.cpython-312.pyc b/src/agent_machine/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ad2056f9b2839c082490e7f5b193c1f109371db GIT binary patch literal 419 zcmZ8dJx{|h5RKD_mb7JHqMO$aP0Egtm=R1&Sx#wU8moyN`P^3NL^mc@{sR1#{sGh# zen3&TvT#u;NZjCi_wkzQmZ)6D~<&vKF?$> zxTQrSN{!NLQ*ojzg0zYJ-spnoTBGoPr8y=>mKM3yM4MtfB8|f#g-)lrz`$R(0cOG= z$p9>lhrxL;9He4)+i$F!0I5y@YCvZI7?=FMI@{X*?mEnLAwp7A!h~~eCLvi`wkrD08&W{5R}!fb+Nzb(zHms{$D(!XVYMeeYzg=HXWzadki0%ZzsKF+Z@sG E8y=E{OaK4? literal 0 HcmV?d00001 diff --git a/src/agent_machine/__pycache__/activation.cpython-312.pyc b/src/agent_machine/__pycache__/activation.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ff4f316abedcbede59008c322ff8a6a4cf406e7 GIT binary patch literal 17867 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 literal 0 HcmV?d00001 diff --git a/src/agent_machine/__pycache__/cli.cpython-312.pyc b/src/agent_machine/__pycache__/cli.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6af25a6c162d173831eab3b5445669363f8377a7 GIT binary patch literal 20248 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 t)V!XUty5hczja!#LzX9oLCY%5O literal 0 HcmV?d00001 diff --git a/src/agent_machine/__pycache__/contracts.cpython-312.pyc b/src/agent_machine/__pycache__/contracts.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7192d531c4e8dcc2852ff7c74b8b99cafa831ad9 GIT binary patch literal 6717 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 literal 0 HcmV?d00001 diff --git a/src/agent_machine/__pycache__/paths.cpython-312.pyc b/src/agent_machine/__pycache__/paths.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4d898c4f039da37638161e9821518d5221de86c0 GIT binary patch literal 1989 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 literal 0 HcmV?d00001 diff --git a/src/agent_machine/__pycache__/runtime_install_receipt.cpython-312.pyc b/src/agent_machine/__pycache__/runtime_install_receipt.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..60084d84f587133fc88a802dcc5b236efaeda308 GIT binary patch literal 10530 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 literal 0 HcmV?d00001 diff --git a/src/agent_machine/__pycache__/supply_chain.cpython-312.pyc b/src/agent_machine/__pycache__/supply_chain.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a78d7522b2798d9cc2c6c1f35c8d2ec62f3d4a9d GIT binary patch literal 7082 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 GeE%IR&I0uS literal 0 HcmV?d00001 diff --git a/src/agent_machine/contracts.py b/src/agent_machine/contracts.py index 3caa256..75a3cc2 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", "StorageReceipt": base / "storage-receipt.schema.json", } @@ -93,9 +94,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: diff --git a/src/agent_machine/renderers/__pycache__/__init__.cpython-312.pyc b/src/agent_machine/renderers/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8580974698ffc6dbb64aab9d5b5740741d34afc2 GIT binary patch literal 221 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 P=<2*c+kZ(r;Q9Xn)+rJo literal 0 HcmV?d00001 diff --git a/src/agent_machine/runtime_install_receipt.py b/src/agent_machine/runtime_install_receipt.py new file mode 100644 index 0000000..dfc4120 --- /dev/null +++ b/src/agent_machine/runtime_install_receipt.py @@ -0,0 +1,229 @@ +"""RuntimeInstallReceipt emission and validation for Agent Machine install/update flows. + +This module builds, validates, and logs compact RuntimeInstallReceipt records for +runtime installation lifecycle transitions. Full manifests and detailed artifact +payloads must be stored in evidence bundles; ordinary logs emit only compact +receipt ids and evidence references (logMode: compact_receipt_ref). +""" + +from __future__ import annotations + +import argparse +import json +import sys +from pathlib import Path +from typing import Any + +from agent_machine.contracts import load_json, schema_by_kind, validate_instance + +INSTALL_STATES = { + "requested", + "manifest_resolved", + "artifact_verified", + "installing", + "installed", + "failed", + "rolled_back", + "partial", + "denied", + "deferred", +} + +VERIFICATION_STATES = {"not_checked", "verified", "failed", "skipped"} + +PLATFORMS = {"darwin-arm64", "darwin-x64", "linux-x64", "linux-arm64", "win32-x64"} + +LOG_MODES = {"compact_receipt_ref", "full_debug_redacted"} + +_TERMINAL_STATES = {"installed", "failed", "rolled_back", "partial", "denied", "deferred"} +_FAILURE_STATES = {"failed", "partial", "denied", "deferred"} + + +def receipt_schema_path(root: Path | None = None) -> Path: + return schema_by_kind(root)["RuntimeInstallReceipt"] + + +def validate_receipt_schema(receipt: dict[str, Any], root: Path | None = None) -> None: + """Validate a RuntimeInstallReceipt dict against the JSON Schema.""" + schema = load_json(receipt_schema_path(root)) + try: + from jsonschema.validators import validator_for + except ImportError as exc: # pragma: no cover + raise RuntimeError( + "Missing dependency: jsonschema. Install with `python -m pip install -r requirements-dev.txt`." + ) from exc + validator_cls = validator_for(schema) + validator_cls.check_schema(schema) + validator = validator_cls(schema) + errors = sorted(validator.iter_errors(receipt), key=lambda err: list(err.path)) + if errors: + rendered = [] + for err in errors: + location = "/".join(str(part) for part in err.path) or "" + rendered.append(f" - {location}: {err.message}") + raise AssertionError("RuntimeInstallReceipt failed schema validation:\n" + "\n".join(rendered)) + + +def validate_receipt_semantics(receipt: dict[str, Any], source: str = "") -> None: + """Validate cross-field semantic invariants for a RuntimeInstallReceipt.""" + install_state = receipt.get("installState") + + # failure_reason must be present for failure/denial/deferral/partial states + failure_reason = receipt.get("failureReason") + if install_state in _FAILURE_STATES and not failure_reason: + raise AssertionError( + f"{source}: installState={install_state!r} requires a non-empty failureReason" + ) + if install_state == "installed" and failure_reason is not None: + raise AssertionError( + f"{source}: installState=installed must not carry failureReason" + ) + + # rollback_ref should be present when rolled_back + rollback_ref = receipt.get("rollbackRef") + if install_state == "rolled_back" and not rollback_ref: + raise AssertionError( + f"{source}: installState=rolled_back requires a non-null rollbackRef" + ) + + # logMode default is compact_receipt_ref + log_mode = receipt.get("logMode") + if log_mode not in LOG_MODES: + raise AssertionError(f"{source}: logMode must be one of {sorted(LOG_MODES)!r}, got {log_mode!r}") + + # evidenceRefs must be non-empty + evidence_refs = receipt.get("evidenceRefs") + if not isinstance(evidence_refs, list) or not evidence_refs: + raise AssertionError(f"{source}: evidenceRefs must be a non-empty list") + + +def validate_receipt(receipt: dict[str, Any], source: str = "", root: Path | None = None) -> None: + """Run both schema and semantic validation on a RuntimeInstallReceipt dict.""" + validate_receipt_schema(receipt, root) + validate_receipt_semantics(receipt, source) + + +def build_receipt( + *, + receipt_id: str, + session_ref: str, + capability_ledger_ref: str, + runtime_ref: str, + target_ref: str, + platform: str, + install_state: str, + manifest_ref: str, + manifest_digest: str, + manifest_resolved_at: str, + artifacts: list[dict[str, Any]], + policy_decision_ref: str, + evidence_refs: list[str], + started_at: str, + captured_at: str, + spec_version: str = "0.1.0", + agent_machine_receipt_ref: str | None = None, + runtime_name: str | None = None, + runtime_version: str | None = None, + manifest_bundle_format_version: str | int | None = None, + rollback_ref: str | None = None, + failure_reason: str | None = None, + log_mode: str = "compact_receipt_ref", + causal_refs: list[str] | None = None, + finished_at: str | None = None, +) -> dict[str, Any]: + """Construct a RuntimeInstallReceipt record. + + All full manifests and artifact payloads belong in evidence bundles; this + record carries only compact receipt ids, digests, and evidence references. + """ + if install_state not in INSTALL_STATES: + raise ValueError(f"Unknown installState {install_state!r}; must be one of {sorted(INSTALL_STATES)}") + if platform not in PLATFORMS: + raise ValueError(f"Unknown platform {platform!r}; must be one of {sorted(PLATFORMS)}") + if log_mode not in LOG_MODES: + raise ValueError(f"Unknown logMode {log_mode!r}; must be one of {sorted(LOG_MODES)}") + + manifest: dict[str, Any] = { + "manifestRef": manifest_ref, + "manifestDigest": manifest_digest, + "resolvedAt": manifest_resolved_at, + } + if manifest_bundle_format_version is not None: + manifest["bundleFormatVersion"] = manifest_bundle_format_version + + receipt: dict[str, Any] = { + "id": receipt_id, + "type": "RuntimeInstallReceipt", + "specVersion": spec_version, + "sessionRef": session_ref, + "capabilityLedgerRef": capability_ledger_ref, + "agentMachineReceiptRef": agent_machine_receipt_ref, + "runtimeRef": runtime_ref, + "runtimeName": runtime_name, + "runtimeVersion": runtime_version, + "targetRef": target_ref, + "platform": platform, + "installState": install_state, + "manifest": manifest, + "artifacts": artifacts, + "rollbackRef": rollback_ref, + "failureReason": failure_reason, + "logMode": log_mode, + "causalRefs": causal_refs or [], + "policyDecisionRef": policy_decision_ref, + "evidenceRefs": evidence_refs, + "startedAt": started_at, + "finishedAt": finished_at, + "capturedAt": captured_at, + } + return receipt + + +def emit_compact_log(receipt: dict[str, Any]) -> str: + """Return a compact one-line log string for operational logs. + + Full manifests and artifact payloads remain in evidence bundles. + """ + receipt_id = receipt.get("id", "") + install_state = receipt.get("installState", "") + evidence_refs = receipt.get("evidenceRefs") or [] + evidence_summary = evidence_refs[0] if evidence_refs else "" + return ( + f"RuntimeInstallReceipt id={receipt_id} state={install_state} evidence[0]={evidence_summary}" + ) + + +def validate_receipt_file(path: Path, root: Path | None = None) -> None: + """Load and validate a RuntimeInstallReceipt JSON file.""" + receipt = load_json(path) + if not isinstance(receipt, dict): + raise AssertionError(f"{path}: root must be a JSON object") + source = str(path) + validate_receipt(receipt, source=source, root=root) + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser(description="Validate or emit RuntimeInstallReceipt records") + subcommands = parser.add_subparsers(dest="command", required=True) + + validate = subcommands.add_parser("validate", help="Validate a RuntimeInstallReceipt JSON file") + validate.add_argument("receipt_json", type=Path) + + return parser.parse_args() + + +def main() -> int: + args = parse_args() + if args.command == "validate": + validate_receipt_file(args.receipt_json) + print(f"VALID RuntimeInstallReceipt {args.receipt_json}") + return 0 + raise AssertionError(f"unsupported command: {args.command}") + + +if __name__ == "__main__": + try: + raise SystemExit(main()) + except (AssertionError, RuntimeError, ValueError) as exc: + print(str(exc), file=sys.stderr) + raise SystemExit(1) from exc From 36b935239fdf2aa3ee22084a438bb2809d893403 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 6 May 2026 19:00:39 +0000 Subject: [PATCH 3/3] Add .gitignore to exclude __pycache__ and build artifacts Agent-Logs-Url: https://github.com/SourceOS-Linux/agent-machine/sessions/8c94ac85-6722-473e-8277-be860a20533e Co-authored-by: mdheller <21163552+mdheller@users.noreply.github.com> --- .gitignore | 6 ++++++ .../__pycache__/__init__.cpython-312.pyc | Bin 419 -> 0 bytes .../__pycache__/activation.cpython-312.pyc | Bin 17867 -> 0 bytes .../__pycache__/cli.cpython-312.pyc | Bin 20248 -> 0 bytes .../__pycache__/contracts.cpython-312.pyc | Bin 6717 -> 0 bytes .../__pycache__/digest.cpython-312.pyc | Bin 1427 -> 0 bytes .../__pycache__/evidence.cpython-312.pyc | Bin 8690 -> 0 bytes .../__pycache__/governance.cpython-312.pyc | Bin 19407 -> 0 bytes .../__pycache__/paths.cpython-312.pyc | Bin 1989 -> 0 bytes .../__pycache__/release_bundle.cpython-312.pyc | Bin 12484 -> 0 bytes .../runtime_install_receipt.cpython-312.pyc | Bin 10530 -> 0 bytes .../__pycache__/supply_chain.cpython-312.pyc | Bin 7082 -> 0 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 221 -> 0 bytes .../renderers/__pycache__/k8s.cpython-312.pyc | Bin 13925 -> 0 bytes .../renderers/__pycache__/plan.cpython-312.pyc | Bin 13651 -> 0 bytes .../__pycache__/quadlet.cpython-312.pyc | Bin 10106 -> 0 bytes 16 files changed, 6 insertions(+) create mode 100644 .gitignore delete mode 100644 src/agent_machine/__pycache__/__init__.cpython-312.pyc delete mode 100644 src/agent_machine/__pycache__/activation.cpython-312.pyc delete mode 100644 src/agent_machine/__pycache__/cli.cpython-312.pyc delete mode 100644 src/agent_machine/__pycache__/contracts.cpython-312.pyc delete mode 100644 src/agent_machine/__pycache__/digest.cpython-312.pyc delete mode 100644 src/agent_machine/__pycache__/evidence.cpython-312.pyc delete mode 100644 src/agent_machine/__pycache__/governance.cpython-312.pyc delete mode 100644 src/agent_machine/__pycache__/paths.cpython-312.pyc delete mode 100644 src/agent_machine/__pycache__/release_bundle.cpython-312.pyc delete mode 100644 src/agent_machine/__pycache__/runtime_install_receipt.cpython-312.pyc delete mode 100644 src/agent_machine/__pycache__/supply_chain.cpython-312.pyc delete mode 100644 src/agent_machine/renderers/__pycache__/__init__.cpython-312.pyc delete mode 100644 src/agent_machine/renderers/__pycache__/k8s.cpython-312.pyc delete mode 100644 src/agent_machine/renderers/__pycache__/plan.cpython-312.pyc delete mode 100644 src/agent_machine/renderers/__pycache__/quadlet.cpython-312.pyc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bdcb471 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +__pycache__/ +*.py[cod] +*.egg-info/ +dist/ +build/ +.eggs/ diff --git a/src/agent_machine/__pycache__/__init__.cpython-312.pyc b/src/agent_machine/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 4ad2056f9b2839c082490e7f5b193c1f109371db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 419 zcmZ8dJx{|h5RKD_mb7JHqMO$aP0Egtm=R1&Sx#wU8moyN`P^3NL^mc@{sR1#{sGh# zen3&TvT#u;NZjCi_wkzQmZ)6D~<&vKF?$> zxTQrSN{!NLQ*ojzg0zYJ-spnoTBGoPr8y=>mKM3yM4MtfB8|f#g-)lrz`$R(0cOG= z$p9>lhrxL;9He4)+i$F!0I5y@YCvZI7?=FMI@{X*?mEnLAwp7A!h~~eCLvi`wkrD08&W{5R}!fb+Nzb(zHms{$D(!XVYMeeYzg=HXWzadki0%ZzsKF+Z@sG E8y=E{OaK4? diff --git a/src/agent_machine/__pycache__/activation.cpython-312.pyc b/src/agent_machine/__pycache__/activation.cpython-312.pyc deleted file mode 100644 index 4ff4f316abedcbede59008c322ff8a6a4cf406e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17867 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 diff --git a/src/agent_machine/__pycache__/cli.cpython-312.pyc b/src/agent_machine/__pycache__/cli.cpython-312.pyc deleted file mode 100644 index 6af25a6c162d173831eab3b5445669363f8377a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20248 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 t)V!XUty5hczja!#LzX9oLCY%5O diff --git a/src/agent_machine/__pycache__/contracts.cpython-312.pyc b/src/agent_machine/__pycache__/contracts.cpython-312.pyc deleted file mode 100644 index 7192d531c4e8dcc2852ff7c74b8b99cafa831ad9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6717 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 diff --git a/src/agent_machine/__pycache__/paths.cpython-312.pyc b/src/agent_machine/__pycache__/paths.cpython-312.pyc deleted file mode 100644 index 4d898c4f039da37638161e9821518d5221de86c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1989 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 diff --git a/src/agent_machine/__pycache__/runtime_install_receipt.cpython-312.pyc b/src/agent_machine/__pycache__/runtime_install_receipt.cpython-312.pyc deleted file mode 100644 index 60084d84f587133fc88a802dcc5b236efaeda308..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10530 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 diff --git a/src/agent_machine/__pycache__/supply_chain.cpython-312.pyc b/src/agent_machine/__pycache__/supply_chain.cpython-312.pyc deleted file mode 100644 index a78d7522b2798d9cc2c6c1f35c8d2ec62f3d4a9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7082 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 GeE%IR&I0uS diff --git a/src/agent_machine/renderers/__pycache__/__init__.cpython-312.pyc b/src/agent_machine/renderers/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 8580974698ffc6dbb64aab9d5b5740741d34afc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 221 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 P=<2*c+kZ(r;Q9Xn)+rJo