Skip to content

symfonic.capabilities.prompting.onboarding

onboarding

What the agent should collect from a new tenant, as a typed contribution.

domain.onboarding_checklist is neither observability nor an inert flag. Its own docstring calls it "items the agent should collect during initial conversations with a new tenant", and a scaffolded project fills it with instructions — "Learn the store name and what it sells". That is model-facing behaviour, so a migrated route that dropped it would answer differently from the legacy one while reporting the field admitted.

The shape is :mod:~symfonic.capabilities.prompting.identity's, for the same reason: the configuration field stays off every allowlist, the compatibility adapter does the translation, and what arrives here is three strings' worth of directive that knows nothing about DomainTemplate.

The cap belongs to the value. Legacy renders onboarding_checklist[:3] under "CORE PREFERENCES", and the three is not arbitrary — a directive that grew unbounded would push the rest of the prompt out under budget. Applying it in :meth:OnboardingDirective.from_checklist rather than at the render keeps the cap a property of what travels, so a reader of the value sees what the model will see.

OnboardingDirective dataclass

OnboardingDirective(items: tuple[str, ...])

The items an agent should collect, already capped and cleaned.

from_checklist classmethod

from_checklist(checklist: Sequence[str] | Iterable[str] | None) -> OnboardingDirective | None

Legacy's own reading of the configured checklist, or None.

None for an absent or entirely blank checklist, because absence means disabled — the rule the whole capability surface follows.

Source code in src/symfonic/capabilities/prompting/onboarding.py
@classmethod
def from_checklist(
    cls, checklist: Sequence[str] | Iterable[str] | None
) -> OnboardingDirective | None:
    """Legacy's own reading of the configured checklist, or ``None``.

    ``None`` for an absent or entirely blank checklist, because absence
    means disabled — the rule the whole capability surface follows.
    """
    cleaned = tuple(
        item.strip() for item in (checklist or ()) if item and item.strip()
    )[:CORE_PREFERENCE_LIMIT]
    return cls(items=cleaned) if cleaned else None

render

render() -> str

The bullets legacy renders into {{CORE_PREFERENCES}}.

Source code in src/symfonic/capabilities/prompting/onboarding.py
def render(self) -> str:
    """The bullets legacy renders into ``{{CORE_PREFERENCES}}``."""
    return "\n".join(f"  - {item}" for item in self.items)

OnboardingSource dataclass

OnboardingSource(directive: OnboardingDirective, untrusted: bool = False, offline_safe: bool = True, scope_aware: bool = False, options: dict[str, Any] = dict())

A ContributionSource that renders one :class:OnboardingDirective.

Not frozen for the reason the other sources are not: ContributionSource declares offline_safe and scope_aware as settable attributes.