build(agent): new-agents#a6e6ec iteration
This commit is contained in:
parent
9606d71df7
commit
067f49dccc
52
AGENTS.md
52
AGENTS.md
|
|
@ -1,40 +1,24 @@
|
|||
# ExProve SWARM Guidelines
|
||||
# ExProve Agent Guidelines
|
||||
|
||||
Architecture overview
|
||||
- Canonical primitives form the Covariant IR for cross-venue execution provenance:
|
||||
- LocalExecutionTask: per-instrument, per-venue planning unit
|
||||
- SharedMarketContext: privacy-safe, versioned market signals
|
||||
Architecture
|
||||
- Core primitives:
|
||||
- LocalExecutionTask: per-instrument, per-venue execution task
|
||||
- SharedMarketContext: versioned market signals across venues
|
||||
- PlanDelta: incremental routing/size/timing decisions with metadata
|
||||
- Attestation/AuditLog: cryptographic attestations and append-only logs
|
||||
- Graph-of-Contracts: adapters and data-contract schemas
|
||||
- Edge-native solver: lightweight optimizer co-located with venue data to produce PlanDelta
|
||||
- Delta-sync with deterministic replay for offline backtesting and regulatory review
|
||||
- Governance ledger: cryptographic signing, policy hooks, optional cloud anchoring
|
||||
- Adapters marketplace: plug-in venue adapters translating venue data into canonical IR
|
||||
- Attestation/AuditLog: cryptographic attestations and an append-only log
|
||||
- Graph-of-Contracts: registry for adapters and data contracts
|
||||
|
||||
MVP plan (8–12 weeks)
|
||||
- Phase 0: Skeleton protocol, 2 starter adapters, toy objective (VWAP-like), deterministic delta-sync
|
||||
- Phase 1: Governance scaffolding, identity management, secure aggregation for SharedMarketContext
|
||||
- Phase 2: Cross-venue demo in simulated env; publish ExProve SDK and minimal contract example
|
||||
- Phase 3: Backtesting harness and deterministic replay; compliance-report generator
|
||||
Development workflow
|
||||
- Use Python as the MVP language for the core primitives.
|
||||
- Tests live under tests/ and are executed via test.sh.
|
||||
- Packaging uses pyproject.toml with a standard build-system block.
|
||||
|
||||
Deliverables
|
||||
- Core data contracts: LocalExecutionTask, SharedMarketContext, PlanDelta, Attestation, AuditLog, Graph-of-Contracts
|
||||
- Toy adapters (2 starters) and conformance harness
|
||||
- Seed DSL for LocalExecutionTask/SharedMarketContext/PlanDelta
|
||||
- Reference ExProve SDK (Python/C++ bindings) and transport layer
|
||||
Validation
|
||||
- Ensure test.sh runs: pytest and python3 -m build (to validate packaging).
|
||||
- Maintain deterministic behavior for replayability in tests where applicable.
|
||||
|
||||
Testing and QA
|
||||
- Lightweight conformance harness and toy adapters (end-to-end replay tests)
|
||||
- Deterministic tests for PlanDelta generation
|
||||
- Audit-ready logs and crypto tagging (signatures stubs for MVP)
|
||||
Contribution
|
||||
- Add small, well-scoped changes. Update tests accordingly.
|
||||
- Document public API in README.md and inline comments where necessary.
|
||||
|
||||
Repository rules
|
||||
- Use Python for core MVP; keep dependencies minimal
|
||||
- Add test.sh that builds and runs tests; ensure python packaging compiles
|
||||
- If you add external dependencies, update pyproject.toml and keep tests deterministic
|
||||
|
||||
Contributing
|
||||
- Follow the existing coding style in this repo; keep changes minimal and well-scoped
|
||||
- Add tests for any bug fixes or new primitives
|
||||
- Update README with usage notes and contributor guidelines
|
||||
This file documents the architectural rules and contribution guidelines for ExProve in this repository.
|
||||
|
|
|
|||
28
README.md
28
README.md
|
|
@ -1,19 +1,17 @@
|
|||
# ExProve: Open-Source Execution Provenance Engine for Cross-Venue Equity Trading
|
||||
# ExProve Open-Source Execution Provenance Engine
|
||||
|
||||
ExProve provides a minimal, production-oriented MVP for verifiable cross-venue execution provenance.
|
||||
ExProve provides cryptographically verifiable provenance primitives for cross-venue execution decisions in equity trading. This repository implements core data contracts and a deterministic planning primitive suitable for testing, backtesting, and regulatory review workflows.
|
||||
|
||||
- Core primitives: LocalExecutionTask, SharedMarketContext, PlanDelta, Attestation, AuditLog, GraphOfContracts
|
||||
- Edge-native planner: deterministic PlanDelta generation for replay and backtesting
|
||||
- Deterministic delta-synchronization for offline replay
|
||||
- Python-based MVP with a small test suite and packaging metadata
|
||||
Key Primitives
|
||||
- LocalExecutionTask: per instrument/venue planning unit
|
||||
- SharedMarketContext: privacy-safe, versioned market signals
|
||||
- PlanDelta: incremental routing/size/timing decisions with metadata
|
||||
- Attestation/AuditLog: cryptographic attestations and an append-only log
|
||||
- GraphOfContracts: registry for adapters and data-contract schemas
|
||||
|
||||
- How to run
|
||||
1. Install dependencies via pyproject.toml (build uses setuptools)
|
||||
2. Run test script: bash test.sh
|
||||
- What’s included
|
||||
- AGENTS.md: SWARM guidelines and MVP plan
|
||||
- src/exprove: core primitives and engine
|
||||
- tests/test_exprove_basic.py: basic unit tests
|
||||
- test.sh: build and test harness
|
||||
How to use
|
||||
- Install dependencies and run tests via the provided test script (test.sh).
|
||||
- The core models are defined under exprove.contracts and can be composed by a solver.
|
||||
|
||||
This README should evolve as the MVP matures and more adapters and backtests are added.
|
||||
Development notes
|
||||
- This repo focuses on a production-ready, minimal core that can be extended to a full edge-native solver and delta-sync pipeline.
|
||||
|
|
|
|||
|
|
@ -0,0 +1,25 @@
|
|||
"""ExProve – Open-Source Execution Provenance Engine (Core Primitives)
|
||||
|
||||
This package provides lightweight, production-oriented data contracts for cross-venue
|
||||
execution provenance. It is intentionally minimal but designed to be easily extended
|
||||
into a full edge-native solver and validator stack.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
from .contracts import (
|
||||
LocalExecutionTask,
|
||||
SharedMarketContext,
|
||||
PlanDelta,
|
||||
Attestation,
|
||||
AuditLog,
|
||||
GraphOfContracts,
|
||||
)
|
||||
|
||||
__all__ = [
|
||||
"LocalExecutionTask",
|
||||
"SharedMarketContext",
|
||||
"PlanDelta",
|
||||
"Attestation",
|
||||
"AuditLog",
|
||||
"GraphOfContracts",
|
||||
]
|
||||
|
|
@ -0,0 +1,95 @@
|
|||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass, asdict
|
||||
from typing import Dict, Any, List
|
||||
|
||||
|
||||
@dataclass
|
||||
class LocalExecutionTask:
|
||||
"""Canonical LocalExecutionTask per instrument/venue planning unit."""
|
||||
task_id: str
|
||||
instrument: str
|
||||
venue: str
|
||||
objective: str
|
||||
constraints: Dict[str, Any]
|
||||
|
||||
def to_dict(self) -> Dict[str, Any]:
|
||||
return asdict(self)
|
||||
|
||||
|
||||
@dataclass
|
||||
class SharedMarketContext:
|
||||
"""Canonical SharedMarketContext with privacy-safe signals."""
|
||||
signals: Dict[str, Any]
|
||||
version: int
|
||||
contract_id: str
|
||||
|
||||
def to_dict(self) -> Dict[str, Any]:
|
||||
return asdict(self)
|
||||
|
||||
|
||||
@dataclass
|
||||
class PlanDelta:
|
||||
"""Incremental routing/size/timing decisions with metadata."""
|
||||
delta: Dict[str, Any]
|
||||
timestamp: float
|
||||
author: str
|
||||
contract_id: str
|
||||
privacy_budget: float
|
||||
|
||||
def to_dict(self) -> Dict[str, Any]:
|
||||
return asdict(self)
|
||||
|
||||
|
||||
@dataclass
|
||||
class Attestation:
|
||||
"""Cryptographic attestation for a delta or event."""
|
||||
entry: str
|
||||
signer: str
|
||||
timestamp: float
|
||||
contract_id: str
|
||||
version: int
|
||||
|
||||
def to_dict(self) -> Dict[str, Any]:
|
||||
return asdict(self)
|
||||
|
||||
|
||||
@dataclass
|
||||
class AuditLog:
|
||||
"""Append-only log of attestations and approvals."""
|
||||
entries: List[Attestation]
|
||||
|
||||
def to_dict(self) -> Dict[str, Any]:
|
||||
return {"entries": [e.to_dict() for e in self.entries]}
|
||||
|
||||
|
||||
@dataclass
|
||||
class GraphOfContracts:
|
||||
"""Registry for adapters and data-contract schemas."""
|
||||
registry: Dict[str, Any]
|
||||
|
||||
def to_dict(self) -> Dict[str, Any]:
|
||||
return {"registry": self.registry}
|
||||
|
||||
|
||||
def compute_delta(task: LocalExecutionTask, ctx: SharedMarketContext) -> PlanDelta:
|
||||
"""Deterministic, minimal PlanDelta from inputs.
|
||||
|
||||
This is intentionally deterministic (timestamp=0.0) for replayability in tests
|
||||
and backtesting scenarios. Real deployments can replace this with a richer solver.
|
||||
"""
|
||||
delta = {
|
||||
"action": "hold",
|
||||
"reason": "base-case",
|
||||
"task_id": task.task_id,
|
||||
"instrument": task.instrument,
|
||||
"venue": task.venue,
|
||||
"constraints_snapshot": task.constraints,
|
||||
}
|
||||
return PlanDelta(
|
||||
delta=delta,
|
||||
timestamp=0.0,
|
||||
author="exprove-solver",
|
||||
contract_id=ctx.contract_id,
|
||||
privacy_budget=0.0,
|
||||
)
|
||||
|
|
@ -0,0 +1 @@
|
|||
# Optional runtime requirements for the ExProve package (empty for MVP)
|
||||
|
|
@ -1,13 +1,22 @@
|
|||
[build-system]
|
||||
requires = ["setuptools>=61.0", "wheel"]
|
||||
requires = ["setuptools>=61.0.0", "wheel"]
|
||||
build-backend = "setuptools.build_meta"
|
||||
|
||||
[project]
|
||||
name = "exprove-core"
|
||||
version = "0.0.1"
|
||||
description = "Open, verifiable execution provenance primitives for cross-venue equity trading"
|
||||
name = "exprove-open-source"
|
||||
version = "0.1.0"
|
||||
description = "Open-source Execution Provenance Engine for cross-venue equity trading (core primitives)"
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.8"
|
||||
license = {text = "MIT"}
|
||||
authors = [ { name = "ExProve Team" } ]
|
||||
dependencies = [
|
||||
"dataclasses; python_version < '3.7'",
|
||||
"typing; python_version < '3.8'",
|
||||
]
|
||||
|
||||
[tool.setuptools.packages.find]
|
||||
where = ["src"]
|
||||
include = ["exprove*"]
|
||||
[project.urls]
|
||||
Homepage = "https://example.org/exprove-open-source"
|
||||
|
||||
[tool.setuptools]
|
||||
packages = ["exprove"]
|
||||
|
|
|
|||
|
|
@ -20,6 +20,10 @@ class LocalExecutionTask:
|
|||
def to_json(self) -> str:
|
||||
return to_json(asdict(self))
|
||||
|
||||
# Backwards-compatibility: tests expect a `to_dict()` method.
|
||||
def to_dict(self) -> Dict[str, Any]:
|
||||
return asdict(self)
|
||||
|
||||
|
||||
@dataclass
|
||||
class SharedMarketContext:
|
||||
|
|
@ -30,6 +34,10 @@ class SharedMarketContext:
|
|||
def to_json(self) -> str:
|
||||
return to_json(asdict(self))
|
||||
|
||||
# Optional: allow dict form if needed by downstream code
|
||||
def to_dict(self) -> Dict[str, Any]:
|
||||
return asdict(self)
|
||||
|
||||
|
||||
@dataclass
|
||||
class PlanDelta:
|
||||
|
|
@ -42,6 +50,19 @@ class PlanDelta:
|
|||
def to_json(self) -> str:
|
||||
return to_json(asdict(self))
|
||||
|
||||
def to_dict(self) -> Dict[str, Any]:
|
||||
return asdict(self)
|
||||
|
||||
|
||||
def compute_delta(task: LocalExecutionTask, ctx: SharedMarketContext) -> PlanDelta:
|
||||
"""Deterministic delta builder for a given task and context.
|
||||
|
||||
For tests, we return a PlanDelta with a fixed timestamp of 0.0 and
|
||||
the contract_id taken from the context. The delta itself is a simple
|
||||
empty dict by default, but kept extensible for future use.
|
||||
"""
|
||||
return PlanDelta(delta={}, timestamp=0.0, author="system", contract_id=ctx.contract_id)
|
||||
|
||||
|
||||
@dataclass
|
||||
class Attestation:
|
||||
|
|
@ -68,9 +89,17 @@ class AuditLog:
|
|||
|
||||
@dataclass
|
||||
class GraphOfContracts:
|
||||
adapters: Dict[str, Any]
|
||||
version: int
|
||||
registry_id: str
|
||||
# Accept both `registry` (preferred by tests) and `adapters` for compatibility
|
||||
registry: Dict[str, Any]
|
||||
version: int = 1
|
||||
adapters: Optional[Dict[str, Any]] = None
|
||||
|
||||
def __post_init__(self):
|
||||
# Normalize to always have both attributes populated consistently
|
||||
if self.adapters is None:
|
||||
self.adapters = self.registry
|
||||
if self.registry is None:
|
||||
self.registry = self.adapters
|
||||
|
||||
def to_json(self) -> str:
|
||||
return to_json(asdict(self))
|
||||
|
|
|
|||
14
test.sh
14
test.sh
|
|
@ -1,11 +1,11 @@
|
|||
#!/bin/bash
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
# Build and test ExProve MVP
|
||||
echo "==> Building package..."
|
||||
python3 -m build
|
||||
|
||||
echo "==> Running tests..."
|
||||
echo "Running tests..."
|
||||
pytest -q
|
||||
|
||||
echo "==> All tests passed."
|
||||
echo "Building package (Python) to validate packaging metadata..."
|
||||
python3 -m build
|
||||
|
||||
echo "All tests and build successful."
|
||||
exit 0
|
||||
|
|
|
|||
|
|
@ -0,0 +1,33 @@
|
|||
import json
|
||||
import pytest
|
||||
|
||||
from exprove.contracts import LocalExecutionTask, SharedMarketContext, PlanDelta, GraphOfContracts
|
||||
|
||||
|
||||
def test_local_execution_task_serialization():
|
||||
task = LocalExecutionTask(
|
||||
task_id="t1",
|
||||
instrument="AAPL",
|
||||
venue="VENUE1",
|
||||
objective="VWAP",
|
||||
constraints={"max_ticks": 5},
|
||||
)
|
||||
|
||||
as_dict = task.to_dict()
|
||||
assert as_dict["task_id"] == "t1"
|
||||
assert as_dict["instrument"] == "AAPL"
|
||||
|
||||
|
||||
def test_shared_market_context_and_plan_delta_roundtrip():
|
||||
ctx = SharedMarketContext(signals={"depth": 10}, version=1, contract_id="c1")
|
||||
# Create a deterministic delta via helper (imported inline for test simplicity)
|
||||
from exprove.contracts import compute_delta
|
||||
delta = compute_delta(LocalExecutionTask("t2", "MSFT", "VENUE2", "VWAP", {}), ctx)
|
||||
assert isinstance(delta, PlanDelta)
|
||||
assert delta.contract_id == "c1"
|
||||
assert delta.timestamp == 0.0
|
||||
|
||||
|
||||
def test_graph_of_contracts_serialization():
|
||||
g = GraphOfContracts(registry={"adapterA": {"version": "1.0"}})
|
||||
assert "adapterA" in g.registry
|
||||
Loading…
Reference in New Issue