# Data Model: LLM Chat Assistant for Project Operations

**Feature**: [`021-llm-project-assistant`](specs/021-llm-project-assistant)  
**Spec**: [`spec.md`](specs/021-llm-project-assistant/spec.md)  
**Research**: [`research.md`](specs/021-llm-project-assistant/research.md)

## 1. Entity: AssistantMessage

Represents one chat message in assistant conversation.

### Fields

| Field | Type | Required | Description |
|---|---|---|---|
| message_id | string | Yes | Unique message identifier. |
| conversation_id | string | Yes | Logical chat session/thread identifier. |
| role | enum | Yes | `user`, `assistant`, `system`. |
| text | string | Yes | Message content. |
| created_at | datetime | Yes | Message timestamp. |
| metadata | object | No | Additional structured metadata (state badge, task link, etc.). |

### Validation Rules

- `text` must be non-empty.
- `role` must be one of allowed values.
- `conversation_id` must be bound to authenticated user scope.

---

## 2. Entity: CommandIntent

Represents parsed intent from user message.

### Fields

| Field | Type | Required | Description |
|---|---|---|---|
| intent_id | string | Yes | Parsed intent identifier. |
| domain | enum | Yes | `git`, `migration`, `backup`, `llm`, `status`, `report`, `unknown`. |
| operation | string | Yes | Normalized operation key (e.g., `create_branch`, `execute_migration`). |
| entities | object | No | Parsed parameters (`dashboard_id`, `env`, `task_id`, etc.). |
| confidence | number | Yes | Confidence score `0.0..1.0`. |
| risk_level | enum | Yes | `safe`, `guarded`, `dangerous`. |
| requires_confirmation | boolean | Yes | Indicates confirmation gate requirement. |

### Validation Rules

- `confidence` must be in `[0.0, 1.0]`.
- `requires_confirmation=true` when `risk_level=dangerous`.
- Missing mandatory entities triggers `needs_clarification` decision.

---

## 3. Entity: ExecutionRequest

Validated request ready for dispatch to existing backend action.

### Fields

| Field | Type | Required | Description |
|---|---|---|---|
| execution_id | string | Yes | Execution request identifier. |
| actor_user_id | string | Yes | Authenticated user initiating request. |
| intent_id | string | Yes | Source `CommandIntent` reference. |
| dispatch_target | string | Yes | Internal route/service/plugin target identifier. |
| payload | object | Yes | Validated action payload. |
| status | enum | Yes | `pending`, `dispatched`, `failed`, `denied`, `cancelled`. |
| task_id | string | No | Linked async task id if created. |

### Validation Rules

- Dispatch target must map to known execution backend.
- Permission checks must pass before `dispatched`.

---

## 4. Entity: ConfirmationToken

One-time confirmation artifact for dangerous operations.

### Fields

| Field | Type | Required | Description |
|---|---|---|---|
| confirmation_id | string | Yes | Unique confirmation token id. |
| actor_user_id | string | Yes | User who must confirm/cancel. |
| intent_snapshot | object | Yes | Immutable normalized intent snapshot. |
| expires_at | datetime | Yes | Token expiry timestamp. |
| state | enum | Yes | `pending`, `confirmed`, `cancelled`, `expired`, `consumed`. |
| created_at | datetime | Yes | Creation time. |
| consumed_at | datetime | No | Time of finalization. |

### Validation Rules

- Only token owner can confirm/cancel.
- `confirmed` token transitions to `consumed` after one dispatch.
- Expired token cannot transition to `confirmed`.

---

## 5. Entity: AssistantExecutionLog

Structured audit record of assistant decision and outcome.

### Fields

| Field | Type | Required | Description |
|---|---|---|---|
| log_id | string | Yes | Unique audit id. |
| user_id | string | Yes | Actor user id. |
| conversation_id | string | Yes | Conversation reference. |
| raw_message | string | Yes | Original user message. |
| normalized_intent | object | No | Parsed intent snapshot. |
| decision | enum | Yes | `executed`, `needs_confirmation`, `needs_clarification`, `denied`, `failed`. |
| outcome | enum | Yes | `success`, `error`, `started`, `cancelled`, `n/a`. |
| task_id | string | No | Linked async task id. |
| created_at | datetime | Yes | Audit timestamp. |

### Validation Rules

- Audit entry required for every command-processing attempt.
- `task_id` required when `outcome=started` for async operations.

---

## 6. Relationships

- `AssistantMessage` (user role) -> may produce one `CommandIntent`.
- `CommandIntent` -> may produce one `ExecutionRequest` or `ConfirmationToken`.
- `ConfirmationToken` (confirmed) -> produces one `ExecutionRequest`.
- `ExecutionRequest` -> may link to one async `task_id` in existing task manager.
- Every processed command -> one `AssistantExecutionLog`.

---

## 7. State Flows

### Command Decision Flow

`received` -> `parsed` -> (`needs_clarification` | `denied` | `needs_confirmation` | `dispatch`)

### Confirmation Flow

`pending` -> (`confirmed` -> `consumed`) | `cancelled` | `expired`

### Execution Flow

`pending` -> (`dispatched` -> `started/success`) | `failed` | `denied` | `cancelled`

---

## 8. Scale Assumptions

- Conversation history is moderate per user and can be paginated.
- Command audit retention aligns with existing operational retention policies.
- Assistant parse step must remain lightweight and avoid blocking task execution system.
