Skip to content

v8.0 is now implemented — see hierarchical-tenant-scope.md

Status (2026-06-13): this page was the forward-looking v8.0 roadmap written in v7.27.0, when the hierarchy was a locked design but not shipped code. v8.0 now ships the hierarchical TenantScope, so the durable- hierarchy surface is no longer forward-looking — it is real. This page is retained as a thin redirect because other docs link to it.

The single source of truth for the v8.0 hierarchical scope model is:

hierarchical-tenant-scope.md

It documents the shipped behaviour the older roadmap only sketched:

Roadmap promise (was forward-looking) Now shipped — read
N-level scope path (org → brand → conversation) §1 The data model, §2 materialised scope_path
Prefix-isolation (no cross-conversation bleed) §3 The isolation rule (ALWAYS-ON security boundary)
Scope-distance retrieval weighting §4 Hierarchical retrieval weighting (opt-in blend)
Unified inheritance (subsumes v7.22 inherits_from) §5 Procedural shadow-override on the path
Durable posture + promotion §6 Durable posture + promotion

How to construct your scope now

Use the blessed factories — bare TenantScope(tenant_id=...) is deprecated:

from symfonic.core.scope import TenantScope

scope = (
    TenantScope.root("org", "acme")
    .child("brand", "myhalos")
    .child("conversation", "c-123")
)

The canonical adopter demonstration of the full org → brand → conversation hierarchy (including a conversation-scoped query blending brand procedures and prefix isolation) lives in a reference configuration.

How v7.27.0 conversation persistence fits

v7.27.0 delivered the transcript + working-resume surfaces ahead of the v8.0 durable hierarchy, deriving thread_id from the scope at a single site that v8.0's path model updated. Adopting v7.27.0 persistence was forward-compatible: transcript and resume keep working under the hierarchical scope. See conversation-persistence.md.

v8.1.0 — ToolCallPolicy (per-intent {model + tool-redirect})

The v8 line continues past the hierarchy. v8.1.0 ships ToolCallPolicy: one declarative rule that core fans out to two seams of every React iteration — per-intent model selection (the v7.23 role_model_resolver half) and deterministic tool redirect (the v7.19 on_tool_call_dispatch half) — sharing one match predicate. It is the deterministic-tool-enforcement + per-intent-model answer to the force-tool-choice-under-thinking ask. Read tool-call-policy.md for the model, and per-dispatch-model-resolver.md for the standalone per-intent model half.

The canonical adopter demonstration of ToolCallPolicy (plus the rest of the v8 surface in one module) lives in a reference configuration.