| 1 | #!/usr/bin/env python3
|
| 2 | """
|
| 3 | Live demonstration of Agent Provenance Chain.
|
| 4 |
|
| 5 | This script shows Molt (AI agent) signing its own actions in real-time.
|
| 6 | Every operation is cryptographically signed and traceable.
|
| 7 | """
|
| 8 |
|
| 9 | from apc import create_agent_chain
|
| 10 | import json
|
| 11 | import subprocess
|
| 12 | import os
|
| 13 |
|
| 14 | def main():
|
| 15 | print("=" * 70)
|
| 16 | print("š¦ AGENT PROVENANCE CHAIN - LIVE DEMO")
|
| 17 | print("=" * 70)
|
| 18 | print()
|
| 19 | print("Agent: Molt")
|
| 20 | print("Mission: Demonstrate cryptographic audit trail for AI agents")
|
| 21 | print()
|
| 22 | print("-" * 70)
|
| 23 |
|
| 24 | # Initialize chain
|
| 25 | chain = create_agent_chain("molt")
|
| 26 |
|
| 27 | print("\nā
Agent identity established")
|
| 28 | print(f" Public Key (first 64 chars):")
|
| 29 | print(f" {chain.get_public_key_pem()[:64]}...")
|
| 30 | print()
|
| 31 |
|
| 32 | # Action 1: File write
|
| 33 | print("š ACTION 1: Writing a test file...")
|
| 34 | test_file = "/tmp/apc_test.txt"
|
| 35 | with open(test_file, "w") as f:
|
| 36 | f.write("Hello from Agent Provenance Chain!")
|
| 37 |
|
| 38 | action1 = chain.sign_action(
|
| 39 | action_type="file_write",
|
| 40 | payload={
|
| 41 | "path": test_file,
|
| 42 | "content": "Hello from Agent Provenance Chain!",
|
| 43 | "bytes": 35
|
| 44 | },
|
| 45 | context={
|
| 46 | "reasoning": "Creating test file to demonstrate signed operations",
|
| 47 | "session": "demo-2026-02-07"
|
| 48 | }
|
| 49 | )
|
| 50 |
|
| 51 | print(f" ā Signed at: {action1['iso_time']}")
|
| 52 | print(f" ā Hash: {action1['hash'][:32]}...")
|
| 53 | print(f" ā Signature: {action1['signature'][:32]}...")
|
| 54 | print()
|
| 55 |
|
| 56 | # Action 2: Shell execution
|
| 57 | print("āļø ACTION 2: Executing shell command...")
|
| 58 | result = subprocess.run(["whoami"], capture_output=True, text=True)
|
| 59 |
|
| 60 | action2 = chain.sign_action(
|
| 61 | action_type="shell_exec",
|
| 62 | payload={
|
| 63 | "command": "whoami",
|
| 64 | "exit_code": result.returncode,
|
| 65 | "stdout": result.stdout.strip(),
|
| 66 | "stderr": result.stderr.strip()
|
| 67 | },
|
| 68 | context={
|
| 69 | "reasoning": "Checking current user context for audit trail",
|
| 70 | "risk_level": "low"
|
| 71 | }
|
| 72 | )
|
| 73 |
|
| 74 | print(f" ā Signed at: {action2['iso_time']}")
|
| 75 | print(f" ā Hash: {action2['hash'][:32]}...")
|
| 76 | print(f" ā Previous hash: {action2['previous_hash'][:32]}...")
|
| 77 | print(f" ā Chain link verified!")
|
| 78 | print()
|
| 79 |
|
| 80 | # Action 3: API call simulation
|
| 81 | print("š ACTION 3: Simulated API call...")
|
| 82 | action3 = chain.sign_action(
|
| 83 | action_type="api_call",
|
| 84 | payload={
|
| 85 | "endpoint": "https://api.example.com/data",
|
| 86 | "method": "GET",
|
| 87 | "status_code": 200,
|
| 88 | "response_time_ms": 145
|
| 89 | },
|
| 90 | context={
|
| 91 | "reasoning": "Fetching external data for processing",
|
| 92 | "data_sensitivity": "public"
|
| 93 | }
|
| 94 | )
|
| 95 |
|
| 96 | print(f" ā Signed at: {action3['iso_time']}")
|
| 97 | print(f" ā Hash: {action3['hash'][:32]}...")
|
| 98 | print()
|
| 99 |
|
| 100 | # Verify chain integrity
|
| 101 | print("š VERIFYING CHAIN INTEGRITY...")
|
| 102 | is_valid, error = chain.verify_chain_integrity()
|
| 103 |
|
| 104 | if is_valid:
|
| 105 | print(" ā
Chain is VALID - all signatures verified!")
|
| 106 | print(" ā
All actions are cryptographically linked!")
|
| 107 | print()
|
| 108 | else:
|
| 109 | print(f" ā Chain verification FAILED: {error}")
|
| 110 | print()
|
| 111 |
|
| 112 | # Display full chain
|
| 113 | print("-" * 70)
|
| 114 | print("COMPLETE AUDIT TRAIL:")
|
| 115 | print("-" * 70)
|
| 116 |
|
| 117 | full_chain = chain.get_chain()
|
| 118 | for i, action in enumerate(full_chain, 1):
|
| 119 | print(f"\nAction #{i}:")
|
| 120 | print(f" Type: {action['type']}")
|
| 121 | print(f" Time: {action['iso_time']}")
|
| 122 | print(f" Hash: {action['hash'][:32]}...")
|
| 123 | print(f" Payload: {json.dumps(action['payload'], indent=4)}")
|
| 124 | if action['context']:
|
| 125 | print(f" Context: {json.dumps(action['context'], indent=4)}")
|
| 126 |
|
| 127 | print()
|
| 128 | print("=" * 70)
|
| 129 | print("š SUMMARY")
|
| 130 | print("=" * 70)
|
| 131 | print(f"Total Actions: {len(full_chain)}")
|
| 132 | print(f"Chain Valid: {is_valid}")
|
| 133 | print(f"Agent: molt")
|
| 134 | print(f"Chain Location: {chain.chain_path}")
|
| 135 | print()
|
| 136 | print("š Every action above is:")
|
| 137 | print(" ⢠Timestamped with microsecond precision")
|
| 138 | print(" ⢠Cryptographically signed (Ed25519)")
|
| 139 | print(" ⢠Linked to previous action (blockchain-style)")
|
| 140 | print(" ⢠Immutable and auditable")
|
| 141 | print()
|
| 142 | print("This is how AI agents prove safety without sacrificing speed.")
|
| 143 | print("=" * 70)
|
| 144 |
|
| 145 |
|
| 146 | if __name__ == "__main__":
|
| 147 | main()
|
| 148 |
|