@semacode/cli 1.5.27 → 1.5.29

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 (81) hide show
  1. package/AGENTS.md +279 -265
  2. package/AGENT_CONTEXT_PACK.json +164 -0
  3. package/README.md +144 -144
  4. package/SEMA_BRIEF.curto.txt +7 -7
  5. package/SEMA_BRIEF.md +464 -65
  6. package/SEMA_BRIEF.micro.txt +6 -6
  7. package/SEMA_INDEX.json +6723 -667
  8. package/dist/bridge.d.ts +52 -0
  9. package/dist/bridge.js +318 -0
  10. package/dist/bridge.js.map +1 -0
  11. package/dist/comandos.d.ts +11 -0
  12. package/dist/comandos.js +110 -0
  13. package/dist/comandos.js.map +1 -0
  14. package/dist/contexto.d.ts +34 -0
  15. package/dist/contexto.js +197 -0
  16. package/dist/contexto.js.map +1 -0
  17. package/dist/drift.d.ts +1 -1
  18. package/dist/drift.js +32 -5
  19. package/dist/drift.js.map +1 -1
  20. package/dist/index.js +391 -64
  21. package/dist/index.js.map +1 -1
  22. package/dist/lua-symbols.d.ts +0 -6
  23. package/dist/lua-symbols.js +11 -78
  24. package/dist/lua-symbols.js.map +1 -1
  25. package/dist/projeto.js +6 -0
  26. package/dist/projeto.js.map +1 -1
  27. package/dist/tipos.d.ts +1 -1
  28. package/docs/AGENT_STARTER.md +109 -109
  29. package/docs/api.md +82 -0
  30. package/docs/cli.md +175 -175
  31. package/docs/como-ensinar-a-sema-para-ia.md +155 -155
  32. package/docs/deploy.md +93 -0
  33. package/docs/documentacao.md +88 -88
  34. package/docs/env.md +105 -105
  35. package/docs/extensao-vscode.md +53 -53
  36. package/docs/fluxo-pratico-ia-sema.md +187 -187
  37. package/docs/instalacao-e-primeiro-uso.md +134 -134
  38. package/docs/integracao-com-ia.md +110 -110
  39. package/docs/mcp.md +292 -292
  40. package/docs/pagamento-ponta-a-ponta.md +171 -171
  41. package/docs/persistencia-vendor-first.md +151 -151
  42. package/docs/prompt-base-ia-sema.md +111 -111
  43. package/docs/repositories.md +54 -54
  44. package/docs/rollback.md +49 -49
  45. package/docs/seguranca.md +126 -126
  46. package/docs/sintaxe.md +218 -218
  47. package/exemplos/author_obra_comum.sema +294 -294
  48. package/exemplos/author_tema_sensivel.sema +264 -264
  49. package/exemplos/profile_game.sema +114 -114
  50. package/exemplos/profile_legal.sema +105 -105
  51. package/exemplos/profile_ops.sema +110 -110
  52. package/exemplos/profile_research.sema +104 -104
  53. package/exemplos/profile_software.sema +123 -123
  54. package/exemplos/profile_workflow_n8n.sema +99 -99
  55. package/llms-full.txt +10 -9
  56. package/llms.txt +8 -7
  57. package/node_modules/@sema/gerador-css/package.json +1 -1
  58. package/node_modules/@sema/gerador-dart/package.json +1 -1
  59. package/node_modules/@sema/gerador-html/package.json +1 -1
  60. package/node_modules/@sema/gerador-javascript/package.json +1 -1
  61. package/node_modules/@sema/gerador-lua/package.json +1 -1
  62. package/node_modules/@sema/gerador-python/package.json +1 -1
  63. package/node_modules/@sema/gerador-typescript/package.json +1 -1
  64. package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +1 -1
  65. package/node_modules/@sema/nucleo/dist/index.d.ts +17 -0
  66. package/node_modules/@sema/nucleo/dist/index.js +28 -0
  67. package/node_modules/@sema/nucleo/dist/index.js.map +1 -1
  68. package/node_modules/@sema/nucleo/dist/ir/conversor.js +4 -0
  69. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +1 -1
  70. package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +3 -3
  71. package/node_modules/@sema/nucleo/dist/parser/parser.js +2 -0
  72. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +1 -1
  73. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +2 -2
  74. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +3 -1
  75. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +1 -1
  76. package/node_modules/@sema/nucleo/package.json +1 -1
  77. package/node_modules/@sema/padroes/package.json +1 -1
  78. package/package.json +11 -10
  79. package/dist/php-symbols.d.ts +0 -24
  80. package/dist/php-symbols.js +0 -375
  81. package/dist/php-symbols.js.map +0 -1
