Docker
Three services, orchestrated with Docker Compose:
All three have health checks and a defined restart policy, and share persistent
evidence storage (the corpus directory holding captured feed data, the ledger, anchor
evidence, and policy snapshots).
Environment variables
Monitoring & observability
- Metrics —
GET /metricsin Prometheus exposition format: stream failures, source-proof failures/pending/verified, SSE client count, and two real latency histograms (tissue_proof_verification_latency_ms,tissue_decision_loop_latency_ms) - Health —
GET /health(liveness) andGET /ready(readiness — requires at least one verified proof and zero recent failures) - Logs — structured JSON events (
tissue.source_proof_failed,tissue.proof_circuit_halt,tissue.checkpoint_anchor_failed, etc.), bounded and rotated in the container runtime
Security & safety practices
- Source proofs are fail-closed: a message that can’t be verified is never admitted, never quoted around
- Drawdown kill and the proof-failure-rate circuit breaker are operator-restart-only — neither latch auto-resumes
- Persisted local receipts are never treated as source authority; recovery always reverifies against the live TxLINE proof endpoints
- No transaction-signing tool exists anywhere in the analyst layer
- Manual private release artifacts include BuildKit provenance, SBOM attestations, and SHA-256 checksums; the release workflow is read-only and cannot itself publish or deploy
Testing & verification
pnpm run ci (dependency audit, lint, typecheck, the full default test suite, build,
compiled-runtime verification, and a determinism-checked replay) runs on every build and
covers 322 tests across the daemon, dashboard, and analyst — including adversarial and
malformed-input suites that run by default, not as an opt-in extra:
- Malformed/adversarial TxLINE input (
apps/daemon/src/ingest/ingest.test.ts,apps/daemon/src/exec/exec.test.ts) — deliberately corrupted feed payloads (non-numeric timestamps, negative/huge scores, NaN-producing odds prices, tampered proof responses) asserting the ingest pipeline fails closed rather than silently accepting garbage. - Adversarial analyst input (
apps/analyst/src/adversarial.test.ts) — prompt injection, spoofed tool names, malformed MCP arguments, and “terrible user prompts” driven through the real MCP client/server pair and the real agent loop, asserting no path can ever reach a write/execute action (none exists) regardless of what a compromised model attempts.
1
Local Solana anchoring tests (Surfpool)
2
Dashboard E2E (Playwright)
3
Real process-level chaos drills
drill:restart SIGKILLs it mid-stream and asserts the persisted hash
chain survives a hard crash. drill:streamdrop severs the SSE connections without
killing the process and asserts the daemon detects the drop and reconnects — a
distinct fault class, requiring only real credentials, not a message that manages to
pass TxLINE’s live proof verification.Real, honest limitation: replaying an old captured corpus against TxLINE’s real proof
endpoints during a restart drill doesn’t reliably produce successful admissions —
TxLINE’s proof service isn’t guaranteed to serve proofs for historical/replayed
messages. This blocks a live SIGKILL-during-anchor-submission scenario specifically,
which is why
drill:streamdrop exists as an independently valid fault class that
doesn’t depend on any message passing proof verification. See Feedback &
Roadmap for the full finding.