Question and use cases
Unified aggregate roots are the default; separate persistence models require explicit asymmetry.
Use this hierarchy when choosing an entity base type or proposing a separate persistence model.
Use the diagram during design review, incident diagnosis, code walkthroughs, and onboarding. It intentionally omits classes and projects unrelated to the focused question, so read it together with the source entry point and related topic pages.
This page covers only the named responsibilities and relationships; consult the relevant module documentation for capabilities not shown here.
Reading path
- Step 1: Begin with identity and audit behavior on
Entity<TId>. - Step 2: Move to aggregate concurrency and soft-delete behavior.
- Step 3: Add tenancy only when the aggregate belongs to a tenant boundary.
Do not skip arrow direction, numbering, or group titles: they express dependency or time direction, execution order, and responsibility boundaries. If the diagram differs from current source or accepted architecture decisions, correct the generated catalog immediately.
Legend and notation
| Visual element | Meaning | What it does not imply |
|---|---|---|
| Coral focus | The decision point or primary path emphasized by this view | That the element is always more important or privileged |
| Blue boundary | An external system, protocol edge, or explicit boundary | That it must be an independently deployed service |
| Muted connector | A dependency, call, transition, or data flow as named by its label | Synchronous, same-transaction, or exactly-once behavior |
| Group frame | A responsibility, layer, or lifecycle phase | A team or physical-machine boundary |
This is a HIERARCHY diagram. Use that form to understand the layout, then test your interpretation against the source facts below.
Key relationships and design meaning
Relationship 1
Source fact: Entity<TId> provides identity and audit fields; AggregateRoot<TId> adds soft delete and concurrency tracking.
Architectural meaning: Identity and audit fields become consistent across entities without reimplementing lifecycle bookkeeping.
Review action: Which base behavior is required by the aggregate’s lifecycle?
Relationship 2
Source fact: TenantAggregateRoot<TId> adds the tenant contract without removing aggregate behavior.
Architectural meaning: Aggregate concurrency and soft delete live with aggregate lifecycle, so repositories can apply uniform persistence semantics.
Review action: Would a 1:1 persistence type duplicate rather than isolate asymmetry?
Relationship 3
Source fact: Separate persistence base classes remain available only for explicit asymmetric storage models.
Architectural meaning: Tenant ownership is explicit in the type system, enabling mandatory tenant filters and preventing accidental global treatment.
Review action: Is any persistence exception recorded and tested?
Design review questions
Answer each question when reviewing or implementing a related change. If code, tests, or an ADR cannot support the answer, do not decide from the diagram alone.
- Which base behavior is required by the aggregate’s lifecycle?
- Would a 1:1 persistence type duplicate rather than isolate asymmetry?
- Is any persistence exception recorded and tested?
How to use the answers
- Identify the single owner of the capability or rule.
- Confirm that dependency, call, or event direction does not reverse ownership.
- Capture the conclusion with an automated test or repeatable command.
Boundaries and common mistakes
Boundary 1
Do not create a 1:1 *Entity, mapper, and domain model pair by default.
- Do not infer: A connector in the diagram does not mean every implementation uses synchronous calls, a shared transaction, or shared data ownership.
- Review requirement: Would a 1:1 persistence type duplicate rather than isolate asymmetry?
Boundary 2
A persistence exception must be recorded under architecture documentation.
- Do not infer: A connector in the diagram does not mean every implementation uses synchronous calls, a shared transaction, or shared data ownership.
- Review requirement: Is any persistence exception recorded and tested?
Source verification and regeneration
The primary verification entry point is src/Framework/BitzOrcas.Domain/Entities + architecture-rules.md. Inspect it and its direct references before regenerating diagram assets and pages.
# Regenerate bilingual SVG, standalone HTML, and documentation pagesnpm run diagrams
# Check locale pairs, references, safety attributes, accessibility, and canvas boundsnpm run verify:diagrams# Confirm that generation changed only the intended diagrams and pagesgit diff -- scripts/diagrams diagram-sources public/diagrams src/content/docs
# Verify internal links, MDX structure, and professional depth gatesnpm run verify:docsnpm run audit:docs-depthChange-completion checklist
- Responsibilities, order, states, and relationships match current source.
- Every new element helps answer this page’s question instead of turning the diagram into an inventory.
- Arrows have explicit direction and semantics without implying nonexistent synchronous or transactional guarantees.
- Chinese and English titles, labels, facts, and boundaries remain semantically equivalent.
- The diagram remains readable on narrow screens, in fullscreen, and while zoomed, with no overlap or overflow.
- Relevant architecture tests, integration tests, or verification commands have run.
- If a long-lived constraint changed, its ADR or architecture documentation is updated.