package/AGENTS.md CHANGED
@@ -1,12 +1,8 @@
1
- # Sema — Regras obrigatorias para IA
2
-
3
- O Sema e o protocolo de governanca de intencao deste projeto.
4
- Toda IA deve consultar o Sema antes de qualquer acao sobre codigo ou contratos.
5
-
6
- ## Mentalidade
7
-
8
- Pense como IA, nao como humano. Voce nao esta "programando" — esta consumindo e produzindo contratos semanticos estruturados. Ao ler um arquivo .sema, trate cada bloco como um no de grafo com entradas, saidas, efeitos e garantias. Ao gerar codigo, derive tudo do contrato — nunca invente logica que nao esteja declarada. O Sema existe para que voce opere com precisao, rastreabilidade e zero adivinhacao.
9
-
1
+ # Sema — Regras obrigatorias para IA
2
+
3
+ O Sema e o contrato semantico IA-first deste projeto.
4
+ Toda IA deve consultar o Sema antes de qualquer acao sobre codigo ou contratos. Humanos escrevem e aprovam; agentes consomem o contrato para operar software vivo.
5
+
10
6
  ## Regras
11
7
 
12
8
  1. Ao abrir o projeto, chame sema_resumo para entender o estado atual.
@@ -17,264 +13,282 @@ Pense como IA, nao como humano. Voce nao esta "programando" — esta consumindo
17
13
  6. Se qualquer ferramenta Sema retornar erro, corrija o problema antes de prosseguir — nao avance com codigo enquanto houver erros Sema pendentes.
18
14
  7. Contrato vem antes de qualquer acao: crie, edite ou remova o `.sema` aplicavel antes de codigo, deploy, docs operacionais, workflow, texto Author, game, legal, research ou ops.
19
15
 
20
- ## Documentação pública
21
-
22
- Toda documentação pública nova ou alterada deve expor entrada trilíngue nesta ordem exata: English, Português, Español.
23
- Português e espanhol precisam preservar acentos. README do GitHub, README do npm, docs públicas, notas de release e textos públicos do site não podem voltar para português sem acento nem para documento monolíngue.
24
-
25
16
  ## MCP
26
17
 
27
18
  O servidor MCP do Sema e uma superficie privada/comercial acessada por endpoint remoto autorizado; ele nao e instalado por pacote npm publico neste repositorio.
28
- Use as ferramentas: sema_resumo, sema_validar, sema_drift, sema_impacto, sema_renomear_semantico, sema_inspecionar, sema_ir, sema_verificar, sema_contexto_ia, sema_prompt_ia, sema_author_iniciar, sema_author_validar, sema_author_briefing, sema_author_revisar_cliches, sema_sync_ai_entrypoints, sema_instalar_exemplos, sema_docs_impacto, sema_finalizar_mudanca.
19
+ Use as ferramentas quando o endpoint privado estiver configurado: sema_resumo, sema_validar, sema_drift, sema_impacto, sema_renomear_semantico, sema_inspecionar, sema_ir, sema_verificar, sema_contexto_ia, sema_prompt_ia, sema_author_iniciar, sema_author_validar, sema_author_briefing, sema_author_revisar_cliches, sema_sync_ai_entrypoints, sema_instalar_exemplos, sema_docs_impacto, sema_finalizar_mudanca.
29
20
 
30
21
  O MCP deve deixar claro em toda orientacao: se nao existe contrato, crie; se a intencao mudou, edite; se a capacidade saiu, remova ou aposente. Isso vale para todo tipo de Sema: Software, Author, Workflow, Ops, Game, Legal, Research e profiles futuros.
