Entities
The Tech Strategy Tool’s domain model consists of a hierarchy of strategy entities. This page documents each entity type, its fields, behaviors, and relationships.
Entity Hierarchy
Section titled “Entity Hierarchy”All entities live within a single Strategy document held in memory by the event processor. There are no separate database tables for entities — the state is derived entirely from events.
Strategy
Section titled “Strategy”The root document containing all teams. There is exactly one Strategy instance in the system.
| Field | Type | Description |
|---|---|---|
| Teams | List<Team> | Ordered list of all teams |
A team represents an engineering group with its own strategy space. Teams are the top-level organizational unit.
Implements INamedEntity.
| Field | Type | Description |
|---|---|---|
| Id | Guid | Unique identifier |
| Name | string | Display name |
| NameSequence | long | Sequence number of the last update_name event for this entity |
| Color | string | Hex color code (e.g., #3498db) used for UI theming |
| Principles | List<Principle> | Ordered list of guiding principles |
| Objectives | List<Objective> | Ordered list of measurable goals |
| Groups | List<Group> | Ordered list of groups for organizing objectives |
Behaviors
Section titled “Behaviors”- Color validation: The
Colorfield must be a valid 6-digit hex color code (e.g.,#3498db). The processor validates this on create and update. - Cascading delete: Deleting a team removes all of its groups, principles, objectives, and initiatives.
- Admin-only operations: Creating, renaming, recoloring, and deleting teams require admin role.
A grouping mechanism for objectives within a team. Groups provide visual organization in the Objectives view.
Implements INamedEntity, IDescribedEntity, and IOrderableEntity.
| Field | Type | Description |
|---|---|---|
| Id | Guid | Unique identifier |
| Name | string | Display name |
| NameSequence | long | Sequence number of the last update_name event for this entity |
| Description | string | Optional description |
| DescriptionSequence | long | Sequence number of the last update_description event for this entity |
| OrderSequence | long | Sequence number of the last reorder_entity event for this entity |
Behaviors
Section titled “Behaviors”- Cascading ungroup: Deleting a group unassigns all objectives from it (they become ungrouped), but does not delete the objectives.
- Deferred creation: In the UI, clicking “Add Group” creates a local-only placeholder rendered with the name field in edit mode. The
create_entityevent (withtargetType: "Group") is only submitted after the user provides a name. Pressing Escape or leaving the name empty discards the placeholder with no server interaction. - Reordering: Groups can be reordered within a team via
reorder_entitywithtargetType: "Group". - Conflict detection: Name and description edits (via
update_nameandupdate_description) supportlastSeenSequence.
Principle
Section titled “Principle”A guiding belief or standard that a team follows. Principles represent the “why” behind technology decisions.
Implements INamedEntity, IDescribedEntity, and IOrderableEntity.
| Field | Type | Description |
|---|---|---|
| Id | Guid | Unique identifier |
| Name | string | Principle name (supports *highlight* syntax) |
| NameSequence | long | Sequence number of the last update_name event for this entity |
| Description | string | Detailed description |
| DescriptionSequence | long | Sequence number of the last update_description event for this entity |
| OrderSequence | long | Sequence number of the last reorder_entity event for this entity |
Behaviors
Section titled “Behaviors”- Highlight syntax: Principle names support
*highlighted text*notation. Text between asterisks is rendered in the team color in the UI. - Cross-team assignment: Principles can be copied to other teams via
assign_principle_to_objective. This creates an independent copy — changes to one do not affect the other. - Cascading reference removal: Deleting a principle removes it from the
PrincipleIdslist of all objectives in the same team. - Deferred creation: In the UI, clicking “Add Principle” creates a local-only placeholder rendered with the name field in edit mode. The
create_entityevent (withtargetType: "Principle") is only submitted after the user provides a name. Pressing Escape or leaving the name empty discards the placeholder with no server interaction. - Conflict detection: Name and description edits (via
update_nameandupdate_description) supportlastSeenSequencefor concurrent edit detection.
Objective
Section titled “Objective”A measurable goal aligned to one or more principles. Objectives track progress through their initiatives.
Implements INamedEntity and IOrderableEntity.
| Field | Type | Description |
|---|---|---|
| Id | Guid | Unique identifier |
| Name | string | Objective name |
| NameSequence | long | Sequence number of the last update_name event for this entity |
| GroupId | Guid? | Optional group assignment |
| OrderSequence | long | Sequence number of the last reorder_entity event for this entity |
| PrincipleIds | List<Guid> | IDs of linked principles |
| Initiatives | List<Initiative> | Ordered list of initiatives |
Behaviors
Section titled “Behaviors”- Group assignment: Objectives can be assigned to a group. Unassigned objectives appear in an “Ungrouped” section.
- Principle links: Objectives link to principles by reference (not copies).
- Progress aggregation: Total progress is computed from the average of all initiative progress values.
- Reordering: Objectives can be reordered within a group via
reorder_entitywithtargetType: "Objective". The index is group-slice-relative (0 = first within the group). - Cascading delete: Deleting an objective removes all of its initiatives.
- Deferred creation: In the UI, clicking “Add Objective” creates a local-only placeholder rendered with the name field in edit mode. The
create_entityevent (withtargetType: "Objective") is only submitted after the user provides a name. Pressing Escape or leaving the name empty discards the placeholder with no server interaction. - Conflict detection: Name edits (via
update_name) supportlastSeenSequence.
Initiative
Section titled “Initiative”A concrete project or work item that drives progress on an objective.
Implements INamedEntity and IOrderableEntity.
| Field | Type | Description |
|---|---|---|
| Id | Guid | Unique identifier |
| Name | string | Initiative name |
| NameSequence | long | Sequence number of the last update_name event for this entity |
| Progress | int | Completion percentage (0-100) |
| OrderSequence | long | Sequence number of the last reorder_entity event for this entity |
| JiraKey | string? | Optional Jira issue key |
Behaviors
Section titled “Behaviors”- Progress range: Progress must be between 0 and 100 inclusive.
- Deferred creation: In the UI, initiatives are created in a “pending” state — the
create_entityevent (withtargetType: "Initiative") is only submitted after the user provides a name. - Reordering: Initiatives can be reordered within their objective via
reorder_entitywithtargetType: "Initiative". - Conflict detection: Name edits (via
update_name) supportlastSeenSequence.
Collections and Ordering
Section titled “Collections and Ordering”All collections in the domain model use List<T>, which preserves insertion order and supports insert-at-index operations. This is important for:
- Display order: Entities are displayed in their list order in the UI
- Reorder events:
reorder_entityspecifies a target index; the entity type determines which list is reordered - Drag-and-drop: The UI allows users to reorder entities via drag-and-drop, which maps to
reorder_entityevents
Field Limits
Section titled “Field Limits”The processor enforces maximum lengths on all text fields. See Event Types for the complete list.
Model Classes
Section titled “Model Classes”Domain model classes and interfaces live in src/TechStrat.Core/Model/. The classes are plain C# classes with { get; set; } properties — mutable, since the event processor modifies them in-place during event processing.
src/TechStrat.Core/Model/ INamedEntity.cs — interface: Id, Name, NameSequence IDescribedEntity.cs — interface: Description, DescriptionSequence IOrderableEntity.cs — interface: OrderSequence Strategy.cs Team.cs — implements INamedEntity Group.cs — implements INamedEntity, IDescribedEntity, IOrderableEntity Principle.cs — implements INamedEntity, IDescribedEntity, IOrderableEntity Objective.cs — implements INamedEntity, IOrderableEntity Initiative.cs — implements INamedEntity, IOrderableEntityThese classes have no external dependencies and no behavior — they are pure data containers. All business logic lives in the EventProcessor. The INamedEntity, IDescribedEntity, and IOrderableEntity interfaces enable the generic update_name, update_description, and reorder_entity handlers to operate across entity types without per-type dispatch.