@praxisui/dynamic-form 8.0.0-beta.2 → 8.0.0-beta.21
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 +166 -18
- package/docs/dynamic-form-authoring-document-semantics.md +80 -0
- package/docs/dynamic-form-llm-rule-authoring-guide.md +318 -0
- package/docs/dynamic-form-rules-authoring-plan.md +379 -0
- package/docs/hot-metadata-updates.md +141 -0
- package/docs/layout-items-visual-blocks.md +406 -0
- package/fesm2022/praxisui-dynamic-form-dynamic-form-agentic-authoring-turn-flow-DuH1ad7h.mjs +417 -0
- package/fesm2022/praxisui-dynamic-form.mjs +9147 -2078
- package/index.d.ts +640 -22
- package/package.json +12 -6
- package/src/lib/components/praxis-form-actions/praxis-form-actions.json-api.md +441 -0
- package/src/lib/config-editor/praxis-dynamic-form-config-editor.json-api.md +481 -0
- package/src/lib/filter-form/praxis-filter-form.json-api.md +507 -0
- package/src/lib/json-config-editor/form-json-config-editor.json-api.md +491 -0
- package/src/lib/layout-editor/praxis-layout-editor.json-api.md +432 -0
- package/src/lib/praxis-dynamic-form.json-api.md +1011 -0
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Dynamic Form LLM Rule Authoring Guide"
|
|
3
|
+
slug: "dynamic-form-llm-rule-authoring-guide"
|
|
4
|
+
description: "Guia operacional para criar, explicar, revisar e aplicar regras de Dynamic Form com apoio de LLM."
|
|
5
|
+
doc_type: "guide"
|
|
6
|
+
document_kind: "host-guide"
|
|
7
|
+
category: "architecture"
|
|
8
|
+
audience:
|
|
9
|
+
- "business-analyst"
|
|
10
|
+
- "frontend"
|
|
11
|
+
- "host"
|
|
12
|
+
- "platform-team"
|
|
13
|
+
- "llm-agent"
|
|
14
|
+
level: "intermediate"
|
|
15
|
+
status: "active"
|
|
16
|
+
owner: "praxis-ui"
|
|
17
|
+
tags:
|
|
18
|
+
- "dynamic-form"
|
|
19
|
+
- "rules"
|
|
20
|
+
- "llm"
|
|
21
|
+
- "json-logic"
|
|
22
|
+
- "governance"
|
|
23
|
+
toc: true
|
|
24
|
+
sidebar: true
|
|
25
|
+
reading_time: "10 min"
|
|
26
|
+
last_updated: "2026-04-22"
|
|
27
|
+
source_of_truth:
|
|
28
|
+
- "projects/praxis-dynamic-form/docs/dynamic-form-rules-authoring-plan.md"
|
|
29
|
+
- "projects/praxis-dynamic-form/src/lib/ai/dynamic-form-rule-authoring-context.ts"
|
|
30
|
+
- "projects/praxis-dynamic-form/src/lib/ai/form-ai-capabilities.ts"
|
|
31
|
+
- "projects/praxis-dynamic-form/src/lib/utils/rule-authoring-diagnostics.ts"
|
|
32
|
+
- "projects/praxis-dynamic-form/src/lib/services/form-rules.service.ts"
|
|
33
|
+
- "projects/praxis-core/src/lib/models/form/rule-property.schema.ts"
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
# Dynamic Form LLM Rule Authoring Guide
|
|
37
|
+
|
|
38
|
+
Este guia define como um analista, host corporativo ou agente LLM deve pedir,
|
|
39
|
+
gerar, explicar, revisar e aplicar regras em `praxis-dynamic-form`.
|
|
40
|
+
|
|
41
|
+
O objetivo e tirar a regra do improviso. A LLM nao deve "adivinhar codigo"; ela
|
|
42
|
+
deve operar sobre o vocabulario autoral publicado pelo componente:
|
|
43
|
+
|
|
44
|
+
- `formRules` e o contrato executavel.
|
|
45
|
+
- `formRulesState` e estado interno do builder visual.
|
|
46
|
+
- `fieldMetadata[].name` identifica campos de negocio.
|
|
47
|
+
- `sections[].rows[].columns[].items[]` identifica layout canonico.
|
|
48
|
+
- `RULE_PROPERTY_SCHEMA` define quais propriedades cada alvo aceita.
|
|
49
|
+
- `rule-authoring-diagnostics` e `ruleDiagnosticsChange` fecham o ciclo de
|
|
50
|
+
validacao e explicacao.
|
|
51
|
+
|
|
52
|
+
## Contrato de responsabilidade
|
|
53
|
+
|
|
54
|
+
| Papel | Pode fazer | Nao deve fazer |
|
|
55
|
+
| --- | --- | --- |
|
|
56
|
+
| Analista | Descrever intencao, revisar impacto, aceitar ou rejeitar sugestao. | Editar `formRulesState` manualmente. |
|
|
57
|
+
| LLM | Gerar proposta em `formRules`, explicar impacto e corrigir diagnostics. | Escrever JS, handler, funcao ou regra fora de Json Logic. |
|
|
58
|
+
| Editor | Validar alvo, condicao, propriedades e round-trip visual. | Aplicar regra invalida silenciosamente. |
|
|
59
|
+
| Runtime | Aplicar somente propriedades saneadas e emitir diagnostics. | Criar campos, controles ou payload a partir de visual block. |
|
|
60
|
+
|
|
61
|
+
## Contexto minimo que a LLM precisa receber
|
|
62
|
+
|
|
63
|
+
A LLM nao precisa analisar codigo em runtime. Ela precisa receber um pacote de
|
|
64
|
+
conhecimento serializado pelo host/editor:
|
|
65
|
+
|
|
66
|
+
```json
|
|
67
|
+
{
|
|
68
|
+
"component": "praxis-dynamic-form",
|
|
69
|
+
"capabilityCatalogVersion": "v1.11",
|
|
70
|
+
"fields": [
|
|
71
|
+
{ "name": "tipoContrato", "label": "Tipo de contrato", "type": "select" },
|
|
72
|
+
{ "name": "dataFim", "label": "Data fim", "type": "date" }
|
|
73
|
+
],
|
|
74
|
+
"targets": {
|
|
75
|
+
"field": ["tipoContrato", "dataFim"],
|
|
76
|
+
"section": ["dados-contratuais"],
|
|
77
|
+
"action": ["submit", "cancel"],
|
|
78
|
+
"visualBlock": ["aviso-lgpd"]
|
|
79
|
+
},
|
|
80
|
+
"allowedRuleProperties": {
|
|
81
|
+
"field": ["visible", "required", "disabled", "readonly", "label", "hint"],
|
|
82
|
+
"visualBlock": ["visible", "hidden", "text", "title", "message", "rootClassName"]
|
|
83
|
+
},
|
|
84
|
+
"visualBlockNodes": {
|
|
85
|
+
"aviso-lgpd": [
|
|
86
|
+
{ "id": "title", "label": "Aviso LGPD", "kind": "card", "roles": ["title"] },
|
|
87
|
+
{ "id": "message", "label": "Aviso", "kind": "text", "roles": ["text", "message"] }
|
|
88
|
+
]
|
|
89
|
+
},
|
|
90
|
+
"existingRules": [],
|
|
91
|
+
"diagnostics": []
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Esse pacote deve ser derivado de `FormConfig`, do catalogo de capacidades e dos
|
|
96
|
+
diagnostics atuais. Ele e o "mapa semantico operacional" do formulario.
|
|
97
|
+
|
|
98
|
+
No runtime/editor, use `buildDynamicFormRuleAuthoringContext(config)` para
|
|
99
|
+
montar esse pacote de forma canonica. A funcao publica:
|
|
100
|
+
|
|
101
|
+
- remove campos `formHidden` dos alvos de regra;
|
|
102
|
+
- coleta campos, secoes, linhas, colunas, actions e visual blocks;
|
|
103
|
+
- publica `allowedRuleProperties` a partir de `RULE_PROPERTY_SCHEMA`;
|
|
104
|
+
- publica `visualBlockNodes` com os nos editaveis de cada rich content block
|
|
105
|
+
quando regras puderem alterar `text`, `title` ou `message`;
|
|
106
|
+
- inclui `existingRules` e `diagnostics`;
|
|
107
|
+
- carrega guardrails permanentes para a LLM, incluindo a regra de que
|
|
108
|
+
`formRulesState` e gerado apenas por internals Praxis apos revisao humana.
|
|
109
|
+
|
|
110
|
+
## Prompt recomendado para criar regra
|
|
111
|
+
|
|
112
|
+
Use pedidos com intencao, alvo, condicao, efeito e criterio de aceite:
|
|
113
|
+
|
|
114
|
+
```text
|
|
115
|
+
Crie uma regra para o formulario de funcionario.
|
|
116
|
+
|
|
117
|
+
Intencao: quando tipoContrato for "temporario", o campo dataFim deve ficar
|
|
118
|
+
obrigatorio e visivel. Quando nao for temporario, dataFim deve ficar opcional.
|
|
119
|
+
|
|
120
|
+
Use somente JSON Logic canonico.
|
|
121
|
+
Use somente alvos existentes no target catalog.
|
|
122
|
+
Para valores calculados de campos, use somente envelope fechado
|
|
123
|
+
`{ "expression": <JsonLogic> }` ou `{ "literal": <valor> }`.
|
|
124
|
+
Nao misture `literal` e `expression` nem adicione chaves extras ao envelope.
|
|
125
|
+
Nao altere formRulesState.
|
|
126
|
+
Marque metadata.origin como "llm" e metadata.reviewStatus como "pending".
|
|
127
|
+
Explique o impacto antes de aplicar.
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Resposta esperada da LLM:
|
|
131
|
+
|
|
132
|
+
```json
|
|
133
|
+
{
|
|
134
|
+
"formRules": [
|
|
135
|
+
{
|
|
136
|
+
"id": "rule-data-fim-contrato-temporario",
|
|
137
|
+
"name": "Data fim obrigatoria para contrato temporario",
|
|
138
|
+
"description": "Exige data fim quando o contrato do funcionario for temporario.",
|
|
139
|
+
"metadata": {
|
|
140
|
+
"origin": "llm",
|
|
141
|
+
"reviewStatus": "pending"
|
|
142
|
+
},
|
|
143
|
+
"targetType": "field",
|
|
144
|
+
"targets": ["dataFim"],
|
|
145
|
+
"effect": {
|
|
146
|
+
"condition": {
|
|
147
|
+
"==": [{ "var": "tipoContrato" }, "temporario"]
|
|
148
|
+
},
|
|
149
|
+
"properties": {
|
|
150
|
+
"visible": true,
|
|
151
|
+
"required": true
|
|
152
|
+
},
|
|
153
|
+
"propertiesWhenFalse": {
|
|
154
|
+
"required": false
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
]
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Prompt para regra LGPD
|
|
163
|
+
|
|
164
|
+
```text
|
|
165
|
+
Crie uma regra LGPD para o formulario.
|
|
166
|
+
|
|
167
|
+
Quando o campo consentimentoLgpd for false, o botao submit deve ficar
|
|
168
|
+
desabilitado e o bloco visual aviso-lgpd deve mostrar a mensagem:
|
|
169
|
+
"Aceite o termo de privacidade para continuar."
|
|
170
|
+
|
|
171
|
+
Use targetType "action" para submit e "visualBlock" para aviso-lgpd.
|
|
172
|
+
Nao coloque aviso-lgpd em fieldMetadata.
|
|
173
|
+
Nao crie FormControl para aviso-lgpd.
|
|
174
|
+
Use JSON Logic canonico.
|
|
175
|
+
Deixe a sugestao pendente de revisao humana.
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
Resposta esperada:
|
|
179
|
+
|
|
180
|
+
```json
|
|
181
|
+
{
|
|
182
|
+
"formRules": [
|
|
183
|
+
{
|
|
184
|
+
"id": "rule-submit-bloqueado-sem-lgpd",
|
|
185
|
+
"name": "Bloquear envio sem consentimento LGPD",
|
|
186
|
+
"metadata": {
|
|
187
|
+
"origin": "llm",
|
|
188
|
+
"reviewStatus": "pending"
|
|
189
|
+
},
|
|
190
|
+
"targetType": "action",
|
|
191
|
+
"targets": ["submit"],
|
|
192
|
+
"effect": {
|
|
193
|
+
"condition": { "===": [{ "var": "consentimentoLgpd" }, false] },
|
|
194
|
+
"properties": { "disabled": true },
|
|
195
|
+
"propertiesWhenFalse": { "disabled": false }
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
"id": "rule-aviso-lgpd-sem-consentimento",
|
|
200
|
+
"name": "Aviso LGPD sem consentimento",
|
|
201
|
+
"metadata": {
|
|
202
|
+
"origin": "llm",
|
|
203
|
+
"reviewStatus": "pending"
|
|
204
|
+
},
|
|
205
|
+
"targetType": "visualBlock",
|
|
206
|
+
"targets": ["aviso-lgpd"],
|
|
207
|
+
"effect": {
|
|
208
|
+
"condition": { "===": [{ "var": "consentimentoLgpd" }, false] },
|
|
209
|
+
"properties": {
|
|
210
|
+
"visible": true,
|
|
211
|
+
"message": "Aceite o termo de privacidade para continuar."
|
|
212
|
+
},
|
|
213
|
+
"propertiesWhenFalse": {
|
|
214
|
+
"visible": false
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
]
|
|
219
|
+
}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
## Prompt para explicar regra existente
|
|
223
|
+
|
|
224
|
+
```text
|
|
225
|
+
Explique esta regra para um analista de negocio.
|
|
226
|
+
|
|
227
|
+
Responda com:
|
|
228
|
+
1. Quando ela dispara.
|
|
229
|
+
2. O que ela altera.
|
|
230
|
+
3. Se afeta payload ou apenas UI.
|
|
231
|
+
4. Riscos de negocio.
|
|
232
|
+
5. Diagnostics que precisam correcao.
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
A explicacao deve traduzir Json Logic para linguagem de dominio e citar os
|
|
236
|
+
alvos por label quando o contexto tiver label disponivel.
|
|
237
|
+
|
|
238
|
+
## Prompt para corrigir diagnostics
|
|
239
|
+
|
|
240
|
+
```text
|
|
241
|
+
Corrija as regras abaixo usando os diagnostics do editor.
|
|
242
|
+
|
|
243
|
+
Nao mude a intencao de negocio.
|
|
244
|
+
Se um alvo nao existir, proponha o alvo existente mais proximo e explique.
|
|
245
|
+
Se uma propriedade for rejeitada pelo schema, substitua por uma propriedade
|
|
246
|
+
permitida ou remova com justificativa.
|
|
247
|
+
Mantenha metadata.reviewStatus como "pending".
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
Mapeamento operacional:
|
|
251
|
+
|
|
252
|
+
| Diagnostic | Acao esperada da LLM |
|
|
253
|
+
| --- | --- |
|
|
254
|
+
| `missing-targets` | Pedir ou preencher `targets`. |
|
|
255
|
+
| `field-target-not-found` | Trocar por `fieldMetadata[].name` existente. |
|
|
256
|
+
| `target-not-found` | Trocar por alvo existente no mesmo `targetType`. |
|
|
257
|
+
| `invalid-condition` | Reescrever como Json Logic canonico. |
|
|
258
|
+
| `invalid-value-expression` | Corrigir `effect.properties.value` ou `propertiesWhenFalse.value` para Json Logic valido ou envelope fechado `{ "expression": ... }` / `{ "literal": ... }`. |
|
|
259
|
+
| `computed-value-iteration-limit` | Remover ciclo ou ambiguidade entre valores calculados encadeados. |
|
|
260
|
+
| `unsupported-property` | Usar propriedade permitida por `RULE_PROPERTY_SCHEMA`. |
|
|
261
|
+
| `unsupported-target-type` | Escolher um `targetType` permitido. |
|
|
262
|
+
| `missing-effect` | Criar `effect.condition` e `effect.properties`. |
|
|
263
|
+
| `rule-evaluation-error` | Simplificar condicao e remover operadores nao suportados. |
|
|
264
|
+
|
|
265
|
+
Quando o diagnostic envolver apenas propriedade rejeitada, valor invalido ou
|
|
266
|
+
valor parcialmente saneado, o editor tambem pode aplicar a acao deterministica
|
|
267
|
+
`Corrigir`. Essa acao usa o mesmo sanitizer central do runtime, remove ou
|
|
268
|
+
coage propriedades conforme `RULE_PROPERTY_SCHEMA` e regenera `formRulesState`.
|
|
269
|
+
Use LLM quando a correcao exigir decisao semantica de dominio, por exemplo
|
|
270
|
+
trocar uma propriedade inexistente por outra intencionalmente equivalente ou
|
|
271
|
+
explicar por que uma regra deve ser removida.
|
|
272
|
+
|
|
273
|
+
## Fluxo de aplicacao seguro
|
|
274
|
+
|
|
275
|
+
1. Host/editor monta o pacote de contexto.
|
|
276
|
+
2. LLM gera uma proposta por operacao autoral ou em `formRules`.
|
|
277
|
+
Para regra de negocio, politica, elegibilidade, validacao, compliance ou
|
|
278
|
+
decisao compartilhada, use `domain-rules`/`shared_rule_authoring` antes de
|
|
279
|
+
materializar `form_config`. Para uma projecao visual derivada de decisao ja
|
|
280
|
+
governada, aceite `operationId: "rule.visualBlockGuidance.add"` com
|
|
281
|
+
`type: "visualBlockGuidance"`, `targetType: "visualBlock"`,
|
|
282
|
+
`context: "notification"` e metadata pendente.
|
|
283
|
+
3. Compilador/adapter rejeita qualquer tentativa de gravar `formRulesState`.
|
|
284
|
+
4. Editor valida alvos, condicao e propriedades.
|
|
285
|
+
5. Editor mostra diff e impacto para o analista.
|
|
286
|
+
6. Analista aceita, edita ou rejeita.
|
|
287
|
+
7. Ao aceitar, editor marca `metadata.reviewStatus: "accepted"`.
|
|
288
|
+
8. Editor tenta gerar `formRulesState` por conversor interno.
|
|
289
|
+
9. Runtime aplica regra e emite `ruleDiagnosticsChange` se houver problema.
|
|
290
|
+
|
|
291
|
+
## Guardrails permanentes
|
|
292
|
+
|
|
293
|
+
- Nunca persistir codigo executavel em regra.
|
|
294
|
+
- Nunca editar `formRulesState` diretamente por LLM.
|
|
295
|
+
- Nunca tentar contornar essa regra no patch final: `compileAiResponse` e
|
|
296
|
+
`applyPatch` tambem rejeitam escrita direta em `formRulesState`.
|
|
297
|
+
- Nunca materializar regra visual direto no estado do builder. O editor preserva
|
|
298
|
+
semantica de `formRules[].type` usando `config.ruleType` internamente no
|
|
299
|
+
round-trip.
|
|
300
|
+
- Nunca criar alvo que nao exista no mapa de targets.
|
|
301
|
+
- Nunca usar propriedade fora do schema permitido.
|
|
302
|
+
- Nunca tratar `visualBlock` como campo.
|
|
303
|
+
- Para `visualBlock` com varios nos editaveis, usar o node id correspondente em
|
|
304
|
+
`textNodeId`, `titleNodeId` ou `messageNodeId`.
|
|
305
|
+
- Nunca esconder erro de regra: todo descarte deve virar diagnostic ou status.
|
|
306
|
+
- Regras LLM entram como `pending`; aceite humano e uma decisao explicita.
|
|
307
|
+
|
|
308
|
+
## Sinal de prontidao para runtime
|
|
309
|
+
|
|
310
|
+
Uma regra esta pronta para runtime quando:
|
|
311
|
+
|
|
312
|
+
- todos os targets existem;
|
|
313
|
+
- a condicao e Json Logic valida;
|
|
314
|
+
- as propriedades passam pelo whitelist;
|
|
315
|
+
- o impacto foi explicado;
|
|
316
|
+
- o preview true/false foi revisado;
|
|
317
|
+
- a origem/revisao esta coerente;
|
|
318
|
+
- o runtime nao emite diagnostic apos aplicar.
|