backend/app/domain/workflow_package/registry.py.Generates a Windows-compatible sAMAccountName from given_name + family_name, with uniqueness check against existing identities.
identity.createdidentity.attributes.samAccountNamemax_length (default 20), collision_strategy (suffix-1, suffix-2…)Generates a primary work email from given_name + family_name + tenant domain. Handles homonyms (suffix-1, suffix-2).
identity.createdidentity.email (or identity.attributes.work_email)domain, format (first.last, flast, firstlast)Generates an AD logon name (typically 8-character with collision-handling). Distinct from samAccountName — covers tenants with separate userPrincipalName conventions.
identity.createdidentity.attributes.ad_usernamelength, style (lowercase only, mixed)Auto-tags identities as contractor / partner / vendor based on email domain + HR-feed attributes. Drives downstream policy decisions (cert frequency, access-grant scope).
identity.created + identity.updatedidentity.attributes.classificationcontractor_domain_patterns, partner_attribute_keysWhen an identity's manager_email changes (mover event), emails the new manager with summary of current access + link to start a smart-cert.
identity.updated with manager_email diffsend_email via NotificationTemplateemail_template_id, cert_url_patternSwitches the tenant into read-only IVIP positioning: provisioning surfaces hidden, only analytics + reconciliation + audit visible.
tenant_feature: "ivip-mode"TenantPlan.IVIP_VISIBILITY SKUUnlocks the "Externals & data" nav item — schema-objects management for tenants with custom reference data.
tenant_feature: "externals-data"schema-objects nav becomes visibleconfig_schema)builds(config) → BuildResultCustomProperty rows (target_kind = workflow / tenant_feature)WorkflowDefinition rows (event / scheduled / manual)(tenant_id, business_id) — re-activate refreshes non-builtin workflows. Built-in workflows are never overwritten.PackageSpec in backend/app/domain/workflow_package/registry.py_PACKAGES dictConfigField)tests/test_workflow_packages.py — at minimum a default-build and a config-override buildCustomProperty + WorkflowDefinition. Don't expand to NotificationTemplates / IGAGroups in the same package — those have separate seeders for clarity.