@semacode/cli 1.5.17 → 1.5.19

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 (111) hide show
  1. package/AGENTS.md +268 -260
  2. package/LICENSE +22 -22
  3. package/README.md +93 -61
  4. package/SEMA_BRIEF.curto.txt +8 -6
  5. package/SEMA_BRIEF.md +71 -22
  6. package/SEMA_BRIEF.micro.txt +7 -5
  7. package/SEMA_INDEX.json +931 -193
  8. package/dist/controleComercialSupabase.d.ts +326 -0
  9. package/dist/controleComercialSupabase.js +310 -0
  10. package/dist/controleComercialSupabase.js.map +1 -0
  11. package/dist/docs.js +48 -20
  12. package/dist/docs.js.map +1 -1
  13. package/dist/drift.d.ts +5 -3
  14. package/dist/drift.js +119 -116
  15. package/dist/drift.js.map +1 -1
  16. package/dist/importador.d.ts +1 -1
  17. package/dist/importador.js +1 -200
  18. package/dist/importador.js.map +1 -1
  19. package/dist/index.js +1924 -493
  20. package/dist/index.js.map +1 -1
  21. package/dist/mcpRemoto.d.ts +32 -0
  22. package/dist/mcpRemoto.js +61 -0
  23. package/dist/mcpRemoto.js.map +1 -0
  24. package/dist/projeto.js +3 -21
  25. package/dist/projeto.js.map +1 -1
  26. package/dist/tipos.d.ts +1 -1
  27. package/docs/AGENT_STARTER.md +109 -102
  28. package/docs/cli.md +89 -33
  29. package/docs/como-ensinar-a-sema-para-ia.md +42 -36
  30. package/docs/deploy.md +231 -43
  31. package/docs/documentacao.md +61 -36
  32. package/docs/env.md +63 -14
  33. package/docs/extensao-vscode.md +12 -4
  34. package/docs/fluxo-pratico-ia-sema.md +45 -35
  35. package/docs/instalacao-e-primeiro-uso.md +52 -30
  36. package/docs/integracao-com-ia.md +44 -35
  37. package/docs/mcp.md +270 -31
  38. package/docs/pagamento-ponta-a-ponta.md +40 -24
  39. package/docs/persistencia-vendor-first.md +11 -5
  40. package/docs/prompt-base-ia-sema.md +18 -11
  41. package/docs/rollback.md +17 -15
  42. package/docs/sintaxe.md +37 -229
  43. package/exemplos/agendamento.sema +105 -106
  44. package/exemplos/assinatura.sema +133 -136
  45. package/exemplos/auditoria.sema +89 -88
  46. package/exemplos/autenticacao.sema +125 -125
  47. package/exemplos/author_obra_comum.sema +294 -0
  48. package/exemplos/author_tema_sensivel.sema +264 -0
  49. package/exemplos/automacao.sema +107 -107
  50. package/exemplos/cadastro_usuario.sema +54 -54
  51. package/exemplos/calculadora.sema +78 -78
  52. package/exemplos/crud_simples.sema +89 -89
  53. package/exemplos/estoque.sema +127 -126
  54. package/exemplos/exportacao.sema +94 -94
  55. package/exemplos/fila.sema +130 -131
  56. package/exemplos/integracao_externa.sema +94 -94
  57. package/exemplos/multi_tenant.sema +140 -140
  58. package/exemplos/notificacao.sema +149 -98
  59. package/exemplos/operacao_estrategia.sema +633 -402
  60. package/exemplos/pagamento.sema +434 -222
  61. package/exemplos/pagamento_dominio.sema +35 -35
  62. package/exemplos/pedido.sema +255 -119
  63. package/exemplos/permissao.sema +121 -121
  64. package/exemplos/persistencia_vendor_first.sema +86 -86
  65. package/exemplos/profile_game.sema +114 -0
  66. package/exemplos/profile_legal.sema +105 -0
  67. package/exemplos/profile_ops.sema +110 -0
  68. package/exemplos/profile_research.sema +104 -0
  69. package/exemplos/profile_software.sema +123 -0
  70. package/exemplos/profile_workflow_n8n.sema +99 -0
  71. package/exemplos/relatorio.sema +93 -93
  72. package/exemplos/replica_analitica_erp.sema +160 -0
  73. package/exemplos/testes_embutidos.sema +45 -45
  74. package/exemplos/tratamento_erro.sema +157 -157
  75. package/exemplos/upload_arquivo.sema +93 -93
  76. package/exemplos/webhook.sema +94 -96
  77. package/llms-full.txt +34 -34
  78. package/llms.txt +17 -17
  79. package/node_modules/@sema/gerador-css/dist/index.js +563 -563
  80. package/node_modules/@sema/gerador-css/package.json +1 -1
  81. package/node_modules/@sema/gerador-dart/package.json +1 -1
  82. package/node_modules/@sema/gerador-html/dist/index.js +90 -90
  83. package/node_modules/@sema/gerador-html/package.json +1 -1
  84. package/node_modules/@sema/gerador-javascript/dist/index.js +92 -92
  85. package/node_modules/@sema/gerador-javascript/package.json +1 -1
  86. package/node_modules/@sema/gerador-lua/dist/index.js +53 -53
  87. package/node_modules/@sema/gerador-lua/package.json +1 -1
  88. package/node_modules/@sema/gerador-python/dist/index.js +122 -96
  89. package/node_modules/@sema/gerador-python/dist/index.js.map +1 -1
  90. package/node_modules/@sema/gerador-python/package.json +1 -1
  91. package/node_modules/@sema/gerador-typescript/dist/index.js +153 -153
  92. package/node_modules/@sema/gerador-typescript/package.json +1 -1
  93. package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +2 -4
  94. package/node_modules/@sema/nucleo/dist/formatador/index.js +26 -46
  95. package/node_modules/@sema/nucleo/dist/formatador/index.js.map +1 -1
  96. package/node_modules/@sema/nucleo/dist/ir/conversor.js +9 -204
  97. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +1 -1
  98. package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +3 -35
  99. package/node_modules/@sema/nucleo/dist/lexer/tokens.js +0 -21
  100. package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +1 -1
  101. package/node_modules/@sema/nucleo/dist/parser/parser.js +0 -40
  102. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +1 -1
  103. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +6 -5
  104. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +76 -307
  105. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +1 -1
  106. package/node_modules/@sema/nucleo/dist/semantico/estruturas.d.ts +2 -0
  107. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js +32 -2
  108. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +1 -1
  109. package/node_modules/@sema/nucleo/package.json +1 -1
  110. package/node_modules/@sema/padroes/package.json +1 -1
  111. package/package.json +15 -15
