> ## Documentation Index
> Fetch the complete documentation index at: https://docs.encoreos.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Core Data Models

> Version: 2.0.0 Last Updated: 2025-12-31

**Version:** 2.0.0\
**Last Updated:** 2025-12-31

This section documents the data models for each core to ensure proper integration patterns are followed.

***

## LO Core: Leadership Operating System Data Model

**Status:** ✅ Implemented (LO-01 through LO-09)

### Tables

| Table                           | Purpose                                       | Key Relationships                                                                  |
| ------------------------------- | --------------------------------------------- | ---------------------------------------------------------------------------------- |
| `lo_accountability_chart`       | One per organization                          | `organization_id` → `pf_organizations`                                             |
| `lo_role_definitions`           | Roles with 5-7 key functions                  | `accountability_chart_id` → `lo_accountability_chart`                              |
| `lo_seat_assignments`           | Person-to-role mappings                       | `profile_id` → `pf_profiles` (NOT hr\_employees)                                   |
| `lo_gwc_assessments`            | GWC scores per seat assignment                | `seat_assignment_id` → `lo_seat_assignments`                                       |
| `lo_vision_documents`           | Vision, mission, core values                  | `organization_id` → `pf_organizations`                                             |
| `lo_strategic_goals`            | 3-year and 1-year goals                       | `vision_document_id` → `lo_vision_documents`                                       |
| `lo_quarterly_rocks`            | 90-day priorities                             | `organization_id` → `pf_organizations`                                             |
| `lo_rock_milestones`            | Sub-tasks within rocks                        | `rock_id` → `lo_quarterly_rocks`                                                   |
| `lo_rock_assignments`           | Team rock assignments                         | `rock_id` → `lo_quarterly_rocks`                                                   |
| `lo_todos`                      | Task management                               | `organization_id` → `pf_organizations`                                             |
| `lo_todo_comments`              | Task discussion threads                       | `todo_id` → `lo_todos`                                                             |
| `lo_scorecards`                 | Weekly scorecard records                      | `role_id` → `lo_role_definitions`                                                  |
| `lo_scorecard_metrics`          | KPI definitions                               | `organization_id` → `pf_organizations`                                             |
| `lo_scorecard_values`           | Weekly metric values                          | `scorecard_id` → `lo_scorecards`                                                   |
| `lo_meetings`                   | Meeting records                               | `organization_id` → `pf_organizations`                                             |
| `lo_meeting_attendees`          | Attendance tracking                           | `meeting_id` → `lo_meetings`                                                       |
| `lo_meeting_action_items`       | Action items linked to todos                  | `meeting_id` → `lo_meetings`, `todo_id` → `lo_todos`                               |
| `lo_issues`                     | Issue records (IDR process)                   | `organization_id` → `pf_organizations`, `meeting_id` → `lo_meetings`               |
| `lo_issue_discussions`          | Discussion threads for issues                 | `issue_id` → `lo_issues`                                                           |
| `lo_one_on_ones`                | 1-on-1 meeting records                        | `organization_id` → `pf_organizations`                                             |
| `lo_feedback`                   | Feedback entries                              | `organization_id` → `pf_organizations`, `one_on_one_id` → `lo_one_on_ones`         |
| `lo_assessments`                | Assessment definitions                        | `organization_id` → `pf_organizations`, `form_id` → `fw_forms`                     |
| `lo_assessment_schedules`       | Distribution schedules                        | `assessment_id` → `lo_assessments`                                                 |
| `lo_assessment_recipients`      | Who receives assessments                      | `schedule_id` → `lo_assessment_schedules`                                          |
| `lo_assessment_responses`       | Response tracking                             | `schedule_id` → `lo_assessment_schedules`, `submission_id` → `fw_form_submissions` |
| `lo_module_settings`            | Org-level LO configuration                    | `organization_id` → `pf_organizations`                                             |
| `lo_knowledge_categories`       | Hierarchical category management              | `organization_id` → `pf_organizations`                                             |
| `lo_knowledge_articles`         | Knowledge base articles with full-text search | `organization_id` → `pf_organizations`                                             |
| `lo_knowledge_article_versions` | Automatic version history                     | `article_id` → `lo_knowledge_articles`                                             |

### Key Design Decisions

1. **User References:** `lo_seat_assignments.profile_id` references `pf_profiles.id` (NOT `hr_employees.id`)
   * Reason: Not all users in seats are employees; allows external board members, advisors, etc.

