@semacode/cli 0.9.0 → 1.1.0

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.
Files changed (46) hide show
  1. package/AGENTS.md +50 -0
  2. package/README.md +24 -3
  3. package/SEMA_BRIEF.curto.txt +9 -0
  4. package/SEMA_BRIEF.md +49 -0
  5. package/SEMA_BRIEF.micro.txt +7 -0
  6. package/SEMA_INDEX.json +501 -0
  7. package/dist/drift.d.ts +15 -0
  8. package/dist/drift.js +496 -5
  9. package/dist/drift.js.map +1 -1
  10. package/dist/importador.d.ts +1 -1
  11. package/dist/importador.js +681 -3
  12. package/dist/importador.js.map +1 -1
  13. package/dist/index.js +1578 -123
  14. package/dist/index.js.map +1 -1
  15. package/dist/projeto.js +49 -1
  16. package/dist/projeto.js.map +1 -1
  17. package/dist/tipos.d.ts +1 -1
  18. package/docs/AGENT_STARTER.md +40 -8
  19. package/docs/como-ensinar-a-sema-para-ia.md +17 -11
  20. package/docs/fluxo-pratico-ia-sema.md +42 -38
  21. package/docs/instalacao-e-primeiro-uso.md +196 -0
  22. package/docs/integracao-com-ia.md +228 -0
  23. package/docs/pagamento-ponta-a-ponta.md +155 -0
  24. package/docs/prompt-base-ia-sema.md +10 -3
  25. package/docs/sintaxe.md +267 -0
  26. package/exemplos/automacao.sema +107 -0
  27. package/exemplos/cadastro_usuario.sema +54 -0
  28. package/exemplos/calculadora.sema +78 -0
  29. package/exemplos/crud_simples.sema +89 -0
  30. package/exemplos/operacao_estrategia.sema +402 -0
  31. package/exemplos/pagamento.sema +222 -0
  32. package/exemplos/pagamento_dominio.sema +35 -0
  33. package/exemplos/testes_embutidos.sema +45 -0
  34. package/exemplos/tratamento_erro.sema +157 -0
  35. package/llms-full.txt +34 -0
  36. package/llms.txt +17 -0
  37. package/node_modules/@sema/gerador-dart/package.json +1 -1
  38. package/node_modules/@sema/gerador-python/dist/index.js +92 -10
  39. package/node_modules/@sema/gerador-python/dist/index.js.map +1 -1
  40. package/node_modules/@sema/gerador-python/package.json +1 -1
  41. package/node_modules/@sema/gerador-typescript/package.json +1 -1
  42. package/node_modules/@sema/nucleo/package.json +1 -1
  43. package/node_modules/@sema/padroes/dist/index.js +47 -1
  44. package/node_modules/@sema/padroes/dist/index.js.map +1 -1
  45. package/node_modules/@sema/padroes/package.json +1 -1
  46. package/package.json +15 -7
