build(agent): new-agents#a6e6ec iteration
This commit is contained in:
parent
796cc6b1b1
commit
9606d71df7
|
|
@ -0,0 +1,21 @@
|
|||
node_modules/
|
||||
.npmrc
|
||||
.env
|
||||
.env.*
|
||||
__tests__/
|
||||
coverage/
|
||||
.nyc_output/
|
||||
dist/
|
||||
build/
|
||||
.cache/
|
||||
*.log
|
||||
.DS_Store
|
||||
tmp/
|
||||
.tmp/
|
||||
__pycache__/
|
||||
*.pyc
|
||||
.venv/
|
||||
venv/
|
||||
*.egg-info/
|
||||
.pytest_cache/
|
||||
READY_TO_PUBLISH
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
# ExProve SWARM 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
|
||||
- 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
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
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)
|
||||
|
||||
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
|
||||
20
README.md
20
README.md
|
|
@ -1,3 +1,19 @@
|
|||
# idea160-exprove-open-source
|
||||
# ExProve: Open-Source Execution Provenance Engine for Cross-Venue Equity Trading
|
||||
|
||||
Source logic for Idea #160
|
||||
ExProve provides a minimal, production-oriented MVP for verifiable cross-venue execution provenance.
|
||||
|
||||
- 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
|
||||
|
||||
- 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
|
||||
|
||||
This README should evolve as the MVP matures and more adapters and backtests are added.
|
||||
|
|
|
|||
|
|
@ -0,0 +1,13 @@
|
|||
[build-system]
|
||||
requires = ["setuptools>=61.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"
|
||||
requires-python = ">=3.8"
|
||||
|
||||
[tool.setuptools.packages.find]
|
||||
where = ["src"]
|
||||
include = ["exprove*"]
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
"""ExProve core primitives package.
|
||||
|
||||
This minimal MVP provides:
|
||||
- LocalExecutionTask
|
||||
- SharedMarketContext
|
||||
- PlanDelta
|
||||
- Attestation
|
||||
- AuditLog
|
||||
- GraphOfContracts
|
||||
"""
|
||||
from .contracts import LocalExecutionTask, SharedMarketContext, PlanDelta, Attestation, AuditLog, GraphOfContracts
|
||||
|
||||
__all__ = [
|
||||
"LocalExecutionTask",
|
||||
"SharedMarketContext",
|
||||
"PlanDelta",
|
||||
"Attestation",
|
||||
"AuditLog",
|
||||
"GraphOfContracts",
|
||||
]
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
from dataclasses import dataclass, asdict, field
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
|
||||
def to_json(obj: Any) -> str:
|
||||
return json.dumps(obj, default=lambda o: o.__dict__, sort_keys=True)
|
||||
|
||||
|
||||
@dataclass
|
||||
class LocalExecutionTask:
|
||||
task_id: str
|
||||
instrument: str
|
||||
venue: str
|
||||
objective: str
|
||||
constraints: Dict[str, Any] = field(default_factory=dict)
|
||||
|
||||
def to_json(self) -> str:
|
||||
return to_json(asdict(self))
|
||||
|
||||
|
||||
@dataclass
|
||||
class SharedMarketContext:
|
||||
signals: Dict[str, Any]
|
||||
version: int
|
||||
contract_id: str
|
||||
|
||||
def to_json(self) -> str:
|
||||
return to_json(asdict(self))
|
||||
|
||||
|
||||
@dataclass
|
||||
class PlanDelta:
|
||||
delta: Dict[str, Any]
|
||||
timestamp: float
|
||||
author: str
|
||||
contract_id: str
|
||||
privacy_budget: Optional[float] = None
|
||||
|
||||
def to_json(self) -> str:
|
||||
return to_json(asdict(self))
|
||||
|
||||
|
||||
@dataclass
|
||||
class Attestation:
|
||||
entry: str
|
||||
signer: str
|
||||
timestamp: float
|
||||
contract_id: str
|
||||
version: int
|
||||
|
||||
def to_json(self) -> str:
|
||||
return to_json(asdict(self))
|
||||
|
||||
|
||||
@dataclass
|
||||
class AuditLog:
|
||||
entries: List[Attestation] = field(default_factory=list)
|
||||
|
||||
def add(self, at: Attestation) -> None:
|
||||
self.entries.append(at)
|
||||
|
||||
def to_json(self) -> str:
|
||||
return to_json([asdict(e) for e in self.entries])
|
||||
|
||||
|
||||
@dataclass
|
||||
class GraphOfContracts:
|
||||
adapters: Dict[str, Any]
|
||||
version: int
|
||||
registry_id: str
|
||||
|
||||
def to_json(self) -> str:
|
||||
return to_json(asdict(self))
|
||||
|
|
@ -0,0 +1,58 @@
|
|||
"""A tiny, deterministic edge-native planner placeholder.
|
||||
|
||||
Given a LocalExecutionTask and SharedMarketContext, produce a PlanDelta
|
||||
deterministically using a stable hash seed. This is intentionally minimal
|
||||
but deterministic to support replay in backtesting.
|
||||
"""
|
||||
|
||||
import hashlib
|
||||
import time
|
||||
from typing import Any, Dict
|
||||
|
||||
from .contracts import LocalExecutionTask, SharedMarketContext, PlanDelta
|
||||
|
||||
|
||||
def _deterministic_delta(task: LocalExecutionTask, ctx: SharedMarketContext) -> Dict[str, Any]:
|
||||
seed_input = f"{task.task_id}:{task.instrument}:{task.venue}:{ctx.version}:{ctx.contract_id}"
|
||||
h = hashlib.sha256(seed_input.encode("utf-8")).hexdigest()
|
||||
# Deterministic small delta: a suggested route and a size adjustment heuristic
|
||||
delta = {
|
||||
"route": [task.venue], # naive: route to the requested venue
|
||||
"size_adjustment": int(h[:6], 16) % 1000, # some deterministic sizing tweak
|
||||
# Deterministic replay: timestamp set to a fixed value for determinism
|
||||
"timestamp": 0.0,
|
||||
"hash_seed": h,
|
||||
}
|
||||
return delta
|
||||
|
||||
|
||||
def compute_plan_delta(task: LocalExecutionTask, ctx: SharedMarketContext, *, author: str) -> PlanDelta:
|
||||
delta = _deterministic_delta(task, ctx)
|
||||
return PlanDelta(
|
||||
delta=delta,
|
||||
timestamp=0.0,
|
||||
author=author,
|
||||
contract_id=ctx.contract_id,
|
||||
privacy_budget=None,
|
||||
)
|
||||
|
||||
|
||||
def main():
|
||||
# Simple CLI-friendly demonstration (not imported by tests)
|
||||
import json
|
||||
|
||||
# Example wiring; in real usage this would be from inputs
|
||||
task = LocalExecutionTask(
|
||||
task_id="demo-001",
|
||||
instrument="AAPL",
|
||||
venue="VenueA",
|
||||
objective="VWAP-tracking",
|
||||
constraints={"latency_ms": 50},
|
||||
)
|
||||
ctx = SharedMarketContext(signals={"depth": 5}, version=1, contract_id="contract-1")
|
||||
delta = compute_plan_delta(task, ctx, author="engine")
|
||||
print(delta.to_json())
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
# Build and test ExProve MVP
|
||||
echo "==> Building package..."
|
||||
python3 -m build
|
||||
|
||||
echo "==> Running tests..."
|
||||
pytest -q
|
||||
|
||||
echo "==> All tests passed."
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
import json
|
||||
import sys
|
||||
import os
|
||||
|
||||
# Ensure the src/ directory is on PYTHONPATH for tests when running from repo root
|
||||
repo_root = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
|
||||
src_dir = os.path.join(repo_root, "src")
|
||||
if src_dir not in sys.path:
|
||||
sys.path.insert(0, src_dir)
|
||||
|
||||
from exprove import LocalExecutionTask, SharedMarketContext, PlanDelta
|
||||
from exprove.engine import compute_plan_delta
|
||||
|
||||
|
||||
def test_local_execution_task_serialization():
|
||||
t = LocalExecutionTask(
|
||||
task_id="t1",
|
||||
instrument="GOOG",
|
||||
venue="VenueX",
|
||||
objective="VWAP",
|
||||
constraints={"latency": 10},
|
||||
)
|
||||
s = t.to_json()
|
||||
assert isinstance(s, str)
|
||||
d = json.loads(s)
|
||||
assert d["task_id"] == "t1"
|
||||
assert d["instrument"] == "GOOG"
|
||||
|
||||
|
||||
def test_engine_deterministic_delta():
|
||||
task = LocalExecutionTask(
|
||||
task_id="t2",
|
||||
instrument="MSFT",
|
||||
venue="VenueY",
|
||||
objective="VWAP",
|
||||
constraints={"latency": 5},
|
||||
)
|
||||
ctx = SharedMarketContext(signals={"depth": 10}, version=2, contract_id="c-2")
|
||||
delta1 = compute_plan_delta(task, ctx, author="engine")
|
||||
delta2 = compute_plan_delta(task, ctx, author="engine")
|
||||
assert delta1.delta == delta2.delta
|
||||
assert delta1.timestamp <= delta2.timestamp # non-decreasing timestamp on re-run is fine
|
||||
|
||||
|
||||
def test_attestation_and_auditlog_serialization():
|
||||
from exprove.contracts import Attestation, AuditLog
|
||||
a = Attestation(entry="delta committed", signer="issuer", timestamp=1.0, contract_id="c-3", version=1)
|
||||
log = AuditLog()
|
||||
log.add(a)
|
||||
j = log.to_json()
|
||||
assert isinstance(j, str)
|
||||
Loading…
Reference in New Issue