Moving to 11.0: kernel adoption, and what 11.0 retires¶
Package metadata declares 11.0.0. This release retires three per-call
arguments and serves stream_typed from the kernel projection; both are
listed in the changelog. It does not remove legacy
code: the compatibility facade and the legacy implementations are still in
the source, and physical removal remains a separate, explicitly authorized
operation behind its own gate.
Adopters who depend on a retired argument stay on 9.12, the newest release
that still honours it. The retirement is not backported.
Choose the right entry point¶
| Your project | Starting point | What to verify |
|---|---|---|
| New agent | from symfonic import Agent; simple-agent guide |
Compose the capabilities your application needs |
| New application with UI and services | Scaffold | Generated configuration, storage, providers, tenancy and enabled capabilities |
Existing SymfonicAgent application |
Keep its current entry point while assessing the migration guide | Arguments, switches, persistence and continuation paths exercised by your application |
| Release or operational validation | Agent regression evals | Evidence from the generated application, not just library unit tests |
Kernel adoption is composition: importing Agent does not automatically
enable memory, extraction, consolidation, delegation, or telemetry.
An existing FrameworkConfig setting is not proof that a separately composed
capability consumes it. Consult the migration guide for the corresponding
public composition entry point.
ask_user on an existing SymfonicAgent¶
FrameworkConfig(ask_user_enabled=True) is still an active compatibility
setting. On run, stream, and stream_typed, it declines the migrated
kernel route and sends the turn to the legacy body, where the built-in
ask_user tool, checkpointer, question event, and HMAC pause token remain
implemented. The fallback is counted and names ask_user_enabled. The
inert_on value in agent/cutover/pause_surfaces.py describes only what the
migrated route would do if this setting were admitted; it does not describe
the behavior of the SymfonicAgent call after routing.
The first turn must supply both a tenant scope and a non-empty session_id.
Without them, all three entry points raise SymfonicAgentError before calling
the model because a later resume could not find a stable checkpoint. A pause
is minted by the legacy body. resume() is routed separately and may redeem
through the kernel continuation or the legacy continuation according to the
deployment's continuation switch and the token it accepts. Exercise one real
pause and redemption through your transport before rollout, including the
question event and pause token returned to the client.
Choose one public composition for human interaction:
| Agent entry point | Supported human-interaction setup |
|---|---|
Existing SymfonicAgent |
Keep ask_user_enabled=True, install the ask-user extra, and provide scope plus session_id on the first turn. No warning is emitted for the flag because it selects working legacy behavior; the missing identity inputs already fail loudly. |
Native Agent and AgentHost on current main |
Use a revision or package that contains human_continuation(...). Compose human_interaction(...) with durable payload, checkpoint, and consumption ports, and install human_continuation(...) on the host. The capability contributes the built-in ask_user tool spec and registration. |
Do not add ask_user_tool_spec or InteractionRegistration beside a
SymfonicAgent merely to restore the flag: those are parts of the native
capability composition, not a patch for the compatibility facade. Move to that
composition when the application moves to Agent and AgentHost. There is no
recorded target version for admitting ask_user_enabled onto the kernel route;
until its blocking and chunk projections gain a pause shape and admission is
re-evaluated, the compatibility route serves the flag.
The ask-user extra remains meaningful for SymfonicAgent. It supplies the
token-signing and supported SQLite/Postgres checkpoint dependencies used by
the compatibility path, so a consumer that may enable the flag should retain
it.
The SymfonicAgent compatibility behavior above is present in the 11.0.0
source and on current main. The clarification of what inert_on means landed
on main after the 11.0.0 wheel was built. The native Agent and AgentHost
recipe describes current main: human_continuation(...) was added after the
11.0.0 release cut, so use it only from a revision or package that contains
that API. This consumer guidance is also a post-release documentation change;
it does not update an installed 11.0.0 package or announce a newer package.
Supported FP-4 compositions¶
The generated scaffold composes platform.governance() and the native QUICK
maintenance cycle. Its MEMORY_QUICK_NAP_TURNS is a real cadence: 0 omits
the coordinator and a positive value constructs ConsolidationSchedule and a
complete quick_phases roster. A quiet-window worker composes the wider DEEP
roster itself; nightly_nap_enabled and nightly_nap_cron were operator
metadata, not an engine scheduler.
LearningPolicy belongs to a DEEP factory that also receives the extractor
collaborator. The model spelling is deliberately different at that boundary:
phase_12_llm_model becomes procedural_model_name. The generated scaffold
does not compose an LLM extractor, so it rejects every phase-12 LLM model/cap
setting early rather than accepting a no-op. enable_semantic_merge is also
not a policy field: QUICK uses explicit chat_model and embedding
collaborators.
from symfonic.capabilities.memory import quick_phases
phases = quick_phases(
graph=graph_backend,
chat_model=chat_model, # enables the merge collaborator
embedding_provider=embeddings,
lookback_hours=24,
spreading_weight=0.5,
)
Prompt cache directives belong to stable provider-system contributions. The
history passed to Agent.run is separate and this does not replace a legacy
rolling-history cache policy.
from symfonic.capabilities.prompting import (
CacheDirective, CacheTtl, Layer, PromptContribution, StaticSource,
)
rules = PromptContribution(
contribution_id="deployment.rules",
source=StaticSource("Stable operating rules."),
layer=Layer.L1,
cache=CacheDirective(cacheable=True, ttl=CacheTtl.ONE_HOUR),
)
governance() supplies the default credential-hygiene composition. Add a
reflector and a trigger policy when the deployment needs metacognition. Recall
sensitivity is factual public subject state (metacognition_sensitive_tags),
which a retrieval integration must pass; it is not inferred automatically from
retrieved prose. ConfidenceOnlyMetacognitionPolicy is an explicit opt-out of
the default selective triggers.
For a durable human pause, create the capability with the deployment's durable payload/checkpoint/consumption ports, then install this host-level continuation factory. The resolver receives authenticated token claims and looks up only the signed scope hash; callers never submit a scope with the token. A successful resume is at-most-once. If host construction fails before the token is claimed, the caller can retry it.
from symfonic.platform import AgentHost, human_continuation
host = AgentHost(
composer=compose_agent_for_scope,
resources=resources,
continuation_factory=human_continuation(
capability=human_pause_capability,
scope_for_claims=scope_for_authenticated_claims,
),
)
result = await host.resume(token, answer)
AgentHost.resume(token, answer) remains the external recovery entry point.
Its host adapter authenticates the token, resolves the signed scope, claims the
single-use token, and restores the paused turn before it invokes the scoped
agent. Agent.continue_recovered(...) is the corresponding trusted in-process
integration seam; its value is available as
from symfonic.agent.facade_types import RecoveredContinuation. Constructing
that value does not authenticate a token, select a scope, or authorize a
recovery. Do not build it from a transport request; hosts construct it only
after the verified recovery steps above.
The scaffold rejects ASK_USER_ENABLED=true, a non-empty
DEV_SQLITE_CHECKPOINT_PATH, and every non-empty PROMPT_LAYER_MODE value at
configuration load with the public migration route. This prevents a legacy
setting from looking accepted when the scaffold has no durable resolver or
explicit prompt contribution for it.
The same early-rejection rule covers uncomposed LLM extraction settings
(PHASE_12_USE_LLM_EXTRACTOR and its model/caps) and legacy speaker, layer,
role, blend, and relevance controls. Their names appear in generated settings
only so a non-default request fails with a route to deep_phases,
RetrievalPolicy, or a composed governance policy; the scaffold does not
silently accept settings it cannot apply.
The scaffold also rejects MESSAGES_CACHE_POLICY, SYSTEM_PREFIX_CACHE_TTL,
and MANIFEST_CACHE_POSITION. A deployment that wants a provider cache must
declare stable PromptContribution regions as above; it must separately choose
and measure any history-cache strategy. test_fp4_scaffold_migration.py
exercises these rejection paths from generated settings.
The installed-artifact FP-4 probe verifies generated settings and the public
prompt, governance, and continuation extension seams. It does not exercise
the generated application's setup.agent.build_agent, API, or worker
lifecycle; that application-closure journey is tracked for FP-5.
What compatibility means here¶
The compatibility facade and legacy implementations remain in the source. This documentation adds no new deprecation. It does not promise that every historical argument is accepted: existing validation and retirement refusals still apply. Test the exact installed artifact and configuration you use.
A kernel default route does not prove that its legacy fallback is unreachable. Likewise, migrating the examples does not authorize deleting the implementation behind an existing compatibility route.
Pause and resume need particular care. Do not assume a legacy token can be redeemed by a kernel-native checkpoint path. The continuation migration window has eligibility checks and depends on a legacy destination; its release-line bound is derived from that destination's retirement line. Validate outstanding pauses and their redemption path before changing a deployment.
The release/retirement contracts contain version markers such as 10.4 and
11.0. 10.4 is a contract input naming the declared bound of the
compatibility window; no 10.x release was ever cut, so the newest version
that honours the legacy pins is 9.12. This page does not change those
markers, and it does not replace the fourteen-condition retirement gate.
Acceptance checklist for an adopter¶
Use an isolated test tenant and a generated project built from the candidate wheel. Record the wheel version, configuration and model used.
| Feature | Evidence to require |
|---|---|
| Memory and recall | A fact persists, reaches a later turn's prompt, and stays invisible to another tenant |
| Vector retrieval | The configured embedder and vector backend are actually called; graph-only mode is reported explicitly |
| Extraction | Durable extracted records, or an explicit empty/degraded outcome; a fluent answer is not evidence of a write |
| QUICK consolidation | Cadence triggers a completed cycle; inspect phases and durable effects, not only a scheduling event |
| DEEP consolidation | Manual and scheduled entry points use the intended composition, with scope exclusion, rollback and restart checks |
| Tools and delegation | Final arguments, execution/result correlation and child scope; refusal must prevent execution |
| Procedural skills | Draft, review, approval, prompt inclusion and enforcement are separate observable steps |
| Observability | Conversation/run/event correlation, safe counters and opt-in redacted content capture |
Run applicable scenario packs and explicitly report non-applicable ones. Keep deterministic assertions about storage, isolation and tool execution separate from judgments about model answers. A run with a scripted provider does not establish live-model quality; a successful live-model run does not establish atomicity or tenant isolation.
Bounded work per sweep is not a promise of bounded total database size or
constant-cost vector search. Maintainers can inspect the source-repository
evidence in docs/design/sc20-bounded-consolidation-worksets.md; that internal
design document is not published as part of this site.
Release handoff¶
Before calling a candidate ready, check documentation links and examples, build/install the wheel, generate the scaffold, run its applicable evals and exercise the UI against that same backend. Keep the resulting evidence with the candidate SHA.
Publishing 10.0, introducing any new deprecation, and removing legacy each require their own decision. None is performed by this documentation update.