SIENTIAPDE-1972: fixa decisoes (JOIN=tag_id, certs=sientia-dataops, metadata vazio) e coluna de write_status via Flyway em tabelas por-modelo
This commit is contained in:
@@ -58,7 +58,7 @@ Mongo `sientia`:
|
||||
|
||||
- **Segurança já é `Basic256Sha256`**; cert de plataforma **único**, baixado do MinIO (bucket `streamlit-connectors`, prefixo `platform/certificates/`) para temp e passado ao `asyncua`.
|
||||
- **Multi-nome por endereço já é permitido** (unicidade em `(connector_id, tag_name)`, nunca em `address`).
|
||||
- **Não existem** `metadata`, `model_id/model_name`, `collection`, `frequency` em `connector_tags`. O subtask 1600 (pendente) adiciona `Category` + **atributos custom como chaves flat na raiz** do doc (não um campo `metadata` nested) — Vitor pediu um campo `metadata`, o que diverge do 1600 (ver §17).
|
||||
- **Não existem** `model_id/model_name`, `collection`, `frequency` em `connector_tags` (vêm do lado modelo/pipeline). O subtask 1600 (pendente) adiciona `Category` + atributos custom como chaves flat na raiz. **Decisão Vitor:** cada tag também tem um campo **`metadata`** (objeto), deixado **vazio** por ora; tags de teste criadas com `metadata: {}` (para documentação).
|
||||
- Fix aplicado: `projects-templates/app/src/operations/db_infra.py:16` corrigido para o caminho local correto da lib (import validado).
|
||||
|
||||
### Escrita hoje (Laborious)
|
||||
@@ -127,7 +127,9 @@ Laborious publica, Gateway consome. Core NATS, subject `opc.write` (avaliar `opc
|
||||
```
|
||||
|
||||
### C3 — Coluna de status de escrita (Postgres, tabela de predições) ⭐ autoritativo em topics.md
|
||||
Nova coluna em `predictions_schema.predictions` (ex.: `write_status` + opcional `write_status_detail`/`write_status_at`). Em **escrita OPC**, o **Gateway** grava o status vinculando por **`timestamp` + `model_id`**. Em **escrita PI Web API**, o **Laborious** grava. Substitui as sentinelas `12/13/14` em `prediction_confidence`. Requer **migração backward-compatible** via `sientia-dataops-database-migrations` (ver §10; confirmar Flyway vs Alembic).
|
||||
Nova coluna no DDL padrão de predições (ex.: `write_status` + opcional `write_status_detail`/`write_status_at`). Em **escrita OPC**, o **Gateway** grava o status vinculando por **`timestamp` + `model_id`**. Em **escrita PI Web API**, o **Laborious** grava. Substitui as sentinelas `12/13/14` em `prediction_confidence`.
|
||||
- **Onde:** schema/tabela de predição são **config por modelo** (`input_data['schema']`/`['table_name']` no Laborious) — não há tabela única fixa. A coluna faz parte do **DDL padrão** de predições; homologar no schema gerenciado pelo Flyway (**`sientia_data`**). Migração via `Aignosi/sientia-dataops-database-migrations` (`.sql` versionado, Job Helm hook), backward-compatible.
|
||||
- **Caveat:** se as tabelas de predição forem criadas dinamicamente por modelo, a coluna precisa entrar no **template de criação** + backfill nas existentes (Flyway sozinho cobre tabelas conhecidas) — confirmar provisionamento com o dono do repo de migrations/Vitor.
|
||||
|
||||
### C4 — GRPC leitura on-demand
|
||||
```
|
||||
@@ -141,7 +143,7 @@ Lê agora, persiste no pipeline e devolve.
|
||||
## 7. Gestão de certificados
|
||||
Reaproveita o mecanismo do 1569: metadados em Mongo `platform_certificates` + arquivos no MinIO. O `OpcConnectionPool` baixa `client_cert`/`private_key` para **`emptyDir`/tmpfs** (root FS é read-only, §12) e passa ao `asyncua` com `Basic256Sha256`, espelhando `_create_opc_ua_client`. Cert de plataforma é único/compartilhado.
|
||||
|
||||
**Bucket (default proposto):** a estratégia de MinIO (`03-database-storage/minio-strategy.md`, Bruno Domingues) é **bucket + user scoped por serviço**, e o bucket do domínio DataOps/`sientia-core` é **`sientia-dataops`**. Hoje o CRUD do 1569 grava os certs no bucket do frontend `streamlit-connectors`. Default do spec: o Gateway lê os certs de **`sientia-dataops`** (domínio dele); reconciliar com a plataforma **onde os certs passam a ser gravados** — mover a escrita do 1569 para `sientia-dataops`, ou conceder ao Gateway policy de leitura no bucket do frontend. Ver §17.
|
||||
**Bucket (DECIDIDO): `sientia-dataops`.** Padrão de MinIO (`03-database-storage/minio-strategy.md`, Bruno Domingues) é bucket + user scoped por serviço; DataOps/`sientia-core` usa **`sientia-dataops`**. O Gateway lê os certs de `sientia-dataops`. **A escrita dos certs do CRUD 1569 passa a ser em `sientia-dataops`** (hoje grava no bucket do frontend `streamlit-connectors`) — ajuste no app 1569 + policy do user do frontend para o bucket DataOps.
|
||||
|
||||
## 8. NATS como nova dependência de plataforma
|
||||
**Decisão: NATS** (definido pelo brief oficial `opc-gateway/topics.md` e confirmado pelo dono da feature, Vitor Pimentel — fonte mais atualizada). O padrão de subjects/queue groups do NATS casa com o comando de escrita ponto-a-ponto de baixa latência.
|
||||
@@ -208,7 +210,7 @@ Nota de plataforma: os docs air-gapped diziam *"do not include RabbitMQ/NATS unl
|
||||
|
||||
## 15. Trilhas paralelas (nível de contrato)
|
||||
- **Orchestrator (1974):** montar slot v2 do banco de tags, propagar `model_id/model_name/collection`, multi-nome. **Integração é net-new** (o orchestrator hoje só usa `connectors_config` de conexão e `pipelines.read_tags` embutidas; não toca `connector_tags`). Alvos: `orchestrator/utils/orchestrator_functions.py` (`gather_read_tags`, `build_tag_config`), `orchestrator/activities/formatters.py` (`process_slots`), `orchestrator/activities/slot_manager.py`.
|
||||
- **Mecânica proposta do JOIN:** `connector_tags` **não tem** `model_id`/`collection`/`frequency`. Então: (a) **identidade da tag + conexão** (address, data_type, `tag_name`, `category`, url/server_uri/security) vêm de `connector_tags`+`connectors` — fonte única; (b) **associação modelo→tag + `collection` + `frequency`** continua vindo do lado modelo/pipeline (hoje `collection = raw_{schedule_name}`, `frequency` no read config). **Chave de junção a confirmar com Vitor:** casar por `(connector/server + address)` (menos migração) **ou** o pipeline passar a referenciar `connector_id`/`tag_id` explicitamente.
|
||||
- **Mecânica do JOIN (DECIDIDO — chave = `tag_id`):** `connector_tags` **não tem** `model_id`/`collection`/`frequency`. Então: (a) **identidade da tag + conexão** (address, data_type, `tag_name`, `category`, url/server_uri/security) vêm de `connector_tags`+`connectors` — fonte única; (b) **associação modelo→tag + `collection` + `frequency`** vêm do lado modelo/pipeline. O pipeline passa a **referenciar `tag_id`** (não `(server+address)`, que é ambíguo sob multi-nome, já que `address` não é único no banco de tags). Cada `tag_id` = 1 nome → mapeia direto para uma entrada de `names` no slot v2. Requer migrar o schema do pipeline para guardar `tag_id`(s).
|
||||
- **Laborious (1975):** publicar no NATS (C2) em vez de `node.write_value`; gravar `write_status` (C3) nas escritas próprias (PI/simples); remover sentinelas `12/13/14` de `process_confidence`/`api.py`.
|
||||
|
||||
## 16. Testes
|
||||
@@ -222,19 +224,17 @@ Nota de plataforma: os docs air-gapped diziam *"do not include RabbitMQ/NATS unl
|
||||
- **Broker = NATS** (Core NATS agora; §8). Definido pelo brief/Vitor.
|
||||
- **Nome da branch:** renomeada para `feature/SIENTIAPDE-1972-...` ✅.
|
||||
|
||||
**Resolvidas nesta rodada (lendo docs/código):**
|
||||
- **Migração = Flyway** — repo `Aignosi/sientia-dataops-database-migrations`, schema Postgres `sientia_data` (substituiu Alembic/SQLAlchemy). Coluna de write_status = `.sql` versionado (V2+), Job Helm hook. Falta só confirmar o nome exato da tabela de predições em prod (`sientia_data` vs `predictions_schema`).
|
||||
- **Bucket de certs (default) = `sientia-dataops`** — padrão de MinIO é bucket scoped por serviço; DataOps usa `sientia-dataops`. Falta só a plataforma decidir *onde os certs passam a ser gravados* (mover escrita do 1569 ou dar policy de leitura). (§7)
|
||||
- **JOIN do 1974:** mecânica proposta em §15 (identidade/conexão do banco de tags; associação/collection/frequency do pipeline). Falta só a *chave de junção* (address+server vs tag_id) — pergunta ao Vitor.
|
||||
- **`metadata`:** o subtask **1600 salva atributos custom como chaves flat na raiz** do doc da tag (não um campo nested). Vitor pediu um **campo `metadata`** — há **discrepância** a confirmar (nested `metadata` vs chaves flat). Pro gateway: tags de teste com `metadata: {}`.
|
||||
**Resolvidas (docs/código + Vitor):**
|
||||
- **Migração = Flyway** — repo `Aignosi/sientia-dataops-database-migrations`, schema `sientia_data` (substituiu Alembic/SQLAlchemy). Coluna = `.sql` versionado (V2+), Job Helm hook.
|
||||
- **Bucket de certs = `sientia-dataops`** (decisão Vitor). Escrita dos certs do 1569 migra p/ esse bucket. (§7)
|
||||
- **JOIN do 1974 = chave `tag_id`** (o pipeline referencia `tag_id`; `(server+address)` é ambíguo sob multi-nome). (§15)
|
||||
- **`metadata` = campo (objeto) na tag, default vazio** (decisão Vitor); tags de teste com `metadata: {}`. (§4)
|
||||
|
||||
**Em aberto (precisam de humano):**
|
||||
1. **Provisionamento do NATS no air-gapped:** subchart/versão/sizing/network policy com a plataforma (a *escolha* já é NATS). (§8) — **plataforma/Bruno**
|
||||
2. **Escrita canônica dos certs:** mover 1569→`sientia-dataops` ou policy cross-bucket. (§7) — **plataforma**
|
||||
3. **Chave de junção do 1974:** `(server+address)` vs `connector_id/tag_id` no pipeline. (§15) — **Vitor**
|
||||
4. **`metadata`:** nested vs chaves flat (discrepância 1600 × pedido do Vitor). — **Vitor**
|
||||
5. **Chamador do GRPC on-demand:** quem chama `ReadTag` e modelo de auth. — **Vitor**
|
||||
6. **Tabela de predições em prod:** schema/nome exato para a migração Flyway. — **Vitor / dono do repo de migrations**
|
||||
1. **Provisionamento do NATS no air-gapped:** subchart/versão/sizing/network policy (a *escolha* já é NATS). (§8) — **plataforma/Bruno**
|
||||
2. **Escrita dos certs 1569 → `sientia-dataops`:** ajuste no app 1569 + policy do user do frontend p/ o bucket DataOps. (§7) — **plataforma**
|
||||
3. **Provisionamento das tabelas de predição:** schema/tabela são config por modelo; a coluna de write_status entra no DDL padrão via Flyway (`sientia_data`) — confirmar se há criação dinâmica (→ template + backfill). (§6 C3) — **Vitor / dono do repo de migrations**
|
||||
4. **Chamador do GRPC on-demand:** quem chama `ReadTag` e modelo de auth. — **Vitor**
|
||||
|
||||
**Adiada por design (nós):**
|
||||
- **Durabilidade da escrita:** Core NATS agora; reavaliar JetStream (TTL curto) se houver perda real em restart.
|
||||
|
||||
Reference in New Issue
Block a user