@@ -1,402 +1,633 @@
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
- }
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
+ 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
+ }
174
+ rules {
175
+ strategy_id existe
176
+ semana_referencia existe
177
+ versao_modelo_candidata existe
178
+ }
179
+ effects {
180
+ persistencia discovery_semanal criticidade = alta
181
+ auditoria strategy criticidade = alta
182
+ evento discovery_aberta criticidade = media
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
+ }
196
+ guarantees {
197
+ janela existe
198
+ discovery_registrada == verdadeiro
199
+ }
200
+ tests {
201
+ caso "abre discovery da semana" {
202
+ given {
203
+ strategy_id: "strategy_alpha"
204
+ semana_referencia: "2026-03-30"
205
+ versao_modelo_candidata: "modelo_2026_13"
206
+ }
207
+
208
+ expect {
209
+ sucesso: verdadeiro
210
+ discovery_registrada: verdadeiro
211
+ janela: "janela_strategy_alpha_2026_13"
212
+ }
213
+ }
214
+ }
215
+ }
216
+
217
+ task avaliar_slice_apos_discovery {
218
+ docs {
219
+ resumo: "Decide se um slice segue aberto,entra em quarentena ou precisa ficar bloqueado ate nova avaliacao."
220
+ }
221
+ input {
222
+ strategy_id: Id required
223
+ slice_id: Id required
224
+ precision_observada: Decimal required
225
+ precision_minima: Decimal required
226
+ risco_operacional: Texto required
227
+ }
228
+ output {
229
+ gate_slice: StatusGate
230
+ slice_status: StatusSlice
231
+ motivo_operacional: Texto
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
+ }
265
+ rules {
266
+ strategy_id existe
267
+ slice_id existe
268
+ precision_observada existe
269
+ precision_minima existe
270
+ risco_operacional existe
271
+ }
272
+ effects {
273
+ persistencia slice criticidade = alta
274
+ auditoria discovery_slice criticidade = alta
275
+ notificacao operacao criticidade = media
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
+ }
289
+ guarantees {
290
+ gate_slice existe
291
+ slice_status existe
292
+ motivo_operacional existe
293
+ }
294
+ tests {
295
+ caso "slice ruim fecha gate na avaliacao" {
296
+ given {
297
+ strategy_id: "strategy_alpha"
298
+ slice_id: "slice_under35_serie_a"
299
+ precision_observada: 0.49
300
+ precision_minima: 0.58
301
+ risco_operacional: "drawdown_excessivo"
302
+ }
303
+
304
+ expect {
305
+ sucesso: verdadeiro
306
+ gate_slice: "FECHADO"
307
+ slice_status: "QUARENTENA"
308
+ motivo_operacional: "drawdown_excessivo"
309
+ }
310
+ }
311
+ }
312
+ }
313
+
314
+ task colocar_slice_em_quarentena {
315
+ docs {
316
+ resumo: "Transforma um problema de slice em acao operacional explicita,sem desligar a strategy inteira por reflexo idiota."
317
+ }
318
+ input {
319
+ strategy_id: Id required
320
+ slice_id: Id required
321
+ motivo: Texto required
322
+ origem: Texto required
323
+ data_referencia: Data required
324
+ }
325
+ output {
326
+ slice_status: StatusSlice
327
+ gate_slice: StatusGate
328
+ contexto: ContextoQuarentena
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
+ }
362
+ rules {
363
+ strategy_id existe
364
+ slice_id existe
365
+ motivo existe
366
+ origem existe
367
+ data_referencia existe
368
+ }
369
+ effects {
370
+ persistencia slice criticidade = alta
371
+ persistencia quarentena criticidade = alta
372
+ notificacao operacao criticidade = alta
373
+ auditoria quarentena criticidade = alta
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
+ }
388
+ state governanca_estrategia {
389
+ transitions {
390
+ ATIVA -> QUARENTENA
391
+ }
392
+ }
393
+ guarantees {
394
+ slice_status == QUARENTENA
395
+ gate_slice == FECHADO
396
+ contexto existe
397
+ }
398
+ tests {
399
+ caso "quarentena seletiva fecha so o slice afetado" {
400
+ given {
401
+ strategy_id: "strategy_alpha"
402
+ slice_id: "slice_under35_serie_a"
403
+ motivo: "llm_detectou_noticia_ruim"
404
+ origem: "monitoramento_live"
405
+ data_referencia: "2026-03-30"
406
+ }
407
+
408
+ expect {
409
+ sucesso: verdadeiro
410
+ slice_status: "QUARENTENA"
411
+ gate_slice: "FECHADO"
412
+ contexto: "ctx_quarentena"
413
+ }
414
+ }
415
+ }
416
+ }
417
+
418
+ task fechar_gate_global_strategy {
419
+ docs {
420
+ resumo: "Fecha o gate global quando a strategy inteira precisa parar de liberar sem apagar historico nem perder a trilha da versao ativa."
421
+ }
422
+ input {
423
+ strategy_id: Id required
424
+ motivo_operacional: Texto required
425
+ versao_modelo_ativa: Texto required
426
+ }
427
+ output {
428
+ strategy_status: StatusStrategy
429
+ gate_global: StatusGate
430
+ versao_modelo_ativa: Texto
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
+ }
462
+ rules {
463
+ strategy_id existe
464
+ motivo_operacional existe
465
+ versao_modelo_ativa existe
466
+ }
467
+ effects {
468
+ persistencia strategy criticidade = alta
469
+ notificacao operacao criticidade = alta
470
+ auditoria gate_global criticidade = alta
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
+ }
484
+ guarantees {
485
+ strategy_status == QUARENTENA
486
+ gate_global == FECHADO
487
+ versao_modelo_ativa existe
488
+ }
489
+ tests {
490
+ caso "fecha gate global sem perder versao ativa" {
491
+ given {
492
+ strategy_id: "strategy_alpha"
493
+ motivo_operacional: "sequencia_ruim_em_varias_ligas"
494
+ versao_modelo_ativa: "modelo_2026_12"
495
+ }
496
+
497
+ expect {
498
+ sucesso: verdadeiro
499
+ strategy_status: "QUARENTENA"
500
+ gate_global: "FECHADO"
501
+ versao_modelo_ativa: "modelo_2026_12"
502
+ }
503
+ }
504
+ }
505
+ }
506
+
507
+ task ativar_strategy_com_nova_versao {
508
+ docs {
509
+ resumo: "Promove a versao candidata aprovada e reabre a strategy so quando houver aprovacao manual e gate global devidamente controlado."
510
+ }
511
+ input {
512
+ strategy_id: Id required
513
+ versao_modelo_ativa: Texto required
514
+ versao_modelo_candidata: Texto required
515
+ strategy_status_atual: StatusStrategy required
516
+ gate_global_atual: StatusGate required
517
+ aprovacao_manual: Booleano required
518
+ }
519
+ output {
520
+ strategy_status: StatusStrategy
521
+ gate_global: StatusGate
522
+ versao_modelo_ativa: Texto
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
+ }
557
+ rules {
558
+ strategy_id existe
559
+ versao_modelo_ativa existe
560
+ versao_modelo_candidata existe
561
+ strategy_status_atual em [RASCUNHO, QUARENTENA]
562
+ gate_global_atual == FECHADO
563
+ aprovacao_manual == verdadeiro
564
+ }
565
+ effects {
566
+ persistencia strategy criticidade = alta
567
+ evento strategy_ativada criticidade = alta
568
+ auditoria rollout criticidade = alta
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
+ }
582
+ state governanca_estrategia {
583
+ transitions {
584
+ QUARENTENA -> ATIVA
585
+ RASCUNHO -> ATIVA
586
+ }
587
+ }
588
+ guarantees {
589
+ strategy_status == ATIVA
590
+ gate_global == ABERTO
591
+ versao_modelo_ativa existe
592
+ }
593
+ tests {
594
+ caso "reativa strategy apos aprovacao do novo modelo" {
595
+ given {
596
+ strategy_id: "strategy_alpha"
597
+ versao_modelo_ativa: "modelo_2026_12"
598
+ versao_modelo_candidata: "modelo_2026_13"
599
+ strategy_status_atual: "QUARENTENA"
600
+ gate_global_atual: "FECHADO"
601
+ aprovacao_manual: verdadeiro
602
+ }
603
+
604
+ expect {
605
+ sucesso: verdadeiro
606
+ strategy_status: "ATIVA"
607
+ gate_global: "ABERTO"
608
+ versao_modelo_ativa: "modelo_2026_13"
609
+ }
610
+ }
611
+ }
612
+ }
613
+
614
+ flow governanca_operacional {
615
+ strategy_id: Id
616
+ slice_id: Id
617
+ semana_referencia: Data
618
+ versao_modelo_ativa: Texto
619
+ versao_modelo_candidata: Texto
620
+ precision_observada: Decimal
621
+ precision_minima: Decimal
622
+ risco_operacional: Texto
623
+ motivo_operacional: Texto
624
+ strategy_status_atual: StatusStrategy
625
+ gate_global_atual: StatusGate
626
+ aprovacao_manual: Booleano
627
+ etapa discovery usa registrar_discovery_semanal com strategy_id = strategy_id, semana_referencia = semana_referencia, versao_modelo_candidata = versao_modelo_candidata
628
+ 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
629
+ 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
630
+ 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
631
+ 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
632
+ }
633
+ }