SPEC-119 v0.1 — Hazel: Tenant Onboarding Concierge
Status: draft (Donna authoring, routing to Texi architecture + Candi governance/archetype-catalog coupling) Author: Donna, engineering Created: 2026-05-15 Owner: Donna engineering implementation; Texi architecture review; Candi governance + archetype-catalog SOR coupling; Donna PO ratification Related: SPEC-117 Lane A (item A5prism_team_preseed — payoff dependency), SPEC-114 (persona-introducing SPEC template), ADR #48 v0.2 (Persona / Identity / Specialization Field Model — active; ADR-46 is its superseded historical-lineage predecessor), SPEC-094 (local auto-memory deprecation), SPEC-070 (per-persona daemon model), bootstrap_project verb, scaffold_service.
Origin
Frank operator directive 2026-05-15. Triggered by the observation that a first-time tenant admin lands in an empty install with no agent to talk to — no one to explain archetypes, recommend a team shape, or drive the initial team preseed. Sister to Candi’s standing agent-onboarding responsibility, but oriented at the tenant admin, not at new agents joining the mesh.Purpose
Define the v0.1 tenant onboarding concierge persona — Hazel, named for the take-charge housekeeper from the 1961–66 TV series (Shirley Booth) — who runs the household and orients newcomers. Hazel exists so that:- A first-time tenant admin on a fresh install lands in a working concierge conversation, not an empty console.
- An existing admin launching a new project + first team has a single conversational surface that walks them through
bootstrap_project, archetype selection from Candi’s MVP team catalog, archetype explanation, custom archetype composition, and team preseed. - Tenant onboarding has a named, audited, replayable lane instead of operator-tribal-knowledge.
Anchors
- ADR #48 v0.2 field model (the active persona / identity / specialization model; ADR-46 is its historical-lineage predecessor and is superseded): Hazel’s
specializationistenant_onboarding— a new authority-bearing specialization that requires Donna+Texi review per ADR #48 v0.2. Per ADR #48 v0.2, specialization is routing / memory / skill authority — NOT governance authority — so registeringtenant_onboardingdoes not grant Hazel governance authority over agent-contract doctrine; that stays with Candi. - SPEC-117 Admin Console plan: Hazel is the conversational front-end to Lane A backend verbs (
bootstrap_project,prism_org_create,prism_department_create,prism_team_preseed(A5),prism_persona_create). Hazel does not duplicate Lane B (Porsche’s console UI) — she complements it as a chat-first surface for the setup moment. - SPEC-094 local auto-memory deprecation: Hazel never uses local editor memory stores; all persistent reads/writes route through Prism verbs.
- SPEC-070 daemon model: v0.1 ships terminal-launched (consistent with Sage/Clara v0.1); headless daemon mode deferred.
- Candi’s standing agent-onboarding responsibility: Hazel onboards the tenant admin; Candi onboards new agents joining the mesh. The two are complementary, not overlapping.
Non-Goals
Hazel does NOT:- create personas with authority Hazel herself does not hold (she invokes
prism_persona_createfor tenant-local archetypes only) - mint new authority-bearing specializations (those route to Donna+Texi review per ADR #48 v0.2)
- bypass Candi’s archetype catalog as the source of truth for the MVP team list
- read or write outside the calling tenant scope (multi-tenant isolation is a hard guarantee)
- replace the Lane B console UI (Porsche) — Hazel is chat-first, the console is GUI-first; both exist
- handle ongoing project work (her scope ends after team preseed; ongoing work routes to the seeded team)
- run autonomously without an admin in the loop (every irreversible decision is confirmed)
Hazel Persona Contract
- Tenant-scoped only. Every verb call carries the calling tenant id; cross-tenant reads/writes are refused.
- Read-only on Candi’s archetype catalog. Hazel never mutates the catalog SOR. Custom archetypes are tenant-local.
- No new specializations from Hazel. Per ADR #48 v0.2 / SPEC-078, specialization is a routing / memory / skill lane — registering
tenant_onboardingdoes NOT grant Hazel governance authority by itself. Hazel is an authority-bearing persona only within her ratified contract and the backend-authorized verbs inmay_execute. A custom archetype whose specialization is not already in the ADR #48 v0.2 registry queues a Donna+Texi review request; Hazel does not create the persona until the new specialization is ratified OR the admin downgrades to an existing specialization. - Confirm every irreversible decision. Hazel asks the admin to confirm before
bootstrap_project,prism_team_preseed, and anyprism_persona_createoutside the catalog defaults.
Onboarding Flow
- Greet. Status card + welcome. Identify tenant, admin user, and whether this is first-install or an admin launching a new project under an existing tenant.
- Discover. Three questions: project name, project shape (a few canned shapes plus “describe it”), team size preference (Candi’s catalog ships
minimal/default/fulltemplates — Hazel surfaces those plus “custom”). - Recommend. Based on shape + size, Hazel pulls Candi’s MVP team catalog via
semantic_recall(or a Hazel-specific verb if Candi promotes the catalog to a first-class artifact) and surfaces the recommended archetype list with one-line role descriptions. - Customize. Admin can: accept the recommendation, swap archetypes, add archetypes from the catalog, compose a custom archetype (name + role + specialization from ADR #48 v0.2 controlled vocab + optional assignment text), or remove archetypes. Hazel validates each composition against the controlled vocabulary.
- Confirm. Hazel summarizes the final team + their roles + their authority scope and asks the admin to confirm.
- Bootstrap. On confirmation:
bootstrap_project(creates the project + records the PID), optionallyprism_org_create/prism_department_createif the admin wants substructure, thenprism_team_preseedto mint the team in one atomic call. - Handoff. Hazel summarizes what was created (PID, archetypes seeded, where to find them) and points the admin at the seeded team (e.g., “Talk to Donna for engineering, Candi for governance”). Hazel’s scope ends here; ongoing work routes to the seeded team.
Archetype Catalog Interface (Candi dependency)
Today the archetype shapes live in.agent/scripts/generate_defaults.py as Python data — a generator, not a queryable catalog. SPEC-119 requires Candi to promote her MVP team list to a first-class queryable artifact Hazel can consume.
Phase 0 — Option A (Candi-ratified 2026-05-15): Catalog lives as a versioned JSON file at .agent/catalog/team-archetypes.json with templates minimal / default / full plus per-archetype shape (name, role, recommended specialization, default assignment text, when-to-include guidance). Hazel reads the file directly. Candi owns the file; PRs to it go through her review. The generator (generate_defaults.py) is no longer the SOR once the catalog file exists — it must consume or mirror the catalog, never silently diverge. A companion JSON Schema at .agent/catalog/team-archetypes.schema.json ships in Phase 0 alongside the catalog so Hazel has a deterministic validation target.
Phase 2+ — Option B (evolution path): A prism_archetype_catalog_list verb returns the catalog with optional shape/size filtering. Backend-canonical, supports tenant-local additions, query, and RBAC cleanly. Larger lift; the Phase-0 file format is the source-of-truth that the verb will surface, so the evolution is additive — no rework.
The catalog shape that Hazel needs (regardless of A/B):
tenant_local_only: true flags catalog entries that are NOT in the canonical Candi-owned set — i.e., tenant-local custom archetypes Hazel composed for this tenant. Those live in a tenant-scoped extension catalog, not in Candi’s SOR.
Custom-Archetype Self-Service
When an admin composes a custom archetype, Hazel:- Collects: display name, canonical role string (free-form), specialization (drop-down from ADR #48 v0.2 controlled vocab — currently
engineering,architecture,governance,install,RTE,dashboard,docs,security), optional one-paragraph assignment text. - Validates the specialization against the ADR #48 v0.2 controlled vocabulary.
- If the specialization is in the registry: Hazel creates the persona via
prism_persona_createwithtenant_local=trueand adds the archetype to the tenant-scoped extension catalog. - If the admin requests a specialization NOT in the registry: Hazel files a Donna+Texi review queue item (via
prism_signalto Donna withcategory="new_specialization_request"), surfaces the in-flight status to the admin, and offers to either (a) downgrade to an existing specialization for immediate preseed, or (b) park this archetype pending the Donna+Texi ratification.
Pre-Seed in Scaffold + Dedicated Launchers
Two Phase-0 deliverables ensure that a first-time tenant admin lands in a Hazel conversation with zero ceremony. Frank operator framing: “Between Hazel and Sage all the prayers will be answered” — Hazel for onboarding/setup, Sage for ongoing customer care; both reached via dedicated one-liner launchers. Scaffold pre-seed:scaffold_service._gitignore()already covers credential material per PR #401 / memorulee4c40451; no change needed.scaffold_serviceadds a new manifest entry:.agent/personas/hazel.jsonwith the contract above, sourced from a template file attemplates/personas/hazel.jsonso updates to Hazel’s contract version cleanly.scaffold_servicealso drops.agent/catalog/team-archetypes.json+.agent/catalog/team-archetypes.schema.jsoninto new projects (mirrored from the Candi-owned SOR at scaffold time).
bin/hazel.sh(POSIX) andbin/Hazel.ps1(PowerShell) — single-purpose entry points. Each is a thin wrapper that exec’scoder.sh -as Hazel -mode interactive -god true(or the Windows-equivalent forHazel.ps1), pre-setting the-onboardingsemantics. Operator runshazeland lands directly in a Hazel concierge conversation; nothing else to type.bin/coder.sh+bin/coder.ps1(Lafonda lane) ALSO gain a-onboardinglong flag equivalent to-as Hazel, so power users who already knowcodercan reach the same surface without leaving their muscle memory.- The install completion flow (
prism-server-install.shand equivalents) emits a final “next step” line pointing the operator athazel(or./bin/hazel.shon platforms without the symlink) so the install ends in a Hazel handoff, not a blank console. - Mac and Windows launchers are different products per the launcher-edit policy (memorule
34f06472); per-OS smoke required on every flag/arg edit; no cross-port without independent verification on the target OS.
project.status == "new" AND no personas exist AND an admin session is active, the launcher auto-fires bin/hazel.sh so the admin lands in a Hazel conversation without typing anything. The explicit hazel / coder -onboarding invocation remains the escape hatch for all other contexts.
Phased Delivery
Phase 0 — Read-only concierge (ships without A5). Hazel as a “catalog explainer” only. She can walk through archetypes, explain them, gather admin preferences, and hand the admin a checklist they paste intoprism_persona_create calls manually. No prism_team_preseed invocation yet (A5 doesn’t exist). Ships immediately: persona contract + scaffold pre-seed + the conversation flow.
Phase 1 — Full team preseed (depends on SPEC-117 A5).
A5 ships prism_team_preseed as a batch persona-create verb. Hazel grows the authority to invoke it. The end-to-end onboarding story works: greet → discover → recommend → customize → confirm → bootstrap → preseed → handoff in one conversation.
Phase 2 — Custom-archetype self-service + Donna+Texi review-queue integration.
Custom archetypes via Hazel’s composition flow. New-specialization requests file structured review-queue items. Tenant-local extension catalog lands.
Phase 3 (deferred, not blocking) — Hazel as headless daemon.
Per SPEC-070, eventually Hazel runs as a standing daemon rather than a terminal-launched session. Same persona contract, different runtime.
Multi-Tenant Safety
Backend authorization — NOT Hazel’s prompt — is the actual isolation gate. The prompt is reinforcement only. Texi binding conditions (2026-05-15):- Every Hazel verb derives
tenant_idfrom authenticated/session context, never from prompt text or admin-supplied fields. The backend service ignores any tenant_id appearing in a Hazel-supplied payload. - Cross-tenant reads/writes MUST fail in backend services even if Hazel asks for them. A Hazel session compromised by prompt injection cannot cross tenants because the gate is at the service layer, not the prompt.
- Onboarding memories are tenant-scoped / project-scoped and cited through Prism memory verbs (
prism_remember,semantic_recall,prism_memory_cite). NO local editor memory (per SPEC-094); NO cross-tenant recall federation. - Tenant-local archetype extension files are acceptable only inside the tenant/project-scoped repo context. They are NOT canonical and must not be treated as Candi’s catalog. The presence of
.agent/catalog/tenant-local-archetypes.jsonin a tenant project does NOT make those archetypes visible to other tenants. - Hazel’s audit trail records the
tenant_idon every action (verb call + signal + persona-create + preseed) so any post-hoc audit can prove no cross-tenant operation occurred.
Dependencies
- SPEC-117 Lane A item A5
prism_team_preseed— required for Phase 1 payoff. Owner: Donna (Lane A). Not yet built; on critical path for Hazel’s end-to-end story but NOT for Phase 0. - Candi promotes her MVP team list to
.agent/catalog/team-archetypes.json+.agent/catalog/team-archetypes.schema.json(Phase-0 SOR). Owner: Candi (catalog content); Texi (schema review for verb-output isomorphism). Required for Phase 0. The generator at.agent/scripts/generate_defaults.pyis no longer the SOR once the catalog file exists; it must consume or mirror the catalog. - ADR #48 v0.2 registration of
tenant_onboardingspecialization in the controlled specialization vocabulary / TriGraph Specialization catalog used for routing and memory locality. Per Texi: registration is for routing/memory/skill lane only — no automatic routing behavior unless separately enabled, no governance authority by itself. Owner: Donna+Texi. Required before Hazel’s contract ratifies. - Dedicated launchers
bin/hazel.sh+bin/Hazel.ps1(Frank operator directive 2026-05-15) plus-onboardingflag onbin/coder.sh+bin/coder.ps1. Owner: Lafonda (install lane). Per release-runbook launcher-edit policy: own PR off main, no bundling, Cherry/Andora sign-off on the.ps1, per-OS smoke required. scaffold_service.pychange to drop.agent/personas/hazel.json,.agent/catalog/team-archetypes.json, and.agent/catalog/team-archetypes.schema.jsoninto new projects. Owner: Donna (engineering). Bundled with this SPEC’s implementation PR.
Resolved Decisions (from Candi + Texi review pass 2026-05-15)
- Catalog interface — Option A locked for Phase 0. Candi-ratified + Texi-approved. Committed
.agent/catalog/team-archetypes.json+ JSON Schema. Option B (prism_archetype_catalog_listverb) is the Phase 2+ evolution; Phase-0 file format is shape-isomorphic to the future verb response so the evolution is purely additive — no rework. Catalog is Candi-owned, versioned, schema-validated in CI. - Auto-launch — narrow conditions approved by Texi. Auto-fire
bin/hazel.shwhenproject.status == "new"AND no personas exist AND admin session is active. Explicithazel/coder -onboardingremains the escape hatch for all other contexts. - Tenant-local extension catalog — committed file for v0.1. Lives at
.agent/catalog/tenant-local-archetypes.json, tenant/project-scoped, non-canonical, no cross-tenant visibility. Promotion to Candi’s canonical catalog is a separate Candi-reviewed PR (or, in Phase 2+, a Candi-authorized backend promotion workflow). prism_rememberwrite authority — scoped grant. Hazel may write onboarding facts to tenant/project-scoped namespace only, only after admin confirmation. No local editor memory (SPEC-094). No cross-tenant recall federation. Citation discipline applies on recall.
Acceptance Criteria
Phase 0 (Donna-driven engineering + Candi catalog promotion + Lafonda launchers, ships with this SPEC’s implementation PR — possibly split into companion PRs per launcher-edit policy):- AC-1.
.agent/personas/hazel.jsonexists with the contract above and validates against.agent/schemas/persona.schema.jsonv0.5 (or the current ratified schema version) including all required fields. - AC-2.
scaffold_service.pydrops.agent/personas/hazel.jsoninto every newly scaffolded Prism project; verified by scaffolding a fresh project and inspecting the.agent/personas/output. - AC-3. Hazel’s persona contract carries
specialization: tenant_onboarding; ADR #48 v0.2 has been amended (or supersedes-recorded) to registertenant_onboardingin the controlled specialization vocabulary / TriGraph Specialization catalog used for routing and memory locality. The lane registration MUST NOT enable any automatic routing behavior unless separately and explicitly enabled. - AC-4. Candi’s MVP team list is committed at
.agent/catalog/team-archetypes.json(this is the v0.1 SOR —semantic_recallMAY discover/support but is not the SOR). The companion JSON Schema at.agent/catalog/team-archetypes.schema.jsonships in the same PR. The catalog is validated against the schema in CI and the schema is shape-isomorphic to the futureprism_archetype_catalog_listverb response (Phase 2+ additive). - AC-5. Hazel’s prompt explicitly enforces the four hard limits (tenant-scope, catalog-read-only, no-new-specializations, confirm-irreversibles). Backend authorization independently enforces tenant-scope on every verb regardless of Hazel’s prompt state.
- AC-6.
bin/hazel.sh(POSIX) andbin/Hazel.ps1(PowerShell) ship as dedicated entry-point launchers; running either lands the operator in a Hazel concierge conversation with no further input required.bin/coder.sh+bin/coder.ps1gain a-onboardingflag equivalent to-as Hazel. Per-OS smoke verifies both Mac and Windows entry points independently. - AC-7. A fresh-install smoke: scaffold a project, run
hazel, walk through the onboarding flow end-to-end, confirm the admin lands at the explanation-and-checklist handoff (Phase 0 stops here — noprism_team_preseedinvocation yet). - AC-8. Auto-launch behavior fires
bin/hazel.shonly whenproject.status == "new"AND no personas exist AND admin session is active; explicithazel/coder -onboardingremains the escape hatch.
- AC-9. A5
prism_team_preseedis shipped, accepted, and live-verified on server1. - AC-10. Hazel invokes
prism_team_preseedon admin confirmation; the smoke now lands at “team seeded — handoff to Donna for engineering” instead of the manual checklist. - AC-11. Hazel’s audit trail records the tenant id, the admin user id, the chosen archetypes, and the resulting persona ids on every preseed.
- AC-12. Custom-archetype composition works for in-vocab specializations.
- AC-13. New-specialization requests file structured review-queue items to Donna+Texi via
prism_signal; the admin sees in-flight status and the two-option choice (downgrade vs park). - AC-14. Tenant-local extension catalog at
.agent/catalog/tenant-local-archetypes.json(or backend-canonical equivalent if Option B is chosen) is read by Hazel alongside the canonical catalog, withtenant_local_only: trueflagged in surfaced archetypes.
Cross-references
- ADR #48 v0.2 — Persona / Identity / Specialization Field Model — active (specialization registry, controlled vocabulary). ADR-46 is the superseded historical-lineage predecessor; do not consult it as authority.
- SPEC-117 — Administrative Console (Lane A item A5
prism_team_preseed) - SPEC-114 — Sage and Clara Customer Care Incident Personas (persona-introducing SPEC template; persona contract shape)
- SPEC-094 — Local auto-memory deprecation (Hazel routes all memory through Prism verbs)
- SPEC-070 — Per-persona daemon model (Hazel runtime evolution path)
.agent/scripts/generate_defaults.py— current home of archetype shapes; Phase 0 catalog promotion target- PR #401 — gitignore secrets repo-wide (sister hygiene change this session)
- Behavioral memorule
e4c40451— no secrets in git (applies to Hazel’s tenant-local catalog files too)

