Principle:OpenHands OpenHands Org Entity Creation
| Knowledge Sources | |
|---|---|
| Domains | Organization_Management, Multi_Tenancy |
| Last Updated | 2026-02-11 21:00 GMT |
Overview
Creating organization domain entities with default configuration ensures every new organization starts with a consistent, well-defined baseline state.
Description
The Org Entity Creation principle implements an entity construction pattern that builds domain objects by combining user-supplied values with system-defined defaults and externally-provisioned configuration. During organization onboarding, the system must:
- Accept core identity fields from the user (name, contact name, contact email).
- Assign system-generated identifiers (UUID) and timestamps.
- Apply default configuration values for settings not yet customized by the user.
- Merge in externally-provisioned settings (such as LiteLLM team and API key information) obtained from prior provisioning steps.
This pattern ensures that every organization entity is fully initialized and ready for use the moment it is created, without requiring subsequent "setup" calls to populate mandatory fields.
Usage
Apply this principle when constructing domain entities that require a combination of user input, system defaults, and external configuration. Common scenarios include:
- Building an organization entity during the onboarding workflow
- Creating tenant records in multi-tenant systems with default quotas and settings
- Constructing any domain object where incomplete initialization would leave the system in an inconsistent state
Theoretical Basis
The entity construction pattern follows a collect-defaults-merge sequence:
# Pseudocode for entity construction with defaults and applied config
def create_entity(entity_id, user_fields, external_settings):
# Step 1: Start with system defaults
entity = Entity(
id=entity_id,
created_at=now(),
**default_config,
)
# Step 2: Apply user-supplied fields
entity.name = user_fields["name"]
entity.contact_name = user_fields["contact_name"]
entity.contact_email = user_fields["contact_email"]
# Step 3: Merge in externally-provisioned settings
apply_external_settings(entity, external_settings)
return entity
Key considerations:
- Immutable defaults: Default values should be defined centrally (not scattered across calling code) so that changes propagate consistently.
- Separation of concerns: The entity construction step should not itself provision external resources; it receives pre-provisioned settings as input.
- Validation: After construction, the entity should pass all domain-level validations (required fields present, values within acceptable ranges).