2. **RLS Pattern:** All tables use `lo_has_org_access()` SECURITY DEFINER function
   * Prevents infinite recursion when checking `pf_user_role_assignments`

3. **Vision-to-Role Alignment:** `lo_role_definitions.vision_alignment` and `strategic_goal_ids[]`
   * Links roles to strategic goals for accountability

4. **Validation Triggers:** Use triggers instead of CHECK constraints
   * `lo_validate_meeting()` - meeting\_type and status validation
   * `lo_validate_meeting_attendee()` - attendee status validation
   * `lo_validate_issue()` - issue priority and status validation
   * `lo_validate_one_on_one()` - 1-on-1 status validation
   * `lo_validate_feedback()` - feedback type and GWC category validation
   * `lo_validate_assessment()` - assessment type validation
   * `lo_validate_assessment_schedule()` - schedule status and scope validation
   * `lo_validate_assessment_response()` - response status validation

### RLS Security Functions

```sql theme={null}
-- SECURITY DEFINER function used by all LO RLS policies
CREATE OR REPLACE FUNCTION lo_has_org_access(org_id UUID, user_id UUID)
RETURNS BOOLEAN
LANGUAGE plpgsql
SECURITY DEFINER
SET search_path = public
AS $$
BEGIN
  RETURN EXISTS (
    SELECT 1 FROM pf_user_role_assignments
    WHERE pf_user_role_assignments.organization_id = org_id
      AND pf_user_role_assignments.user_id = user_id
  );
END;
$$;

-- Admin access function for elevated operations
CREATE OR REPLACE FUNCTION lo_has_admin_access(org_id UUID, user_id UUID)
RETURNS BOOLEAN
LANGUAGE plpgsql
SECURITY DEFINER
SET search_path = public
AS $$
BEGIN
  RETURN EXISTS (
    SELECT 1 FROM pf_user_role_assignments
    WHERE pf_user_role_assignments.organization_id = org_id
      AND pf_user_role_assignments.user_id = user_id
      AND pf_user_role_assignments.system_role >= 'org_admin'
  );
END;
$$;
```

### Integration Points

**Consumes:**

* `pf_profiles` - User identity and display names
* `pf_organizations` - Multi-tenant context
* `pf_user_role_assignments` - RBAC (via SECURITY DEFINER function)
* `fw_forms` - Assessment forms (LO-09)

**Publishes Events:**

* `rock_completed` - When rock is completed ✅
* `todo_created` - When task is created ✅
* `todo_completed` - When task is completed ✅
* `todo_overdue` - When task becomes overdue ✅
* `scorecard_updated` - When scorecard is updated ✅
* `metric_threshold_breached` - When metric breaches threshold ✅
* `meeting_scheduled` - When meeting is scheduled ✅
* `meeting_completed` - When meeting is completed ✅
* `action_item_created` - When action item created ✅
* `issue_identified` - When issue is identified ✅
* `issue_resolved` - When issue is resolved ✅
* `assessment_distributed` - When assessment is distributed ✅
* `assessment_completed` - When assessment is completed ✅

**Downstream Consumers:**

* LO-03: Rocks assigned to roles
* LO-04: To-dos from action items
* LO-05: Scorecards owned by roles
* LO-06: Meetings with agenda items
* LO-07: Issues linked to meetings
* LO-08: Feedback linked to roles

**Planned Events:**

* `one_on_one_scheduled` - When 1-on-1 is scheduled
* `feedback_submitted` - When feedback is provided
* `vision_updated` - When vision is updated
* `strategic_goal_created` - When strategic goal is created
* `rock_created` - When rock is created
* `role_assigned` - When person assigned to role
* `accountability_chart_updated` - When accountability chart structure changes
* `knowledge_article_created` - When knowledge article is created
* `process_updated` - When process is updated

***

## Related Documentation

* [Platform Integration Layers](./PLATFORM_INTEGRATION_LAYERS.md) - Platform layer integrations
* [Event Contracts](./EVENT_CONTRACTS.md) - Event-based integrations
* [API Contracts](./API_CONTRACTS.md) - API-based integrations
* [Cross-Core Integrations](./CROSS_CORE_INTEGRATIONS.md) - Integration matrix

***

**Next Review:** 2026-03-03 (Quarterly)
