v1.8.0
🧭 v1.8.0 — the C³ release
Context · Continuity · Control
Turnstone 1.8 is built for workstreams expected to keep going: through long
contexts, reconnects, provider failures, compaction, restarts, and enterprise
identity boundaries. The easy first turn was never the hard part. Three C's
carry this release.
This note covers the change from 1.7.4 to 1.8.0; features already shipped
on the 1.7 line are not repeated here.
🧠 Context — stable, visible, and bounded
- Immutable memory-index snapshots capture the memory metadata visible to
the acting user and project at the first real model call. The index stays
cache-stable for the workstream, while memory bodies remain behind an
explicitmemory_getand every project, persona, approval, and principal
boundary is enforced. (#902) - Compaction is now a first-class lifecycle event. Manual and automatic
compaction render durable progress/result cards, preserve their token delta
through reload, serialize concurrent sends safely, and remain cancellable. - Task-agent context meters show normalized used/total context, warn at
80%, recover across reconnects, and clear on terminal paths. The Python and
TypeScript SDKs expose the typedagent_contextevent. (#982) - Sampling settings now inherit from the configured backend instead of
manufacturingtemperature=0.5andreasoning_effort="medium"defaults.
🔄 Continuity — one path through the hard edges
Every model call now travels through one turn and streaming transport pipeline:
interactive work, judges, titles, compaction, perception, extraction, evals,
optimizers, and task agents all share provider-native replay, lowering,
re-ingest, cancellation, and retry behavior. (#827, #831, #832, #979)
On that foundation, 1.8 adds lossless SSE and history recovery, idempotent
conversation commits, deletion-safe persistence handoff, bounded reconstruction,
and honest fail-closed history errors. Mid-stream transport deaths retry without
double-rendering, HTTP-200 compatibility-endpoint errors retain their real
classification, and pre-dispatch cancellation sends no request. MCP catalogs,
pooled transports, and partial resource discovery also recover without turning
an unavailable server into a false empty result.
Coordinator workstreams gain MCP tools, resources, and prompts plus bounded
unfinished-work nudges; task and child handles survive compaction, and blocked
tasks can explicitly report needs_user.
🛡️ Control — identity and admission stay operator-owned
- OIDC-to-MCP single-sign-on passthrough mints short-lived,
audience-scoped Entra or RFC 8693 tokens from an opt-in login credential,
with encrypted storage, rotation, revocation, and cache flushing. (#551) - Per-model gateway identity supports static keys, caller-delegated OBO,
RFC 8693 exchange, and shared app identity. Dynamic modes are default-deny,
audience/scope constrained, permission-gated, and fail closed. (#898, #950,
#955) - Per-alias model concurrency adds FIFO admission across the full stream,
while the optionalserver.require_projectpolicy keeps human-created work
filed under a governed project. (#917) - Outbound URL guards classify the destination actually reached, including
NAT64, transition addresses, metadata endpoints, DNS failure, and every
redirect hop. Private-network opt-ins never open metadata or special-use
destinations. (GHSA-wm4f-79pw-pfr9)
Also in this release
- OpenAI SDK v3 and HTTPX2 now back the OpenAI provider stack; lacme 1.2 and
HTTPX2 add routable cross-host mTLS enrollment and typed IP certificates. - Claude Opus 5 joins the capability table with its 1M context window, adaptive
thinking, and complete effort ladder. - Large text pastes become retry-safe attachments, and copy actions now cover
assistant Markdown, code, Mermaid, and tables across every chat surface. - Reranking shares a lifecycle-owned HTTP client, alias admission limit, and
outage circuit breaker; intent-judge batches evaluate in parallel. - Helm installs work with bundled or external PostgreSQL, support multi-node
routing and scheduling controls, and Docker Compose health checks work under
WSL.
⚠️ Before upgrading
- Back up storage first. 1.8 advances Alembic migration
066to072,
adding encrypted OIDC credentials, per-model authentication/concurrency,
idempotent commit keys, and immutable memory-index snapshots. Migration 072
removesmemory.fetch_limitand resets structured-memory access counters,
because access now means an explicit full-body fetch. - Every configured model endpoint must support streaming. OpenAI-compatible
endpoints must accept the currentstream_options; endpoints that end
cleanly without a terminal marker need
{"finish_reason_optional": true}in their capabilities. The old
create_completionadapter method is gone. - Custom SSE/SDK consumers should handle typed
compactionand
agent_contextevents. Compaction is no longer duplicated as a generic
infoline. - OpenAI's default client now uses the operating-system trust store. If a
private CA was installed only intocertifi, install it system-wide or set
SSL_CERT_FILE/SSL_CERT_DIR.
For contributors, dev is now the default development and pull-request
branch. main is the current stable line and install source; prior
stable/X.Y branches remain frozen unless explicitly reopened for maintenance.
👋 Contributors
A warm welcome to first-time contributors @Sanjays2402,
@BlackMyrmidon, @bensonjohnson, and @wittdennis. Thank you also to
@metaclassing for the model-identity and MCP-discovery work carried into
this release.
Upgrading
pip install --upgrade "turnstone==1.8.0"
📦 PyPI: turnstone==1.8.0
· 🐳 ghcr.io/turnstonelabs/turnstone:1.8.0 (also :1.8, :stable,
:latest)
· 📄 full changelog
Full diff: v1.7.4...v1.8.0