This release has been yanked by its maintainers, and will be ignored by installers, except when explicitly specified.
LockStock Python SDK
The TCP/IP of AI Agency
Cryptographic identity and memory continuity for autonomous AI agents.
What is LockStock?
LockStock provides three critical capabilities for AI agents:
- The Lock (Security): Cryptographic identity verification - agents can't be impersonated
- The Stock (Memory): Portable state - agents never forget, even across server migrations
- The Two Smoking Barrels (Proof): Unforgeable audit trail - prove what happened, when, in order
Installation
pip install lockstock
Quick Start
1. Bootstrap a New Agent
from lockstock import LockStockAgent, Task
# Create agent
agent = LockStockAgent(
server_url="https://lockstock.example.com",
client_id="trading-bot-42",
secret="your-agent-secret-key"
)
# Bootstrap (first time only)
agent.bootstrap()
# Agent is now ready with cryptographic identity
2. Perform Actions
# Authenticate each action
response = agent.authenticate(Task.QUERY)
if response.accepted:
print(f"✅ Authenticated at sequence #{agent.passport.last_sequence}")
print(f"State hash: {response.state_hash}")
print(f"Server timestamp: {response.server_timestamp}")
3. Agent Teleportation (Zero-Downtime Migration)
import json
# On Server A: Export passport
passport = agent.export_passport()
with open("passport.json", "w") as f:
json.dump(passport, f)
# Upload to S3, Redis, database, anywhere...
# On Server B: Import passport
with open("passport.json", "r") as f:
passport = json.load(f)
agent = LockStockAgent.from_passport(
passport=passport,
server_url="https://new-server.example.com",
secret="your-agent-secret-key"
)
# Agent continues from EXACTLY where it left off
# Zero memory loss. Zero downtime.
4. View Action History (The Golden Thread)
# Get complete audit trail
timeline = agent.get_action_timeline()
for action in timeline:
print(action)
# Output:
# Seq #1: BOOTSTRAP (hash: a3f4b2e1...)
# Seq #2: QUERY (hash: b2e1c9d7...)
# Seq #3: EXECUTE (hash: c9d7a4f8...)
Use Cases
Multi-Cloud Migration
# AWS
passport = agent.export_passport()
upload_to_s3("my-bucket", "agent-passport.json", passport)
# Agent crashes on AWS
# Azure
passport = download_from_s3("my-bucket", "agent-passport.json")
agent = LockStockAgent.from_passport(passport, server_url="azure-endpoint", secret=secret)
# Agent resumes at exactly the same sequence number
# No memory loss. Cryptographic proof of continuity.
Hot Standby (High Availability)
# Primary agent (active)
while True:
passport = primary_agent.export_passport()
redis.set("agent-42-passport", json.dumps(passport))
primary_agent.authenticate(Task.QUERY)
time.sleep(1)
# Standby agent (passive, different server)
while True:
if not is_primary_alive():
# Take over instantly
passport_data = redis.get("agent-42-passport")
passport = json.loads(passport_data)
standby_agent = LockStockAgent.from_passport(passport, server_url, secret)
standby_agent.authenticate(Task.EXECUTE)
break
time.sleep(1)
LangChain Integration
from langchain.agents import AgentExecutor
from lockstock import LockStockAgent, Task
# Wrap your LangChain agent with LockStock
lockstock_agent = LockStockAgent(
server_url="https://lockstock.example.com",
client_id="research-agent",
secret="agent-secret"
)
lockstock_agent.bootstrap()
# Your LangChain agent now has:
# - Cryptographic identity
# - Persistent memory across restarts
# - Clone detection
# - Audit trail
executor = AgentExecutor(agent=your_agent, tools=tools)
# Before each action, authenticate
lockstock_agent.authenticate(Task.QUERY)
result = executor.invoke({"input": "Research AAPL stock"})
# Export passport for crash recovery
passport = lockstock_agent.export_passport()
save_passport(passport)
Error Handling
from lockstock.exceptions import (
CircuitBreakerError,
SplitBrainError,
MemoryGapError,
AuthenticationError,
)
try:
response = agent.authenticate(Task.EXECUTE)
except CircuitBreakerError as e:
# Agent is making requests too fast (rogue behavior detected)
print(f"🚨 LOCKED: {e}")
# Alert security team, investigate
except SplitBrainError as e:
# Two instances detected (clone attack)
print(f"🧠 CLONE DETECTED: {e}")
# Emergency shutdown
except MemoryGapError as e:
# Agent has a gap in sequence (data corruption)
print(f"⚠️ MEMORY GAP: {e}")
# Restore from backup
except AuthenticationError as e:
# Invalid signature or unauthorized task
print(f"❌ AUTH FAILED: {e}")
Features
Identity = The Sum of History
Traditional auth: "I have the API key" ✅ Authenticated
LockStock: "I have the API key + cryptographic proof of my entire action history" ✅ Authenticated + Verified
Clone Detection (Split Brain Prevention)
If an attacker clones your agent:
Server: ✅ Primary agent authenticated at Seq #50
Server: ❌ Clone rejected - parent hash #49 already spent
"Split brain detected. Original agent alerted."
Velocity Monitoring
Built-in circuit breaker detects rogue agents:
# Normal behavior: 1 req/sec
agent.authenticate(Task.QUERY) # ✅ Accepted
# Rogue behavior: 100 req/sec (infinite loop)
for i in range(100):
agent.authenticate(Task.EXECUTE) # ❌ Circuit breaker trips
# CircuitBreakerError raised
# Agent locked. Security team alerted.
API Reference
LockStockAgent
Constructor:
agent = LockStockAgent(
server_url: str,
client_id: str,
secret: str,
passport: Optional[AgentPassport] = None
)
Methods:
bootstrap()- Initialize new agent identityauthenticate(task: Task) -> VerifyResponse- Authenticate actionexport_passport() -> dict- Export for migrationget_action_timeline() -> List[str]- View historyget_status() -> dict- Get agent status
Class Methods:
from_passport(passport, server_url, secret) -> LockStockAgent- Resume from passport
Task (Enum)
Available task types:
Task.BOOTSTRAPTask.DEPLOYTask.RESTARTTask.BACKUPTask.UPDATETask.QUERYTask.EXECUTE
AgentPassport
The agent's cryptographic "soul":
@dataclass
class AgentPassport:
agent_id: str
last_sequence: int
last_hash: str
state_matrix: Matrix
last_server_timestamp: int
action_history: List[ActionRecord]
Architecture
LockStock uses:
- Braid Group B₃ over finite field F₆₅₅₃₇ for topological state verification
- HMAC-SHA256 for signature verification
- Holder-of-Key authentication (must have full state matrix)
- Dual-Timestamp Architecture (logical sequence + physical server timestamp)
- DAG-based Linear Chain with parent hash validation
Comparison
| Feature | Session IDs | JWT | LockStock |
|---|---|---|---|
| Continuity | ❌ None | ❌ Just identity | ✅ Full history |
| Clone Detection | ❌ No | ❌ No | ✅ Yes |
| Portability | ❌ Lost on restart | ❌ Not designed for it | ✅ Export/import |
| Time Dependency | ✅ No | ❌ Yes (exp claim) | ✅ No |
| Memory | ❌ External DB | ❌ Stateless | ✅ Cryptographic |
Support
- Documentation: https://docs.lockstock.dev
- Issues: https://github.com/lockstock/lockstock/issues
- Community: https://discord.gg/lockstock
License
MIT License - see LICENSE file for details.
Built with LockStock. The whole nine yards. 🔒📦💨
Metadata
Release files for lockstock 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| lockstock-0.1.0.tar.gz | 16.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| lockstock-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 30.3 kB
Release files / lockstock-0.1.0.tar.gz
| Download URL | lockstock-0.1.0.tar.gz |
|---|---|
| Size | 16.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b670078276dc212d2eb68006a5a126f19efb3f81d7ab2ea5a40955e9a4bb7e2a
|
|
BLAKE2b-256 checksum How to use checksums |
b845b8f13a5af5f125abd345f7cb7812f49301ceb6ccfd0f14954e9e5266f74a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.5
|
Release files / lockstock-0.1.0-py3-none-any.whl
| Download URL | lockstock-0.1.0-py3-none-any.whl |
|---|---|
| Size | 14.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
36aed9435a2c7ae9a65ad496a122eabb758873392e5d38349396ec5752403643
|
|
BLAKE2b-256 checksum How to use checksums |
d07a11f87b77f039cdfa3e36d44bb739e680a4ae7712954e2651d896af6c323c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.5
|