# NATS Subjects Standards

**Версія:** 1.0  
**Статус:** Canonical

---

## Subject Naming Convention

### Формат: `{domain}.{event}.{qualifier}`

---

## 1. Messages

```
message.created.{channel_id}      # Нове повідомлення
message.edited.{channel_id}       # Редагування
message.deleted.{channel_id}      # Видалення
message.reaction.{channel_id}     # Реакція
```

---

## 2. Attachments

```
attachment.created.image          # Завантажено зображення
attachment.created.video          # Завантажено відео
attachment.created.audio          # Завантажено аудіо
attachment.created.document       # Завантажено документ

attachment.parsed.image           # Оброблено (vision)
attachment.parsed.audio           # Оброблено (STT)
attachment.parsed.document        # Оброблено (parser)

attachment.indexed.{type}         # Проіндексовано в Qdrant
```

---

## 3. Agent Operations

```
agent.run.requested.{agent_id}    # Запит на виконання
agent.run.started.{agent_id}      # Почато виконання
agent.run.progress.{agent_id}     # Прогрес (для довгих задач)
agent.run.completed.{agent_id}    # Завершено успішно
agent.run.failed.{agent_id}       # Помилка

# Handoff (orchestration)
agent.handoff.requested.{from}.{to}   # Запит на передачу
agent.handoff.accepted.{from}.{to}    # Прийнято
agent.handoff.completed.{from}.{to}   # Завершено
agent.handoff.rejected.{from}.{to}    # Відхилено
```

---

## 4. Memory Operations

```
memory.fact.created.{scope}       # scope: user|team|public
memory.fact.updated.{scope}
memory.fact.deleted.{scope}

memory.vector.indexed.{scope}     # Проіндексовано в Qdrant
memory.graph.updated.{scope}      # Оновлено в Neo4j
```

---

## 5. Quota & Billing

```
quota.consumed.{user_id}          # Використано ресурс
quota.blocked.{user_id}           # Заблоковано (ліміт)
quota.reset.{user_id}             # Скинуто (новий період)
quota.warning.{user_id}           # Попередження (80%+)
```

---

## 6. Audit (append-only)

```
audit.gateway.request             # Вхідний запит
audit.router.decision             # Рішення маршрутизації
audit.agent.invocation            # Виклик агента
audit.tool.execution              # Виконання інструменту
audit.memory.access               # Доступ до пам'яті
audit.auth.event                  # Auth події
```

---

## 7. Ops & Health

```
ops.health.{service}              # Health check result
ops.alert.critical.{service}      # Критична помилка
ops.alert.warning.{service}       # Попередження
ops.metric.{service}              # Метрика
```

---

## 8. Workflows (CrewAI)

```
workflow.started.{workflow_id}    # Почато workflow
workflow.step.{workflow_id}       # Крок workflow
workflow.completed.{workflow_id}  # Завершено
workflow.failed.{workflow_id}     # Помилка
```

---

## JetStream Streams Configuration

```yaml
streams:
  - name: MESSAGES
    subjects: ["message.>"]
    retention: limits
    max_msgs: 1000000
    max_bytes: 10GB
    max_age: 7d
    
  - name: ATTACHMENTS
    subjects: ["attachment.>"]
    retention: limits
    max_msgs: 100000
    max_bytes: 1GB
    max_age: 30d
    
  - name: AGENT_OPS
    subjects: ["agent.>"]
    retention: limits
    max_msgs: 500000
    max_bytes: 5GB
    max_age: 7d
    
  - name: AUDIT
    subjects: ["audit.>"]
    retention: limits
    max_msgs: -1  # unlimited
    max_bytes: 100GB
    max_age: 365d  # 1 рік
    
  - name: OPS
    subjects: ["ops.>"]
    retention: limits
    max_msgs: 100000
    max_bytes: 1GB
    max_age: 7d
```

---

## Consumer Groups

```yaml
consumers:
  # Parser pipeline
  - name: parser-pipeline
    stream: ATTACHMENTS
    filter: "attachment.created.>"
    deliver_policy: all
    ack_policy: explicit
    max_deliver: 3
    
  # RAG indexer
  - name: rag-indexer
    stream: ATTACHMENTS
    filter: "attachment.parsed.>"
    deliver_policy: all
    ack_policy: explicit
    max_deliver: 3
    
  # CrewAI workers
  - name: crewai-workers
    stream: AGENT_OPS
    filter: "agent.run.requested.>"
    deliver_policy: all
    ack_policy: explicit
    max_deliver: 5
```

---

## Dead Letter Queue (DLQ)

```yaml
dlq:
  stream: DLQ
  subjects: ["dlq.>"]
  retention: limits
  max_age: 30d
  
  # Routing rule: після 3 retries → DLQ
  # Format: dlq.{original_subject}.{error_type}
```

---

**Останнє оновлення:** 2026-01-19
