* feat: configurable judge rules with dedicated admin tab Externalize heuristic intent validation rules and output guard patterns from hard-coded module constants into the storage abstraction with full admin UI CRUD. Introduces a dedicated Judge tab in the admin panel that consolidates all judge configuration (scalar settings, heuristic rules, output guard patterns) under a single admin.judge permission scope. - Add heuristic_rules and output_guard_patterns tables (migration 033) - Add RuleRegistry with thread-safe merge of built-in + DB rules - Refactor output_guard.py patterns into structured OutputGuardPatternDef - evaluate_heuristic() and evaluate_output() accept optional rules/patterns - IntentJudge resolves model aliases via ModelRegistry - 15 admin API endpoints under /api/admin/judge/ with regex validation - Judge tab with Settings, Heuristic Rules, and Output Guard sub-panels - Filter judge.* settings from generic Settings tab - ConfigStore.storage public property for backend access * fix: align Judge tab with admin panel design system - Replace raw <table> with grid-based admin-row/admin-colheaders pattern - Replace dynamic innerHTML modals with static overlays using focus traps - Replace confirm() with styled showConfirmModal() - Replace inline badge styles with scope-badge classes - Add mobile responsive breakpoints for Judge tab grids * fix: Judge tab accessibility and polish - Extract sub-section switcher inline styles to CSS classes - Add focus-visible outline and reduced-motion support - Add tab button IDs and fix aria-labelledby on tabpanels - Add tabindex roving and arrow key navigation for sub-tabs - Add role=list and aria-live to table containers - Replace status text with scope-badge classes for scannability * fix: address CodeQL and Copilot review feedback - Remove unused validation constants from rule_registry.py (CodeQL) - Return MappingProxyType from output_patterns for immutability - Fix ThreadPoolExecutor shutdown(wait=False) to prevent hangs - Use separate _VALID_OG_RISK_LEVELS (no "critical") for output guard - Pass pattern_flags to regex validation in update endpoint - Chain redactions in configurable mode (compose pattern + complex) - Initialize RuleRegistry on console app.state - Fix test fixtures to use valid enum values (approve/review/deny) * fix: use Mapping type for evaluate_output patterns param (mypy)
Turnstone
Multi-node AI orchestration platform. Deploy tool-using AI agents across a cluster of servers with direct HTTP routing, interactive interfaces, and enterprise governance.
Named after the Ruddy Turnstone (Arenaria interpres) — a shorebird that flips stones to discover what's hiding underneath.
Release Tracks
| Track | Install | Docker | Description |
|---|---|---|---|
| Stable | pip install turnstone |
ghcr.io/turnstonelabs/turnstone:stable |
Production-grade. Bugfixes only. |
| Experimental | pip install turnstone --pre |
ghcr.io/turnstonelabs/turnstone:experimental |
New features. May have rough edges. |
See docs/releasing.md for the full release process.
What it does
Turnstone gives LLMs tools — shell, files, search, web, planning — and orchestrates multi-turn conversations where the model investigates, acts, and reports.
- Interactive sessions — terminal CLI or browser UI with parallel workstreams
- Cluster dashboard — real-time view of all nodes and workstreams with console routing proxy
- Intent validation — LLM judge evaluates every tool call with risk assessments and evidence
- Governance — RBAC, OIDC SSO, tool policies, skills, usage tracking, audit logs
- Multi-provider — OpenAI-compatible APIs (vLLM, llama.cpp, NIM) and Anthropic Messages API
- MCP support — external tool servers with native deferred loading (Anthropic/OpenAI) or BM25 fallback
Quickstart
pip install turnstone
# Terminal REPL
turnstone --base-url http://localhost:8000/v1
# Browser UI
turnstone-server --port 8080 --base-url http://localhost:8000/v1
# Cluster dashboard
pip install turnstone[console]
turnstone-console --port 8090
Docker
cp .env.example .env # edit LLM_BASE_URL, OPENAI_API_KEY, etc.
docker compose --profile production up
See QUICKSTART.md for the bootstrap wizard and docs/docker.md for Docker configuration and profiles.
Programmatic (SDK)
from turnstone.sdk import TurnstoneServer
with TurnstoneServer("http://localhost:8080", token="tok_xxx") as client:
ws = client.create_workstream(name="demo")
result = client.send_and_wait("Analyze the error logs", ws.ws_id, auto_approve=True)
print(result.content)
Tools
Built-in tools for shell, files, search, web, memory, notifications, and autonomous sub-agents — plus external tools via MCP with native deferred loading. See docs/tools.md for the full reference and docs/mcp.md for MCP configuration.
Architecture
Single-node: Client → Server (direct HTTP + SSE). No external dependencies beyond the database.
Multi-node: Client → Console (hash ring routing proxy) → Server nodes. The console maintains a 65536-entry bucket cache for O(1) workstream routing. A rebalancer daemon redistributes buckets when nodes join or leave.
| Component | Purpose |
|---|---|
turnstone |
Terminal CLI (REPL) |
turnstone-server |
Web UI + REST API + SSE events |
turnstone-console |
Cluster dashboard + routing proxy + admin panel |
turnstone-channel |
Channel gateway (Discord, with adapters for Slack/Teams planned) |
turnstone-admin |
User/token management CLI |
turnstone-eval |
Eval harness for prompt/tool optimization |
turnstone-bootstrap |
LLM-guided setup wizard |
Diagrams
UML diagrams in docs/diagrams/:
| Diagram | Description |
|---|---|
| System Context | Components and external dependencies |
| Package Structure | Python modules and dependency graph |
| Core Engine | SessionUI, ChatSession, LLMProvider |
| Conversation Turn | Message lifecycle through the engine |
| Tool Pipeline | Prepare / approve / execute |
| Workstream States | State machine transitions |
| Console Data Flow | Dashboard data collection |
| Deployment | Docker Compose topology |
| Auth | JWT, scopes, login flows |
| Channels | Discord adapter + routing |
| Judge | Intent validation pipeline |
| OIDC | SSO authorization code flow |
Documentation
| Topic | Link |
|---|---|
| Configuration reference | docs/settings.md |
| API reference | docs/api-reference.md |
| Docker deployment | docs/docker.md |
| Intent validation (judge) | docs/judge.md |
| Governance & RBAC | docs/governance.md |
| OIDC SSO | docs/oidc.md |
| TLS / mTLS | docs/tls.md |
| Channel integrations | docs/channels.md |
| Console dashboard | docs/console.md |
| Eval harness | docs/eval.md |
| Tools reference | docs/tools.md |
| MCP integration | docs/mcp.md |
Requirements
- Python 3.11+
- An OpenAI-compatible API endpoint or Anthropic API key
- Optional: PostgreSQL (
pip install turnstone[postgres]), Anthropic (pip install turnstone[anthropic]) - Git LFS for cloning (diagram PNGs)
License
Business Source License 1.1 — free for all use except hosting as a managed service. Converts to Apache 2.0 on 2030-03-01.
