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.