@semacode/cli 1.5.17 → 1.5.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +104 -112
- package/SEMA_BRIEF.curto.txt +6 -6
- package/SEMA_BRIEF.md +17 -24
- package/SEMA_BRIEF.micro.txt +5 -5
- package/SEMA_INDEX.json +86 -224
- package/dist/drift.d.ts +3 -3
- package/dist/drift.js +5 -111
- package/dist/drift.js.map +1 -1
- package/dist/importador.d.ts +1 -1
- package/dist/importador.js +1 -200
- package/dist/importador.js.map +1 -1
- package/dist/index.js +59 -479
- package/dist/index.js.map +1 -1
- package/dist/projeto.js +0 -20
- package/dist/projeto.js.map +1 -1
- package/dist/tipos.d.ts +1 -1
- package/docs/AGENT_STARTER.md +9 -8
- package/docs/cli.md +106 -119
- package/docs/como-ensinar-a-sema-para-ia.md +4 -4
- package/docs/env.md +56 -56
- package/docs/fluxo-pratico-ia-sema.md +171 -167
- package/docs/integracao-com-ia.md +98 -96
- package/docs/mcp.md +51 -53
- package/docs/pagamento-ponta-a-ponta.md +11 -1
- package/docs/persistencia-vendor-first.md +1 -1
- package/docs/prompt-base-ia-sema.md +6 -5
- package/docs/rollback.md +1 -1
- package/docs/sintaxe.md +196 -394
- package/exemplos/agendamento.sema +0 -1
- package/exemplos/assinatura.sema +0 -3
- package/exemplos/auditoria.sema +2 -1
- package/exemplos/estoque.sema +2 -1
- package/exemplos/fila.sema +2 -3
- package/exemplos/multi_tenant.sema +2 -2
- package/exemplos/notificacao.sema +53 -2
- package/exemplos/operacao_estrategia.sema +231 -0
- package/exemplos/pagamento.sema +214 -2
- package/exemplos/pedido.sema +156 -20
- package/exemplos/replica_analitica_erp.sema +160 -0
- package/exemplos/webhook.sema +2 -4
- package/node_modules/@sema/gerador-css/package.json +1 -1
- package/node_modules/@sema/gerador-dart/package.json +1 -1
- package/node_modules/@sema/gerador-html/package.json +1 -1
- package/node_modules/@sema/gerador-javascript/package.json +1 -1
- package/node_modules/@sema/gerador-lua/package.json +1 -1
- package/node_modules/@sema/gerador-python/package.json +1 -1
- package/node_modules/@sema/gerador-typescript/package.json +1 -1
- package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +2 -4
- package/node_modules/@sema/nucleo/dist/formatador/index.js +14 -42
- package/node_modules/@sema/nucleo/dist/formatador/index.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/ir/conversor.js +9 -204
- package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +3 -35
- package/node_modules/@sema/nucleo/dist/lexer/tokens.js +0 -21
- package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/parser/parser.js +0 -40
- package/node_modules/@sema/nucleo/dist/parser/parser.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +6 -5
- package/node_modules/@sema/nucleo/dist/semantico/analisador.js +76 -307
- package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/semantico/estruturas.d.ts +2 -0
- package/node_modules/@sema/nucleo/dist/semantico/estruturas.js +32 -2
- package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +1 -1
- package/node_modules/@sema/nucleo/package.json +1 -1
- package/node_modules/@sema/padroes/package.json +1 -1
- package/package.json +14 -14
package/exemplos/assinatura.sema
CHANGED
|
@@ -71,7 +71,6 @@ module exemplos.assinatura {
|
|
|
71
71
|
}
|
|
72
72
|
rules {
|
|
73
73
|
assinatura_id deve_ser valido
|
|
74
|
-
assinatura.status == ATIVA
|
|
75
74
|
motivo deve_ser preenchido
|
|
76
75
|
}
|
|
77
76
|
effects {
|
|
@@ -110,8 +109,6 @@ module exemplos.assinatura {
|
|
|
110
109
|
}
|
|
111
110
|
rules {
|
|
112
111
|
assinatura_id deve_ser valido
|
|
113
|
-
assinatura.status == ATIVA
|
|
114
|
-
assinatura.proximo_vencimento <= hoje
|
|
115
112
|
}
|
|
116
113
|
effects {
|
|
117
114
|
consulta gateway_pagamento criticidade = alta
|
package/exemplos/auditoria.sema
CHANGED
|
@@ -31,6 +31,7 @@ module exemplos.auditoria {
|
|
|
31
31
|
}
|
|
32
32
|
output {
|
|
33
33
|
auditoria_id: Id
|
|
34
|
+
imutavel: Booleano
|
|
34
35
|
}
|
|
35
36
|
rules {
|
|
36
37
|
acao deve_ser preenchida
|
|
@@ -42,7 +43,7 @@ module exemplos.auditoria {
|
|
|
42
43
|
}
|
|
43
44
|
guarantees {
|
|
44
45
|
auditoria_id existe
|
|
45
|
-
|
|
46
|
+
imutavel == verdadeiro
|
|
46
47
|
}
|
|
47
48
|
error {
|
|
48
49
|
falha_persistencia: "Nao foi possivel registrar a auditoria — operacao bloqueada."
|
package/exemplos/estoque.sema
CHANGED
|
@@ -32,6 +32,7 @@ module exemplos.estoque {
|
|
|
32
32
|
}
|
|
33
33
|
output {
|
|
34
34
|
reserva_id: Id
|
|
35
|
+
quantidade_reservada: Inteiro
|
|
35
36
|
}
|
|
36
37
|
rules {
|
|
37
38
|
quantidade > 0
|
|
@@ -46,7 +47,7 @@ module exemplos.estoque {
|
|
|
46
47
|
}
|
|
47
48
|
guarantees {
|
|
48
49
|
reserva_id existe
|
|
49
|
-
|
|
50
|
+
quantidade_reservada existe
|
|
50
51
|
}
|
|
51
52
|
error {
|
|
52
53
|
estoque_insuficiente: "Quantidade solicitada indisponivel em estoque."
|
package/exemplos/fila.sema
CHANGED
|
@@ -50,7 +50,7 @@ module exemplos.fila {
|
|
|
50
50
|
}
|
|
51
51
|
tests {
|
|
52
52
|
caso "enfileira job valido" {
|
|
53
|
-
given { tipo: "envio_email" payload:
|
|
53
|
+
given { tipo: "envio_email" payload: "destinatario:a@b.com" }
|
|
54
54
|
expect { sucesso: verdadeiro }
|
|
55
55
|
}
|
|
56
56
|
}
|
|
@@ -65,7 +65,6 @@ module exemplos.fila {
|
|
|
65
65
|
}
|
|
66
66
|
rules {
|
|
67
67
|
job_id deve_ser valido
|
|
68
|
-
job.status == PENDENTE
|
|
69
68
|
}
|
|
70
69
|
effects {
|
|
71
70
|
persistencia Job
|
|
@@ -105,7 +104,7 @@ module exemplos.fila {
|
|
|
105
104
|
}
|
|
106
105
|
rules {
|
|
107
106
|
job_id deve_ser valido
|
|
108
|
-
|
|
107
|
+
motivo deve_ser preenchido
|
|
109
108
|
}
|
|
110
109
|
effects {
|
|
111
110
|
persistencia Job
|
|
@@ -106,11 +106,11 @@ module exemplos.multi.tenant {
|
|
|
106
106
|
}
|
|
107
107
|
output {
|
|
108
108
|
protocolo: Id
|
|
109
|
+
tenant_ativo: Booleano
|
|
109
110
|
}
|
|
110
111
|
rules {
|
|
111
112
|
tenant_id deve_ser valido
|
|
112
113
|
motivo deve_ser preenchido
|
|
113
|
-
tenant.ativo == verdadeiro
|
|
114
114
|
}
|
|
115
115
|
effects {
|
|
116
116
|
persistencia Tenant
|
|
@@ -125,7 +125,7 @@ module exemplos.multi.tenant {
|
|
|
125
125
|
}
|
|
126
126
|
guarantees {
|
|
127
127
|
protocolo existe
|
|
128
|
-
|
|
128
|
+
tenant_ativo == falso
|
|
129
129
|
}
|
|
130
130
|
error {
|
|
131
131
|
tenant_ja_suspenso: "Tenant ja esta suspenso."
|
|
@@ -85,14 +85,65 @@ module exemplos.notificacao {
|
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
+
task registrar_falha_notificacao {
|
|
89
|
+
input {
|
|
90
|
+
canal: Texto required
|
|
91
|
+
}
|
|
92
|
+
output {
|
|
93
|
+
protocolo_falha: Id
|
|
94
|
+
}
|
|
95
|
+
rules {
|
|
96
|
+
canal deve_ser preenchido
|
|
97
|
+
}
|
|
98
|
+
effects {
|
|
99
|
+
auditoria falha_notificacao
|
|
100
|
+
persistencia Notificacao
|
|
101
|
+
}
|
|
102
|
+
guarantees {
|
|
103
|
+
protocolo_falha existe
|
|
104
|
+
}
|
|
105
|
+
tests {
|
|
106
|
+
caso "registra falha de canal" {
|
|
107
|
+
given { canal: "email" }
|
|
108
|
+
expect { sucesso: verdadeiro }
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
task confirmar_notificacao {
|
|
114
|
+
input {
|
|
115
|
+
destinatario_id: Id required
|
|
116
|
+
}
|
|
117
|
+
output {
|
|
118
|
+
protocolo: Id
|
|
119
|
+
}
|
|
120
|
+
rules {
|
|
121
|
+
destinatario_id deve_ser valido
|
|
122
|
+
}
|
|
123
|
+
effects {
|
|
124
|
+
auditoria notificacao_concluida
|
|
125
|
+
}
|
|
126
|
+
guarantees {
|
|
127
|
+
protocolo existe
|
|
128
|
+
}
|
|
129
|
+
tests {
|
|
130
|
+
caso "confirma notificacao multicanal" {
|
|
131
|
+
given { destinatario_id: "usr_1" }
|
|
132
|
+
expect { sucesso: verdadeiro }
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
88
137
|
flow notificar_multicanal {
|
|
89
138
|
destinatario_id: Id
|
|
90
139
|
titulo: Texto
|
|
91
140
|
corpo: Texto
|
|
141
|
+
canal_email: Texto
|
|
142
|
+
canal_push: Texto
|
|
92
143
|
etapa email usa enviar_email com destinatario = destinatario_id, titulo = titulo, corpo = corpo em_sucesso concluir em_erro registrar_falha_email
|
|
93
144
|
etapa push usa enviar_push com device_token = destinatario_id, titulo = titulo, corpo = corpo em_sucesso concluir em_erro registrar_falha_push
|
|
94
|
-
etapa registrar_falha_email usa registrar_falha_notificacao com canal =
|
|
95
|
-
etapa registrar_falha_push usa registrar_falha_notificacao com canal =
|
|
145
|
+
etapa registrar_falha_email usa registrar_falha_notificacao com canal = canal_email depende_de email
|
|
146
|
+
etapa registrar_falha_push usa registrar_falha_notificacao com canal = canal_push depende_de push
|
|
96
147
|
etapa concluir usa confirmar_notificacao com destinatario_id = destinatario_id depende_de email
|
|
97
148
|
}
|
|
98
149
|
}
|
|
@@ -142,6 +142,35 @@ module exemplos.operacao_estrategia {
|
|
|
142
142
|
janela: JanelaDiscovery
|
|
143
143
|
discovery_registrada: Booleano
|
|
144
144
|
}
|
|
145
|
+
authz {
|
|
146
|
+
escopo: strategy.discovery.operar
|
|
147
|
+
tenant: obrigatorio
|
|
148
|
+
}
|
|
149
|
+
dados {
|
|
150
|
+
classificacao_padrao: interno
|
|
151
|
+
redacao_log: obrigatoria
|
|
152
|
+
input {
|
|
153
|
+
strategy_id: interno
|
|
154
|
+
semana_referencia: interno
|
|
155
|
+
versao_modelo_candidata: interno
|
|
156
|
+
}
|
|
157
|
+
output {
|
|
158
|
+
janela: interno
|
|
159
|
+
discovery_registrada: interno
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
audit {
|
|
163
|
+
evento: strategy.discovery.aberta
|
|
164
|
+
ator: sistema.strategy
|
|
165
|
+
correlacao: request_id
|
|
166
|
+
retencao: "180d"
|
|
167
|
+
motivo: obrigatorio
|
|
168
|
+
}
|
|
169
|
+
forbidden {
|
|
170
|
+
shell.exec
|
|
171
|
+
log.segredo
|
|
172
|
+
retorno.credencial
|
|
173
|
+
}
|
|
145
174
|
rules {
|
|
146
175
|
strategy_id existe
|
|
147
176
|
semana_referencia existe
|
|
@@ -152,6 +181,18 @@ module exemplos.operacao_estrategia {
|
|
|
152
181
|
auditoria strategy criticidade = alta
|
|
153
182
|
evento discovery_aberta criticidade = media
|
|
154
183
|
}
|
|
184
|
+
vinculos {
|
|
185
|
+
tabela: discovery_semanal
|
|
186
|
+
recurso: strategy_registry
|
|
187
|
+
evento: discovery_aberta
|
|
188
|
+
}
|
|
189
|
+
execucao {
|
|
190
|
+
idempotencia: verdadeiro
|
|
191
|
+
timeout: "10s"
|
|
192
|
+
retry: "nenhum"
|
|
193
|
+
compensacao: "fechar_janela_discovery_inconsistente"
|
|
194
|
+
criticidade_operacional: alta
|
|
195
|
+
}
|
|
155
196
|
guarantees {
|
|
156
197
|
janela existe
|
|
157
198
|
discovery_registrada == verdadeiro
|
|
@@ -166,6 +207,8 @@ module exemplos.operacao_estrategia {
|
|
|
166
207
|
|
|
167
208
|
expect {
|
|
168
209
|
sucesso: verdadeiro
|
|
210
|
+
discovery_registrada: verdadeiro
|
|
211
|
+
janela: "janela_strategy_alpha_2026_13"
|
|
169
212
|
}
|
|
170
213
|
}
|
|
171
214
|
}
|
|
@@ -187,6 +230,38 @@ module exemplos.operacao_estrategia {
|
|
|
187
230
|
slice_status: StatusSlice
|
|
188
231
|
motivo_operacional: Texto
|
|
189
232
|
}
|
|
233
|
+
authz {
|
|
234
|
+
escopo: strategy.slice.avaliar
|
|
235
|
+
tenant: obrigatorio
|
|
236
|
+
}
|
|
237
|
+
dados {
|
|
238
|
+
classificacao_padrao: interno
|
|
239
|
+
redacao_log: obrigatoria
|
|
240
|
+
input {
|
|
241
|
+
strategy_id: interno
|
|
242
|
+
slice_id: interno
|
|
243
|
+
precision_observada: interno
|
|
244
|
+
precision_minima: interno
|
|
245
|
+
risco_operacional: interno
|
|
246
|
+
}
|
|
247
|
+
output {
|
|
248
|
+
gate_slice: interno
|
|
249
|
+
slice_status: interno
|
|
250
|
+
motivo_operacional: interno
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
audit {
|
|
254
|
+
evento: strategy.slice.avaliado
|
|
255
|
+
ator: sistema.strategy
|
|
256
|
+
correlacao: request_id
|
|
257
|
+
retencao: "180d"
|
|
258
|
+
motivo: obrigatorio
|
|
259
|
+
}
|
|
260
|
+
forbidden {
|
|
261
|
+
shell.exec
|
|
262
|
+
log.segredo
|
|
263
|
+
retorno.credencial
|
|
264
|
+
}
|
|
190
265
|
rules {
|
|
191
266
|
strategy_id existe
|
|
192
267
|
slice_id existe
|
|
@@ -199,6 +274,18 @@ module exemplos.operacao_estrategia {
|
|
|
199
274
|
auditoria discovery_slice criticidade = alta
|
|
200
275
|
notificacao operacao criticidade = media
|
|
201
276
|
}
|
|
277
|
+
vinculos {
|
|
278
|
+
tabela: slice
|
|
279
|
+
recurso: strategy_registry
|
|
280
|
+
evento: discovery_slice_avaliado
|
|
281
|
+
}
|
|
282
|
+
execucao {
|
|
283
|
+
idempotencia: verdadeiro
|
|
284
|
+
timeout: "10s"
|
|
285
|
+
retry: "nenhum"
|
|
286
|
+
compensacao: "manter_gate_slice_fechado_ate_reavaliacao"
|
|
287
|
+
criticidade_operacional: alta
|
|
288
|
+
}
|
|
202
289
|
guarantees {
|
|
203
290
|
gate_slice existe
|
|
204
291
|
slice_status existe
|
|
@@ -216,6 +303,9 @@ module exemplos.operacao_estrategia {
|
|
|
216
303
|
|
|
217
304
|
expect {
|
|
218
305
|
sucesso: verdadeiro
|
|
306
|
+
gate_slice: "FECHADO"
|
|
307
|
+
slice_status: "QUARENTENA"
|
|
308
|
+
motivo_operacional: "drawdown_excessivo"
|
|
219
309
|
}
|
|
220
310
|
}
|
|
221
311
|
}
|
|
@@ -237,6 +327,38 @@ module exemplos.operacao_estrategia {
|
|
|
237
327
|
gate_slice: StatusGate
|
|
238
328
|
contexto: ContextoQuarentena
|
|
239
329
|
}
|
|
330
|
+
authz {
|
|
331
|
+
escopo: strategy.slice.quarentena
|
|
332
|
+
tenant: obrigatorio
|
|
333
|
+
}
|
|
334
|
+
dados {
|
|
335
|
+
classificacao_padrao: interno
|
|
336
|
+
redacao_log: obrigatoria
|
|
337
|
+
input {
|
|
338
|
+
strategy_id: interno
|
|
339
|
+
slice_id: interno
|
|
340
|
+
motivo: interno
|
|
341
|
+
origem: interno
|
|
342
|
+
data_referencia: interno
|
|
343
|
+
}
|
|
344
|
+
output {
|
|
345
|
+
slice_status: interno
|
|
346
|
+
gate_slice: interno
|
|
347
|
+
contexto: interno
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
audit {
|
|
351
|
+
evento: strategy.slice.quarentena
|
|
352
|
+
ator: sistema.strategy
|
|
353
|
+
correlacao: request_id
|
|
354
|
+
retencao: "180d"
|
|
355
|
+
motivo: obrigatorio
|
|
356
|
+
}
|
|
357
|
+
forbidden {
|
|
358
|
+
shell.exec
|
|
359
|
+
log.segredo
|
|
360
|
+
retorno.credencial
|
|
361
|
+
}
|
|
240
362
|
rules {
|
|
241
363
|
strategy_id existe
|
|
242
364
|
slice_id existe
|
|
@@ -250,6 +372,19 @@ module exemplos.operacao_estrategia {
|
|
|
250
372
|
notificacao operacao criticidade = alta
|
|
251
373
|
auditoria quarentena criticidade = alta
|
|
252
374
|
}
|
|
375
|
+
vinculos {
|
|
376
|
+
tabela: slice
|
|
377
|
+
tabela: quarentena
|
|
378
|
+
recurso: strategy_registry
|
|
379
|
+
evento: slice_quarentena
|
|
380
|
+
}
|
|
381
|
+
execucao {
|
|
382
|
+
idempotencia: verdadeiro
|
|
383
|
+
timeout: "10s"
|
|
384
|
+
retry: "nenhum"
|
|
385
|
+
compensacao: "reabrir_slice_por_revisao_manual"
|
|
386
|
+
criticidade_operacional: alta
|
|
387
|
+
}
|
|
253
388
|
state governanca_estrategia {
|
|
254
389
|
transitions {
|
|
255
390
|
ATIVA -> QUARENTENA
|
|
@@ -272,6 +407,9 @@ module exemplos.operacao_estrategia {
|
|
|
272
407
|
|
|
273
408
|
expect {
|
|
274
409
|
sucesso: verdadeiro
|
|
410
|
+
slice_status: "QUARENTENA"
|
|
411
|
+
gate_slice: "FECHADO"
|
|
412
|
+
contexto: "ctx_quarentena"
|
|
275
413
|
}
|
|
276
414
|
}
|
|
277
415
|
}
|
|
@@ -291,6 +429,36 @@ module exemplos.operacao_estrategia {
|
|
|
291
429
|
gate_global: StatusGate
|
|
292
430
|
versao_modelo_ativa: Texto
|
|
293
431
|
}
|
|
432
|
+
authz {
|
|
433
|
+
escopo: strategy.gate.fechar
|
|
434
|
+
tenant: obrigatorio
|
|
435
|
+
}
|
|
436
|
+
dados {
|
|
437
|
+
classificacao_padrao: interno
|
|
438
|
+
redacao_log: obrigatoria
|
|
439
|
+
input {
|
|
440
|
+
strategy_id: interno
|
|
441
|
+
motivo_operacional: interno
|
|
442
|
+
versao_modelo_ativa: interno
|
|
443
|
+
}
|
|
444
|
+
output {
|
|
445
|
+
strategy_status: interno
|
|
446
|
+
gate_global: interno
|
|
447
|
+
versao_modelo_ativa: interno
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
audit {
|
|
451
|
+
evento: strategy.gate_global.fechado
|
|
452
|
+
ator: sistema.strategy
|
|
453
|
+
correlacao: request_id
|
|
454
|
+
retencao: "180d"
|
|
455
|
+
motivo: obrigatorio
|
|
456
|
+
}
|
|
457
|
+
forbidden {
|
|
458
|
+
shell.exec
|
|
459
|
+
log.segredo
|
|
460
|
+
retorno.credencial
|
|
461
|
+
}
|
|
294
462
|
rules {
|
|
295
463
|
strategy_id existe
|
|
296
464
|
motivo_operacional existe
|
|
@@ -301,6 +469,18 @@ module exemplos.operacao_estrategia {
|
|
|
301
469
|
notificacao operacao criticidade = alta
|
|
302
470
|
auditoria gate_global criticidade = alta
|
|
303
471
|
}
|
|
472
|
+
vinculos {
|
|
473
|
+
tabela: strategy
|
|
474
|
+
recurso: strategy_registry
|
|
475
|
+
evento: gate_global_fechado
|
|
476
|
+
}
|
|
477
|
+
execucao {
|
|
478
|
+
idempotencia: verdadeiro
|
|
479
|
+
timeout: "10s"
|
|
480
|
+
retry: "nenhum"
|
|
481
|
+
compensacao: "manter_strategy_em_quarentena"
|
|
482
|
+
criticidade_operacional: alta
|
|
483
|
+
}
|
|
304
484
|
guarantees {
|
|
305
485
|
strategy_status == QUARENTENA
|
|
306
486
|
gate_global == FECHADO
|
|
@@ -316,6 +496,9 @@ module exemplos.operacao_estrategia {
|
|
|
316
496
|
|
|
317
497
|
expect {
|
|
318
498
|
sucesso: verdadeiro
|
|
499
|
+
strategy_status: "QUARENTENA"
|
|
500
|
+
gate_global: "FECHADO"
|
|
501
|
+
versao_modelo_ativa: "modelo_2026_12"
|
|
319
502
|
}
|
|
320
503
|
}
|
|
321
504
|
}
|
|
@@ -338,6 +521,39 @@ module exemplos.operacao_estrategia {
|
|
|
338
521
|
gate_global: StatusGate
|
|
339
522
|
versao_modelo_ativa: Texto
|
|
340
523
|
}
|
|
524
|
+
authz {
|
|
525
|
+
escopo: strategy.rollout.ativar
|
|
526
|
+
tenant: obrigatorio
|
|
527
|
+
}
|
|
528
|
+
dados {
|
|
529
|
+
classificacao_padrao: interno
|
|
530
|
+
redacao_log: obrigatoria
|
|
531
|
+
input {
|
|
532
|
+
strategy_id: interno
|
|
533
|
+
versao_modelo_ativa: interno
|
|
534
|
+
versao_modelo_candidata: interno
|
|
535
|
+
strategy_status_atual: interno
|
|
536
|
+
gate_global_atual: interno
|
|
537
|
+
aprovacao_manual: interno
|
|
538
|
+
}
|
|
539
|
+
output {
|
|
540
|
+
strategy_status: interno
|
|
541
|
+
gate_global: interno
|
|
542
|
+
versao_modelo_ativa: interno
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
audit {
|
|
546
|
+
evento: strategy.rollout.ativado
|
|
547
|
+
ator: sistema.strategy
|
|
548
|
+
correlacao: request_id
|
|
549
|
+
retencao: "180d"
|
|
550
|
+
motivo: obrigatorio
|
|
551
|
+
}
|
|
552
|
+
forbidden {
|
|
553
|
+
shell.exec
|
|
554
|
+
log.segredo
|
|
555
|
+
retorno.credencial
|
|
556
|
+
}
|
|
341
557
|
rules {
|
|
342
558
|
strategy_id existe
|
|
343
559
|
versao_modelo_ativa existe
|
|
@@ -351,6 +567,18 @@ module exemplos.operacao_estrategia {
|
|
|
351
567
|
evento strategy_ativada criticidade = alta
|
|
352
568
|
auditoria rollout criticidade = alta
|
|
353
569
|
}
|
|
570
|
+
vinculos {
|
|
571
|
+
tabela: strategy
|
|
572
|
+
recurso: model_registry
|
|
573
|
+
evento: strategy_ativada
|
|
574
|
+
}
|
|
575
|
+
execucao {
|
|
576
|
+
idempotencia: verdadeiro
|
|
577
|
+
timeout: "15s"
|
|
578
|
+
retry: "nenhum"
|
|
579
|
+
compensacao: "reverter_para_versao_modelo_ativa_anterior"
|
|
580
|
+
criticidade_operacional: alta
|
|
581
|
+
}
|
|
354
582
|
state governanca_estrategia {
|
|
355
583
|
transitions {
|
|
356
584
|
QUARENTENA -> ATIVA
|
|
@@ -375,6 +603,9 @@ module exemplos.operacao_estrategia {
|
|
|
375
603
|
|
|
376
604
|
expect {
|
|
377
605
|
sucesso: verdadeiro
|
|
606
|
+
strategy_status: "ATIVA"
|
|
607
|
+
gate_global: "ABERTO"
|
|
608
|
+
versao_modelo_ativa: "modelo_2026_13"
|
|
378
609
|
}
|
|
379
610
|
}
|
|
380
611
|
}
|