31
-
32
- ## Contratos e exemplos
33
-
34
- - Sempre salve arquivos .sema na pasta `contratos/` do projeto.
35
- - Crie um arquivo .sema por modulo ou contexto de negocio. Exemplo: `contratos/pedido.sema`, `contratos/pagamento.sema`, `contratos/usuario.sema`. Nunca coloque modulos de contextos diferentes no mesmo arquivo.
36
- - Antes de criar qualquer arquivo .sema, leia todos os arquivos da pasta `exemplos/` para entender o formato correto da linguagem.
37
- - Nunca edite os arquivos da pasta `exemplos/`.
38
-
39
- ## Quando o projeto nao tem .sema
40
-
41
- Pergunte ao usuario se deseja semantizar o projeto e sugira: sema iniciar
42
-
43
- ## Exemplos de arquivos .sema (referencia de formato)
44
-
45
- ### 1. Task simples com testes
46
- ```
47
- module exemplos.calculadora {
48
- task somar {
49
- input {
50
- a: Numero required
51
- b: Numero required
52
- }
53
- output {
54
- resultado: Numero
55
- }
56
- rules {
57
- a deve_ser numero_valido
58
- b deve_ser numero_valido
59
- }
60
- effects {
61
- auditoria operacao soma
62
- }
63
- guarantees {
64
- resultado existe
65
- }
66
- error {
67
- entrada_invalida: "Os valores precisam ser numericos."
68
- }
69
- tests {
70
- caso "soma basica" {
71
- given { a: 2 b: 3 }
72
- expect { sucesso: verdadeiro }
73
- }
74
- }
75
- }
76
- }
77
- ```
78
-
79
- ### 2. Entity + CRUD com route
80
- ```
81
- module exemplos.crud.simples {
82
- entity Produto {
83
- fields {
84
- id: Id
85
- nome: Texto
86
- preco: Decimal
87
- ativo: Booleano
88
- }
89
- }
90
-
91
- task criar_produto {
92
- input {
93
- nome: Texto required
94
- preco: Decimal required
95
- }
96
- output {
97
- produto: Produto
98
- }
99
- rules {
100
- nome deve_ser preenchido
101
- preco deve_ser positivo
102
- }
103
- effects {
104
- persistencia Produto
105
- auditoria produto_criado
106
- }
107
- guarantees {
108
- produto existe
109
- }
110
- tests {
111
- caso "cria produto" {
112
- given { nome: "Caneca" preco: 39.9 }
113
- expect { sucesso: verdadeiro }
114
- }
115
- }
116
- }
117
-
118
- route produtos {
119
- metodo: POST
120
- caminho: /produtos
121
- task: criar_produto
122
- finalidade: cadastro_produto
123
- input { nome: Texto preco: Decimal }
124
- output { produto: Produto }
125
- }
126
- }
127
- ```
128
-
129
- ### 3. Cadastro com validacoes e unicidade
130
- ```
131
- module exemplos.cadastro.usuario {
132
- entity Usuario {
133
- fields {
134
- id: Id
135
- nome: Texto
136
- email: Email
137
- ativo: Booleano
138
- }
139
- }
140
-
141
- task criar_usuario {
142
- input {
143
- nome: Texto required
144
- email: Email required
145
- }
146
- output {
147
- usuario: Usuario
148
- }
149
- rules {
150
- nome deve_ser preenchido
151
- email deve_ser email_valido
152
- email deve_ser unico em Usuario.email
153
- }
154
- effects {
155
- persistencia Usuario
156
- evento usuario_criado
157
- auditoria cadastro_usuario
158
- }
159
- guarantees {
160
- usuario existe
161
- persistencia concluida
162
- }
163
- error {
164
- email_duplicado: "Ja existe usuario com este email."
165
- entrada_invalida: "Os dados informados nao atendem as regras."
166
- }
167
- tests {
168
- caso "cria usuario valido" {
169
- given { nome: "Ana" email: "ana@empresa.com" }
170
- expect { sucesso: verdadeiro }
171
- }
172
- }
173
- }
174
- }
175
- ```
176
-
177
- ### 4. Pagamento com state e flow
178
- ```
179
- module exemplos.pagamento {
180
- task processar_pagamento {
181
- input {
182
- pagamento_id: Id required
183
- valor: Decimal required
184
- token: Texto required
185
- }
186
- output {
187
- pagamento: Pagamento
188
- status: StatusPagamento
189
- }
190
- rules {
191
- valor > 0
192
- token deve_ser valido
193
- }
194
- effects {
195
- consulta gateway_pagamento criticidade = alta
196
- persistencia Pagamento criticidade = alta
197
- evento pagamento_autorizado criticidade = media
198
- auditoria pagamento criticidade = alta
199
- }
200
- state ciclo_pagamento {
201
- transitions {
202
- PENDENTE -> AUTORIZADO
203
- AUTORIZADO -> PROCESSADO
204
- }
205
- }
206
- guarantees {
207
- pagamento existe
208
- status em [AUTORIZADO, PROCESSADO]
209
- }
210
- error {
211
- autorizacao_negada: "Recusado pelo gateway."
212
- timeout_gateway: "Gateway nao respondeu."
213
- }
214
- tests {
215
- caso "pagamento autorizado" {
216
- given { pagamento_id: "pag_1" valor: 199.9 token: "tok_ok" }
217
- expect { sucesso: verdadeiro }
218
- }
219
- caso "pagamento recusado" {
220
- given { pagamento_id: "pag_err" valor: 10 token: "tok_recusado" }
221
- expect { sucesso: falso }
222
- error { tipo: "autorizacao_negada" }
223
- }
224
- }
225
- }
226
-
227
- flow orquestracao_pagamento {
228
- pagamento_id: Id
229
- valor: Decimal
230
- token: Texto
231
- etapa autorizar usa processar_pagamento com pagamento_id = pagamento_id, valor = valor, token = token em_sucesso confirmar em_erro registrar_falha
232
- etapa confirmar usa confirmar_pagamento com pagamento_id = pagamento_id depende_de autorizar
233
- etapa registrar_falha usa registrar_timeout_pagamento com pagamento_id = pagamento_id depende_de autorizar
234
- }
235
- }
236
- ```
237
-
238
- ### 5. Tratamento de erro com flow ramificado
239
- ```
240
- module exemplos.tratamento.erro {
241
- task executar_operacao_sensivel {
242
- input {
243
- chave: Texto required
244
- }
245
- output {
246
- protocolo: Id
247
- }
248
- rules {
249
- chave deve_ser preenchida
250
- }
251
- effects {
252
- consulta cofre
253
- auditoria falha_operacao_sensivel
254
- }
255
- guarantees {
256
- protocolo existe
257
- }
258
- error {
259
- acesso_negado: "A chave nao tem permissao."
260
- recurso_indisponivel: "Servico temporariamente indisponivel."
261
- }
262
- tests {
263
- caso "falha por acesso negado" {
264
- given { chave: "sem_permissao" }
265
- expect { sucesso: falso }
266
- error { tipo: "acesso_negado" }
267
- }
268
- }
269
- }
270
-
271
- flow resposta_segura {
272
- chave: Texto
273
- etapa tentar usa executar_operacao_sensivel com chave = chave em_sucesso concluir em_erro registrar_falha por_erro acesso_negado = tratar_acesso_negado, recurso_indisponivel = agendar_retentativa
274
- etapa tratar_acesso_negado usa responder_acesso_negado com chave = chave depende_de tentar
275
- etapa agendar_retentativa usa responder_retentativa com chave = chave depende_de tentar
276
- etapa registrar_falha usa registrar_auditoria_falha com chave = chave depende_de tentar
277
- etapa concluir usa registrar_sucesso com protocolo = tentar.protocolo depende_de tentar
278
- }
279
- }
280
- ```
22
+
23
+ ## Plataformas e Interfaces
24
+
25
+ ### IDEs com MCP (Roo Code, VS Code, Cursor, Windsurf, etc.)
26
+ Quando usar MCP Sema configurado:
27
+ 1. Ao abrir o projeto, chame `sema_resumo` para entender o estado atual
28
+ 2. **ANTES DE QUALQUER AÇÃO**: chame `sema_docs_impacto` com sua intenção declarada
29
+ 3. Aguarde a resposta com as docs obrigatórias e leia-as antes de agir
30
+ 4. Use `sema_finalizar_mudanca` para comprovar que leu as docs
31
+
32
+ ### Web / Chat (ChatGPT, Lovable, etc.)
33
+ Quando usar Sema via web sem MCP:
34
+ 1. Ao abrir o projeto, chame `sema_resumo` (se disponivel via web hook)
35
+ 2. **ANTES DE QUALQUER AÇÃO**: Declare sua intenção ao usuário
36
+ 3. Use `sema_docs_impacto` para descobrir docs obrigatórias (se via API)
37
+ 4. Leia as docs antes de agir e finalize com `sema_finalizar_mudanca`
38
+
39
+ ### CLI / Terminal
40
+ Quando usar Sema via CLI:
41
+ 1. Execute `sema resumo` para entender o estado atual
42
+ 2. Execute `sema docs-impacto` antes de qualquer ação
43
+ 3. Leia as docs recomendadas antes de editar/criar/deletar
44
+ 4. Execute `sema finalizar-mudanca` ao concluir
45
+
46
+ ## Contratos e exemplos
47
+
48
+ - Sempre salve arquivos .sema na pasta `contratos/` do projeto.
49
+ - Crie um arquivo .sema por modulo ou contexto de negocio. Exemplo: `contratos/pedido.sema`, `contratos/pagamento.sema`, `contratos/usuario.sema`. Nunca coloque modulos de contextos diferentes no mesmo arquivo.
50
+ - Antes de criar qualquer arquivo .sema, leia todos os arquivos da pasta `exemplos/` para entender o formato correto da linguagem.
51
+ - Nunca edite os arquivos da pasta `exemplos/`.
52
+
53
+ ## Quando o projeto nao tem .sema
54
+
55
+ Pergunte ao usuario se deseja semantizar o projeto e sugira: sema iniciar
56
+
57
+ ## Exemplos de arquivos .sema (referencia de formato)
58
+
59
+ ### 1. Task simples com testes
60
+ ```
61
+ module exemplos.calculadora {
62
+ task somar {
63
+ input {
64
+ a: Numero required
65
+ b: Numero required
66
+ }
67
+ output {
68
+ resultado: Numero
69
+ }
70
+ rules {
71
+ a deve_ser numero_valido
72
+ b deve_ser numero_valido
73
+ }
74
+ effects {
75
+ auditoria operacao soma
76
+ }
77
+ guarantees {
78
+ resultado existe
79
+ }
80
+ error {
81
+ entrada_invalida: "Os valores precisam ser numericos."
82
+ }
83
+ tests {
84
+ caso "soma basica" {
85
+ given { a: 2 b: 3 }
86
+ expect { sucesso: verdadeiro }
87
+ }
88
+ }
89
+ }
90
+ }
91
+ ```
92
+
93
+ ### 2. Entity + CRUD com route
94
+ ```
95
+ module exemplos.crud.simples {
96
+ entity Produto {
97
+ fields {
98
+ id: Id
99
+ nome: Texto
100
+ preco: Decimal
101
+ ativo: Booleano
102
+ }
103
+ }
104
+
105
+ task criar_produto {
106
+ input {
107
+ nome: Texto required
108
+ preco: Decimal required
109
+ }
110
+ output {
111
+ produto: Produto
112
+ }
113
+ rules {
114
+ nome deve_ser preenchido
115
+ preco deve_ser positivo
116
+ }
117
+ effects {
118
+ persistencia Produto
119
+ auditoria produto_criado
120
+ }
121
+ guarantees {
122
+ produto existe
123
+ }
124
+ tests {
125
+ caso "cria produto" {
126
+ given { nome: "Caneca" preco: 39.9 }
127
+ expect { sucesso: verdadeiro }
128
+ }
129
+ }
130
+ }
131
+
132
+ route produtos {
133
+ metodo: POST
134
+ caminho: /produtos
135
+ task: criar_produto
136
+ finalidade: cadastro_produto
137
+ input { nome: Texto preco: Decimal }
138
+ output { produto: Produto }
139
+ }
140
+ }
141
+ ```
142
+
143
+ ### 3. Cadastro com validacoes e unicidade
144
+ ```
145
+ module exemplos.cadastro.usuario {
146
+ entity Usuario {
147
+ fields {
148
+ id: Id
149
+ nome: Texto
150
+ email: Email
151
+ ativo: Booleano
152
+ }
153
+ }
154
+
155
+ task criar_usuario {
156
+ input {
157
+ nome: Texto required
158
+ email: Email required
159
+ }
160
+ output {
161
+ usuario: Usuario
162
+ }
163
+ rules {
164
+ nome deve_ser preenchido
165
+ email deve_ser email_valido
166
+ email deve_ser unico em Usuario.email
167
+ }
168
+ effects {
169
+ persistencia Usuario
170
+ evento usuario_criado
171
+ auditoria cadastro_usuario
172
+ }
173
+ guarantees {
174
+ usuario existe
175
+ persistencia concluida
176
+ }
177
+ error {
178
+ email_duplicado: "Ja existe usuario com este email."
179
+ entrada_invalida: "Os dados informados nao atendem as regras."
180
+ }
181
+ tests {
182
+ caso "cria usuario valido" {
183
+ given { nome: "Ana" email: "ana@empresa.com" }
184
+ expect { sucesso: verdadeiro }
185
+ }
186
+ }
187
+ }
188
+ }
189
+ ```
190
+
191
+ ### 4. Pagamento com state e flow
192
+ ```
193
+ module exemplos.pagamento {
194
+ task processar_pagamento {
195
+ input {
196
+ pagamento_id: Id required
197
+ valor: Decimal required
198
+ token: Texto required
199
+ }
200
+ output {
201
+ pagamento: Pagamento
202
+ status: StatusPagamento
203
+ }
204
+ rules {
205
+ valor > 0
206
+ token deve_ser valido
207
+ }
208
+ effects {
209
+ consulta gateway_pagamento criticidade = alta
210
+ persistencia Pagamento criticidade = alta
211
+ evento pagamento_autorizado criticidade = media
212
+ auditoria pagamento criticidade = alta
213
+ }
214
+ state ciclo_pagamento {
215
+ transitions {
216
+ PENDENTE -> AUTORIZADO
217
+ AUTORIZADO -> PROCESSADO
218
+ }
219
+ }
220
+ guarantees {
221
+ pagamento existe
222
+ status em [AUTORIZADO, PROCESSADO]
223
+ }
224
+ error {
225
+ autorizacao_negada: "Recusado pelo gateway."
226
+ timeout_gateway: "Gateway nao respondeu."
227
+ }
228
+ tests {
229
+ caso "pagamento autorizado" {
230
+ given { pagamento_id: "pag_1" valor: 199.9 token: "tok_ok" }
231
+ expect { sucesso: verdadeiro }
232
+ }
233
+ caso "pagamento recusado" {
234
+ given { pagamento_id: "pag_err" valor: 10 token: "tok_recusado" }
235
+ expect { sucesso: falso }
236
+ error { tipo: "autorizacao_negada" }
237
+ }
238
+ }
239
+ }
240
+
241
+ flow orquestracao_pagamento {
242
+ pagamento_id: Id
243
+ valor: Decimal
244
+ token: Texto
245
+ etapa autorizar usa processar_pagamento com pagamento_id = pagamento_id, valor = valor, token = token em_sucesso confirmar em_erro registrar_falha
246
+ etapa confirmar usa confirmar_pagamento com pagamento_id = pagamento_id depende_de autorizar
247
+ etapa registrar_falha usa registrar_timeout_pagamento com pagamento_id = pagamento_id depende_de autorizar
248
+ }
249
+ }
250
+ ```
251
+
252
+ ### 5. Tratamento de erro com flow ramificado
253
+ ```
254
+ module exemplos.tratamento.erro {
255
+ task executar_operacao_sensivel {
256
+ input {
257
+ chave: Texto required
258
+ }
259
+ output {
260
+ protocolo: Id
261
+ }
262
+ rules {
263
+ chave deve_ser preenchida
264
+ }
265
+ effects {
266
+ consulta cofre
267
+ auditoria falha_operacao_sensivel
268
+ }
269
+ guarantees {
270
+ protocolo existe
271
+ }
272
+ error {
273
+ acesso_negado: "A chave nao tem permissao."
274
+ recurso_indisponivel: "Servico temporariamente indisponivel."
275
+ }
276
+ tests {
277
+ caso "falha por acesso negado" {
278
+ given { chave: "sem_permissao" }
279
+ expect { sucesso: falso }
280
+ error { tipo: "acesso_negado" }
281
+ }
282
+ }
283
+ }
284
+
285
+ flow resposta_segura {
286
+ chave: Texto
287
+ etapa tentar usa executar_operacao_sensivel com chave = chave em_sucesso concluir em_erro registrar_falha por_erro acesso_negado = tratar_acesso_negado, recurso_indisponivel = agendar_retentativa
288
+ etapa tratar_acesso_negado usa responder_acesso_negado com chave = chave depende_de tentar
289
+ etapa agendar_retentativa usa responder_retentativa com chave = chave depende_de tentar
290
+ etapa registrar_falha usa registrar_auditoria_falha com chave = chave depende_de tentar
291
+ etapa concluir usa registrar_sucesso com protocolo = tentar.protocolo depende_de tentar
292
+ }
293
+ }
294
+ ```