forgeos 0.1.0-alpha.70 → 0.1.0-alpha.72
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/.agents/skills/forge-agent-fabric/SKILL.md +10 -1
- package/AGENTS.md +1 -1
- package/CHANGELOG.md +12 -0
- package/docs/agent-fabric-programs.md +183 -168
- package/docs/agent-fabric.md +4 -6
- package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_COMPETITIVE_EVIDENCE.md +75 -0
- package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_COMPETITIVE_PLAN.md +137 -0
- package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_COMPETITIVE_REVIEW.md +56 -0
- package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_ADR.md +81 -41
- package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_CORRECTIONS.md +39 -0
- package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_CORRECTIONS_EVIDENCE.md +53 -0
- package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_EVIDENCE.md +49 -109
- package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_PLAN.md +463 -423
- package/examples/agent-fabric-v2/README.md +16 -0
- package/examples/agent-fabric-v2/item-child.workflow.ts +11 -0
- package/examples/agent-fabric-v2/map-child.workflow.ts +10 -0
- package/examples/agent-fabric-v2/migrate.workflow.ts +1 -1
- package/examples/agent-fabric-v2/run-ui-fixture.ts +48 -0
- package/examples/agent-fabric-v2/templates/README.md +46 -0
- package/examples/agent-fabric-v2/templates/bugfix.json +12 -0
- package/examples/agent-fabric-v2/templates/migration.json +13 -0
- package/examples/agent-fabric-v2/templates/review.json +12 -0
- package/examples/agent-fabric-v2/ui-audit.workflow.ts +28 -0
- package/examples/agent-fabric-v2/ui-fixture-worker.cjs +36 -0
- package/examples/agent-fabric-v2/visual-population.json +13 -0
- package/package.json +7 -1
- package/scripts/summarize-fabric-benchmark.mjs +6 -0
- package/src/forge/_generated/releaseManifest.json +1 -1
- package/src/forge/_generated/releaseManifest.ts +3 -3
- package/src/forge/agent-fabric/claude-program-worker.ts +95 -0
- package/src/forge/agent-fabric/codex-sdk-worker.ts +12 -4
- package/src/forge/agent-fabric/index.ts +5 -0
- package/src/forge/agent-fabric/local-task-server.ts +2 -1
- package/src/forge/agent-fabric/managed-environment.ts +14 -8
- package/src/forge/agent-fabric/managed-workspace.ts +4 -0
- package/src/forge/agent-fabric/program-api.ts +37 -0
- package/src/forge/agent-fabric/program-authoring.ts +48 -0
- package/src/forge/agent-fabric/program-benchmark.ts +76 -0
- package/src/forge/agent-fabric/program-capabilities.ts +14 -0
- package/src/forge/agent-fabric/program-contract.ts +106 -36
- package/src/forge/agent-fabric/program-dsl.ts +45 -31
- package/src/forge/agent-fabric/program-evidence.ts +22 -0
- package/src/forge/agent-fabric/program-image.ts +15 -0
- package/src/forge/agent-fabric/program-lock.ts +50 -0
- package/src/forge/agent-fabric/program-observation.ts +63 -0
- package/src/forge/agent-fabric/program-owner.ts +16 -0
- package/src/forge/agent-fabric/program-runtime-options.ts +23 -0
- package/src/forge/agent-fabric/program-scheduler.ts +57 -0
- package/src/forge/agent-fabric/program-service.ts +423 -112
- package/src/forge/agent-fabric/program-store.ts +88 -55
- package/src/forge/agent-fabric/program-structure.ts +65 -0
- package/src/forge/agent-fabric/program-templates.ts +96 -0
- package/src/forge/agent-fabric/program-types.ts +21 -9
- package/src/forge/agent-fabric/program-view.ts +26 -0
- package/src/forge/agent-fabric/program-worker.ts +93 -23
- package/src/forge/agent-memory/mcp.ts +9 -3
- package/src/forge/cli/fabric.ts +4 -2
- package/src/forge/cli/main.ts +4 -0
- package/src/forge/cli/parse.ts +3 -1
- package/src/forge/version.ts +1 -1
|
@@ -1,550 +1,590 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Plano implementado: Agent Fabric workflows R2.1
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
executable alpha contract and its conservative F6/F7 boundaries, read
|
|
5
|
-
[program workflows](../../agent-fabric-programs.md),
|
|
6
|
-
[implementation decisions](WORKFLOW_PROGRAM_V2_ADR.md) and
|
|
7
|
-
[evidence](WORKFLOW_PROGRAM_V2_EVIDENCE.md). An implementation release does not mark every
|
|
8
|
-
future acceptance item in this plan complete.
|
|
3
|
+
Este documento preserva os requisitos e a revisão do plano. A implementação adota a arquitetura diretamente, conforme a decisão posterior do usuário de ignorar compatibilidade legada. Estado e evidências da implementação: WORKFLOW_PROGRAM_V2_EVIDENCE.md; contrato operacional: WORKFLOW_PROGRAM_V2_ADR.md. Correções e acabamento R2.2 estão em WORKFLOW_PROGRAM_V2_CORRECTIONS.md; o ADR e o guia de API prevalecem sobre detalhes históricos de armazenamento/autoria abaixo. Extensões da seção 22 continuam fora do núcleo.
|
|
9
4
|
|
|
10
|
-
#
|
|
5
|
+
# Plano revisado do Agent Fabric Workflows
|
|
11
6
|
|
|
12
|
-
|
|
7
|
+
Versão editorial R2.1, 07/10/2026. Baseline observado: Forge `083077bdc9aee74e81d941a67c3c38bd31d8e2d0`, alpha.70. O corpo abaixo preserva o plano na data da proposta; a implementação e suas correções são registradas nos documentos indicados na introdução. A arquitetura R2 recebeu confirmação independente; R2.1 incorpora a restrição posterior do usuário de não executar testes reais com LLM. Antes desta implementação, o baseline publicado alpha.70 reconhecia operatorVersion 1; o working tree atual implementa operatorVersion 2. A versão npm não foi incrementada/publicada nesta rodada. O número da versão comercial futura será escolhido na implementação, sem ser inferido deste documento.
|
|
13
8
|
|
|
14
|
-
|
|
9
|
+
**Restrição vigente de validação: nenhum teste, piloto ou benchmark pode chamar LLM real, incluindo CLI/SDK de agentes, providers pagos, assinatura ou modelos locais.** Usar executores determinísticos, mocks/stubs de transportes e fixtures. Não iniciar comandos/subprocessos que possam acessar um modelo como fallback. Avaliação com modelos reais fica adiada e requer nova autorização explícita do usuário; sua ausência não bloqueia a entrega técnica do runtime, mas limita as alegações de qualidade do produto.
|
|
15
10
|
|
|
16
|
-
## 1. Objetivo e
|
|
11
|
+
## 1. Objetivo e critério de sucesso
|
|
17
12
|
|
|
18
|
-
|
|
13
|
+
Criar uma solução programática para múltiplos agentes com autoria acessível, execução explícita, trabalho concluído recuperável e obrigações verificadas pelo runtime. A proposta de valor combina expressividade, recuperação, revisão, cobertura e integração; não depende de usar YAML, de permitir mais agentes ou de adicionar mais operadores.
|
|
19
14
|
|
|
20
|
-
|
|
15
|
+
O objetivo de superar Claude Code Dynamic Workflows será avaliado por dimensão e em tarefas/configurações delimitadas: menos chamadas repetidas após falha, cumprimento de obrigações, menos falsos aceites/regressões, esforço de autoria aceitável e custo total observado. Não declarar superioridade geral a partir de fixtures ou do formato da DSL.
|
|
21
16
|
|
|
22
|
-
|
|
17
|
+
## 2. Baseline e mudanças desejadas
|
|
23
18
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
19
|
+
| Área | Alpha.70 observada | Alvo deste plano |
|
|
20
|
+
|---|---|---|
|
|
21
|
+
| Autoria | Subconjunto finito TS e IR JSON; opções genéricas | Mesmo núcleo, tipos discriminados, referências tipadas e diagnósticos com localização |
|
|
22
|
+
| Scheduling | Raízes percorridas sequencialmente, referências resolvidas sob demanda; map concorrente | Dependências de dados e controle, scopes explícitos, fila pronta persistida e quotas separadas |
|
|
23
|
+
| Waiting | Falta de evento lança erro; na raiz needs-attention, em map vira failed | Suspensão durável do ramo, sem consumir slot e sem contar como falha |
|
|
24
|
+
| Resume SDK | Resultado completo passa pelo caminho de preparação/cache, sem reuso SDK nativo | Continuação de invocação intacta devolve resultado persistido sem nova chamada |
|
|
25
|
+
| Revisão | Repair com candidate/review/checks/budgets | Preservar; acrescentar evidências de avaliação e diagnósticos de fase |
|
|
26
|
+
| Aplicação | Gate e ApplyIntent congelado, reconciliação | Preservar fronteira e vincular todas as novas evidências ao candidato exato |
|
|
27
|
+
| Persistência | Snapshots completos/histórico a cada transação | Instrumentar; otimizar somente após profiling e testes de recuperação |
|
|
28
|
+
| UI/browser | Sem integração automática com browser do chat | Adaptador explícito e artefatos duráveis vinculados à build/candidato |
|
|
29
|
+
| Providers | Codex e comandos | Consolidar esse contrato; outros harnesses como extensão posterior |
|
|
32
30
|
|
|
33
|
-
|
|
31
|
+
O plano anterior do repo diz que a ordem de steps não cria sequência; o executor atual percorre as raízes com await e pode antecipar uma raiz por forward reference. P0 resolve essa divergência formalmente. Não apresentar o comportamento atual como sequência estrita.
|
|
34
32
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
Limitações relevantes:
|
|
38
|
-
|
|
39
|
-
| Situação existente | Evolução proposta |
|
|
40
|
-
| --- | --- |
|
|
41
|
-
| Cada nó gerenciado exige executor explícito | Templates e fábricas validadas materializam nós e executores |
|
|
42
|
-
| Replan exige ausência de tentativas ativas/incertas | Primeiro barreiras seguras; depois extensão independente e fencing por ramo |
|
|
43
|
-
| `changes_requested` marca falha e bloqueia o run | Resultado operacional separado do verdict; feedback consumível |
|
|
44
|
-
| Relatório SDK fixa campos genéricos | Envelope operacional com saída tipada por etapa e artefatos por referência |
|
|
45
|
-
| Obrigações ligadas a nós `required` | Contrato de aceite estável, separado da topologia das rodadas v2 |
|
|
46
|
-
| Eventos de status são uma janela limitada | Histórico durável de operações e projeções compactas de progresso |
|
|
47
|
-
| Limites gerenciados de 32 nós e concorrência 4 | Expansão paginada e limites distintos de template, itens, janela e concorrência |
|
|
48
|
-
| Bridge acompanhado invalida pelo escopo inteiro | Preservar conservadorismo v1; melhorar v2 somente com entradas completas |
|
|
49
|
-
|
|
50
|
-
Não há garantia atual de App fechado, wakeup, serviço de sistema, encerramento de toda árvore de processos ou atomicidade da aplicação de múltiplos arquivos contra desligamento. Esses limites não são apagados pelo desenho v2.
|
|
51
|
-
|
|
52
|
-
## 3. Decisão arquitetural
|
|
53
|
-
|
|
54
|
-
Preservar o reducer puro, os mecanismos de concorrência, capturas, artefatos e reconciliação. Acrescentar uma camada de programa e um contrato v2, sem redefinir silenciosamente as APIs ou os resultados dos runs v1.
|
|
55
|
-
|
|
56
|
-
```text
|
|
57
|
-
Pedido no Codex / autoria humana
|
|
58
|
-
↓
|
|
59
|
-
DSL tipada e limitada de workflow
|
|
60
|
-
↓ validação e lowering sem executar código arbitrário
|
|
61
|
-
ProgramIR versionada: templates, expressões, schemas e obrigações
|
|
62
|
-
↓ expansão persistida conforme os resultados
|
|
63
|
-
ExecIR: operações materializadas, dependências, gerações e tentativas
|
|
64
|
-
↓
|
|
65
|
-
Owner: scheduler, journal, políticas, workers e artefatos
|
|
66
|
-
↓
|
|
67
|
-
Gates de candidato, revisão, checks e aplicação local
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
O DAG é uma projeção materializada do trabalho corrente; não precisa conter todas as iterações e itens futuros desde o início. O programa contém templates para materializá-los.
|
|
71
|
-
|
|
72
|
-
Workflows de aplicação do Forge e workflows do Fabric continuam subsistemas distintos. Podemos reutilizar primitives compatíveis de idempotência, persistência e retry depois de mapear seus contratos; seu runtime atual não deve ser apresentado como um interpretador pronto de programas dinâmicos.
|
|
73
|
-
|
|
74
|
-
## 4. Autoria v2: uma DSL, não TypeScript arbitrário
|
|
75
|
-
|
|
76
|
-
Escolha inicial: DSL com aparência e tipos TypeScript, compilada por um lowerer que reconhece um subconjunto declarativo. O lowerer não importa e executa o módulo do usuário para obter um objeto.
|
|
77
|
-
|
|
78
|
-
Subconjunto inicial: imports declarativos somente da biblioteca DSL versionada; literais; bindings constantes sobre esses literais; referências de dados; construtores de operações; templates aninhados e expressões puras reconhecidas pelo compilador. Condições e seletores usam operações como `eq`, `and`, `field` e `output`, convertidas a uma AST de expressão tipada. Sem `eval`, closures arbitrárias, I/O, imports dinâmicos, acesso ao relógio, aleatoriedade ou leitura implícita de variáveis de ambiente.
|
|
79
|
-
|
|
80
|
-
O catálogo de transformações puras deve ser finito, versionado, limitado em tempo/tamanho e validado. Bibliotecas e módulos não reconhecidos falham na validação; não são executados para descobrir seu significado. Uma transformação complexa pode virar atividade explícita com entradas, saída e política próprias. Não esconder efeitos em expressões.
|
|
81
|
-
|
|
82
|
-
Antes de congelar a autoria ou implementar o compilador de produto, produzir ADR semântica e um protótipo limitado de expressividade. Comparar opções de autoria sobre a mesma IR quando necessário, sem construir dois runtimes de produto. Se uma API assíncrona restrita for preferível, uma ADR substitutiva deve definir replay, isolamento e compatibilidade; não prometer compilação genérica de `async`/closures.
|
|
83
|
-
|
|
84
|
-
O protótipo precisa expressar pesquisa com filtro/deduplicação/ranking e resultados parciais, migração de 80 itens, loop com estado acumulado, branch com saídas diferentes e merge tipado, map aninhado/subworkflow, conflito de integração e evento enviado antes do wait. Medir tamanho do programa, erros de autoria e clareza da inspeção. A aparência TypeScript não comprova equivalência à expressividade de um script JavaScript.
|
|
85
|
-
|
|
86
|
-
Schemas, executores, receitas e contratos externos usam referências de registry com versão e digest, resolvidas pelo owner sem executar módulos de autoria. Schemas inline só podem usar literais reconhecidos. Um símbolo importado de um módulo arbitrário não é um schema válido da DSL. Referências de outputs inferem dependências; a ordem do array steps não cria sequência implícita. O programa declara uma expressão result compatível com outputSchema, inclusive os estados de negócio permitidos.
|
|
87
|
-
|
|
88
|
-
Operações mínimas de ProgramIR:
|
|
89
|
-
|
|
90
|
-
| Operação | Semântica |
|
|
91
|
-
| --- | --- |
|
|
92
|
-
| `agent` | Worker com papel, prompt/entradas, schema de saída, efeito e limites |
|
|
93
|
-
| `command` | Comando com argv explícito, parser/classificação de resultado e política de efeitos |
|
|
94
|
-
| `map` | Expande coleção persistida usando identidade estável, template, limite e política de conclusão |
|
|
95
|
-
| `branch` | Seleciona ramos por expressão pura ou decisão estruturada de agente |
|
|
96
|
-
| `loop` | Materializa rodadas com estado persistido, progresso e término explícitos |
|
|
97
|
-
| `compose` | Combina candidatos com ancestralidade e política de conflito |
|
|
98
|
-
| `gate` | Avalia obrigações e evidências sobre um candidato identificado |
|
|
99
|
-
| `subworkflow` | Invoca programa versionado, com identidade de invocação e orçamento herdado |
|
|
100
|
-
| `waitEvent` | Aguarda entrada humana/externa autorizada, tipada e persistida |
|
|
101
|
-
|
|
102
|
-
`repair` é uma receita versionada de biblioteca sobre agent/command/loop/gate; não introduz um segundo motor. Toda invocação, inclusive no body de map, recebe ID estável. Seus passos internos usam namespace de invocação/item/rodada/etapa. Checkpoints são fronteiras de commit do runtime; um operador de checkpoint explícito pode etiquetá-las, mas nenhuma etiqueta sozinha garante durabilidade.
|
|
103
|
-
|
|
104
|
-
Branch registra a seleção e valida o merge tipado. Ramos não selecionados ficam skipped e não prendem o join; isso não remove obrigações externas de aceite. Uma decisão de agente só seleciona alternativas autorizadas pelo owner. Subworkflow fixa programa/operadores, identidade de invocação, profundidade e orçamento herdado; retry do pai não cria outro filho nem repete efeitos do filho. Cancelamento e incerteza pertinentes propagam ao pai. Recursão fica desabilitada inicialmente.
|
|
105
|
-
|
|
106
|
-
## 5. Contratos de dados e identidades
|
|
107
|
-
|
|
108
|
-
Tipos conceituais propostos:
|
|
33
|
+
## 3. Arquitetura
|
|
109
34
|
|
|
110
35
|
```text
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
StepOutput: schemaId, schemaVersion, dataRef, artifacts[], evidence[], summary
|
|
125
|
-
|
|
126
|
-
Candidate: candidateId, snapshotDigest, baselineRef, parentCandidateRefs[],
|
|
127
|
-
artifactRefs[], producerAttemptRefs[]
|
|
128
|
-
|
|
129
|
-
CandidateDelta: deltaId, inputCandidateDigest, outputCandidateDigest,
|
|
130
|
-
beforeimages, changes, producerAttemptRef
|
|
131
|
-
|
|
132
|
-
Assessment: assessmentId, candidateRef, verdict, findings[], checkResults[],
|
|
133
|
-
assessorAttemptRef, provenance
|
|
134
|
-
|
|
135
|
-
PopulationContract: populationId, version, baselineRef, definition,
|
|
136
|
-
inventoryValidatorRef, allowedExclusions, allowNoWork, requiredEvidence
|
|
137
|
-
|
|
138
|
-
CoverageManifest: populationContractRef, expectedMembersRef, observedMembersRef,
|
|
139
|
-
exclusionsWithReasons, inventoryDigest, discoveryDigest, provenance, verdict
|
|
140
|
-
|
|
141
|
-
CapabilityContract: adapterIdentity, argv, cwd, effectiveEnvironmentRef,
|
|
142
|
-
tools, network, candidateWriteScope, allowedGeneratedPaths, isolationEvidence
|
|
143
|
-
|
|
144
|
-
ApplyIntent: intentId, candidateDigest, gateReceiptId, populationDigest,
|
|
145
|
-
collectionSeals, programRevision, acceptanceVersion, policyVersion,
|
|
146
|
-
authorizationRefs, targetBaseline, beforeimages, expectedAfterimages
|
|
36
|
+
Chat/CLI/SDK de autoria
|
|
37
|
+
↓
|
|
38
|
+
DSL TypeScript finita ou IR JSON
|
|
39
|
+
↓ lowering estático + validação + plano de capacidades
|
|
40
|
+
IR versionada com dados, controle, scopes e obrigações
|
|
41
|
+
↓
|
|
42
|
+
Owner autenticado: registry, estado autoritativo, scheduler
|
|
43
|
+
↓
|
|
44
|
+
Atividades: Codex / comandos / adaptadores aprovados
|
|
45
|
+
↓
|
|
46
|
+
Resultados tipados, candidatos, evidências e receipts
|
|
47
|
+
↓
|
|
48
|
+
Composição → avaliação integrada → gate → aplicação autorizada
|
|
147
49
|
```
|
|
148
50
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
A chave de map precisa ser única e estável. Duplicatas ou colisões de normalização são erros visíveis. Índices de lista não são identidades. Paths só servem como itemId se o contrato tratar renames; o exemplo usa um ID de componente separado do path. Ordem de enumeração e ordem de composição são declaradas e normalizadas.
|
|
152
|
-
|
|
153
|
-
Referências são imutáveis, vinculadas ao run ou a uma fonte permitida. Um worker não pode introduzir referências arbitrárias ao filesystem, fabricar receipts ou usar handles pertencentes a outra revisão. Resolver uma referência sempre revalida escopo, digest e disponibilidade.
|
|
154
|
-
|
|
155
|
-
Candidate é uma descrição imutável de snapshot. Aceite, rejeição e supersessão são eventos/projeções vinculados ao digest, não campos mutáveis no objeto. Delta descreve a transformação entre dois snapshots; não confundir patch com snapshot completo.
|
|
156
|
-
|
|
157
|
-
## 6. Resultado operacional separado de avaliação
|
|
158
|
-
|
|
159
|
-
`executionOutcome`: `completed | infrastructure_failed | invalid_output | uncertain | canceled_confirmed`.
|
|
160
|
-
|
|
161
|
-
`reviewVerdict`: `approved | changes_requested | inconclusive`.
|
|
162
|
-
|
|
163
|
-
Uma revisão pode terminar como completed e retornar changes_requested. Isso produz feedback válido, mas não aprova o candidato. Schema inválido não vira reprovação de negócio: é invalid_output e só tem retry sob política explícita. Inconclusive não é aprovado nem refutado.
|
|
164
|
-
|
|
165
|
-
Comandos possuem resultado observado de processo separado do significado de um checker. Um exit code não zero esperado pode significar completed com checkResults.failed. Falha de lançamento, deadline ou processo sem resultado conhecido são categorias próprias. A classificação é definida pelo adaptador/política versionados; o modelo não redefine quais códigos significam teste aprovado.
|
|
166
|
-
|
|
167
|
-
O envelope de relatório operacional é controlado pelo executor. O payload de negócio usa schema por etapa, validado antes de consumo. Schemas, resolvers e validators têm digest/versão; requests e objetos têm limites de tamanho e profundidade. Relato agent_reported continua distinto de observação executor_observed e de aceite humano.
|
|
168
|
-
|
|
169
|
-
## 7. Transporte de dados, artefatos e contexto
|
|
170
|
-
|
|
171
|
-
Dados pequenos são serializados e validados; dados grandes, patches, logs e imagens vão a artefatos imutáveis referenciados por digest. Persistir metadata e resumo no estado quente, evitando copiar relatórios inteiros para cada prompt ou recibo.
|
|
172
|
-
|
|
173
|
-
Workers recebem seleção explícita de entradas e referências das dependências, com resolvers somente leitura limitados ao escopo e ao orçamento. Dados de outros agentes são fonte não confiável, não instrução que amplia autorização. Mensagens de coordenação pertencem ao contrato do owner.
|
|
174
|
-
|
|
175
|
-
Chunks, paginação e streaming de coleções precisam de integridade e versão. Para v2 inicial, discovery produz uma coleção finita persistida; streaming incremental virá depois. Não concluir um map porque a janela atual esvaziou enquanto ainda há itens não materializados.
|
|
176
|
-
|
|
177
|
-
Garbage collection só remove artefatos fora das referências de runs ativos, checkpoints, retenção de recuperação e relatórios publicados. Antes de remover, calcular reachability; replay com artefato ausente falha explicitamente e não dispara um efeito externo para tentar reconstruí-lo.
|
|
51
|
+
O owner é a autoridade local do projeto; sua existência não implica serviço distribuído, funcionamento com App fechado nem wakeup instalado. O runtime pode ser compartilhado sem instalar Forge como dependência do projeto alvo. CLI/MCP/cliente futuro usam a mesma autoridade e o mesmo estado.
|
|
178
52
|
|
|
179
|
-
|
|
53
|
+
O registry confiável contém schemas, executores, políticas, contratos de aceite, populações e child programs versionados. Cada run fixa seus contratos. Um plano gerado por agente não amplia permissões nem substitui o registry. Dados, imagens e relatórios dos agentes são entradas não confiáveis, não autorização.
|
|
180
54
|
|
|
181
|
-
|
|
55
|
+
## 4. Modelo público e compatibilidade
|
|
182
56
|
|
|
183
|
-
|
|
57
|
+
Manter schemaVersion da persistência e operatorVersion como eixos diferentes. Proposta: operatorVersion 2 identifica as novas semânticas de scheduling/scopes/wait/resume. Se novas estruturas de persistência exigirem migração, usar discriminador próprio; não fingir compatibilidade binária apenas mantendo schemaVersion 2.
|
|
184
58
|
|
|
185
|
-
|
|
59
|
+
Programas operatorVersion 1 continuam interpretados por seu comportamento histórico. Não migrar runs ativos automaticamente. Uma conversão gera proposta/diff, explicita dependências de controle e exige confirmação do owner dentro da autorização da tarefa. Não deduzir silenciosamente ordem a partir de uma lista ambígua.
|
|
186
60
|
|
|
187
|
-
O
|
|
61
|
+
O novo formato tem `mode: "data" | "candidate"` para ergonomia. Em data, resultado tipado não autoriza publicação. Em candidate, o resultado que declara aceite precisa do gate do owner. Nenhum perfil pode enfraquecer política, cobertura ou autoridade de efeitos. Perfis são configurações do mesmo núcleo, não dois runtimes.
|
|
188
62
|
|
|
189
|
-
|
|
63
|
+
Blocos canônicos usam `{ steps, result }`. Blocos de map/loop/subworkflow e braços de branch têm escopo lexical. Um body contendo uma única operação é um shorthand: o lowerer cria o bloco e sua expressão de resultado. Não usar implicitamente a última operação de um bloco com várias etapas como resultado. Referência entre irmãos usa IDs locais; referência a um filho interno de outro scope é inválida. Só o resultado público do scope atravessa sua fronteira.
|
|
190
64
|
|
|
191
|
-
|
|
65
|
+
## 5. Semântica de ordem, dependências e scopes
|
|
192
66
|
|
|
193
|
-
|
|
67
|
+
No operatorVersion 2, `steps` no nível de grafo é um conjunto finito de operações identificadas; ordem textual não é aresta. Referências de output/candidate/evidence criam dependências de dados. O campo comum `after: [stepId, ...]` cria dependências de controle que não exigem consumir dados. `after` é campo, não uma função JavaScript executada.
|
|
194
68
|
|
|
195
|
-
|
|
69
|
+
Uma operação fica pronta somente quando todos os predecessores exigidos satisfazem o contrato. “Processo terminou” não equivale a “dependência satisfeita”: repairs requeridos precisam de aceite, waits requerem decisão válida e scopes exigem join. Falha não satisfaz after. Receber uma decisão válida de declínio por waitEvent pode concluir a espera, mas não autoriza escrita/aplicação: after/sequence ordenam controle, e o owner exige a decisão aprovadora vinculada quando policy requer autorização. Uma política de collection pode representar um resultado parcial de forma explícita, sem converter falhas em sucesso.
|
|
196
70
|
|
|
197
|
-
|
|
71
|
+
`sequence` adiciona arestas de controle em ordem declarada e tem resultado explícito. Referência de uma etapa anterior à saída de uma posterior no mesmo sequence cria ciclo e é rejeitada. `parallel` permite executar filhos independentes quando prontos; dependências entre filhos continuam valendo. O pai não ocupa um slot de worker aguardando seus filhos. Join e cancelamento pertencem ao scope.
|
|
198
72
|
|
|
199
|
-
|
|
73
|
+
`parallel.onFailure` inicialmente suporta `collect-all` e `cancel-siblings`. O primeiro coleta desfechos em ScopeResult persistido para diagnóstico; um filho obrigatório falho impede sucesso do scope. O campo result é avaliado somente após join bem-sucedido; na falha, output(scope) não fornece valor de sucesso. status/history/explain expõem os outcomes sem inventar output de filho falho, null ou recovery implícito. Não adicionar outcome()/catch ao núcleo inicial. O segundo solicita cancelamento dos filhos pendentes/ativos, preserva os completos e aguarda observação/reconciliação. Não implementar race ou “primeiro resultado ganha” sem contrato separado de efeitos.
|
|
200
74
|
|
|
201
|
-
|
|
75
|
+
Todos os roots declarados pertencem ao scope raiz; trabalho obrigatório falho não pode desaparecer porque result referencia apenas um subconjunto. Arms não escolhidos são skipped, sem obrigações ativas. Ordem de agregação e de composição é determinística; ordem de conclusão de workers pode variar. Não prometer reproduzir o mesmo interleaving de efeitos externos.
|
|
202
76
|
|
|
203
|
-
|
|
77
|
+
## 6. Catálogo completo das funções de autoria desejadas
|
|
204
78
|
|
|
205
|
-
|
|
79
|
+
Este é o catálogo fechado do núcleo proposto, não uma promessa de JavaScript irrestrito. A significa função existente cujo contrato é preservado/aprimorado; N significa função proposta. Recursos de fases posteriores são marcados no texto. Não incluir funções internas de hashing/locking como APIs de workflow.
|
|
206
80
|
|
|
207
|
-
|
|
81
|
+
### 6.1 Definição e referências de registry
|
|
208
82
|
|
|
209
|
-
|
|
83
|
+
| Função | Estado | Contrato |
|
|
84
|
+
|---|---|---|
|
|
85
|
+
| `defineWorkflow(definition)` | A | Define identidade, versões, schemas, policy, mode, população opcional, steps e result |
|
|
86
|
+
| `schemaRef(id, version)` | A | Referência a schema resolvido e fixado pelo owner |
|
|
87
|
+
| `executorRef(id, version)` | A | Referência a executor autorizado, com schemas/capacidades/efeitos |
|
|
88
|
+
| `policyRef(id, version)` | A | Referência a limites e autoridade; não alteração de policy |
|
|
89
|
+
| `acceptanceRef(id, version)` | A | Obrigações e critérios definidos pelo owner |
|
|
90
|
+
| `populationRef(id, version)` | A | Catálogo fechado, baseline, evidência e exclusões justificadas |
|
|
91
|
+
| `recipeRef(id, version)` | A | Receita versionada; inicialmente repair built-in, não extensão arbitrária |
|
|
92
|
+
| `programRef(id, version)` | A | Child program registrado, sem import/eval arbitrário |
|
|
210
93
|
|
|
211
|
-
|
|
94
|
+
### 6.2 Operadores de execução
|
|
212
95
|
|
|
213
|
-
|
|
96
|
+
Todos usam ID estável e opções discriminadas. Campos comuns: after, label e input onde pertinente. Recursos/efeitos efetivos são a interseção da solicitação com a policy/registry. A autoria não declara autoridade nova.
|
|
214
97
|
|
|
215
|
-
|
|
98
|
+
| Função | Estado/fase | Contrato e resultado |
|
|
99
|
+
|---|---|---|
|
|
100
|
+
| `value(id, {value})` | A | Calcula expressão pura finita, sem I/O; resultado é o valor tipado |
|
|
101
|
+
| `agent(id, {executor,input,candidate?,writeScope?})` | A/P1 | Executa agente registrado; output entrega seus dados tipados, candidato/evidência permanecem identidades separadas |
|
|
102
|
+
| `command(id, {executor,input,candidate?,writeScope?})` | A/P1 | Executa argv registrado e retorno tipado; não shell arbitrário do autor |
|
|
103
|
+
| `map(id, {items,key,coverage?,completion,quorum?,concurrency,body,order})` | A/P1 | Fan-out finito, chaves únicas, seal e ledger; retorna CollectionResult tipado |
|
|
104
|
+
| `branch(id, {condition,then,else})` | A/P0 | Seleciona um bloco; condition booleano validado, merges tipados, outro braço skipped |
|
|
105
|
+
| `loop(id, {initialState,maxRounds,body,next,until})` | A/P1 | Rodadas com state/counters persistidos; next e until têm contratos de tipo explícitos |
|
|
106
|
+
| `repair(id, options)` | A/P1/P2 | Receita de implementação/avaliação limitada, com candidato e critérios; ver seção 11 |
|
|
107
|
+
| `compose(id, {candidates,onConflict})` | A/P1 | Integra lineage compatível, conserva produtores; conflito preserva inputs e bloqueia; continuidade por resolução é extensão posterior |
|
|
108
|
+
| `gate(id, {candidate,coverage?,authorization?})` | A/P1/P2 | Owner verifica obrigações e emite GateReceipt para o candidato exato; não aplica arquivos |
|
|
109
|
+
| `subworkflow(id, {program,input})` | A/P1 | Materializa child program registrado, herdando autoridade e limites globais |
|
|
110
|
+
| `waitEvent(id, {type,correlation,schema,subject?,timeoutMs})` | A/P1 | Aguarda evento autorizado, devolve dados/receipt tipados, sem contar espera como falha |
|
|
111
|
+
| `sequence(id, {steps,result})` | N/P1 | Scope com arestas de controle em ordem explícita |
|
|
112
|
+
| `parallel(id, {steps,result,onFailure})` | N/P1 | Scope com paralelismo estruturado, join e política de falha/cancelamento |
|
|
216
113
|
|
|
217
|
-
|
|
114
|
+
`map.key` deve produzir string Unicode válida. V2 normaliza NFC **antes** de verificar unicidade e rejeita colisões; v1 conserva sua regra histórica de rejeitar keys não NFC. Default proposto de 256 bytes UTF-8 por key, com limite efetivo fixado pela policy antes do dispatch. A key canônica é usada em invocation, seal, evento, ledger e resultado; o original é apenas metadata. Scope path é tupla de segmentos; representação textual usa um único encoding percent UTF-8 sem ambiguidades, sem concatenação crua e sem dupla decodificação. Slash/separadores dentro da key nunca criam scopes. `map.order` inicialmente é `key` ou `input`; default v2 `key`, ordenação por bytes UTF-8, sem localeCompare. Ordem input usa ordinal persistido no seal. É ordem de resultado, não de dispatch nem identidade.
|
|
218
115
|
|
|
219
|
-
|
|
116
|
+
`completion` deve ser declarada: all-required, partial ou quorum. Partial/quorum só são admitidos por contrato owner compatível, nunca alimentam gate all-required por acidente. `quorum: { minAccepted: K }` é obrigatório para quorum, proibido nos demais modos; K inteiro entre 1 e o tamanho do seal. Collection vazia segue decisão no-work explícita, sem quorum 0 implícito. Em data, contar outputs válidos segundo o contrato; em candidate, somente contribuições aceitas. Failed, inconclusive, canceled e skipped não contam. Atingir K não fecha cedo: o núcleo exige todos os outcomes observados e settled. Waiting conserva obrigação e mantém collection aberta. Deadline pode fixar timeout terminal permitido pelo contrato, sem esconder efeito incerto nem retirar obrigação required. Abaixo de K ao final: collection reprovada e diagnóstico, sem result de sucesso. Quorum com 2/3 e um waiting permanece aberto; se o terceiro terminar por timeout admitido, pode fechar apenas se o contrato aceitar esse desfecho. Unknown/uncertain nunca é settled para liberar gate/apply. Fechamento antecipado exige extensão owner específica para remaining, cancelamento e reconciliação, fora do MVP.
|
|
220
117
|
|
|
221
|
-
|
|
118
|
+
`map.concurrency` limita atividades ativas no subgrafo do map, incluindo implement/review/check/evidence, e não a quantidade de itens em voo. Um futuro scope activity limit usa a mesma unidade. Pais e waits não ocupam slot; todos os limites de ancestral/run/owner são aplicados conjuntamente. Limite de itens em voo, se necessário, recebe campo separado e não muda a definição de concurrency.
|
|
222
119
|
|
|
223
|
-
|
|
120
|
+
CollectionResult canônico proposto: `{ items: [{key,outcome,valueRef?}], sealRef, totals, coverageReceiptRef?, contributionLedgerRef? }`. As saídas de filhos são resolvidas por referências tipadas; a experiência de autoria pode oferecer projeção de dados sem duplicar conteúdo no estado. Esse envelope não é uma lista que pode ser filtrada para esconder falhas. acceptedCandidates/coverageReceipt leem registros emitidos pelo owner.
|
|
224
121
|
|
|
225
|
-
|
|
122
|
+
ScopeResult é diagnóstico autoritativo acessível por status/history/explain, não um envelope adicional de output(sequence/parallel). Loop devolve state final tipado somente quando until é satisfeito; exaustão preserva state/diagnóstico na inspeção e bloqueia output de sucesso. Branch arms e loop body usam Block. `loop.next` é avaliado após body terminar e ter seus outputs públicos; `until` usa o state novo e outputs permitidos. Terminação falsa após maxRounds produz exhaustion visível. Uma rodada não pode remover obligations de rodadas anteriores sem contrato próprio; loop não é escape de budgets.
|
|
226
123
|
|
|
227
|
-
|
|
228
|
-
2. Preparar workspace sobre o candidato anterior, aplicando sua ancestralidade.
|
|
229
|
-
3. Conforme entryMode e avaliação anterior, executar implementação ou correção com feedback vinculado ao candidato observado; assess-first não modifica um candidato já aceito.
|
|
230
|
-
4. Capturar novo artefato e candidato, validando beforeimages e writeScope.
|
|
231
|
-
5. Executar revisão distinta e checks configurados sobre esse candidato.
|
|
232
|
-
6. Se satisfeito o gate da rodada, registrar aceite do candidato; senão persistir findings e decidir a próxima rodada permitida. Inconclusive permite reavaliação/escalada limitada por política; não é ordem automática para editar código.
|
|
233
|
-
7. Em interrupção/efeito incerto, parar esse ramo para reconciliação; não transformar incerteza em reprovação comum.
|
|
124
|
+
### 6.3 Expressões puras e referências de resultados
|
|
234
125
|
|
|
235
|
-
|
|
126
|
+
| Função | Contrato |
|
|
127
|
+
|---|---|
|
|
128
|
+
| `workflowInput()` | Entrada tipada e congelada do programa corrente, inclusive child |
|
|
129
|
+
| `item()` | Item corrente do map; inválido fora desse contexto |
|
|
130
|
+
| `loopState()` | State da rodada; inválido fora de loop |
|
|
131
|
+
| `output(id)` | agent/command: dados tipados; sequence/parallel: Block.result após join válido; branch: result do braço escolhido; subworkflow: result público do child program; loop: state final quando until satisfeito; repair/map: envelopes tipados; falha obrigatória não entrega valor de sucesso |
|
|
132
|
+
| `field(value,key)` | Acesso a propriedade conhecida; campo obrigatório ausente é erro, não undefined silencioso |
|
|
133
|
+
| `literal(value)` | Literal JSON finito, com budgets de profundidade/bytes |
|
|
134
|
+
| `object(fields)` | Objeto de valores/expressões com chaves permitidas |
|
|
135
|
+
| `array(...values)` | Lista finita de valores/expressões |
|
|
136
|
+
| `eq(left,right)` | Igualdade canônica dos tipos permitidos; sem coerção JS |
|
|
137
|
+
| `and(...values)` | Conjunção de booleanos |
|
|
138
|
+
| `or(...values)` | Disjunção de booleanos |
|
|
139
|
+
| `not(value)` | Negação de booleano |
|
|
140
|
+
| `concat(...arrays)` | Concatenação com budget antes da alocação |
|
|
141
|
+
| `filter(values,key,equals)` | Seleção pura por igualdade de campo; não é step nem callback livre |
|
|
142
|
+
| `unique(values,key)` | Unicidade determinística; não dispensa map validar todas as chaves originais |
|
|
143
|
+
| `sort(values,key)` | Ordenação estável explícita; tipos/normalização definidos |
|
|
144
|
+
| `take(values,count)` | Prefixo limitado; não enfraquece population/coverage |
|
|
145
|
+
| `length(value)` | Tamanho permitido pelo tipo registrado |
|
|
146
|
+
| `population()` | Contrato/manifesto do owner para o programa, não catálogo inventado pelo agente |
|
|
147
|
+
| `acceptance()` | Critérios e digest fixados pelo owner |
|
|
148
|
+
| `candidateFromBaseline(entry)` | Candidato inicial sobre o baseline capturado; entry descreve o item, não concede writes |
|
|
149
|
+
| `outputCandidate(id)` | Candidato observado produzido por atividade/compose; não implica aceite |
|
|
150
|
+
| `acceptedCandidate(id)` | Candidato com assessment válido de repair/controle correspondente |
|
|
151
|
+
| `acceptedCandidates(id)` | Candidatos/contribuições aceitas de collection fechada, sem omitir obrigações |
|
|
152
|
+
| `coverageFor(contract,discovered)` | Solicita validação owner da descoberta contra o catálogo; não declaração literal de completude |
|
|
153
|
+
| `coverageReceipt(id)` | Receipt owner da collection relevante, seal e obrigações |
|
|
154
|
+
| `acceptanceWriteScope(id)` | Escopo do contrato de aceite, limitado pela policy |
|
|
155
|
+
| `approvedChecksFor(entry)` | Checks owner da avaliação do item, resolvidos por fase/contexto; não lista escolhida pelo autor |
|
|
156
|
+
| `acceptanceChecks(id)` | Checks owner da avaliação correspondente ao ID/contexto, inclusive fase final; v1 mantém sua lista única |
|
|
236
157
|
|
|
237
|
-
|
|
158
|
+
Todas essas 29 expressões já têm nomes no subsistema de programas atual; os contratos exatos serão versionados. Elas não fazem chamadas de modelos, rede, filesystem, relógio do host ou random. Tipos inválidos são erros de validação. Transformações complexas usam atividades registradas. Operadores adicionais, reduce/race/streaming e callbacks gerais ficam fora do núcleo inicial, com proposta de versão separada se a necessidade for demonstrada.
|
|
238
159
|
|
|
239
|
-
|
|
160
|
+
### 6.4 APIs de compilação e validação
|
|
240
161
|
|
|
241
|
-
|
|
162
|
+
`lowerWorkflowSource(source)` converte AST finita em IR sem importar/transpilar/executar authored code. `validateWorkflowProgram(program,registry)` valida estrutura, refs, tipos, grafo, scope, efeitos e budgets. `validateProgramData(value,schema)` valida entradas/saídas. `validateProgramTypes(program,registry)` é etapa da validação, não mecanismo de aprovação. O cliente pode expor essas APIs offline; a validação autoritativa é sempre a do owner.
|
|
242
163
|
|
|
243
|
-
|
|
164
|
+
Melhoria de P1: tipos discriminados e branded refs para não confundir schema/executor/candidate/data/receipt. Gerar declarações de tipos a partir do registry versionado. Diagnósticos incluem arquivo/linha/operação/caminho de schema/razão. Um handle tipado é shorthand compilado para ref; não objeto que executa callback. sourceMap é metadata com digest próprio e não amplia autoridade.
|
|
244
165
|
|
|
245
|
-
|
|
166
|
+
## 7. Controle do run e inspeção
|
|
246
167
|
|
|
247
|
-
|
|
168
|
+
| Operação lógica | Situação | Contrato |
|
|
169
|
+
|---|---|---|
|
|
170
|
+
| `program-validate` | Existe, ampliar | Validação sem dispatch; devolve diagnósticos, capabilities e plano de efeitos |
|
|
171
|
+
| `program-start` | Existe, ampliar | Fixa programa/input/registry/baseline e autorização; persiste antes de agendar |
|
|
172
|
+
| `program-status` | Existe, ampliar | Estado autoritativo, waits, obrigações, uso e razões de bloqueio |
|
|
173
|
+
| `program-wait` | Existe | Long poll com cursor/timeout; distinto de waitEvent no programa |
|
|
174
|
+
| `program-pause` | Existe, esclarecer | Suspende novo dispatch; atividades em voo continuam ou recebem pedido explícito conforme escopo |
|
|
175
|
+
| `program-resume` | Existe, corrigir | Continua fatos persistidos; não recria budgets nem repete completados intactos |
|
|
176
|
+
| `program-signal` | Existe, ampliar | Entrada autorizada idempotente; receipt de recebimento separado do consumo/decisão |
|
|
177
|
+
| `program-replan` | Existe, esclarecer | Diff versionado com preservação/invalidação explícitas e reason/evidence |
|
|
178
|
+
| `program-cancel` | Existe, ampliar | Solicita cancelamento; conclusão exige observação dos efeitos, não apenas abort enviado |
|
|
179
|
+
| `program-reconcile` | Existe, ampliar | Reconcilia attempts/apply com observação verificável e identidade exata |
|
|
180
|
+
| `program-apply` | Existe, preservar | Gate atual + autorização + beforeimages + ApplyIntent; efeito local separado de compute |
|
|
181
|
+
| `program-history` | Proposta P1 | Transições, stateRefs e decisões antigas sem mutação |
|
|
182
|
+
| `program-artifact-get` | Proposta P1/P2 | Resolve referência autorizada; metadata/bytes limitados, sem acesso por path arbitrário |
|
|
183
|
+
| `program-explain` | Proposta P1 | Explica ready/wait/blocked, dependências e motivo de replay/invalidação |
|
|
184
|
+
| `program-diff` | Proposta P0/P1 | Mostra proposta de replan/migração, efeitos e gates afetados sem aplicar |
|
|
248
185
|
|
|
249
|
-
|
|
250
|
-
2. Candidato escolhido e artefatos de composição identificados.
|
|
251
|
-
3. Revisão distinta aplicável ao digest desse candidato.
|
|
252
|
-
4. Checks obrigatórios satisfeitos sobre o mesmo candidato e ambiente pertinente.
|
|
253
|
-
5. Findings bloqueantes resolvidos com evidência ou decisão autorizada; inconclusivos não são aprovação.
|
|
254
|
-
6. Ausência de tentativas/efeitos incertos pertinentes ou publicação parcial.
|
|
255
|
-
7. Autorização compatível com ação, escopo e versão de aceite.
|
|
186
|
+
Os nomes novos são propostas, não comandos instalados. CLI usa request JSON e MCP traduz para fabric_program_*; ambos passam pelo mesmo contrato. Mutations usam requestId único e expectedVersion. Repetir requestId com corpo diferente conflita. ACK idempotente não significa efeito externo exatamente uma vez. Capabilities devem declarar versão de operadores, adapters, isolamento e limites observados.
|
|
256
187
|
|
|
257
|
-
|
|
188
|
+
## 8. Estados e scheduler durável
|
|
258
189
|
|
|
259
|
-
|
|
190
|
+
Operações propostas: declared → ready → preparing → running → completed; waiting, skipped, failed, canceled-confirmed e uncertain têm significado separado. needs-attention é razão operacional agregada, não substituto universal de todos os estados. Parent join conserva cada outcome; resultados conhecidos não são apagados por falha de outro filho.
|
|
260
191
|
|
|
261
|
-
|
|
192
|
+
Run executing se há atividade/controle autorizado em progresso; waiting quando só restam waits autorizados e não há trabalho pronto/ativo; paused por decisão explícita; needs-attention se exige correção/reconciliação; completed para compute de dados; acceptance-ready para candidato gated; applying/applied/apply-uncertain para efeito local. canceled só após settle/observação das atividades pertinentes. Histórico preserva cancel-requested e instantes reais.
|
|
262
193
|
|
|
263
|
-
|
|
194
|
+
Fila persistida com invocations e claims; capacidade do owner distinta de quota por run e limite por scope/map. Só atividades reservam slots. Espera e pais aguardando filhos não reservam worker. Fairness inicial: round-robin entre runs elegíveis e scopes, com tie-breaker estável; reentrada não pode esgotar a fila de outros runs. Não prometer scheduling distribuído. Claims de dispatch são persistidos antes do processo/modelo; epoch do owner/generation impedem resultado antigo de satisfazer trabalho substituído. Uma única autoridade ativa por projeto admite dispatch: exclusividade local via lock de processo/host e CAS do estado/epoch, validada em toda mutação autoritativa; não inferir exclusividade de TTL. Não é um protocolo distribuído.
|
|
264
195
|
|
|
265
|
-
|
|
196
|
+
Reservas têm ID de invocação/tentativa e debit transacional antes do dispatch; reconstrução usa intents/outcomes autoritativos. Release observado acontece uma vez. Crash antes de dispatch pode liberar apenas após provar que nenhum processo foi iniciado; crash depois de possível dispatch preserva reserva e classifica uncertain até observação. Claim expirado, PID indisponível e novo epoch não provam morte nem ausência de efeito. Worker órfão vivo continua contando na quota. Resultado tardio fica no histórico para reconciliação; não satisfaz automaticamente geração substituída. Dois owners concorrentes não podem ambos admitir o mesmo trabalho.
|
|
266
197
|
|
|
267
|
-
|
|
198
|
+
Materialização é limitada/paginada: não criar todos os clones/processos de 10 mil itens antes de haver capacidade. Persistir o catálogo/seal, uma janela de invocations e cursor; resolver resultados por key. Quotas incluem calls de implementer, reviewer, checks/evidence e child programs. Subagentes internos de um harness só têm teto agregado se o adapter realmente os observa/controla; declarar o limite caso contrário.
|
|
268
199
|
|
|
269
|
-
|
|
200
|
+
Backpressure impõe bytes/ready queue/atividade e admite/nega expansão antes de alocar. Aumentar cap não prova performance. Começar concurrency 4 até medir. Cancelamento ou revogação de policy retira admissões novas; não invalida fatos históricos já observados.
|
|
270
201
|
|
|
271
|
-
|
|
202
|
+
## 9. Retomada, replan e cache
|
|
272
203
|
|
|
273
|
-
|
|
204
|
+
| Caso | Regra |
|
|
205
|
+
|---|---|
|
|
206
|
+
| Mesmo run/invocação intacta concluída | Ler resultado, candidato e receipts duráveis; não preparar clone nem chamar adapter/modelo de novo |
|
|
207
|
+
| Resultado de activity persistido, parent sem commit | Reconstruir parent a partir dos fatos dos filhos, com validação/join; não repetir activity |
|
|
208
|
+
| Execução interrompida sem resultado observado | Marcar uncertain, consultar/observar se adapter permite, reconciliar antes de redispatch |
|
|
209
|
+
| Replan | Diff de dados/controle/obrigações, invalidação transitiva; preservação explícita de invocations intactas |
|
|
210
|
+
| Novo run/cache entre runs | Contrato opt-in separado, fechado sobre entradas e validade; posterior ao MVP |
|
|
274
211
|
|
|
275
|
-
|
|
212
|
+
A retomada exige integridade e acesso a resultados/artifacts/candidates. Corrupção/ausência bloqueia com diagnóstico; não vira cache miss que dispara efeito. Mudança de código do adapter/CLI não reescreve o passado: owner pode ler fatos antigos mas bloquear novo dispatch/apply se incompatível ou revogado. Uma consulta externa com exigência de frescor precisa de nova atividade/obrigação, não I/O implícito em replay.
|
|
276
213
|
|
|
277
|
-
|
|
214
|
+
Capturar definição de invocação: runId, scope path, itemKey/round, operationId, generation, semantic/input/candidate digests e executor/contract refs. attemptId identifica uma execução concreta; reattempt não muda identidade do item. Cada fato de resultado inclui produtor, uso, artifacts e candidato. As operações de controle são reconstruídas deterministicamente desses fatos; não reexecutam chamadas externas.
|
|
278
215
|
|
|
279
|
-
|
|
216
|
+
Barrier/additive/fenced globais existentes continuam conservadores. Preservação de work intacto deve ser explícita mesmo quando a revisão global aumenta: generation de trabalho não deve obrigatoriamente ser igual ao contador editorial do plano. Alterar população/aceite/autoridade fixados requer successor run conforme contrato, não replan que enfraqueça obrigações. Fenced replan local independente é extensão posterior e exige reconciliação de efeitos, não só ignorar outputs tardios.
|
|
280
217
|
|
|
281
|
-
|
|
218
|
+
## 10. Eventos, decisões humanas e deadlines
|
|
282
219
|
|
|
283
|
-
|
|
220
|
+
waitEvent registra alvo, scope, generation, tipo, correlation, subject e prazo. Subject pode ligar decisão a candidate/contract digests. Um evento aprovado para candidato antigo não autoriza outro. Payload válido por schema não basta: actor/autoridade, bindings, expiração e consumo precisam ser verificados pelo owner.
|
|
284
221
|
|
|
285
|
-
|
|
222
|
+
Eventos anteriores ao wait podem ficar em inbox autorizada bounded, sem inventar targets futuros. Duplicatas são idempotentes; geração antiga fica stale e auditável. Consumir evento e fixar decisão é transação única. Receipt de entrada aceita, receipt de decisão e GateReceipt são distintos. Declínio é decisão válida, mas não aprovação; gate exige aprovação compatível quando policy requer.
|
|
286
223
|
|
|
287
|
-
|
|
224
|
+
Deadlines persistidos são absolutos. Tempo de espera conta no deadline do run por default; uma extensão exige decisão autorizada versionada com limite, não reset por resume. Prazo de atividade/check inclui preparação quando pertinente. Owner vivo pode despertar somente o ramo autorizado após evento. Run paused não desperta por evento; restart do owner reconcilia e exige política explícita de continuação. Não instalar serviço/wakeup/automation como efeito da autoria.
|
|
288
225
|
|
|
289
|
-
|
|
226
|
+
## 11. Repair e aceite
|
|
290
227
|
|
|
291
|
-
|
|
228
|
+
`repair` preserva implement-first e assess-first. Campos existentes: recipe, implement, review, checks, entryMode, initialCandidate, writeScope, maxRepairRounds, maxAssessmentAttempts, maxInfrastructureAttempts, progressPolicy. Campos novos propostos: input tipado para contexto, assessmentScope: "item" | "final" e evidence para executores readonly que preparam evidências de avaliação. Todos são refs autorizadas, não código livre.
|
|
292
229
|
|
|
293
|
-
|
|
230
|
+
**Obrigações por fase, sem enfraquecimento pelo autor.** Acceptance v2 tem obligation IDs imutáveis, critérios/evidências e `requiredChecksByScope`; registry vincula operation/recipe aos contextos item ou final admitidos. `assessmentScope` solicita uma dessas bindings, mas o owner verifica a correspondência estrutural: repair dentro do map cobre sua key, avaliação pós-compose obrigatória é final. Declarar item na fase final ou omitir checks não reduz obrigações; validação rejeita antes do dispatch. V1 mantém acceptance.requiredChecks e seu intérprete histórico.
|
|
294
231
|
|
|
295
|
-
|
|
232
|
+
No caso UI, o contrato fixa uma obrigação de layout por key do catálogo, mais obrigações de integração/inventário. Item exige ui-layout@v2 e typecheck@v1 para sua avaliação. Final exige ui-regression@v2 e typecheck@v1, evidência nova de todo o catálogo e revisão com cobertura explícita de cada obrigação de layout e integração. O check de regressão deve observar por item as constraints requeridas de layout; essa ligação entre critérios e validators é aprovada no registry, não inferida pela semelhança de nomes. Se o validator final não comprovar uma obrigação local, o contrato também exige seu checker local no candidato final. O workflow pode pedir checks extras admitidos; nunca um subconjunto mais fraco.
|
|
296
233
|
|
|
297
|
-
|
|
234
|
+
**Interfaces de avaliação propostas (schemas do registry, não novos operadores).**
|
|
298
235
|
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
236
|
+
```text
|
|
237
|
+
AssessmentContext = {
|
|
238
|
+
runId, invocationId, assessmentId, phase, candidateRef,
|
|
239
|
+
obligationIds, itemKey?, populationSealRef?, environmentRef,
|
|
240
|
+
evidenceRefs, input
|
|
241
|
+
}
|
|
242
|
+
EvidenceResult = {
|
|
243
|
+
outcome: observed | infrastructure_failed | inconclusive,
|
|
244
|
+
artifactRefs, proposedCoverage, producerAttemptId
|
|
245
|
+
}
|
|
246
|
+
AssessmentReceipt = {
|
|
247
|
+
assessmentId, candidateRef, contractRef, phase,
|
|
248
|
+
environmentRef, evidenceRefs, checkResultRefs, reviewResultRef,
|
|
249
|
+
satisfiedObligationIds, unsatisfiedObligationIds, verdict, ownerRecordRef
|
|
250
|
+
}
|
|
251
|
+
```
|
|
302
252
|
|
|
303
|
-
|
|
253
|
+
O owner cria AssessmentContext. Executores evidence recebem contexto com evidenceRefs inicialmente vazio; seus outputs são validados, e o owner liga CaptureReceipts/artefatos válidos ao contexto dos checks/reviewer. Esses consumidores recebem referências autorizadas com quotas de bytes, imagens e acesso readonly; não escolhem candidate/environment/obligation IDs. proposedCoverage de agente é alegação, não prova owner. Owner emite AssessmentReceipt a partir dos outcomes/critério observáveis, registra cada obrigação satisfeita ou faltante e rejeita evidência de outro candidato, ambiente ou geração. Output aprovado com cobertura omitida não fecha a matriz. Input.ui/catalog ajuda a tarefa, mas não substitui o contexto confiável.
|
|
304
254
|
|
|
305
|
-
|
|
255
|
+
Sequência de uma avaliação: persistir fase/counters → preparar evidência para candidato exato → construir AssessmentContext validado → executar checks pertinentes e reviewer distinto → validar outputs/cobertura → decisão do owner. Checks e review podem rodar paralelos quando dependências de evidência permitem. Reviewer visual recebe capturas emitidas/validadas pelo adapter, não path textual qualquer. Dados de reviewer são assessment proposto; owner emite receipt após verificar linkage/checks/criteria.
|
|
306
256
|
|
|
307
|
-
|
|
257
|
+
Approved + nenhum finding pendente + checks exigidos aprovados + evidências pertinentes válidas permite aceite. Changes_requested ou check de código reprovado permite implementação limitada. Inconclusive ou captura inválida não deve ser transformada automaticamente em defeito visual; corrigir infraestrutura/reavaliar dentro dos budgets ou parar para intervenção. Uma falha de build genuína do candidato é finding/check negativo, distinta de browser indisponível.
|
|
308
258
|
|
|
309
|
-
|
|
259
|
+
MaxRepairRounds conta implementações, inclusive tentativa antes de seus efeitos serem observados; maxAssessmentAttempts conta ciclos de avaliação; maxInfrastructureAttempts conta reattempts operacionais, sem devolver tentativas consumidas. `maxAttempts` global conta dispatches de atividades e reattempts **visíveis ao owner**, incluindo implement/review/check/evidence. Uma atividade SDK não equivale a uma única RPC/model call. Reservar/debitar por tentativa antes do efeito, com ID transacional; reconstrução não devolve nem cobra novamente a mesma reserva. Resume de completed intacto debita zero; reattempt observado debita nova tentativa. maxRepairRounds/maxAssessmentAttempts/maxInfrastructureAttempts têm unidades separadas e counters persistidos. RPCs, provider retries e subagentes internos têm contagem/limite próprios somente quando o adapter realmente os observa/controla; caso contrário declarar unknown/cooperative e não prometer teto de requisições/tokens/dinheiro. Guardar phase, debit e dispatch antes de cada efeito evita replenishment por crash. Efeito incerto sempre exige observação/reconciliação.
|
|
310
260
|
|
|
311
|
-
|
|
261
|
+
Progress policy mede candidato/deltas e findings canonicalizados por schema; thresholds configurados não são prova semântica de melhoria. Stalled/exhausted/inconclusive ficam visíveis e bloqueiam consumers obrigatórios. Um value final não mascara repair rejeitado. Reviewer distinto pode usar mesmo modelo, mas essa separação não garante independência estatística de julgamento.
|
|
312
262
|
|
|
313
|
-
|
|
263
|
+
## 12. Cobertura, contribuições, composição e gate
|
|
314
264
|
|
|
315
|
-
|
|
265
|
+
Population fixa o catálogo esperado, baseline/evidência, itens e exclusões justificadas. Discovery propõe itens; coverageFor compara identidades e checks de inventário owner. Chaves estáveis não são índices de lista. “Todas as UIs” significa todas do catálogo aceito; a qualidade do catálogo é obrigação separada, não prova por declaração do capturador.
|
|
316
266
|
|
|
317
|
-
|
|
267
|
+
Seal fecha a collection. CoverageReceipt prova cumprimento do catálogo. ContributionLedger liga cada item à avaliação e candidato/contribuição aceitos, inclusive zero-delta legítimo. Todos os itens obrigatórios precisam aparecer; filter/take/unique não retiram obrigações. No-work só com autorização em population e acceptance. Partial/quorum têm denominador/seal e faltantes explícitos, sem transformar skipped/failed em aceito.
|
|
318
268
|
|
|
319
|
-
|
|
269
|
+
Compose mantém baseline, pais e deltas de cada produtor; ancestral compartilhado aparece uma vez, patches iguais independentes ainda requerem política de conflito. Antes de aceitar, validar closures e beforeimages. onConflict inicialmente needs-resolution: preservar inputs, emitir conflito e parar. P1/P2 detecta e bloqueia conflito, preserva candidatos/receipts e não promete continuar automaticamente a composição. Não aplicar last-writer-wins nem criar operador resolve automático. Uma extensão de resolução/successor só entra com ResolutionReceipt owner ligando conflictRef, parents/inputs, supersededDeltas, obligations e candidateRef resultante; não exigir que deltas substituídos permaneçam literalmente no novo patch. Contribuições originais permanecem auditáveis e a nova solução exige avaliação final completa. Sem esse contrato implementado, a resolução é trabalho separado autorizado, e o run permanece bloqueado.
|
|
320
270
|
|
|
321
|
-
|
|
271
|
+
Gate verifica candidato, população/contribuições/seals, avaliações, checks, versão semântica e autorização pertinente. Candidato global após composição exige revisão/checks globais mesmo se cada item passou. No MVP UI, a avaliação final cobre **todo o catálogo** no candidato final; cada rodada que altera esse candidato exige nova avaliação completa. Receipts locais são histórico de contribuições, não prova atual de preservação semântica. Otimização seletiva por impacto e reuso por equivalência são posteriores, com regras owner demonstradas; lineage sozinho não basta. Contexto de autorização/decision fica ligado ao candidato e contratos exatos. Approved é aceite de contrato técnico, não aceite humano ou produção por implicação.
|
|
322
272
|
|
|
323
|
-
|
|
273
|
+
### 12.1 Resultados e receipts canônicos a fechar em P0
|
|
324
274
|
|
|
325
|
-
|
|
275
|
+
| Schema desejado | Campos/invariantes mínimos |
|
|
276
|
+
|---|---|
|
|
277
|
+
| ScopeResult | scopeRef, requiredChildIds, outcomes tipados por filho, joinStatus, successValueRef?; valor só no join válido, diagnóstico disponível mesmo na falha |
|
|
278
|
+
| CollectionResult | sealRef, keys/outcomes/valueRefs, totals, completion/quorum, coverage/contribution refs; não pode esconder itens faltantes/uncertain |
|
|
279
|
+
| RepairResult | outcome accepted/exhausted/stalled/inconclusive/uncertain/canceled, candidateRef, assessmentReceiptRefs, counters; acceptedCandidate só resolve accepted válido |
|
|
280
|
+
| CaptureReceipt | candidate/build/environment/item identities, artifactRef/digest/MIME/dimensões, producerAttempt, freshness/observação owner; não confundir captura registrada com ausência de defeito |
|
|
281
|
+
| AssessmentContext/Receipt | Contratos da seção 11; cobertura por obrigação, candidato e ambiente exatos |
|
|
282
|
+
| GateReceipt | candidate/program/acceptance/population/seal/contribution refs, matriz final de assessment/checks/evidence, authorizationRef quando requerida, ownerRecordRef |
|
|
326
283
|
|
|
327
|
-
|
|
284
|
+
Outcomes tipados distinguem execução, verdict e aceite. As unions serão schemas discriminados versionados; um JSON com campos iguais a um receipt não recebe autoridade. ScopeResult falho fica em inspeção, sem output fictício. CoverageReceipt histórico do map valida inventário/contribuições e não substitui o AssessmentReceipt final. Gate depende de ambos.
|
|
328
285
|
|
|
329
|
-
|
|
286
|
+
## 13. Efeitos e aplicação
|
|
330
287
|
|
|
331
|
-
|
|
288
|
+
Cada executor declara read, isolated-write, idempotent-effect ou non-idempotent-effect; os dois últimos não ganham exactly-once pela declaração. Adapter precisa especificar chave/receipt/probe/reconciliação; sem isso a execução é cooperativa com outcome uncertain possível. Fonte do autor não faz rede/shell diretamente.
|
|
332
289
|
|
|
333
|
-
|
|
290
|
+
Aplicar é operação externa ao programa de compute por default. program-apply exige GateReceipt atual, autorização válida e destinos/beforeimages observados. Owner persiste ApplyIntent antes da primeira escrita, com candidate/program/contract digests e expected files. Múltiplos arquivos não são transação única de filesystem; partial/interrupted/divergent gera apply-uncertain. Preservar arquivos e reconciliar; nunca repetir automaticamente uma publicação ambígua.
|
|
334
291
|
|
|
335
|
-
|
|
292
|
+
Eventos/replans durante aplicação ficam pending-after-apply; não alteram intent em voo. Revogação/cancelamento verifica admissão e próximas escritas, mas não desfaz o já observado. Applied/canceled final exigem successor run para novo trabalho. Não ampliar publicação npm/deploy como efeito de concluir um plano.
|
|
336
293
|
|
|
337
|
-
|
|
294
|
+
## 14. Adaptadores, capacidades e imagens
|
|
338
295
|
|
|
339
|
-
|
|
296
|
+
Contrato comum de atividade: prepare/admit, dispatch, observe, requestCancel, result, usage, artifacts e reconcile, com versão/identidade. Garantias efetivas explicitam plataforma, sandbox, rede, filesystem e ferramentas. Default Codex atual continua fechado; acesso browser/rede/MCP só entra por capability específica aprovada e adapter que a implemente. Não herdar ferramentas do chat por conveniência.
|
|
340
297
|
|
|
341
|
-
|
|
298
|
+
Command adapters são cooperativos, mesmo com workspace clonado; isso não é sandbox de host/rede. Não afirmar cancelamento confirmado apenas por AbortController ou SIGKILL enviado. Um adapter de outro harness só pode entrar quando os outcomes forem representados corretamente. Subagentes internos precisam de IDs/usage/parent linkage se o produto prometer limites sobre eles.
|
|
342
299
|
|
|
343
|
-
|
|
300
|
+
P2 de UI: artefato imutável de bytes com digest/MIME/dimensões, producerAttempt, baseline/candidate/build/environment digests e identificação de rota/estado/viewport. Browser serve build originada do candidato preparado, com dados de teste/auth fixtures definidos. Caminho em scratch ou URL sem conteúdo persistido não basta para prova. Resolver somente leitura com capacidades scoped; bytes fora do JSON de estado e budgets de imagem/quantidade/resolução.
|
|
344
301
|
|
|
345
|
-
|
|
302
|
+
Captura inválida é outcome separado de defeito visual. Validar tela carregada, URL/estado/viewport, assets/renderização pertinentes e build esperada. Autenticação usa capacidades efêmeras; não persistir tokens/segredos em registry, prompts ou receipts. Ambientes externos voláteis só suportam garantias limitadas declaradas.
|
|
346
303
|
|
|
347
|
-
|
|
304
|
+
Evidence executor pode reaproveitar uma captura já emitida para o mesmo candidato/item/environment dentro da validade owner. Se candidato/contexto mudou, recapturar. Isso evita capturar novamente todas as telas intactas apenas por uma retomada; não confundir com cache cross-run de respostas LLM.
|
|
348
305
|
|
|
349
|
-
|
|
306
|
+
## 15. Exemplo principal: captura, revisão e correção de UIs
|
|
350
307
|
|
|
351
|
-
|
|
308
|
+
API desejada operatorVersion 2, proposta P2. Usa operações/expressões existentes com novas semânticas e campos input/assessmentScope/evidence/mode/operatorVersion. Não é executável na alpha.70. Os executores, schemas, catálogos e checks abaixo são nomes de configuração proposta, não registros já instalados.
|
|
352
309
|
|
|
353
310
|
```typescript
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
311
|
+
import {
|
|
312
|
+
defineWorkflow, schemaRef, executorRef, policyRef,
|
|
313
|
+
acceptanceRef, populationRef, recipeRef,
|
|
314
|
+
agent, map, repair, compose, gate,
|
|
315
|
+
output, field, item, population, coverageFor,
|
|
316
|
+
candidateFromBaseline, acceptedCandidates,
|
|
317
|
+
outputCandidate, acceptedCandidate, coverageReceipt,
|
|
318
|
+
} from "forgeos/agent-fabric/workflows";
|
|
319
|
+
|
|
320
|
+
const itemRepair = {
|
|
321
|
+
recipe: recipeRef("repair", "v2"),
|
|
322
|
+
implement: executorRef("corrigir-ui", "v2"),
|
|
323
|
+
review: executorRef("revisar-ui", "v2"),
|
|
324
|
+
assessmentScope: "item",
|
|
325
|
+
evidence: [executorRef("capturar-candidato-ui", "v2")],
|
|
326
|
+
checks: ["ui-layout@v2", "typecheck@v1"],
|
|
327
|
+
entryMode: "assess-first",
|
|
328
|
+
maxRepairRounds: 3,
|
|
329
|
+
maxAssessmentAttempts: 6,
|
|
330
|
+
maxInfrastructureAttempts: 2,
|
|
331
|
+
progressPolicy: {
|
|
332
|
+
unchangedCandidateRounds: 2,
|
|
333
|
+
repeatedFindingsRounds: 2,
|
|
334
|
+
},
|
|
335
|
+
};
|
|
336
|
+
|
|
337
|
+
export default defineWorkflow({
|
|
338
|
+
id: "revisar-e-corrigir-uis",
|
|
358
339
|
version: 1,
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
policy: policyRef("local
|
|
340
|
+
operatorVersion: 2,
|
|
341
|
+
mode: "candidate",
|
|
342
|
+
inputSchema: schemaRef("entrada-ui", "v2"),
|
|
343
|
+
outputSchema: schemaRef("gate-ui", "v2"),
|
|
344
|
+
policy: policyRef("ui-local", "v2"),
|
|
345
|
+
acceptance: acceptanceRef("qualidade-ui", "v2"),
|
|
346
|
+
population: populationRef("catalogo-uis", "v2"),
|
|
347
|
+
|
|
364
348
|
steps: [
|
|
365
|
-
agent("
|
|
366
|
-
|
|
367
|
-
input:
|
|
368
|
-
outputSchema: schemaRef("component-list", "v1"),
|
|
369
|
-
effect: "read",
|
|
370
|
-
prompt: "Identifique os componentes e suas dependências; não altere arquivos.",
|
|
349
|
+
agent("capturas", {
|
|
350
|
+
executor: executorRef("capturar-uis", "v2"),
|
|
351
|
+
input: { catalog: population() },
|
|
371
352
|
}),
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
353
|
+
|
|
354
|
+
map("uis", {
|
|
355
|
+
items: field(output("capturas"), "items"),
|
|
375
356
|
key: field(item(), "id"),
|
|
376
|
-
|
|
357
|
+
order: "key",
|
|
377
358
|
completion: "all-required",
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
359
|
+
concurrency: 4,
|
|
360
|
+
coverage: coverageFor(population(), output("capturas")),
|
|
361
|
+
body: repair("avaliar-e-corrigir", {
|
|
362
|
+
...itemRepair,
|
|
363
|
+
input: { ui: item() },
|
|
381
364
|
initialCandidate: candidateFromBaseline(item()),
|
|
382
365
|
writeScope: field(item(), "allowedPaths"),
|
|
383
|
-
implement: executorRef("migrate-component", "v1"),
|
|
384
|
-
review: executorRef("review-component", "v1"),
|
|
385
|
-
checks: approvedChecksFor(item()),
|
|
386
|
-
maxRepairRounds: 3,
|
|
387
|
-
maxAssessmentAttempts: 6,
|
|
388
|
-
maxInfrastructureAttempts: 3,
|
|
389
|
-
progressPolicy: { unchangedCandidateRounds: 2, repeatedFindingsRounds: 2 },
|
|
390
|
-
onExhausted: "needs-attention",
|
|
391
|
-
onUncertain: "reconcile",
|
|
392
|
-
preserveCandidateHistory: true,
|
|
393
366
|
}),
|
|
394
367
|
}),
|
|
395
|
-
|
|
396
|
-
|
|
368
|
+
|
|
369
|
+
compose("integrado", {
|
|
370
|
+
candidates: acceptedCandidates("uis"),
|
|
397
371
|
onConflict: "needs-resolution",
|
|
398
372
|
}),
|
|
399
|
-
|
|
400
|
-
|
|
373
|
+
|
|
374
|
+
repair("regressao-global", {
|
|
375
|
+
recipe: recipeRef("repair", "v2"),
|
|
376
|
+
implement: executorRef("corrigir-regressao-ui", "v2"),
|
|
377
|
+
review: executorRef("revisar-ui-integrada", "v2"),
|
|
378
|
+
assessmentScope: "final",
|
|
379
|
+
evidence: [executorRef("capturar-candidato-completo", "v2")],
|
|
380
|
+
checks: ["ui-regression@v2", "typecheck@v1"],
|
|
381
|
+
input: { catalog: population() },
|
|
401
382
|
entryMode: "assess-first",
|
|
402
|
-
initialCandidate: outputCandidate("
|
|
403
|
-
writeScope:
|
|
404
|
-
implement: executorRef("fix-integration", "v1"),
|
|
405
|
-
review: executorRef("review-integrated-result", "v1"),
|
|
406
|
-
checks: acceptanceChecks("integration"),
|
|
383
|
+
initialCandidate: outputCandidate("integrado"),
|
|
384
|
+
writeScope: ["src"],
|
|
407
385
|
maxRepairRounds: 2,
|
|
408
|
-
maxAssessmentAttempts:
|
|
409
|
-
maxInfrastructureAttempts:
|
|
410
|
-
progressPolicy: {
|
|
411
|
-
|
|
412
|
-
|
|
386
|
+
maxAssessmentAttempts: 4,
|
|
387
|
+
maxInfrastructureAttempts: 2,
|
|
388
|
+
progressPolicy: {
|
|
389
|
+
unchangedCandidateRounds: 2,
|
|
390
|
+
repeatedFindingsRounds: 2,
|
|
391
|
+
},
|
|
413
392
|
}),
|
|
393
|
+
|
|
414
394
|
gate("final", {
|
|
415
|
-
candidate: acceptedCandidate("
|
|
416
|
-
|
|
417
|
-
coverage: coverageReceipt("migrate"),
|
|
395
|
+
candidate: acceptedCandidate("regressao-global"),
|
|
396
|
+
coverage: coverageReceipt("uis"),
|
|
418
397
|
}),
|
|
419
398
|
],
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
candidate: acceptedCandidate("repair-integration"),
|
|
423
|
-
gate: output("final"),
|
|
424
|
-
coverage: coverageReceipt("migrate"),
|
|
425
|
-
}),
|
|
399
|
+
|
|
400
|
+
result: output("final"),
|
|
426
401
|
});
|
|
427
402
|
```
|
|
428
403
|
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
Map aceita somente candidatos approved por seus gates de rodada. Compose detecta sobreposição e produz candidato integrado imutável. Assess-first avalia o candidato de integração antes de modificar: se já passar revisão/checks, não cria alteração vazia nem gasta uma implementação desnecessária. Caso falhe, rodadas seguintes partem desse candidato e seu feedback. O gate final reaproveita apenas evidências de revisão/checks que correspondam exatamente ao candidato escolhido e às obrigações vigentes. Result accepted significa candidato aceito, não aplicado. Aplicação local é uma ação posterior autorizada, com ApplyIntent/receipt e lifecycle da seção 12, não implícita no retorno de gate.
|
|
432
|
-
|
|
433
|
-
Exemplo de falha: após duas reprovações e nenhuma mudança de digest, um item fica stalled. Os outros candidatos continuam persistidos, mas map all-required não conclui. Após instrução autorizada e reparo do item, retomar com apenas os ramos invalidados; integração e gates finais só usam o novo conjunto fechado.
|
|
434
|
-
|
|
435
|
-
## 19. Compatibilidade e pontos de código
|
|
436
|
-
|
|
437
|
-
Não mudar comandos v1, persisted schemaVersion 1 ou sua definição histórica de succeeded/ready. Runs antigos continuam em seu executor/intérprete. Novo protocolo deve ter discriminador e validação explícitos; não aceitar mistura de envelopes v1/v2.
|
|
438
|
-
|
|
439
|
-
Introduzir módulos de responsabilidade conceituais: workflow-program-contract/lowering, expression-evaluator, operation-store/journal, dynamic-expansion, outcome-contract, typed-output/artefact-resolver, candidate-lineage, acceptance-gates e recipes. Nomes finais dependem da inspeção do projeto; não criar um serviço paralelo para cada primitive.
|
|
440
|
-
|
|
441
|
-
Mapeamento de reuso:
|
|
442
|
-
|
|
443
|
-
| Código existente | Tratamento |
|
|
444
|
-
| --- | --- |
|
|
445
|
-
| workflow-engine.ts | Reutilizar reducer/invalidation para operações materializadas; adapter v2 explicita semântica de controle |
|
|
446
|
-
| managed-run-contract/store/service.ts | Acrescentar contratos versionados e lifecycle; preservar v1 |
|
|
447
|
-
| codex-sdk-worker.ts | Envelope separado de payload tipado; modelos e isolamento observados |
|
|
448
|
-
| managed-workspace.ts | Reusar snapshots, beforeimages, scopes e composição; acrescentar Candidate metadata |
|
|
449
|
-
| workflow-task-actions.ts | Não relaxar validação de snapshots acompanhados ao introduzir v2 |
|
|
450
|
-
| CLI fabric / agent-memory MCP | Transportes do mesmo owner, sem instalação/configuração global implícita |
|
|
451
|
-
| tests/agent-fabric | Contratos, crash/replay, loops, expansão, artefatos, efeitos e compatibilidade |
|
|
452
|
-
|
|
453
|
-
V2 review rejeitada não pode ser despachada pelo path v1 que a converte em failed/blocked sem adaptação explícita. Controle puro (branch/join/expansion/gate) usa executor local determinístico e receipt próprio, não um worker LLM obrigatório para cada nó. Não enfraquecer o contrato legado que exige executor por nó; o contrato v2 define suas categorias próprias.
|
|
454
|
-
|
|
455
|
-
Freeze P0a/P0b, acceptance records e cronologia não são reescritos. Mudanças materiais em invariantes exigem ADR/supersessão com baseline, compatibilidade, evidência e commit de aplicabilidade. Migrar run antigo só por operação explícita, pausada e sem incertezas, mantendo o original recuperável; nenhuma conversão automática em abertura de owner.
|
|
456
|
-
|
|
457
|
-
## 20. Entregas, dependências e critérios de aceite
|
|
458
|
-
|
|
459
|
-
| Etapa | Entrega | Dependências | Gate verificável |
|
|
460
|
-
| --- | --- | --- | --- |
|
|
461
|
-
| F0 | ADR semântica: IR, identidades, população/aceite, capacidades, efeitos, lifecycle e persistência autoritativa | Baseline | Contraexemplos de cobertura, rejeição, exaustão, crash e corrida de aplicação resolvidos na especificação; review independente |
|
|
462
|
-
| F0b | Protótipo limitado de expressividade e decisão de autoria | F0 | Cenários da seção 4 expressos/inspecionados; schemas/result/dependências/IDs sem execução arbitrária; medir esforço antes de congelar DSL |
|
|
463
|
-
| F1 | Contrato v2, outputs/avaliações e CapabilityContract antes do dispatch | F0 | Feedback separado de falha; restrições efetivas validadas; envelope v1 preservado; sem dispatch antes de validação |
|
|
464
|
-
| F2 | Lowerer de produto e expressões puras da autoria escolhida | F0b/F1 | Lowering determinístico; imports/I/O inválidos rejeitados sem execução; schemas/result/merge e limites verificados |
|
|
465
|
-
| F3a | Journal autoritativo, artefatos, receipts e checkpoints | F1/F2 | Crash em commit/artefato/ACK recuperável; projeções verificadas; sem dual write independente; limites de durabilidade documentados |
|
|
466
|
-
| F3b | Map/loop de dados, seals, coverage e budgets | F3a | Inventário de 80 itens sem omissões; janela limitada; vazio inválido/no-work distintos; loops de dados duráveis e contadores conservados |
|
|
467
|
-
| F4a | Candidate snapshot/delta, ancestralidade e composição | F3a | Três deltas no mesmo arquivo; diamond aplica ancestral uma vez; ciclos/baselines/conflitos rejeitados |
|
|
468
|
-
| F4b | Repair de código, avaliações/gates e ApplyIntent/lifecycle | F3b/F4a | Assess-first/implement-first corretos; união accepted exclusiva; review/checks do digest final; CAS/eventos/apply-uncertain seguros |
|
|
469
|
-
| F5 | Recuperação seletiva, sinais humanos e extensão monotônica | F4b | Evento não perdido/duplicado; alterar item reexecuta só dependentes; joins fechados; reuse receipt explícito; geração antiga não satisfaz nova |
|
|
470
|
-
| F6 | Substituição online com fencing e escala medida | F5 | Corridas entre replan/result/abort/restart seguras; fila justa e backpressure; limites externos efetivos |
|
|
471
|
-
| F7 | Benchmark pareado e piloto real autorizado | Gates anteriores pertinentes | Relatório de resultados/limites reproduzível; sem claims de produção/EasyGrow/App-closed a partir de fixtures |
|
|
472
|
-
|
|
473
|
-
F3a entrega persistência antes da expansão de F3b. F3b usa dados/fixtures, sem declarar repair de código seguro. F4a vem antes de F4b; F4b depende também de cobertura/loops F3b. CapabilityContract é obrigatório em F1, sem aguardar fencing ou escala F6. Novas capacidades entram opt-in e nunca substituem imediatamente o modo v1.
|
|
474
|
-
|
|
475
|
-
Cada slice termina com checks pertinentes, revisão independente sobre snapshot atual e validações exigidas pelo AGENTS.md do checkout. Testes reais SDK, dependências, MCP nativo e efeitos externos têm evidência separada e respeitam autorização/custos. Não iniciar chamadas pagas em toda CI nem executar checks apenas porque um manifesto os sugere.
|
|
404
|
+
Dependências são obtidas pelas refs: capturas → uis → integrado → regressao-global → final. Não há dependência por posição no array. Capturador entrega 20 itens, por exemplo; a primeira avaliação cria 20 reviewer activities. Se 3 itens têm problemas, somente esses itens iniciam implementer. Reavaliações desses itens e avaliação global criam chamadas adicionais; não prometer que o fluxo inteiro usa exatamente 20 revisores e 3 implementadores.
|
|
476
405
|
|
|
477
|
-
|
|
406
|
+
`allowedPaths` do item deve ser confirmado contra o catálogo e as policies owner, inclusive componentes compartilhados. Capturador não concede write authority. Capturar-candidato-ui usa a captura inicial somente se sua identidade/validade corresponder à avaliação; depois de cada alteração produz nova captura do novo candidato.
|
|
478
407
|
|
|
479
|
-
|
|
480
|
-
| --- | --- | --- |
|
|
481
|
-
| T01 | Revisão concluída, changes_requested | Feedback consumível; candidato não aprovado |
|
|
482
|
-
| T02 | Checker produz diagnósticos com exit esperado não zero | Diagnóstico válido; obrigação de check passou continua pendente |
|
|
483
|
-
| T03 | Schema inválido/truncado/referência fora de escopo | Falha explícita; output não consumido e nenhum efeito adicional implícito |
|
|
484
|
-
| T04 | maxRepairRounds e mesma falha repetida | exhausted/stalled; jamais último candidato tratado como accepted |
|
|
485
|
-
| T05 | Crash antes/depois de persistir expansão/claim/resultado | Nenhum dispatch sem registro; operações incertas reconciliadas; ACK não inventado |
|
|
486
|
-
| T06 | Lista reordenada, chave duplicada, rename | Identidades estáveis; duplicata rejeitada; rename segue regra declarada |
|
|
487
|
-
| T07 | 80 itens, janela pequena e restart | Sem itens omitidos/duplicados; all-required e fechamento corretos |
|
|
488
|
-
| T08 | Três patches no mesmo arquivo em rodadas | Ancestralidade correta; beforeimage divergente rejeitada |
|
|
489
|
-
| T09 | Writers independentes conflitantes | Needs-resolution; nada de last-writer-wins silencioso |
|
|
490
|
-
| T10 | Item novo após fechamento, antes/durante/depois de apply | Antes: novo seal invalida gate; durante: pending-after-apply; terminal: sucessor explícito sem mudar run aplicado |
|
|
491
|
-
| T11 | Resultado tardio após fencing | Histórico preservado; nenhuma conclusão da geração nova |
|
|
492
|
-
| T12 | Replan com worker incerto | Operação recusada ou ramo bloqueado até reconciliação pertinente |
|
|
493
|
-
| T13 | Mensagem humana antes do wait, após timeout ou repetida | Matching/validade/consumo persistidos; timeout nunca aprova |
|
|
494
|
-
| T14 | Efeito termina, owner cai antes de receipt | uncertain e reconciliação; sem retry automático não idempotente |
|
|
495
|
-
| T15 | Artefato apagado/alterado ou dependência externa mudou | Reuso recusado; nenhum efeito refeito para esconder corrupção |
|
|
496
|
-
| T16 | Subworkflow tenta reiniciar budget/ampliar escopo | Política externa bloqueia; contadores globais conservados |
|
|
497
|
-
| T17 | Modelo/ambiente/schema/validator mudou | Fingerprint atualizado; reuso somente sob compatibilidade explícita |
|
|
498
|
-
| T18 | Reviewer/check report aplica a candidato anterior | Gate recusa mesmo que o texto diga aprovado |
|
|
499
|
-
| T19 | Publicação parcial e cancelamento sem árvore encerrada | Estado incerto visível; inspeção/reconciliação exigidas |
|
|
500
|
-
| T20 | Run v1 antigo após instalar v2 | Semântica original preservada; nenhuma migração silenciosa |
|
|
501
|
-
| T21 | Inventário de 80, discovery com 79/zero/extras/exclusão/rename | Omissão/vazio não provado/extras bloqueados; exclusão autorizada e rename contabilizados |
|
|
502
|
-
| T22 | Vazio legítimo e alvo semântico não comprovado por glob | No-work somente com contrato/evidência; cobertura semântica inconclusiva permanece pendente |
|
|
503
|
-
| T23 | Steering/revisão disputa CAS antes do ApplyIntent | Tupla vencedora determina aplicação; gate obsoleto não inicia |
|
|
504
|
-
| T24 | Evento entre intent/primeiro write e entre dois writes | Intent congelado; ACK recebido/pending, nunca consumido; aplicado pertence à versão congelada |
|
|
505
|
-
| T25 | Revogação, cancelamento ou crash após write e antes de receipt | Interrupção observada/reconciliação; nenhuma nova aplicação com apply-uncertain |
|
|
506
|
-
| T26 | Assess-first aprovado, inconclusive repetido, limites distintos | Zero implementação quando aprovado; reavaliação limitada; counters/união accepted corretos |
|
|
507
|
-
| T27 | Adicionar item, reordenar, alterar prompt/schema/receita/operador | Reuso por semântica local e entradas; aggregators invalidam; receipt vincula nova geração |
|
|
508
|
-
| T28 | Worker vê arquivo compartilhado fora de writeScope | Snapshot visível entra no digest conservador; mudança pertinente impede falso reuso |
|
|
509
|
-
| T29 | Diamond, ancestral ausente/ciclo e patches iguais de produtores distintos | Ancestral comum aplicado uma vez; estruturas inválidas rejeitadas; igualdade textual não deduplica automaticamente |
|
|
510
|
-
| T30 | Check edita source, gera cache autorizado ou command alega read sem contenção | Source invalida candidato; scratch isolado permitido; capacidade insuficiente impede dispatch forte |
|
|
511
|
-
| T31 | Crash na gravação de artefato/journal/checkpoint/ACK | Fonte autoritativa íntegra; outputRef nunca aponta a artefato não confirmado; power-loss tem escopo declarado |
|
|
512
|
-
| T32 | Branch não selecionado, merge incompatível, child retry/cancel/uncertain | Join não espera skipped; obrigações externas preservadas; tipos validados; filho/effect não duplicado |
|
|
513
|
-
| T33 | Evento antigo em wait novo, consumo duplicado, prazo e budget após restart | Matching de geração/invocação; decisão/consumo atômicos; expiração/contadores conservados |
|
|
514
|
-
| T34 | DSL importa schema arbitrário, result não tipado ou receita sem ID | Rejeição sem executar módulo; registry/result/identidade exigidos |
|
|
408
|
+
Regressão-global exige contribution lineage das 20 UIs. A avaliação final recaptura e verifica todas as UIs no candidato integrado, mesmo sem correção global. Se ela modificar código/CSS compartilhado, uma nova avaliação de todo o catálogo é obrigatória; receipts locais anteriores são históricos e não aprovações do conteúdo alterado. AssessmentContext liga capturas aos checks/reviewer, e AssessmentReceipt registra cobertura de cada obrigação. Nenhuma análise seletiva de impacto é presumida neste MVP. O gate valida a matriz de obrigações final para o candidato integrado. Se onConflict detectar overlap, run para antes da avaliação/aplicação, preserva candidatos e bloqueia; continuação por resolução exige o contrato de extensão descrito na seção 12. Saída acceptance-ready não aplica arquivo; aplicação é decisão posterior autorizada.
|
|
515
409
|
|
|
516
|
-
|
|
410
|
+
## 16. Exemplos auxiliares de paralelismo e controle humano
|
|
517
411
|
|
|
518
|
-
|
|
412
|
+
Fragmentos da API futura, não workflows executáveis isolados. Parallel expõe resultado explícito somente no join bem-sucedido; collect-all com filho required falho conserva ScopeResult para status/explain e bloqueia consumidores, sem avaliar result abaixo. Sequence cria controle independente de dados.
|
|
519
413
|
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
Itens podem virar entregas futuras explícitas após o núcleo e sua evidência. A DSL restrita tem menos liberdade que JavaScript geral: provar que expressa os workflows alvo é requisito, não supor paridade pela aparência TypeScript.
|
|
414
|
+
```typescript
|
|
415
|
+
parallel("analises", {
|
|
416
|
+
onFailure: "collect-all",
|
|
417
|
+
steps: [
|
|
418
|
+
agent("acessibilidade", {
|
|
419
|
+
executor: executorRef("revisar-acessibilidade", "v2"),
|
|
420
|
+
input: { captures: output("capturas") },
|
|
421
|
+
}),
|
|
422
|
+
agent("consistencia", {
|
|
423
|
+
executor: executorRef("revisar-consistencia", "v2"),
|
|
424
|
+
input: { captures: output("capturas") },
|
|
425
|
+
}),
|
|
426
|
+
],
|
|
427
|
+
result: object({
|
|
428
|
+
accessibility: output("acessibilidade"),
|
|
429
|
+
consistency: output("consistencia"),
|
|
430
|
+
}),
|
|
431
|
+
});
|
|
539
432
|
|
|
540
|
-
|
|
433
|
+
sequence("decidir", {
|
|
434
|
+
steps: [
|
|
435
|
+
waitEvent("aprovacao", {
|
|
436
|
+
type: "candidate-approval",
|
|
437
|
+
correlation: field(acceptedCandidate("regressao-global"), "digest"),
|
|
438
|
+
subject: {
|
|
439
|
+
candidate: acceptedCandidate("regressao-global"),
|
|
440
|
+
contract: acceptance(),
|
|
441
|
+
},
|
|
442
|
+
schema: schemaRef("decisao-humana", "v2"),
|
|
443
|
+
timeoutMs: 3600000,
|
|
444
|
+
}),
|
|
445
|
+
gate("ready", {
|
|
446
|
+
candidate: acceptedCandidate("regressao-global"),
|
|
447
|
+
coverage: coverageReceipt("uis"),
|
|
448
|
+
authorization: output("aprovacao"),
|
|
449
|
+
}),
|
|
450
|
+
],
|
|
451
|
+
result: output("ready"),
|
|
452
|
+
});
|
|
453
|
+
```
|
|
541
454
|
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
455
|
+
O schema decisao-humana descreve a decisão e receipt emitido pelo owner; não é booleano autodeclarado. Gate rejeita declínio, actor sem autoridade, expiração ou subject diferente. Esse sequence substituiria o gate direto do exemplo principal quando policy exigisse aprovação humana; não adicionar os dois gates independentes e permitir bypass. Timeout precisa caber no deadline do run. Pausar não significa cancelar automaticamente os irmãos; são operações distintas.
|
|
456
|
+
|
|
457
|
+
## 17. Exemplo de registry e contratos do caso de UI
|
|
458
|
+
|
|
459
|
+
Não persistir segredos. O registry abaixo é especificação de requisitos, não JSON de configuração atual. Schema/refs/digests serão validados na implementação.
|
|
460
|
+
|
|
461
|
+
| Registro proposto | Responsabilidade |
|
|
462
|
+
|---|---|
|
|
463
|
+
| entrada-ui@v2 | Ambiente de teste identificado; overrides de ferramentas/domínios proibidos |
|
|
464
|
+
| catalogo-uis@v2 | IDs rota/estado/viewport/auth fixture, baseline, paths autorizados, evidência e exclusões |
|
|
465
|
+
| capturar-uis@v2 | Investigator readonly com browser autorizado; retorna itens/capturas duráveis e identidade da build |
|
|
466
|
+
| capturar-candidato-ui@v2 | Evidence readonly de item/candidato, valida origem e emite CaptureReceipt |
|
|
467
|
+
| revisar-ui@v2 | Reviewer distinto, saída approved/changes_requested/inconclusive, findings tipados e refs de evidências |
|
|
468
|
+
| corrigir-ui@v2 | Implementer isolated-write, sem write fora do escopo owner |
|
|
469
|
+
| ui-layout@v2 | Command check registrado, valida constraints objetivas pertinentes ao candidato/item |
|
|
470
|
+
| capturar-candidato-completo@v2 | Evidence do catálogo para o candidato integrado |
|
|
471
|
+
| revisar-ui-integrada@v2 | Avalia resultado integrado e possíveis regressões de componentes compartilhados |
|
|
472
|
+
| corrigir-regressao-ui@v2 | Implementer limitado para correções globais autorizadas |
|
|
473
|
+
| ui-regression@v2 | Check global de cobertura/renderização/constraints registradas |
|
|
474
|
+
| qualidade-ui@v2 | IDs de obrigações por UI/final, bindings de scope/operation, requiredChecksByScope, evidências/cobertura e gate; no-work explicitamente decidido |
|
|
475
|
+
| ui-local@v2 | Quotas, deadlines, byte budgets e capacidades browser/SDK/command por papel |
|
|
476
|
+
| gate-ui@v2 | Receipt técnico de aceite ligado ao candidato; não recibo de deploy/aceite humano |
|
|
477
|
+
|
|
478
|
+
Cada executor tem input/output schemas, timeout e capabilities efetivos. Contratos de captura e check recebem o candidato pelo contexto confiável do owner, não só pelo JSON do autor. Capacidade de browser aprovada não habilita rede arbitrária para todos os agentes.
|
|
479
|
+
|
|
480
|
+
## 18. Persistência, observabilidade e budgets
|
|
481
|
+
|
|
482
|
+
Manter uma fonte de verdade. Persista inputs/dispatch/results/decisões com ordem de commit definida; projection/UI é derivada. SHA verifica integridade, não autentica uma alegação de verdade por si só. Receipt owner fica em registro confiável e ligado às identidades; um objeto de agente com o mesmo formato não é receipt.
|
|
483
|
+
|
|
484
|
+
Instrumentar desde P0/P1: tempo de lock/queue/preparation/SDK/check/serialização/hash/fsync, bytes gravados/retidos, uso de memória e recuperação. Cada invocation tem trace de deps/after, generation, attempts, candidate, evidence, budgets e razão de waiting/replay/invalidation. program-explain usa esses fatos. Logs têm redaction e budgets; não copiar transcript inteiro para cada snapshot.
|
|
485
|
+
|
|
486
|
+
Profiling precede escolha de journal incremental/backend transacional. Otimização preserva atomicidade do registro autoritativo, references commitadas antes de uso, dispatch intent e correção em crash. Crash de processo tem prova separada de power-loss/filesystem. Migração, leitura de histórico e rollback precisam de contrato. GC posterior mantém artefatos alcançáveis por runs, gates, intents, receipts e retenção explícita; nunca apagar prova necessária para apply/reconcile.
|
|
487
|
+
|
|
488
|
+
Budgets iniciais: owner slots, run/scope concurrency de atividades, itens/ops/profundidade, maxAttempts de dispatches visíveis, prazos, dados/artefatos/imagens e revisions. Reservas/debits têm unidade e ID persistidos, seguem seção 8 e não são repostos na retomada. Calls/retries internos só entram em limites próprios observáveis pelo adapter. Tokens/uso medidos por atividade e role. Cached input é subconjunto de input. Controle financeiro futuro requer preços versionados e reservas para calls em voo; sem limite verificável por chamada, declarar overshoot possível. Não prometer teto monetário rígido a partir de timeout/maxAttempts.
|
|
489
|
+
|
|
490
|
+
## 19. Entregas e critérios de aceite
|
|
491
|
+
|
|
492
|
+
| Fase | Entrega delimitada | Gate de aceite |
|
|
493
|
+
|---|---|---|
|
|
494
|
+
| P0 | ADR: grafo/after/scopes, outcomes/waits/quorum, obrigações por fase e schemas de receipts, resume/replan/cache, keys/compatibilidade; catálogo/API/examples; instrumentação básica | Contraexemplos têm comportamento único; v1 não muda; autorizações/ordens não ambíguas |
|
|
495
|
+
| P1a | Resume de completed same-run, reconstrução de pais e budgets; diagnósticos | Siblings completos não chamam adapter/modelo novamente; gaps de commit/corrupção/uncertain tratados |
|
|
496
|
+
| P1b | Fila pronta, exclusividade owner/reservas/quotas, sequence/parallel, waiting localizado, joins/quorum/cancelamento | Dependências de dados/controle respeitadas, fairness e deadlock de slots testados, espera não vira falha |
|
|
497
|
+
| P1c | Tipos/diagnósticos e ciclo implementação/review/check/compose/gate com agentes simulados; transporte SDK stubado | Mesmo candidato e obrigações ligados, retomada preservada e políticas respeitadas nos cenários determinísticos; nenhuma chamada a modelo |
|
|
498
|
+
| P2 | Caso UI com site local/fixtures, capturas e agentes simulados: artifacts/evidence/repair/integration | Capturas ligadas ao candidato, defeitos/infra separados e regressões conhecidas detectadas por checks determinísticos; sem alegar qualidade de revisão por LLM |
|
|
499
|
+
| P3 | Profiling/otimização e benchmark determinístico do runtime | Metas e métricas publicadas; comparação real de produto com Claude/LLMs adiada até nova autorização |
|
|
500
|
+
| Posterior | Outros harnesses, cache cross-run, fencing local, receitas extensíveis, planner adaptativo | Necessidade demonstrada e contratos anteriores preservados |
|
|
501
|
+
|
|
502
|
+
Decisão do usuário em 07/10/2026: Forge é usado apenas pelo autor e está em dev; não há requisito de compatibilidade. O runtime adota operatorVersion 2 diretamente, sem interpretador legado ou migração de runs. P1b não é troca silenciosa de for-await por Promise.all. P1c usa implementadores/revisores simulados que produzem patches/findings conhecidos; P2 usa site local e fixtures com defeitos conhecidos. O contrato SDK pode ser validado com transporte stubado, sem iniciar cliente real conectado a provider. Generalização de pesquisa/data vem depois como exemplo adicional, sem bloquear o primeiro valor de produto.
|
|
503
|
+
|
|
504
|
+
Cada etapa de implementação futura usa checks pertinentes do repo e evidência própria. Toda a matriz técnica deve rodar sem LLM: mocks/stubs fail-closed, contador de tentativas de provider esperado em zero e ausência de fallback para CLI/SDK real. Testes locais de filesystem, subprocessos determinísticos, browser sobre fixture e falhas/crashes injetados podem verificar efeitos reais do runtime sem modelo. Testes que dependem de modelos reais não são gates obrigatórios de implementação, CI ou release e permanecem desativados até nova autorização explícita. Este plano não inicia nenhuma dessas atividades.
|
|
505
|
+
|
|
506
|
+
## 20. Matriz mínima de verificação
|
|
507
|
+
|
|
508
|
+
| ID | Cenário | Resultado exigido |
|
|
509
|
+
|---|---|---|
|
|
510
|
+
| T01 | Grafo A/B independentes, C depende de ambos | Concorrência autorizada; C espera |
|
|
511
|
+
| T02 | Controle humano A, writer B sem dado de A | B espera after/sequence, nunca só posição textual; declínio não concede autoridade de escrita |
|
|
512
|
+
| T03 | Forward ref em grafo e em sequence | Grafo válido resolve; ciclo de sequence rejeitado |
|
|
513
|
+
| T04 | Scope com filho required falho, result usa outro filho | Pai não oculta falha |
|
|
514
|
+
| T05 | Cancel-siblings após falha | Completos preservados; ativos observados ou uncertain; nenhum falso sucesso |
|
|
515
|
+
| T06 | Map nested com owner quota pequena | Pais não retêm slots; ausência de deadlock |
|
|
516
|
+
| T07 | Dois runs/scopes competem | Sem starvation na policy de fairness testada |
|
|
517
|
+
| T08 | Wait no root e dentro de map | waiting, não failed; irmãos independentes continuam |
|
|
518
|
+
| T09 | Evento cedo/duplicado/expirado/geração antiga | Consumo único e binding correto; histórico preservado |
|
|
519
|
+
| T10 | Declínio humano ou receipt fabricado | Não satisfaz gate nem autoriza apply |
|
|
520
|
+
| T11 | Restart durante wait | Prazo absoluto e obrigação preservados |
|
|
521
|
+
| T12 | Fan-out N−1 complete/um falho | Resume chama só o afetado; mesmo resultado/candidato para completos |
|
|
522
|
+
| T13 | Activity commitada, parent não commitado | Reconstrução sem segunda execução |
|
|
523
|
+
| T14 | Dispatch ocorreu, output não observado | Uncertain e reconciliação; não redispatch cego |
|
|
524
|
+
| T15 | Artifact perdido/corrompido | Diagnóstico e bloqueio, sem cache-miss com efeito |
|
|
525
|
+
| T16 | Replan troca entrada de um ramo | Invalidação de afetados/dependentes; intactos preservados explicitamente |
|
|
526
|
+
| T17 | Resume após budget esgotado | Não repõe implementação/assessment/infra/global |
|
|
527
|
+
| T18 | Capture inválida versus UI defeituosa | Classificação diferente, sem correção visual indevida |
|
|
528
|
+
| T19 | Imagem de baseline antigo ou candidato diferente | Inconclusive/bloqueio; não aprovado |
|
|
529
|
+
| T20 | Descoberta omite item required/no-work indevido | Coverage recusada |
|
|
530
|
+
| T21 | Partial/quorum usado para gate all-required | Recusado, faltantes explícitos |
|
|
531
|
+
| T22 | Repair rejeitado seguido de value | Rejeição não mascarada |
|
|
532
|
+
| T23 | UI sem defeitos | Zero implementações do item, assessment/evidência válidos |
|
|
533
|
+
| T24 | Duas correções de CSS compartilhado | Inputs/receipts preservados, conflito bloqueia MVP sem resolução automática |
|
|
534
|
+
| T25 | Diamond/shared ancestor e patches iguais independentes | Ancestral uma vez; conflito independente preservado |
|
|
535
|
+
| T26 | Correção global altera item antes aprovado | Todo o catálogo reavaliado no candidato final; obrigação antes aprovada pode reprovar |
|
|
536
|
+
| T27 | Gate para candidato A, apply candidato B | Recusado |
|
|
537
|
+
| T28 | Beforeimage alterada e aplicação parcial | Destino preservado; apply-uncertain, sem retry silencioso |
|
|
538
|
+
| T29 | Dados readonly declaram accepted ou receipt falso | Sem autoridade de publicação |
|
|
539
|
+
| T30 | Lowerer recebe import/callback/I/O arbitrário | Rejeitado antes de dispatch |
|
|
540
|
+
| T31 | IDs/types/fields inválidos e expressão gigante | Diagnóstico/limite antes de alocação/execução |
|
|
541
|
+
| T32 | Modelo/harness produz nested agents sem controle | Capacidade/limite declarado; nenhuma garantia agregada fictícia |
|
|
542
|
+
| T33 | Policy revogada após atividade completa | Fato histórico legível, novo dispatch/apply bloqueado |
|
|
543
|
+
| T34 | Crash em commit de decisão/result/intent | Fonte de verdade consistente; efeitos classificados |
|
|
544
|
+
| T35 | GC/retention proposto apaga artifact gated | Impedido enquanto alcançável/retido |
|
|
545
|
+
| T36 | Checks locais/finais distintos e omissão pelo autor | Binding owner correto; omissão/rebaixamento rejeitado antes de dispatch |
|
|
546
|
+
| T37 | Reviewer/check sem refs, cobertura de item omitida ou ambiente trocado | AssessmentReceipt/gate recusados; contexto confiável exigido |
|
|
547
|
+
| T38 | Quorum inválido, 2/3 com waiting e quorum impossível | K validado; waiting mantém aberto; timeout só por contrato; falha abaixo de K explícita |
|
|
548
|
+
| T39 | Collect-all com filho required falho e result usando esse output | ScopeResult diagnóstico persistido; result não avaliado; sibling completo preservado |
|
|
549
|
+
| T40 | Keys é/e\u0301, slash e restart em outro locale | Colisão NFC rejeitada; encoding único; identidade/ordem UTF-8 estáveis |
|
|
550
|
+
| T41 | Dois owners, crash em reserva/dispatch e worker órfão vivo | Admissão exclusiva; reservas reconstruídas sem perda/dupla liberação; uncertain conservado |
|
|
551
|
+
| T42 | Crash antes/depois do debit, retry SDK interno e completed resume | Debit por dispatch visível sem duplicar; retry novo debita; completed zero; limites internos declarados |
|
|
552
|
+
| T43 | Futura resolução substitui deltas e perde obrigação | Receipt de extensão e cobertura final exigidos; não aceitação pelos receipts locais antigos |
|
|
553
|
+
|
|
554
|
+
Fixtures testam contratos e não provam qualidade visual/modelo nem integração live com provider. Piloto SDK real e avaliação de qualidade com LLM estão adiados por instrução do usuário, sem bloquear os gates técnicos determinísticos. Typecheck/lowering/schema e execução futura devem testar a mesma definição; apenas aceitar sintaxe não valida semântica de API. Os cenários T01–T43 usam agentes simulados, transportes stubados e fixtures; T43 é teste da extensão apenas quando ela for implementada.
|
|
555
|
+
|
|
556
|
+
## 21. Benchmark e comparação com Claude DW
|
|
557
|
+
|
|
558
|
+
Executar somente a avaliação de correção/performance do runtime com adapters determinísticos e falhas injetadas. Avaliação do produto com modelos reais e execução de Claude DW ficam adiadas até nova autorização explícita. Uma referência procedural que não executa Claude nunca recebe rótulo “benchmark Claude”. O protocolo abaixo permanece documentado para eventual avaliação futura; não é trabalho autorizado agora. Se Fabric usa Codex e DW usa Claude, o resultado é do sistema completo. Comparação causal de runtime exige harness/modelo/ferramentas efetivamente equivalentes, quando isso for possível.
|
|
559
|
+
|
|
560
|
+
Congelar tarefas/dataset/falhas, baseline, prompts por papel, ferramentas, isolamento, concorrência e critérios antes da execução. Dois cenários de autoria: workflow cuidadosamente escrito e geração por prompt; não misturá-los como se fossem a mesma medição. Repetições com ordem contrabalanceada; evaluator externo cego para origem do candidato. Avaliar candidato integrado, não só alterações isoladas.
|
|
561
|
+
|
|
562
|
+
Métricas: obrigações/cobertura, falsos aceites, regressões, chamadas repetidas, tempo normal/recuperação, tokens por papel e uso/custo com incerteza, bytes/I/O e esforço/erros de autoria. Prompt cache é feature do provider distinta de saved-result replay. Preservar/configurar explicitamente defaults do concorrente e publicar limitações, falhas e dispersão.
|
|
563
|
+
|
|
564
|
+
Hard gates iniciais: zero aceite fabricado/obsoleto nos cenários determinísticos; nenhuma repetição silenciosa de efeito incerto; same-run completed intacto gera zero novas chamadas; zero aplicação de candidato diferente do gated. Metas de latência/custo/esforço são fixadas após profiling baseline e antes do pareamento, sem inventar percentuais agora. Superioridade declarada somente nas dimensões/tarefas/configurações medidas.
|
|
565
|
+
|
|
566
|
+
## 22. Limites e extensões posteriores
|
|
567
|
+
|
|
568
|
+
Fora do núcleo inicial: JS/TS irrestrito, YAML nativo, discovery streaming ilimitado, race, serviço distribuído, novos MCPs/credenciais globais, wakeup automático, exactly-once externo genérico, cache SDK cross-run, live replan local, múltiplos providers completos e GC automático não especificado. Qualquer extensão exige necessidade demonstrada, versionamento e matriz de invariantes.
|
|
569
|
+
|
|
570
|
+
Planner LLM posterior pode propor expansão/branches/plan diff, mas owner valida budgets, obrigações, capacidades e autoridade antes de materializar trabalho. Ele não pode retirar itens/critério porque ficou difícil, aprovar seu próprio candidato ou substituir decisão humana. Dados externos não tornam autorização legítima.
|
|
571
|
+
|
|
572
|
+
## 23. Fontes e rastreabilidade
|
|
545
573
|
|
|
546
|
-
|
|
574
|
+
- [Claude DW](https://code.claude.com/docs/en/workflows): referência de autoria/script e comportamento público de replay; não avaliação de código interno.
|
|
575
|
+
- [Claude subagents](https://code.claude.com/docs/en/sub-agents): referência de capacidades/isolamento que precisam de comparação equivalente.
|
|
576
|
+
- [Temporal workflow definition](https://docs.temporal.io/workflow-definition): referência de determinismo/atividades; código também pode ser durável.
|
|
577
|
+
- [Temporal messages](https://docs.temporal.io/encyclopedia/workflow-message-passing): referência da separação entre receber evento e obter decisão/resultado.
|
|
578
|
+
- [LangGraph checkpointers](https://docs.langchain.com/oss/javascript/langgraph/checkpointers): referência de preservação de nós concluídos quando outro falha.
|
|
547
579
|
|
|
548
|
-
|
|
580
|
+
Baseline local lido: program-dsl.ts, program-contract.ts, program-service.ts, program-worker.ts, program-store.ts, codex-sdk-worker.ts em `C:\Users\stahl\Projects\forge\src\forge\agent-fabric`; docs/agent-fabric-programs.md e WORKFLOW_PROGRAM_V2_PLAN.md; evidências de entrega e revisão anterior em outputs. Artefatos anteriores: COMPARACAO_FABRIC_VS_CLAUDE_DW.md e REVISAO_PLANO_EVOLUCAO_FABRIC_VS_CLAUDE_DW.md. Esses documentos registram o baseline, não autorizações para implementar ou executar este plano.
|
|
549
581
|
|
|
550
|
-
|
|
582
|
+
## 24. Revisão desta edição
|
|
583
|
+
|
|
584
|
+
R1 examinada pelo novo subagente verify_revised_fabric_workflow_plan: SHA256 A1227F2CDE7C1E21DF3B468616B1346AD4728646C2575FDEEC0C8B6D54908893. Parecer: REVISAO_NOVO_PLANO_AGENT_FABRIC_WORKFLOWS.md, SHA256 C2727DCB39C58DBE1A423F392AEE9B972FE3CDE83BF22EC9780B7A6511B0DA24 (edição original do parecer, antes da confirmação R2).
|
|
585
|
+
|
|
586
|
+
R2 incorpora F1–F7: obrigações item/final e AssessmentContext/Receipt; quorum com threshold e settle; collect-all diagnóstico; keys NFC antes de unicidade; exclusividade owner/reservas/órfãos; unidade observável de maxAttempts; MVP de conflitos bloqueia e resolução fica como extensão especificada. Acrescenta schemas canônicos e T36–T43. Catálogo fonte conferido: 11 operadores, 29 expressões, 7 refs e defineWorkflow; sequence/parallel são as únicas novas funções de autoria.
|
|
587
|
+
|
|
588
|
+
A confirmação da R2 deve ser consultada no parecer independente, que registra o hash final examinado e sua conclusão. O hash do documento não pode ser embutido nele próprio; constará do parecer. Pesquisa/inspeção estática não constitui validação de implementação; não foram executados workflows, testes, owner ou modelos.
|
|
589
|
+
|
|
590
|
+
R2.1: restrição direta posterior do usuário — “nao quero rodar testes reais com llm para nao gastar”. Substitui os gates de pilotos/modelos reais por validação determinística, transporte stubado e fixtures; posterga benchmark de produto/Claude até nova autorização. A aprovação independente registrada refere-se ao hash da R2, e não a esta edição posterior. A arquitetura e o exemplo conceitual permanecem os mesmos; nenhum teste ou workflow foi executado nesta atualização.
|