@@ -0,0 +1,107 @@
1
+ module exemplos.automacao {
2
+ state onboarding_status {
3
+ origem: automacao
4
+ fields {
5
+ lead_id: Id
6
+ etapa_atual: Texto
7
+ concluido: Booleano
8
+ }
9
+ }
10
+
11
+ task executar_onboarding {
12
+ input {
13
+ lead_id: Id required
14
+ email: Email required
15
+ }
16
+ output {
17
+ protocolo: Id
18
+ }
19
+ rules {
20
+ lead_id deve_ser valido
21
+ email deve_ser email_valido
22
+ }
23
+ effects {
24
+ consulta crm
25
+ persistencia conta
26
+ notificacao email detalhe_boas_vindas
27
+ auditoria onboarding
28
+ }
29
+ guarantees {
30
+ protocolo existe
31
+ persistencia concluida
32
+ }
33
+ tests {
34
+ caso "onboarding completo" {
35
+ given {
36
+ lead_id: "lead_1"
37
+ email: "cliente@empresa.com"
38
+ }
39
+
40
+ expect {
41
+ sucesso: verdadeiro
42
+ }
43
+ }
44
+ }
45
+ }
46
+
47
+ task registrar_auditoria {
48
+ input {
49
+ protocolo: Id required
50
+ }
51
+ output {
52
+ auditoria_id: Id
53
+ }
54
+ effects {
55
+ auditoria onboarding
56
+ }
57
+ guarantees {
58
+ auditoria_id existe
59
+ }
60
+ tests {
61
+ caso "auditoria registrada" {
62
+ given {
63
+ protocolo: "prot_1"
64
+ }
65
+
66
+ expect {
67
+ sucesso: verdadeiro
68
+ }
69
+ }
70
+ }
71
+ }
72
+
73
+ task registrar_falha_onboarding {
74
+ input {
75
+ lead_id: Id required
76
+ }
77
+ output {
78
+ protocolo_falha: Id
79
+ }
80
+ effects {
81
+ auditoria falha_onboarding
82
+ persistencia onboarding_falha
83
+ }
84
+ guarantees {
85
+ protocolo_falha existe
86
+ }
87
+ tests {
88
+ caso "falha registrada" {
89
+ given {
90
+ lead_id: "lead_1"
91
+ }
92
+
93
+ expect {
94
+ sucesso: verdadeiro
95
+ }
96
+ }
97
+ }
98
+ }
99
+
100
+ flow onboarding_cliente {
101
+ lead_id: Id
102
+ email: Email
103
+ etapa receber usa executar_onboarding com lead_id = lead_id, email = email quando (sucesso existe ou persistencia concluida) em_sucesso auditar em_erro registrar_falha
104
+ etapa auditar usa registrar_auditoria com protocolo = receber.protocolo depende_de receber
105
+ etapa registrar_falha usa registrar_falha_onboarding com lead_id = lead_id depende_de receber
106
+ }
107
+ }
@@ -0,0 +1,54 @@
1
+ module exemplos.cadastro.usuario {
2
+ docs {
3
+ resumo: "Cadastro de usuario com entidade,validacoes e persistencia declarada."
4
+ }
5
+
6
+ entity Usuario {
7
+ fields {
8
+ id: Id
9
+ nome: Texto
10
+ email: Email
11
+ ativo: Booleano
12
+ }
13
+ }
14
+
15
+ task criar_usuario {
16
+ input {
17
+ nome: Texto required
18
+ email: Email required
19
+ }
20
+ output {
21
+ usuario: Usuario
22
+ }
23
+ rules {
24
+ nome deve_ser preenchido
25
+ email deve_ser email_valido
26
+ email deve_ser unico em Usuario.email
27
+ }
28
+ effects {
29
+ persistencia Usuario
30
+ evento usuario_criado
31
+ auditoria cadastro_usuario
32
+ }
33
+ guarantees {
34
+ usuario existe
35
+ persistencia concluida
36
+ }
37
+ error {
38
+ email_duplicado: "Ja existe usuario com este email."
39
+ entrada_invalida: "Os dados informados nao atendem as regras."
40
+ }
41
+ tests {
42
+ caso "cria usuario valido" {
43
+ given {
44
+ nome: "Ana"
45
+ email: "ana@empresa.com"
46
+ }
47
+
48
+ expect {
49
+ sucesso: verdadeiro
50
+ }
51
+ }
52
+ }
53
+ }
54
+ }
@@ -0,0 +1,78 @@
1
+ module exemplos.calculadora {
2
+ docs {
3
+ resumo: "Operacoes aritmeticas simples com garantias e testes."
4
+ }
5
+
6
+ comments {
7
+ observacao: "Exemplo base para demonstrar tarefas semanticas puras."
8
+ }
9
+
10
+ task somar {
11
+ input {
12
+ a: Numero required
13
+ b: Numero required
14
+ }
15
+ output {
16
+ resultado: Numero
17
+ }
18
+ rules {
19
+ a deve_ser numero_valido
20
+ b deve_ser numero_valido
21
+ }
22
+ effects {
23
+ auditoria operacao soma
24
+ }
25
+ guarantees {
26
+ resultado existe
27
+ }
28
+ error {
29
+ entrada_invalida: "Os valores precisam ser numericos."
30
+ }
31
+ tests {
32
+ caso "soma basica" {
33
+ given {
34
+ a: 2
35
+ b: 3
36
+ }
37
+
38
+ expect {
39
+ sucesso: verdadeiro
40
+ }
41
+ }
42
+ }
43
+ }
44
+
45
+ task dividir {
46
+ input {
47
+ dividendo: Numero required
48
+ divisor: Numero required
49
+ }
50
+ output {
51
+ resultado: Numero
52
+ }
53
+ rules {
54
+ divisor deve_ser diferente_de_zero
55
+ }
56
+ effects {
57
+ auditoria operacao divisao
58
+ }
59
+ guarantees {
60
+ resultado existe
61
+ }
62
+ error {
63
+ divisor_zero: "Nao e permitido dividir por zero."
64
+ }
65
+ tests {
66
+ caso "divisao valida" {
67
+ given {
68
+ dividendo: 10
69
+ divisor: 2
70
+ }
71
+
72
+ expect {
73
+ sucesso: verdadeiro
74
+ }
75
+ }
76
+ }
77
+ }
78
+ }
@@ -0,0 +1,89 @@
1
+ module exemplos.crud.simples {
2
+ entity Produto {
3
+ fields {
4
+ id: Id
5
+ nome: Texto
6
+ preco: Decimal
7
+ ativo: Booleano
8
+ }
9
+ }
10
+
11
+ task criar_produto {
12
+ input {
13
+ nome: Texto required
14
+ preco: Decimal required
15
+ }
16
+ output {
17
+ produto: Produto
18
+ }
19
+ rules {
20
+ nome deve_ser preenchido
21
+ preco deve_ser positivo
22
+ }
23
+ effects {
24
+ persistencia Produto
25
+ auditoria produto_criado
26
+ }
27
+ guarantees {
28
+ produto existe
29
+ }
30
+ tests {
31
+ caso "cria produto" {
32
+ given {
33
+ nome: "Caneca"
34
+ preco: 39.9
35
+ }
36
+
37
+ expect {
38
+ sucesso: verdadeiro
39
+ }
40
+ }
41
+ }
42
+ }
43
+
44
+ task atualizar_produto {
45
+ input {
46
+ id: Id required
47
+ nome: Texto
48
+ preco: Decimal
49
+ }
50
+ output {
51
+ produto: Produto
52
+ }
53
+ rules {
54
+ id deve_ser valido
55
+ }
56
+ effects {
57
+ persistencia Produto
58
+ auditoria produto_atualizado
59
+ }
60
+ guarantees {
61
+ produto existe
62
+ }
63
+ tests {
64
+ caso "atualiza produto" {
65
+ given {
66
+ id: "prod_1"
67
+ }
68
+
69
+ expect {
70
+ sucesso: verdadeiro
71
+ }
72
+ }
73
+ }
74
+ }
75
+
76
+ route produtos {
77
+ metodo: POST
78
+ caminho: /produtos
79
+ task: criar_produto
80
+ finalidade: cadastro_produto
81
+ input {
82
+ nome: Texto
83
+ preco: Decimal
84
+ }
85
+ output {
86
+ produto: Produto
87
+ }
88
+ }
89
+ }
@@ -0,0 +1,402 @@
1
+ module exemplos.operacao_estrategia {
2
+ docs {
3
+ resumo: "Referencia oficial de governanca operacional para strategy,slice,gate,discovery semanal e rollout de nova versao de modelo."
4
+ }
5
+
6
+ type JanelaDiscovery {
7
+ fields {
8
+ semana_referencia: Data
9
+ strategy_id: Id
10
+ versao_modelo_candidata: Texto
11
+ status_discovery: StatusDiscovery
12
+ }
13
+ invariants {
14
+ semana_referencia existe
15
+ strategy_id existe
16
+ versao_modelo_candidata existe
17
+ status_discovery em [ABERTA, EM_AVALIACAO, APROVADA, REJEITADA]
18
+ }
19
+ }
20
+
21
+ type ContextoQuarentena {
22
+ fields {
23
+ motivo: Texto
24
+ origem: Texto
25
+ desde: Data
26
+ }
27
+ invariants {
28
+ motivo existe
29
+ origem existe
30
+ desde existe
31
+ }
32
+ }
33
+
34
+ entity Strategy {
35
+ fields {
36
+ id: Id
37
+ versao_modelo_ativa: Texto
38
+ versao_modelo_candidata: Texto
39
+ status: StatusStrategy
40
+ gate_global: StatusGate
41
+ discovery_atual: JanelaDiscovery
42
+ ultima_quarentena: ContextoQuarentena
43
+ }
44
+ invariants {
45
+ id existe
46
+ versao_modelo_ativa existe
47
+ versao_modelo_candidata existe
48
+ status em [RASCUNHO, ATIVA, QUARENTENA, DESATIVADA]
49
+ gate_global em [ABERTO, FECHADO]
50
+ discovery_atual existe
51
+ ultima_quarentena existe
52
+ }
53
+ }
54
+
55
+ entity Slice {
56
+ fields {
57
+ id: Id
58
+ strategy_id: Id
59
+ status: StatusSlice
60
+ gate: StatusGate
61
+ versao_modelo_ativa: Texto
62
+ versao_modelo_candidata: Texto
63
+ motivo_quarentena: Texto
64
+ precision_observada: Decimal
65
+ }
66
+ invariants {
67
+ id existe
68
+ strategy_id existe
69
+ status em [ATIVO, QUARENTENA, DESLIGADO]
70
+ gate em [ABERTO, FECHADO]
71
+ versao_modelo_ativa existe
72
+ versao_modelo_candidata existe
73
+ motivo_quarentena existe
74
+ precision_observada existe
75
+ }
76
+ }
77
+
78
+ enum StatusStrategy {
79
+ RASCUNHO,
80
+ ATIVA,
81
+ QUARENTENA,
82
+ DESATIVADA
83
+ }
84
+
85
+ enum StatusSlice {
86
+ ATIVO,
87
+ QUARENTENA,
88
+ DESLIGADO
89
+ }
90
+
91
+ enum StatusGate {
92
+ ABERTO,
93
+ FECHADO
94
+ }
95
+
96
+ enum StatusDiscovery {
97
+ ABERTA,
98
+ EM_AVALIACAO,
99
+ APROVADA,
100
+ REJEITADA
101
+ }
102
+
103
+ state governanca_estrategia {
104
+ fields {
105
+ status: StatusStrategy
106
+ slice_status: StatusSlice
107
+ gate_global: StatusGate
108
+ gate_slice: StatusGate
109
+ discovery_status: StatusDiscovery
110
+ versao_modelo_ativa: Texto
111
+ versao_modelo_candidata: Texto
112
+ motivo_operacional: Texto
113
+ }
114
+ invariants {
115
+ status em [RASCUNHO, ATIVA, QUARENTENA, DESATIVADA]
116
+ slice_status em [ATIVO, QUARENTENA, DESLIGADO]
117
+ gate_global em [ABERTO, FECHADO]
118
+ gate_slice em [ABERTO, FECHADO]
119
+ discovery_status em [ABERTA, EM_AVALIACAO, APROVADA, REJEITADA]
120
+ versao_modelo_ativa existe
121
+ versao_modelo_candidata existe
122
+ motivo_operacional existe
123
+ }
124
+ transitions {
125
+ RASCUNHO -> ATIVA
126
+ ATIVA -> QUARENTENA
127
+ QUARENTENA -> ATIVA
128
+ ATIVA -> DESATIVADA
129
+ }
130
+ }
131
+
132
+ task registrar_discovery_semanal {
133
+ docs {
134
+ resumo: "Abre a janela semanal de discovery para uma strategy e marca a versao candidata que esta entrando em avaliacao."
135
+ }
136
+ input {
137
+ strategy_id: Id required
138
+ semana_referencia: Data required
139
+ versao_modelo_candidata: Texto required
140
+ }
141
+ output {
142
+ janela: JanelaDiscovery
143
+ discovery_registrada: Booleano
144
+ }
145
+ rules {
146
+ strategy_id existe
147
+ semana_referencia existe
148
+ versao_modelo_candidata existe
149
+ }
150
+ effects {
151
+ persistencia discovery_semanal criticidade = alta
152
+ auditoria strategy criticidade = alta
153
+ evento discovery_aberta criticidade = media
154
+ }
155
+ guarantees {
156
+ janela existe
157
+ discovery_registrada == verdadeiro
158
+ }
159
+ tests {
160
+ caso "abre discovery da semana" {
161
+ given {
162
+ strategy_id: "strategy_alpha"
163
+ semana_referencia: "2026-03-30"
164
+ versao_modelo_candidata: "modelo_2026_13"
165
+ }
166
+
167
+ expect {
168
+ sucesso: verdadeiro
169
+ }
170
+ }
171
+ }
172
+ }
173
+
174
+ task avaliar_slice_apos_discovery {
175
+ docs {
176
+ resumo: "Decide se um slice segue aberto,entra em quarentena ou precisa ficar bloqueado ate nova avaliacao."
177
+ }
178
+ input {
179
+ strategy_id: Id required
180
+ slice_id: Id required
181
+ precision_observada: Decimal required
182
+ precision_minima: Decimal required
183
+ risco_operacional: Texto required
184
+ }
185
+ output {
186
+ gate_slice: StatusGate
187
+ slice_status: StatusSlice
188
+ motivo_operacional: Texto
189
+ }
190
+ rules {
191
+ strategy_id existe
192
+ slice_id existe
193
+ precision_observada existe
194
+ precision_minima existe
195
+ risco_operacional existe
196
+ }
197
+ effects {
198
+ persistencia slice criticidade = alta
199
+ auditoria discovery_slice criticidade = alta
200
+ notificacao operacao criticidade = media
201
+ }
202
+ guarantees {
203
+ gate_slice existe
204
+ slice_status existe
205
+ motivo_operacional existe
206
+ }
207
+ tests {
208
+ caso "slice ruim fecha gate na avaliacao" {
209
+ given {
210
+ strategy_id: "strategy_alpha"
211
+ slice_id: "slice_under35_serie_a"
212
+ precision_observada: 0.49
213
+ precision_minima: 0.58
214
+ risco_operacional: "drawdown_excessivo"
215
+ }
216
+
217
+ expect {
218
+ sucesso: verdadeiro
219
+ }
220
+ }
221
+ }
222
+ }
223
+
224
+ task colocar_slice_em_quarentena {
225
+ docs {
226
+ resumo: "Transforma um problema de slice em acao operacional explicita,sem desligar a strategy inteira por reflexo idiota."
227
+ }
228
+ input {
229
+ strategy_id: Id required
230
+ slice_id: Id required
231
+ motivo: Texto required
232
+ origem: Texto required
233
+ data_referencia: Data required
234
+ }
235
+ output {
236
+ slice_status: StatusSlice
237
+ gate_slice: StatusGate
238
+ contexto: ContextoQuarentena
239
+ }
240
+ rules {
241
+ strategy_id existe
242
+ slice_id existe
243
+ motivo existe
244
+ origem existe
245
+ data_referencia existe
246
+ }
247
+ effects {
248
+ persistencia slice criticidade = alta
249
+ persistencia quarentena criticidade = alta
250
+ notificacao operacao criticidade = alta
251
+ auditoria quarentena criticidade = alta
252
+ }
253
+ state governanca_estrategia {
254
+ transitions {
255
+ ATIVA -> QUARENTENA
256
+ }
257
+ }
258
+ guarantees {
259
+ slice_status == QUARENTENA
260
+ gate_slice == FECHADO
261
+ contexto existe
262
+ }
263
+ tests {
264
+ caso "quarentena seletiva fecha so o slice afetado" {
265
+ given {
266
+ strategy_id: "strategy_alpha"
267
+ slice_id: "slice_under35_serie_a"
268
+ motivo: "llm_detectou_noticia_ruim"
269
+ origem: "monitoramento_live"
270
+ data_referencia: "2026-03-30"
271
+ }
272
+
273
+ expect {
274
+ sucesso: verdadeiro
275
+ }
276
+ }
277
+ }
278
+ }
279
+
280
+ task fechar_gate_global_strategy {
281
+ docs {
282
+ resumo: "Fecha o gate global quando a strategy inteira precisa parar de liberar sem apagar historico nem perder a trilha da versao ativa."
283
+ }
284
+ input {
285
+ strategy_id: Id required
286
+ motivo_operacional: Texto required
287
+ versao_modelo_ativa: Texto required
288
+ }
289
+ output {
290
+ strategy_status: StatusStrategy
291
+ gate_global: StatusGate
292
+ versao_modelo_ativa: Texto
293
+ }
294
+ rules {
295
+ strategy_id existe
296
+ motivo_operacional existe
297
+ versao_modelo_ativa existe
298
+ }
299
+ effects {
300
+ persistencia strategy criticidade = alta
301
+ notificacao operacao criticidade = alta
302
+ auditoria gate_global criticidade = alta
303
+ }
304
+ guarantees {
305
+ strategy_status == QUARENTENA
306
+ gate_global == FECHADO
307
+ versao_modelo_ativa existe
308
+ }
309
+ tests {
310
+ caso "fecha gate global sem perder versao ativa" {
311
+ given {
312
+ strategy_id: "strategy_alpha"
313
+ motivo_operacional: "sequencia_ruim_em_varias_ligas"
314
+ versao_modelo_ativa: "modelo_2026_12"
315
+ }
316
+
317
+ expect {
318
+ sucesso: verdadeiro
319
+ }
320
+ }
321
+ }
322
+ }
323
+
324
+ task ativar_strategy_com_nova_versao {
325
+ docs {
326
+ resumo: "Promove a versao candidata aprovada e reabre a strategy so quando houver aprovacao manual e gate global devidamente controlado."
327
+ }
328
+ input {
329
+ strategy_id: Id required
330
+ versao_modelo_ativa: Texto required
331
+ versao_modelo_candidata: Texto required
332
+ strategy_status_atual: StatusStrategy required
333
+ gate_global_atual: StatusGate required
334
+ aprovacao_manual: Booleano required
335
+ }
336
+ output {
337
+ strategy_status: StatusStrategy
338
+ gate_global: StatusGate
339
+ versao_modelo_ativa: Texto
340
+ }
341
+ rules {
342
+ strategy_id existe
343
+ versao_modelo_ativa existe
344
+ versao_modelo_candidata existe
345
+ strategy_status_atual em [RASCUNHO, QUARENTENA]
346
+ gate_global_atual == FECHADO
347
+ aprovacao_manual == verdadeiro
348
+ }
349
+ effects {
350
+ persistencia strategy criticidade = alta
351
+ evento strategy_ativada criticidade = alta
352
+ auditoria rollout criticidade = alta
353
+ }
354
+ state governanca_estrategia {
355
+ transitions {
356
+ QUARENTENA -> ATIVA
357
+ RASCUNHO -> ATIVA
358
+ }
359
+ }
360
+ guarantees {
361
+ strategy_status == ATIVA
362
+ gate_global == ABERTO
363
+ versao_modelo_ativa existe
364
+ }
365
+ tests {
366
+ caso "reativa strategy apos aprovacao do novo modelo" {
367
+ given {
368
+ strategy_id: "strategy_alpha"
369
+ versao_modelo_ativa: "modelo_2026_12"
370
+ versao_modelo_candidata: "modelo_2026_13"
371
+ strategy_status_atual: "QUARENTENA"
372
+ gate_global_atual: "FECHADO"
373
+ aprovacao_manual: verdadeiro
374
+ }
375
+
376
+ expect {
377
+ sucesso: verdadeiro
378
+ }
379
+ }
380
+ }
381
+ }
382
+
383
+ flow governanca_operacional {
384
+ strategy_id: Id
385
+ slice_id: Id
386
+ semana_referencia: Data
387
+ versao_modelo_ativa: Texto
388
+ versao_modelo_candidata: Texto
389
+ precision_observada: Decimal
390
+ precision_minima: Decimal
391
+ risco_operacional: Texto
392
+ motivo_operacional: Texto
393
+ strategy_status_atual: StatusStrategy
394
+ gate_global_atual: StatusGate
395
+ aprovacao_manual: Booleano
396
+ etapa discovery usa registrar_discovery_semanal com strategy_id = strategy_id, semana_referencia = semana_referencia, versao_modelo_candidata = versao_modelo_candidata
397
+ etapa avaliar_slice usa avaliar_slice_apos_discovery com strategy_id = strategy_id, slice_id = slice_id, precision_observada = precision_observada, precision_minima = precision_minima, risco_operacional = risco_operacional depende_de discovery
398
+ etapa quarentena_slice usa colocar_slice_em_quarentena com strategy_id = strategy_id, slice_id = slice_id, motivo = motivo_operacional, origem = risco_operacional, data_referencia = semana_referencia quando motivo_operacional existe depende_de avaliar_slice
399
+ etapa fechar_gate_global usa fechar_gate_global_strategy com strategy_id = strategy_id, motivo_operacional = motivo_operacional, versao_modelo_ativa = versao_modelo_ativa quando motivo_operacional existe depende_de quarentena_slice
400
+ etapa reativacao usa ativar_strategy_com_nova_versao com strategy_id = strategy_id, versao_modelo_ativa = versao_modelo_ativa, versao_modelo_candidata = versao_modelo_candidata, strategy_status_atual = strategy_status_atual, gate_global_atual = gate_global_atual, aprovacao_manual = aprovacao_manual quando aprovacao_manual == verdadeiro depende_de fechar_gate_global
401
+ }
402
+ }